From 8b0285e13521ad555df5640f90b7a1e225d58004 Mon Sep 17 00:00:00 2001 From: mio Date: Sat, 1 Jan 2022 00:58:10 +0100 Subject: [PATCH] Add python support for s390x --- bindings/const_generator.py | 3 +- bindings/python/sample_s390x.py | 62 ++++++++++++ bindings/python/unicorn/s390x_const.py | 120 +++++++++++++++++++++++ bindings/python/unicorn/unicorn_const.py | 3 +- 4 files changed, 186 insertions(+), 2 deletions(-) create mode 100644 bindings/python/sample_s390x.py create mode 100644 bindings/python/unicorn/s390x_const.py diff --git a/bindings/const_generator.py b/bindings/const_generator.py index 64c518a8..9c2a15be 100644 --- a/bindings/const_generator.py +++ b/bindings/const_generator.py @@ -6,7 +6,7 @@ import sys, re, os INCL_DIR = os.path.join('..', 'include', 'unicorn') -include = [ 'arm.h', 'arm64.h', 'mips.h', 'x86.h', 'sparc.h', 'm68k.h', 'ppc.h', 'riscv.h', 'unicorn.h' ] +include = [ 'arm.h', 'arm64.h', 'mips.h', 'x86.h', 'sparc.h', 'm68k.h', 'ppc.h', 'riscv.h', 's390x.h', 'unicorn.h' ] template = { 'python': { @@ -23,6 +23,7 @@ template = { 'm68k.h': 'm68k', 'ppc.h': 'ppc', 'riscv.h': 'riscv', + 's390x.h' : "s390x", 'unicorn.h': 'unicorn', 'comment_open': '#', 'comment_close': '', diff --git a/bindings/python/sample_s390x.py b/bindings/python/sample_s390x.py new file mode 100644 index 00000000..c2a3ec58 --- /dev/null +++ b/bindings/python/sample_s390x.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python + +from unicorn import * +from unicorn.s390x_const import * + +# lr %r2, %r3 +S390X_CODE = b"\x18\x23" + +# memory address where emulation starts +ADDRESS = 0x10000 + + +# callback for tracing basic blocks +def hook_block(uc, address, size, user_data): + print(">>> Tracing basic block at 0x%x, block size = 0x%x" %(address, size)) + + +# callback for tracing instructions +def hook_code(uc, address, size, user_data): + print(">>> Tracing instruction at 0x%x, instruction size = 0x%x" %(address, size)) + + +# Test RISCV +def test_s390x(): + print("Emulate S390X code") + try: + # Initialize emulator in big endian mode + mu = Uc(UC_ARCH_S390X, UC_MODE_BIG_ENDIAN) + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, S390X_CODE) + + # initialize machine registers + mu.reg_write(UC_S390X_REG_R3, 0x7890) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, hook_block) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, hook_code) + + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + len(S390X_CODE)) + + # now print out some registers + print(">>> Emulation done. Below is the CPU context") + + r2 = mu.reg_read(UC_S390X_REG_R2) + r3 = mu.reg_read(UC_S390X_REG_R3) + print(">>> R2 = 0x%x" % r2) + print(">>> R3 = 0x%x" % r3) + + except UcError as e: + print("ERROR: %s" % e) + + +if __name__ == '__main__': + test_s390x() + diff --git a/bindings/python/unicorn/s390x_const.py b/bindings/python/unicorn/s390x_const.py new file mode 100644 index 00000000..ec96ae66 --- /dev/null +++ b/bindings/python/unicorn/s390x_const.py @@ -0,0 +1,120 @@ +# For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [s390x_const.py] + +# S390X CPU + +UC_CPU_S390X_Z900 = 0 +UC_CPU_S390X_Z900_2 = 1 +UC_CPU_S390X_Z900_3 = 2 +UC_CPU_S390X_Z800 = 3 +UC_CPU_S390X_Z990 = 4 +UC_CPU_S390X_Z990_2 = 5 +UC_CPU_S390X_Z990_3 = 6 +UC_CPU_S390X_Z890 = 7 +UC_CPU_S390X_Z990_4 = 8 +UC_CPU_S390X_Z890_2 = 9 +UC_CPU_S390X_Z990_5 = 10 +UC_CPU_S390X_Z890_3 = 11 +UC_CPU_S390X_Z9EC = 12 +UC_CPU_S390X_Z9EC_2 = 13 +UC_CPU_S390X_Z9BC = 14 +UC_CPU_S390X_Z9EC_3 = 15 +UC_CPU_S390X_Z9BC_2 = 16 +UC_CPU_S390X_Z10EC = 17 +UC_CPU_S390X_Z10EC_2 = 18 +UC_CPU_S390X_Z10BC = 19 +UC_CPU_S390X_Z10EC_3 = 20 +UC_CPU_S390X_Z10BC_2 = 21 +UC_CPU_S390X_Z196 = 22 +UC_CPU_S390X_Z196_2 = 23 +UC_CPU_S390X_Z114 = 24 +UC_CPU_S390X_ZEC12 = 25 +UC_CPU_S390X_ZEC12_2 = 26 +UC_CPU_S390X_ZBC12 = 27 +UC_CPU_S390X_Z13 = 28 +UC_CPU_S390X_Z13_2 = 29 +UC_CPU_S390X_Z13S = 30 +UC_CPU_S390X_Z14 = 31 +UC_CPU_S390X_Z14_2 = 32 +UC_CPU_S390X_Z14ZR1 = 33 +UC_CPU_S390X_GEN15A = 34 +UC_CPU_S390X_GEN15B = 35 +UC_CPU_S390X_QEMU = 36 +UC_CPU_S390X_MAX = 37 + +# S390X registers + +UC_S390X_REG_INVALID = 0 + +# General purpose registers +UC_S390X_REG_R0 = 1 +UC_S390X_REG_R1 = 2 +UC_S390X_REG_R2 = 3 +UC_S390X_REG_R3 = 4 +UC_S390X_REG_R4 = 5 +UC_S390X_REG_R5 = 6 +UC_S390X_REG_R6 = 7 +UC_S390X_REG_R7 = 8 +UC_S390X_REG_R8 = 9 +UC_S390X_REG_R9 = 10 +UC_S390X_REG_R10 = 11 +UC_S390X_REG_R11 = 12 +UC_S390X_REG_R12 = 13 +UC_S390X_REG_R13 = 14 +UC_S390X_REG_R14 = 15 +UC_S390X_REG_R15 = 16 + +# Floating point registers +UC_S390X_REG_F0 = 17 +UC_S390X_REG_F1 = 18 +UC_S390X_REG_F2 = 19 +UC_S390X_REG_F3 = 20 +UC_S390X_REG_F4 = 21 +UC_S390X_REG_F5 = 22 +UC_S390X_REG_F6 = 23 +UC_S390X_REG_F7 = 24 +UC_S390X_REG_F8 = 25 +UC_S390X_REG_F9 = 26 +UC_S390X_REG_F10 = 27 +UC_S390X_REG_F11 = 28 +UC_S390X_REG_F12 = 29 +UC_S390X_REG_F13 = 30 +UC_S390X_REG_F14 = 31 +UC_S390X_REG_F15 = 32 +UC_S390X_REG_F16 = 33 +UC_S390X_REG_F17 = 34 +UC_S390X_REG_F18 = 35 +UC_S390X_REG_F19 = 36 +UC_S390X_REG_F20 = 37 +UC_S390X_REG_F21 = 38 +UC_S390X_REG_F22 = 39 +UC_S390X_REG_F23 = 40 +UC_S390X_REG_F24 = 41 +UC_S390X_REG_F25 = 42 +UC_S390X_REG_F26 = 43 +UC_S390X_REG_F27 = 44 +UC_S390X_REG_F28 = 45 +UC_S390X_REG_F29 = 46 +UC_S390X_REG_F30 = 47 +UC_S390X_REG_F31 = 48 + +# Access registers +UC_S390X_REG_A0 = 49 +UC_S390X_REG_A1 = 50 +UC_S390X_REG_A2 = 51 +UC_S390X_REG_A3 = 52 +UC_S390X_REG_A4 = 53 +UC_S390X_REG_A5 = 54 +UC_S390X_REG_A6 = 55 +UC_S390X_REG_A7 = 56 +UC_S390X_REG_A8 = 57 +UC_S390X_REG_A9 = 58 +UC_S390X_REG_A10 = 59 +UC_S390X_REG_A11 = 60 +UC_S390X_REG_A12 = 61 +UC_S390X_REG_A13 = 62 +UC_S390X_REG_A14 = 63 +UC_S390X_REG_A15 = 64 +UC_S390X_REG_PC = 65 +UC_S390X_REG_ENDING = 66 + +# Alias registers diff --git a/bindings/python/unicorn/unicorn_const.py b/bindings/python/unicorn/unicorn_const.py index 9baf4f68..1737a2c8 100644 --- a/bindings/python/unicorn/unicorn_const.py +++ b/bindings/python/unicorn/unicorn_const.py @@ -21,7 +21,8 @@ UC_ARCH_PPC = 5 UC_ARCH_SPARC = 6 UC_ARCH_M68K = 7 UC_ARCH_RISCV = 8 -UC_ARCH_MAX = 9 +UC_ARCH_S390X = 9 +UC_ARCH_MAX = 10 UC_MODE_LITTLE_ENDIAN = 0 UC_MODE_BIG_ENDIAN = 1073741824