diff options
| -rw-r--r-- | miasm2/ir/ir2C.py | 30 | ||||
| -rw-r--r-- | miasm2/ir/translators/C.py | 14 | ||||
| -rw-r--r-- | miasm2/jitter/JitCore.c | 126 | ||||
| -rw-r--r-- | miasm2/jitter/JitCore.h | 134 | ||||
| -rw-r--r-- | miasm2/jitter/Jittcc.c | 9 | ||||
| -rw-r--r-- | miasm2/jitter/arch/JitCore.c | 8 | ||||
| -rw-r--r-- | miasm2/jitter/arch/JitCore.h | 73 | ||||
| -rw-r--r-- | miasm2/jitter/arch/JitCore_arm.c | 242 | ||||
| -rw-r--r-- | miasm2/jitter/arch/JitCore_arm.h | 4 | ||||
| -rw-r--r-- | miasm2/jitter/arch/JitCore_mips32.c | 241 | ||||
| -rw-r--r-- | miasm2/jitter/arch/JitCore_mips32.h | 3 | ||||
| -rw-r--r-- | miasm2/jitter/arch/JitCore_msp430.c | 615 | ||||
| -rw-r--r-- | miasm2/jitter/arch/JitCore_msp430.h | 3 | ||||
| -rw-r--r-- | miasm2/jitter/arch/JitCore_x86.c | 275 | ||||
| -rw-r--r-- | miasm2/jitter/arch/JitCore_x86.h | 5 | ||||
| -rw-r--r-- | miasm2/jitter/jitcore.py | 10 | ||||
| -rw-r--r-- | miasm2/jitter/jitcore_python.py | 2 | ||||
| -rw-r--r-- | miasm2/jitter/jitcore_tcc.py | 5 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr_py.c | 1 | ||||
| -rwxr-xr-x | setup.py | 16 | ||||
| -rw-r--r-- | test/ir/ir2C.py | 4 |
21 files changed, 656 insertions, 1164 deletions
diff --git a/miasm2/ir/ir2C.py b/miasm2/ir/ir2C.py index 4c9dff8c..6cf3b4e6 100644 --- a/miasm2/ir/ir2C.py +++ b/miasm2/ir/ir2C.py @@ -28,12 +28,12 @@ for size in [8, 16, 32, 64]: def init_arch_C(arch): arch.id2Cid = {} for x in arch.regs.all_regs_ids + prefetch_id: - arch.id2Cid[x] = m2_expr.ExprId('vmcpu->' + str(x), x.size) + arch.id2Cid[x] = m2_expr.ExprId('((vm_cpu_t*)jitcpu->cpu)->' + str(x), x.size) arch.id2newCid = {} for x in arch.regs.all_regs_ids + prefetch_id: - arch.id2newCid[x] = m2_expr.ExprId('vmcpu->%s_new' % x, x.size) + arch.id2newCid[x] = m2_expr.ExprId('((vm_cpu_t*)jitcpu->cpu)->%s_new' % x, x.size) def patch_c_id(arch, e): @@ -49,7 +49,7 @@ mask_int = 0xffffffffffffffff pre_instr_test_exception = r""" // pre instruction test exception -if (vm_mngr->exception_flags) { +if (VM_exception_flag) { %s; return; } @@ -58,14 +58,14 @@ if (vm_mngr->exception_flags) { code_exception_fetch_mem_at_instr = r""" // except fetch mem at instr -if (vm_mngr->exception_flags & EXCEPT_DO_NOT_UPDATE_PC) { +if (VM_exception_flag & EXCEPT_DO_NOT_UPDATE_PC) { %s; return; } """ code_exception_fetch_mem_post_instr = r""" // except fetch mem post instr -if (vm_mngr->exception_flags) { +if (VM_exception_flag) { %s; return; } @@ -74,14 +74,14 @@ if (vm_mngr->exception_flags) { code_exception_fetch_mem_at_instr_noautomod = r""" // except fetch mem at instr noauto -if ((vm_mngr->exception_flags & ~EXCEPT_CODE_AUTOMOD) & EXCEPT_DO_NOT_UPDATE_PC) { +if ((VM_exception_flag & ~EXCEPT_CODE_AUTOMOD) & EXCEPT_DO_NOT_UPDATE_PC) { %s; return; } """ code_exception_fetch_mem_post_instr_noautomod = r""" // except post instr noauto -if (vm_mngr->exception_flags & ~EXCEPT_CODE_AUTOMOD) { +if (VM_exception_flag & ~EXCEPT_CODE_AUTOMOD) { %s; return; } @@ -90,7 +90,7 @@ if (vm_mngr->exception_flags & ~EXCEPT_CODE_AUTOMOD) { code_exception_at_instr = r""" // except at instr -if (vmcpu->exception_flags && vmcpu->exception_flags > EXCEPT_NUM_UPDT_EIP) { +if (CPU_exception_flag && CPU_exception_flag > EXCEPT_NUM_UPDT_EIP) { %s; return; } @@ -98,8 +98,8 @@ if (vmcpu->exception_flags && vmcpu->exception_flags > EXCEPT_NUM_UPDT_EIP) { code_exception_post_instr = r""" // except post instr -if (vmcpu->exception_flags) { - if (vmcpu->exception_flags > EXCEPT_NUM_UPDT_EIP) { +if (CPU_exception_flag) { + if (CPU_exception_flag > EXCEPT_NUM_UPDT_EIP) { %s; } else { @@ -111,15 +111,15 @@ if (vmcpu->exception_flags) { code_exception_at_instr_noautomod = r""" -if ((vmcpu->exception_flags & ~EXCEPT_CODE_AUTOMOD) && vmcpu->exception_flags > EXCEPT_NUM_UPDT_EIP) { +if ((CPU_exception_flag & ~EXCEPT_CODE_AUTOMOD) && (CPU_exception_flag > EXCEPT_NUM_UPDT_EIP)) { %s; return; } """ code_exception_post_instr_noautomod = r""" -if (vmcpu->exception_flags & ~EXCEPT_CODE_AUTOMOD) { - if (vmcpu->exception_flags > EXCEPT_NUM_UPDT_EIP) { +if (CPU_exception_flag & ~EXCEPT_CODE_AUTOMOD) { + if (CPU_exception_flag > EXCEPT_NUM_UPDT_EIP) { %s; } else { @@ -326,7 +326,7 @@ def Expr2C(ir_arch, l, exprs, gen_exception_code=False): if gen_exception_code: if set_exception_flags: if pc_is_dst: - post_instr.append("if (vm_mngr->exception_flags) { " + + post_instr.append("if (VM_exception_flag) { " + "/*pc = 0x%X; */return; }" % (l.offset)) else: e = set_pc(ir_arch, l.offset & mask_int) @@ -391,7 +391,7 @@ def ir2C(ir_arch, irbloc, lbl_done, lbl_done.add(l.offset) if log_regs: - out.append([r'dump_gpregs(vmcpu);']) + out.append([r'dump_gpregs(jitcpu->cpu);']) if log_mn: out.append(['printf("%.8X %s\\n");' % (l.offset, str(l))]) diff --git a/miasm2/ir/translators/C.py b/miasm2/ir/translators/C.py index 3de1dea4..4018454b 100644 --- a/miasm2/ir/translators/C.py +++ b/miasm2/ir/translators/C.py @@ -45,8 +45,8 @@ class TranslatorC(Translator): (expr.cond, expr.src1, expr.src2))) def from_ExprMem(self, expr): - return "MEM_LOOKUP_%.2d(vmcpu, %s)" % (expr.size, - self.from_expr(expr.arg)) + return "MEM_LOOKUP_%.2d(jitcpu, %s)" % (expr.size, + self.from_expr(expr.arg)) def from_ExprOp(self, expr): if len(expr.args) == 1: @@ -106,13 +106,13 @@ class TranslatorC(Translator): return "%s(%s, %s)" % (expr.op, self.from_expr(expr.args[0]), self.from_expr(expr.args[1])) elif expr.op == "segm": - return "segm2addr(vmcpu, %s, %s)" % ( + return "segm2addr(jitcpu, %s, %s)" % ( self.from_expr(expr.args[0]), self.from_expr(expr.args[1])) elif expr.op in ['udiv', 'umod', 'idiv', 'imod']: - return '%s%d(vmcpu, %s, %s)' % (expr.op, - expr.args[0].size, - self.from_expr(expr.args[0]), - self.from_expr(expr.args[1])) + return '%s%d(jitcpu, %s, %s)' % (expr.op, + expr.args[0].size, + self.from_expr(expr.args[0]), + self.from_expr(expr.args[1])) elif expr.op in ["bcdadd", "bcdadd_cf"]: return "%s_%d(%s, %s)" % (expr.op, expr.args[0].size, self.from_expr(expr.args[0]), diff --git a/miasm2/jitter/JitCore.c b/miasm2/jitter/JitCore.c new file mode 100644 index 00000000..25134869 --- /dev/null +++ b/miasm2/jitter/JitCore.c @@ -0,0 +1,126 @@ +#include <Python.h> +#include "structmember.h" +#include <stdint.h> +#include <inttypes.h> +#include "queue.h" +#include "vm_mngr.h" +#include "vm_mngr_py.h" +#include "JitCore.h" + + +void JitCpu_dealloc(JitCpu* self) +{ + self->ob_type->tp_free((PyObject*)self); +} + + +PyObject * JitCpu_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + JitCpu *self; + + self = (JitCpu *)type->tp_alloc(type, 0); + return (PyObject *)self; +} + +PyObject * JitCpu_get_vmmngr(JitCpu *self, void *closure) +{ + return self->pyvm; +} + +PyObject * JitCpu_set_vmmngr(JitCpu *self, PyObject *value, void *closure) +{ + self->pyvm = value; + return 0; +} + +PyObject * JitCpu_get_jitter(JitCpu *self, void *closure) +{ + return self->jitter; +} + +PyObject * JitCpu_set_jitter(JitCpu *self, PyObject *value, void *closure) +{ + self->jitter = value; + return 0; +} + + +void Resolve_dst(block_id* b, uint64_t addr, uint64_t is_local) +{ + b->address = addr; + b->is_local = is_local; +} + + + + +uint8_t __attribute__((weak)) MEM_LOOKUP_08(JitCpu* jitcpu, uint64_t addr) +{ + return vm_MEM_LOOKUP_08(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr); +} + +uint16_t __attribute__((weak)) MEM_LOOKUP_16(JitCpu* jitcpu, uint64_t addr) +{ + return vm_MEM_LOOKUP_16(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr); +} + +uint32_t __attribute__((weak)) MEM_LOOKUP_32(JitCpu* jitcpu, uint64_t addr) +{ + return vm_MEM_LOOKUP_32(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr); +} + +uint64_t __attribute__((weak)) MEM_LOOKUP_64(JitCpu* jitcpu, uint64_t addr) +{ + return vm_MEM_LOOKUP_64(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr); +} + +void __attribute__((weak)) MEM_WRITE_08(JitCpu* jitcpu, uint64_t addr, uint8_t src) +{ + vm_MEM_WRITE_08(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src); +} + +void __attribute__((weak)) MEM_WRITE_16(JitCpu* jitcpu, uint64_t addr, uint16_t src) +{ + vm_MEM_WRITE_16(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src); +} + +void __attribute__((weak)) MEM_WRITE_32(JitCpu* jitcpu, uint64_t addr, uint32_t src) +{ + vm_MEM_WRITE_32(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src); +} + +void __attribute__((weak)) MEM_WRITE_64(JitCpu* jitcpu, uint64_t addr, uint64_t src) +{ + vm_MEM_WRITE_64(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src); +} + + + + +PyObject* __attribute__((weak)) vm_get_mem(JitCpu *self, PyObject* args) +{ + PyObject *py_addr; + PyObject *py_len; + + uint64_t addr; + uint64_t size; + PyObject *obj_out; + char * buf_out; + int ret; + + if (!PyArg_ParseTuple(args, "OO", &py_addr, &py_len)) + return NULL; + + PyGetInt(py_addr, addr); + PyGetInt(py_len, size); + + ret = vm_read_mem(&(((VmMngr*)self->pyvm)->vm_mngr), addr, &buf_out, size); + if (ret < 0) { + PyErr_SetString(PyExc_RuntimeError, "cannot find address"); + return NULL; + } + + obj_out = PyString_FromStringAndSize(buf_out, size); + free(buf_out); + return obj_out; +} diff --git a/miasm2/jitter/JitCore.h b/miasm2/jitter/JitCore.h new file mode 100644 index 00000000..af87a9cb --- /dev/null +++ b/miasm2/jitter/JitCore.h @@ -0,0 +1,134 @@ +#ifndef JITCORE_H +#define JITCORE_H + +#define RAISE(errtype, msg) {PyObject* p; p = PyErr_Format( errtype, msg ); return p;} +#define RAISE_ret0(errtype, msg) {PyObject* p; p = PyErr_Format( errtype, msg ); return 0;} + + +#define PyGetInt(item, value) \ + if (PyInt_Check(item)){ \ + value = (uint64_t)PyInt_AsLong(item); \ + } \ + else if (PyLong_Check(item)){ \ + value = (uint64_t)PyLong_AsUnsignedLongLong(item); \ + } \ + else{ \ + RAISE(PyExc_TypeError,"arg must be int"); \ + } \ + + +#define PyGetInt_ret0(item, value) \ + if (PyInt_Check(item)){ \ + value = (uint64_t)PyInt_AsLong(item); \ + } \ + else if (PyLong_Check(item)){ \ + value = (uint64_t)PyLong_AsUnsignedLongLong(item); \ + } \ + else{ \ + printf("error\n"); return 0; \ + } \ + + + +#define getset_reg_u64(regname) \ + static PyObject *JitCpu_get_ ## regname (JitCpu *self, void *closure) \ + { \ + return PyLong_FromUnsignedLongLong((uint64_t)(((vm_cpu_t*)(self->cpu))-> regname )); \ + } \ + static int JitCpu_set_ ## regname (JitCpu *self, PyObject *value, void *closure) \ + { \ + uint64_t val; \ + PyGetInt_ret0(value, val); \ + ((vm_cpu_t*)(self->cpu))-> regname = val; \ + return 0; \ + } + +#define getset_reg_u32(regname) \ + static PyObject *JitCpu_get_ ## regname (JitCpu *self, void *closure) \ + { \ + return PyLong_FromUnsignedLongLong((uint32_t)(((vm_cpu_t*)(self->cpu))-> regname )); \ + } \ + static int JitCpu_set_ ## regname (JitCpu *self, PyObject *value, void *closure) \ + { \ + uint32_t val; \ + PyGetInt_ret0(value, val); \ + ((vm_cpu_t*)(self->cpu))-> regname = val; \ + return 0; \ + } + + +#define getset_reg_u16(regname) \ + static PyObject *JitCpu_get_ ## regname (JitCpu *self, void *closure) \ + { \ + return PyLong_FromUnsignedLongLong((uint16_t)(((vm_cpu_t*)(self->cpu))-> regname )); \ + } \ + static int JitCpu_set_ ## regname (JitCpu *self, PyObject *value, void *closure) \ + { \ + uint16_t val; \ + PyGetInt_ret0(value, val); \ + ((vm_cpu_t*)(self->cpu))-> regname = val; \ + return 0; \ + } + + +#define get_reg(reg) do { \ + o = PyLong_FromUnsignedLongLong((uint64_t)((vm_cpu_t*)(self->cpu))->reg); \ + PyDict_SetItemString(dict, #reg, o); \ + Py_DECREF(o); \ + } while(0); + + +#define get_reg_off(reg) do { \ + o = PyLong_FromUnsignedLongLong((uint64_t)offsetof(vm_cpu_t, reg)); \ + PyDict_SetItemString(dict, #reg, o); \ + Py_DECREF(o); \ + } while(0); + + +typedef struct { + uint8_t is_local; + uint64_t address; +} block_id; + +typedef struct { + PyObject_HEAD + PyObject *pyvm; + PyObject *jitter; + void* cpu; +} JitCpu; + + +typedef struct _reg_dict{ + char* name; + size_t offset; +} reg_dict; + + + +void JitCpu_dealloc(JitCpu* self); +PyObject * JitCpu_new(PyTypeObject *type, PyObject *args, PyObject *kwds); +PyObject * JitCpu_get_vmmngr(JitCpu *self, void *closure); +PyObject * JitCpu_set_vmmngr(JitCpu *self, PyObject *value, void *closure); +PyObject * JitCpu_get_jitter(JitCpu *self, void *closure); +PyObject * JitCpu_set_jitter(JitCpu *self, PyObject *value, void *closure); +void Resolve_dst(block_id* BlockDst, uint64_t addr, uint64_t is_local); + + + +uint8_t MEM_LOOKUP_08(JitCpu* jitcpu, uint64_t addr); +uint16_t MEM_LOOKUP_16(JitCpu* jitcpu, uint64_t addr); +uint32_t MEM_LOOKUP_32(JitCpu* jitcpu, uint64_t addr); +uint64_t MEM_LOOKUP_64(JitCpu* jitcpu, uint64_t addr); +void MEM_WRITE_08(JitCpu* jitcpu, uint64_t addr, uint8_t src); +void MEM_WRITE_16(JitCpu* jitcpu, uint64_t addr, uint16_t src); +void MEM_WRITE_32(JitCpu* jitcpu, uint64_t addr, uint32_t src); +void MEM_WRITE_64(JitCpu* jitcpu, uint64_t addr, uint64_t src); +PyObject* vm_get_mem(JitCpu *self, PyObject* args); + + + + +#define VM_exception_flag (((VmMngr*)jitcpu->pyvm)->vm_mngr.exception_flags) +#define CPU_exception_flag (((vm_cpu_t*)jitcpu->cpu)->exception_flags) + +#endif diff --git a/miasm2/jitter/Jittcc.c b/miasm2/jitter/Jittcc.c index 49035fc4..d146aaf4 100644 --- a/miasm2/jitter/Jittcc.c +++ b/miasm2/jitter/Jittcc.c @@ -127,14 +127,13 @@ typedef struct { PyObject* tcc_exec_bloc(PyObject* self, PyObject* args) { - void (*func)(block_id*, void*, void*); - uint64_t vm; - uint64_t cpu; + void (*func)(block_id*, PyObject*); + PyObject* jitcpu; block_id BlockDst = {0, 0}; - if (!PyArg_ParseTuple(args, "KKK", &func, &cpu, &vm)) + if (!PyArg_ParseTuple(args, "KO", &func, &jitcpu)) return NULL; - func(&BlockDst, (void*)cpu, (void*)vm); + func(&BlockDst, jitcpu); if (BlockDst.is_local == 1) { fprintf(stderr, "return on local label!\n"); diff --git a/miasm2/jitter/arch/JitCore.c b/miasm2/jitter/arch/JitCore.c deleted file mode 100644 index 6d3b0df4..00000000 --- a/miasm2/jitter/arch/JitCore.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <Python.h> -#include "JitCore.h" - -void Resolve_dst(block_id* b, uint64_t addr, uint64_t is_local) -{ - b->address = addr; - b->is_local = is_local; -} diff --git a/miasm2/jitter/arch/JitCore.h b/miasm2/jitter/arch/JitCore.h deleted file mode 100644 index 735cbd27..00000000 --- a/miasm2/jitter/arch/JitCore.h +++ /dev/null @@ -1,73 +0,0 @@ - -#define PyGetInt(item, value) \ - if (PyInt_Check(item)){ \ - value = (uint64_t)PyInt_AsLong(item); \ - } \ - else if (PyLong_Check(item)){ \ - value = (uint64_t)PyLong_AsUnsignedLongLong(item); \ - } \ - else{ \ - RAISE(PyExc_TypeError,"arg must be int"); \ - } \ - - -#define PyGetInt_ret0(item, value) \ - if (PyInt_Check(item)){ \ - value = (uint64_t)PyInt_AsLong(item); \ - } \ - else if (PyLong_Check(item)){ \ - value = (uint64_t)PyLong_AsUnsignedLongLong(item); \ - } \ - else{ \ - printf("error\n"); return 0; \ - } \ - - - -#define getset_reg_u64(regname) \ - static PyObject *JitCpu_get_ ## regname (JitCpu *self, void *closure) \ - { \ - return PyLong_FromUnsignedLongLong((uint64_t)(self->vmcpu. regname )); \ - } \ - static int JitCpu_set_ ## regname (JitCpu *self, PyObject *value, void *closure) \ - { \ - uint64_t val; \ - PyGetInt_ret0(value, val); \ - self->vmcpu. regname = val; \ - return 0; \ - } - -#define getset_reg_u32(regname) \ - static PyObject *JitCpu_get_ ## regname (JitCpu *self, void *closure) \ - { \ - return PyLong_FromUnsignedLongLong((uint32_t)(self->vmcpu. regname )); \ - } \ - static int JitCpu_set_ ## regname (JitCpu *self, PyObject *value, void *closure) \ - { \ - uint32_t val; \ - PyGetInt_ret0(value, val); \ - self->vmcpu. regname = val; \ - return 0; \ - } - - -#define getset_reg_u16(regname) \ - static PyObject *JitCpu_get_ ## regname (JitCpu *self, void *closure) \ - { \ - return PyLong_FromUnsignedLongLong((uint16_t)(self->vmcpu. regname )); \ - } \ - static int JitCpu_set_ ## regname (JitCpu *self, PyObject *value, void *closure) \ - { \ - uint16_t val; \ - PyGetInt_ret0(value, val); \ - self->vmcpu. regname = val; \ - return 0; \ - } - - -typedef struct { - uint8_t is_local; - uint64_t address; -} block_id; - -void Resolve_dst(block_id* BlockDst, uint64_t addr, uint64_t is_local); diff --git a/miasm2/jitter/arch/JitCore_arm.c b/miasm2/jitter/arch/JitCore_arm.c index 9d23ff44..92027c25 100644 --- a/miasm2/jitter/arch/JitCore_arm.c +++ b/miasm2/jitter/arch/JitCore_arm.c @@ -1,5 +1,5 @@ #include <Python.h> -#include "JitCore.h" +#include "../JitCore.h" #include "structmember.h" #include <stdint.h> #include <inttypes.h> @@ -8,24 +8,7 @@ #include "../vm_mngr_py.h" #include "JitCore_arm.h" -#define RAISE(errtype, msg) {PyObject* p; p = PyErr_Format( errtype, msg ); return p;} -typedef struct _reg_dict{ - char* name; - unsigned long offset; -} reg_dict; - - -#define PyGetInt(item, value) \ - if (PyInt_Check(item)){ \ - value = (uint64_t)PyInt_AsLong(item); \ - } \ - else if (PyLong_Check(item)){ \ - value = (uint64_t)PyLong_AsUnsignedLongLong(item); \ - } \ - else{ \ - RAISE(PyExc_TypeError,"arg must be int"); \ - } \ reg_dict gpreg_dict[] = { {.name = "R0", .offset = offsetof(vm_cpu_t, R0)}, {.name = "R1", .offset = offsetof(vm_cpu_t, R1)}, @@ -52,19 +35,6 @@ reg_dict gpreg_dict[] = { {.name = "R0", .offset = offsetof(vm_cpu_t, R0)}, /************************** JitCpu object **************************/ -typedef struct { - PyObject_HEAD - PyObject *cpu; /* cpu */ - vm_cpu_t vmcpu; -} JitCpu; - - - -#define get_reg(reg) do { \ - o = PyLong_FromUnsignedLongLong((uint64_t)self->vmcpu.reg); \ - PyDict_SetItemString(dict, #reg, o); \ - Py_DECREF(o); \ - } while(0); @@ -98,13 +68,18 @@ PyObject* cpu_get_gpreg(JitCpu* self) return dict; } -PyObject* _vm_set_gpreg(JitCpu* self, PyObject *dict) + + +PyObject* cpu_set_gpreg(JitCpu* self, PyObject *args) { + PyObject* dict; PyObject *d_key, *d_value = NULL; Py_ssize_t pos = 0; uint64_t val; unsigned int i, found; + if (!PyArg_ParseTuple(args, "O", &dict)) + return NULL; if(!PyDict_Check(dict)) RAISE(PyExc_TypeError, "arg must be dict"); while(PyDict_Next(dict, &pos, &d_key, &d_value)){ @@ -113,12 +88,11 @@ PyObject* _vm_set_gpreg(JitCpu* self, PyObject *dict) PyGetInt(d_value, val); - found = 0; for (i=0; i < sizeof(gpreg_dict)/sizeof(reg_dict); i++){ if (strcmp(PyString_AsString(d_key), gpreg_dict[i].name)) continue; - *((uint32_t*)(((char*)&(self->vmcpu)) + gpreg_dict[i].offset)) = val; + *((uint32_t*)(((char*)(self->cpu)) + gpreg_dict[i].offset)) = val; found = 1; break; } @@ -128,48 +102,17 @@ PyObject* _vm_set_gpreg(JitCpu* self, PyObject *dict) fprintf(stderr, "unkown key: %s\n", PyString_AsString(d_key)); RAISE(PyExc_ValueError, "unkown reg"); } - return NULL; -} - -PyObject* cpu_set_gpreg(JitCpu* self, PyObject *args) -{ - PyObject* dict; - if (!PyArg_ParseTuple(args, "O", &dict)) - return NULL; - _vm_set_gpreg(self, dict); - Py_INCREF(Py_None); - return Py_None; -} - - -PyObject* cpu_set_exception(JitCpu* self, PyObject* args) -{ - PyObject *item1; - uint64_t i; - - if (!PyArg_ParseTuple(args, "O", &item1)) - return NULL; - - PyGetInt(item1, i); - - self->vmcpu.exception_flags = i; - Py_INCREF(Py_None); - return Py_None; -} - -PyObject* cpu_get_exception(JitCpu* self, PyObject* args) -{ - return PyLong_FromUnsignedLongLong((uint64_t)self->vmcpu.exception_flags); + Py_INCREF(Py_None); + return Py_None; } PyObject * cpu_init_regs(JitCpu* self) { - memset(&self->vmcpu, 0, sizeof(vm_cpu_t)); + memset(self->cpu, 0, sizeof(vm_cpu_t)); Py_INCREF(Py_None); return Py_None; - } void dump_gpregs(vm_cpu_t* vmcpu) @@ -191,129 +134,77 @@ PyObject * cpu_dump_gpregs(JitCpu* self, PyObject* args) { vm_cpu_t* vmcpu; - vmcpu = &self->vmcpu; + vmcpu = self->cpu; dump_gpregs(vmcpu); Py_INCREF(Py_None); return Py_None; } - -static void -JitCpu_dealloc(JitCpu* self) -{ - self->ob_type->tp_free((PyObject*)self); -} - - -static PyObject * -JitCpu_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - JitCpu *self; - - self = (JitCpu *)type->tp_alloc(type, 0); - return (PyObject *)self; -} - -static PyObject * -JitCpu_get_cpu(JitCpu *self, void *closure) -{ - return PyLong_FromUnsignedLongLong((uint64_t)&(self->vmcpu)); -} - -static int -JitCpu_set_cpu(JitCpu *self, PyObject *value, void *closure) -{ - PyErr_SetString(PyExc_TypeError, "immutable cpu"); - return -1; -} - - -static PyObject * -JitCpu_get_vmmngr(JitCpu *self, void *closure) +PyObject* cpu_set_exception(JitCpu* self, PyObject* args) { - return self->vmcpu.pyvm; -} + PyObject *item1; + uint64_t i; -static PyObject * -JitCpu_set_vmmngr(JitCpu *self, PyObject *value, void *closure) -{ - self->vmcpu.pyvm = value; - return 0; -} + if (!PyArg_ParseTuple(args, "O", &item1)) + return NULL; -static PyObject * -JitCpu_get_jitter(JitCpu *self, void *closure) -{ - return self->vmcpu.jitter; -} + PyGetInt(item1, i); -static PyObject * -JitCpu_set_jitter(JitCpu *self, PyObject *value, void *closure) -{ - self->vmcpu.jitter = value; - return 0; + ((vm_cpu_t*)self->cpu)->exception_flags = i; + Py_INCREF(Py_None); + return Py_None; } -uint8_t MEM_LOOKUP_08(vm_cpu_t* vmcpu, uint64_t addr) +PyObject* cpu_get_exception(JitCpu* self, PyObject* args) { - return vm_MEM_LOOKUP_08(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr); + return PyLong_FromUnsignedLongLong((uint64_t)(((vm_cpu_t*)self->cpu)->exception_flags)); } -uint16_t MEM_LOOKUP_16(vm_cpu_t* vmcpu, uint64_t addr) -{ - return vm_MEM_LOOKUP_16(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr); -} -uint32_t MEM_LOOKUP_32(vm_cpu_t* vmcpu, uint64_t addr) -{ - return vm_MEM_LOOKUP_32(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr); -} - -uint64_t MEM_LOOKUP_64(vm_cpu_t* vmcpu, uint64_t addr) -{ - return vm_MEM_LOOKUP_64(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr); -} -void check_automod(vm_cpu_t* vmcpu, uint64_t addr, int size) +void check_automod(JitCpu* jitcpu, uint64_t addr, int size) { PyObject *result; - if (!((((VmMngr*)vmcpu->pyvm)->vm_mngr).exception_flags & EXCEPT_CODE_AUTOMOD)) + if (!(((VmMngr*)jitcpu->pyvm)->vm_mngr.exception_flags & EXCEPT_CODE_AUTOMOD)) return; - result = PyObject_CallMethod((PyObject *)vmcpu->jitter, "automod_cb", "LL", addr, size); + result = PyObject_CallMethod(jitcpu->jitter, "automod_cb", "LL", addr, size); Py_DECREF(result); } -void MEM_WRITE_08(vm_cpu_t* vmcpu, uint64_t addr, uint8_t src) +void MEM_WRITE_08(JitCpu* jitcpu, uint64_t addr, uint8_t src) { - vm_MEM_WRITE_08(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr, src); - check_automod(vmcpu, addr, 8); + vm_MEM_WRITE_08(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src); + check_automod(jitcpu, addr, 8); } -void MEM_WRITE_16(vm_cpu_t* vmcpu, uint64_t addr, uint16_t src) +void MEM_WRITE_16(JitCpu* jitcpu, uint64_t addr, uint16_t src) { - vm_MEM_WRITE_16(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr, src); - check_automod(vmcpu, addr, 16); + vm_MEM_WRITE_16(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src); + check_automod(jitcpu, addr, 16); } -void MEM_WRITE_32(vm_cpu_t* vmcpu, uint64_t addr, uint32_t src) +void MEM_WRITE_32(JitCpu* jitcpu, uint64_t addr, uint32_t src) { - vm_MEM_WRITE_32(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr, src); - check_automod(vmcpu, addr, 32); + vm_MEM_WRITE_32(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src); + check_automod(jitcpu, addr, 32); } -void MEM_WRITE_64(vm_cpu_t* vmcpu, uint64_t addr, uint64_t src) +void MEM_WRITE_64(JitCpu* jitcpu, uint64_t addr, uint64_t src) { - vm_MEM_WRITE_64(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr, src); - check_automod(vmcpu, addr, 64); + vm_MEM_WRITE_64(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src); + check_automod(jitcpu, addr, 64); } + + + PyObject* vm_set_mem(JitCpu *self, PyObject* args) { PyObject *py_addr; @@ -336,46 +227,15 @@ PyObject* vm_set_mem(JitCpu *self, PyObject* args) size = PyString_Size(py_buffer); PyString_AsStringAndSize(py_buffer, &buffer, &py_length); - ret = vm_write_mem(&(((VmMngr*)self->vmcpu.pyvm)->vm_mngr), addr, buffer, size); + ret = vm_write_mem(&(((VmMngr*)self->pyvm)->vm_mngr), addr, buffer, size); if (ret < 0) RAISE(PyExc_TypeError,"arg must be str"); - check_automod(&self->vmcpu, addr, size*8); + check_automod(self, addr, size*8); Py_INCREF(Py_None); return Py_None; } -PyObject* vm_get_mem(JitCpu *self, PyObject* args) -{ - PyObject *py_addr; - PyObject *py_len; - - uint64_t addr; - uint64_t size; - PyObject *obj_out; - char * buf_out; - int ret; - - if (!PyArg_ParseTuple(args, "OO", &py_addr, &py_len)) - return NULL; - - PyGetInt(py_addr, addr); - PyGetInt(py_len, size); - - ret = vm_read_mem(&(((VmMngr*)self->vmcpu.pyvm)->vm_mngr), addr, &buf_out, size); - if (ret < 0) { - free(buf_out); - PyErr_SetString(PyExc_RuntimeError, "cannot find address"); - return NULL; - } - - obj_out = PyString_FromStringAndSize(buf_out, size); - free(buf_out); - return obj_out; -} - - - static PyMemberDef JitCpu_members[] = { {NULL} /* Sentinel */ }; @@ -403,6 +263,11 @@ static PyMethodDef JitCpu_methods[] = { static int JitCpu_init(JitCpu *self, PyObject *args, PyObject *kwds) { + self->cpu = malloc(sizeof(vm_cpu_t)); + if (self->cpu == NULL) { + fprintf(stderr, "cannot alloc vm_cpu_t\n"); + exit(0); + } return 0; } @@ -429,13 +294,6 @@ getset_reg_u32(of); getset_reg_u32(cf); - -#define get_reg_off(reg) do { \ - o = PyLong_FromUnsignedLongLong((uint64_t)offsetof(vm_cpu_t, reg)); \ - PyDict_SetItemString(dict, #reg, o); \ - Py_DECREF(o); \ - } while(0); - PyObject* get_gpreg_offset_all(void) { PyObject *dict = PyDict_New(); @@ -583,10 +441,6 @@ PyObject* get_gpreg_offset_all(void) static PyGetSetDef JitCpu_getseters[] = { - {"cpu", - (getter)JitCpu_get_cpu, (setter)JitCpu_set_cpu, - "first name", - NULL}, {"vmmngr", (getter)JitCpu_get_vmmngr, (setter)JitCpu_set_vmmngr, "vmmngr", diff --git a/miasm2/jitter/arch/JitCore_arm.h b/miasm2/jitter/arch/JitCore_arm.h index 32aecfc7..dde112ef 100644 --- a/miasm2/jitter/arch/JitCore_arm.h +++ b/miasm2/jitter/arch/JitCore_arm.h @@ -137,10 +137,6 @@ typedef struct { uint64_t pfmem64_18; uint64_t pfmem64_19; - - PyObject *pyvm; - PyObject *jitter; - }vm_cpu_t; diff --git a/miasm2/jitter/arch/JitCore_mips32.c b/miasm2/jitter/arch/JitCore_mips32.c index ecc7500c..4cd016cf 100644 --- a/miasm2/jitter/arch/JitCore_mips32.c +++ b/miasm2/jitter/arch/JitCore_mips32.c @@ -1,5 +1,5 @@ #include <Python.h> -#include "JitCore.h" +#include "../JitCore.h" #include "structmember.h" #include <stdint.h> #include <inttypes.h> @@ -8,25 +8,6 @@ #include "../vm_mngr_py.h" #include "JitCore_mips32.h" -#define RAISE(errtype, msg) {PyObject* p; p = PyErr_Format( errtype, msg ); return p;} - -typedef struct _reg_dict{ - char* name; - unsigned long offset; -} reg_dict; - - -#define PyGetInt(item, value) \ - if (PyInt_Check(item)){ \ - value = (uint64_t)PyInt_AsLong(item); \ - } \ - else if (PyLong_Check(item)){ \ - value = (uint64_t)PyLong_AsUnsignedLongLong(item); \ - } \ - else{ \ - RAISE(PyExc_TypeError,"arg must be int"); \ - } \ - reg_dict gpreg_dict[] = { {.name = "ZERO", .offset = offsetof(vm_cpu_t, ZERO)}, @@ -69,20 +50,6 @@ reg_dict gpreg_dict[] = { {.name = "ZERO", .offset = offsetof(vm_cpu_t, ZERO)}, /************************** JitCpu object **************************/ -typedef struct { - PyObject_HEAD - PyObject *cpu; /* cpu */ - vm_cpu_t vmcpu; -} JitCpu; - - - -#define get_reg(reg) do { \ - o = PyLong_FromUnsignedLongLong((uint32_t)self->vmcpu.reg); \ - PyDict_SetItemString(dict, #reg, o); \ - Py_DECREF(o); \ - } while(0); - PyObject* cpu_get_gpreg(JitCpu* self) @@ -130,13 +97,19 @@ PyObject* cpu_get_gpreg(JitCpu* self) return dict; } -PyObject* _vm_set_gpreg(JitCpu* self, PyObject *dict) + + + +PyObject* cpu_set_gpreg(JitCpu* self, PyObject *args) { + PyObject* dict; PyObject *d_key, *d_value = NULL; Py_ssize_t pos = 0; uint64_t val; unsigned int i, found; + if (!PyArg_ParseTuple(args, "O", &dict)) + return NULL; if(!PyDict_Check(dict)) RAISE(PyExc_TypeError, "arg must be dict"); while(PyDict_Next(dict, &pos, &d_key, &d_value)){ @@ -145,12 +118,11 @@ PyObject* _vm_set_gpreg(JitCpu* self, PyObject *dict) PyGetInt(d_value, val); - found = 0; for (i=0; i < sizeof(gpreg_dict)/sizeof(reg_dict); i++){ if (strcmp(PyString_AsString(d_key), gpreg_dict[i].name)) continue; - *((uint32_t*)(((char*)&(self->vmcpu)) + gpreg_dict[i].offset)) = val; + *((uint32_t*)(((char*)(self->cpu)) + gpreg_dict[i].offset)) = val; found = 1; break; } @@ -160,50 +132,23 @@ PyObject* _vm_set_gpreg(JitCpu* self, PyObject *dict) fprintf(stderr, "unkown key: %s\n", PyString_AsString(d_key)); RAISE(PyExc_ValueError, "unkown reg"); } - return NULL; + Py_INCREF(Py_None); + return Py_None; } -PyObject* cpu_set_gpreg(JitCpu* self, PyObject *args) -{ - PyObject* dict; - if (!PyArg_ParseTuple(args, "O", &dict)) - return NULL; - _vm_set_gpreg(self, dict); - Py_INCREF(Py_None); - return Py_None; -} -PyObject* cpu_set_exception(JitCpu* self, PyObject* args) -{ - PyObject *item1; - uint64_t i; - - if (!PyArg_ParseTuple(args, "O", &item1)) - return NULL; - - PyGetInt(item1, i); - - self->vmcpu.exception_flags = i; - Py_INCREF(Py_None); - return Py_None; -} - -PyObject* cpu_get_exception(JitCpu* self, PyObject* args) -{ - return PyLong_FromUnsignedLongLong((uint32_t)self->vmcpu.exception_flags); -} - PyObject * cpu_init_regs(JitCpu* self) { - memset(&self->vmcpu, 0, sizeof(vm_cpu_t)); + memset(self->cpu, 0, sizeof(vm_cpu_t)); Py_INCREF(Py_None); return Py_None; } + void dump_gpregs(vm_cpu_t* vmcpu) { @@ -232,130 +177,74 @@ PyObject * cpu_dump_gpregs(JitCpu* self, PyObject* args) { vm_cpu_t* vmcpu; - vmcpu = &self->vmcpu; + vmcpu = self->cpu; dump_gpregs(vmcpu); Py_INCREF(Py_None); return Py_None; } - -static void -JitCpu_dealloc(JitCpu* self) -{ - self->ob_type->tp_free((PyObject*)self); -} - - -static PyObject * -JitCpu_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - JitCpu *self; - - self = (JitCpu *)type->tp_alloc(type, 0); - return (PyObject *)self; -} - -static PyObject * -JitCpu_get_cpu(JitCpu *self, void *closure) -{ - return PyLong_FromUnsignedLongLong((uint64_t)&(self->vmcpu)); -} - -static int -JitCpu_set_cpu(JitCpu *self, PyObject *value, void *closure) -{ - PyErr_SetString(PyExc_TypeError, "immutable cpu"); - return -1; -} - - - -static PyObject * -JitCpu_get_vmmngr(JitCpu *self, void *closure) +PyObject* cpu_set_exception(JitCpu* self, PyObject* args) { - return self->vmcpu.pyvm; -} + PyObject *item1; + uint64_t i; -static PyObject * -JitCpu_set_vmmngr(JitCpu *self, PyObject *value, void *closure) -{ - self->vmcpu.pyvm = value; - return 0; -} + if (!PyArg_ParseTuple(args, "O", &item1)) + return NULL; -static PyObject * -JitCpu_get_jitter(JitCpu *self, void *closure) -{ - return self->vmcpu.jitter; -} + PyGetInt(item1, i); -static PyObject * -JitCpu_set_jitter(JitCpu *self, PyObject *value, void *closure) -{ - self->vmcpu.jitter = value; - return 0; + ((vm_cpu_t*)self->cpu)->exception_flags = i; + Py_INCREF(Py_None); + return Py_None; } -uint8_t MEM_LOOKUP_08(vm_cpu_t* vmcpu, uint64_t addr) +PyObject* cpu_get_exception(JitCpu* self, PyObject* args) { - return vm_MEM_LOOKUP_08(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr); + return PyLong_FromUnsignedLongLong((uint64_t)(((vm_cpu_t*)self->cpu)->exception_flags)); } -uint16_t MEM_LOOKUP_16(vm_cpu_t* vmcpu, uint64_t addr) -{ - return vm_MEM_LOOKUP_16(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr); -} -uint32_t MEM_LOOKUP_32(vm_cpu_t* vmcpu, uint64_t addr) -{ - return vm_MEM_LOOKUP_32(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr); -} -uint64_t MEM_LOOKUP_64(vm_cpu_t* vmcpu, uint64_t addr) -{ - return vm_MEM_LOOKUP_64(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr); -} -void check_automod(vm_cpu_t* vmcpu, uint64_t addr, int size) +void check_automod(JitCpu* jitcpu, uint64_t addr, int size) { PyObject *result; - if (!((((VmMngr*)vmcpu->pyvm)->vm_mngr).exception_flags & EXCEPT_CODE_AUTOMOD)) + if (!(((VmMngr*)jitcpu->pyvm)->vm_mngr.exception_flags & EXCEPT_CODE_AUTOMOD)) return; - result = PyObject_CallMethod((PyObject *)vmcpu->jitter, "automod_cb", "LL", addr, size); + result = PyObject_CallMethod(jitcpu->jitter, "automod_cb", "LL", addr, size); Py_DECREF(result); } -void MEM_WRITE_08(vm_cpu_t* vmcpu, uint64_t addr, uint8_t src) +void MEM_WRITE_08(JitCpu* jitcpu, uint64_t addr, uint8_t src) { - vm_MEM_WRITE_08(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr, src); - check_automod(vmcpu, addr, 8); + vm_MEM_WRITE_08(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src); + check_automod(jitcpu, addr, 8); } -void MEM_WRITE_16(vm_cpu_t* vmcpu, uint64_t addr, uint16_t src) +void MEM_WRITE_16(JitCpu* jitcpu, uint64_t addr, uint16_t src) { - vm_MEM_WRITE_16(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr, src); - check_automod(vmcpu, addr, 16); + vm_MEM_WRITE_16(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src); + check_automod(jitcpu, addr, 16); } -void MEM_WRITE_32(vm_cpu_t* vmcpu, uint64_t addr, uint32_t src) +void MEM_WRITE_32(JitCpu* jitcpu, uint64_t addr, uint32_t src) { - vm_MEM_WRITE_32(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr, src); - check_automod(vmcpu, addr, 32); + vm_MEM_WRITE_32(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src); + check_automod(jitcpu, addr, 32); } -void MEM_WRITE_64(vm_cpu_t* vmcpu, uint64_t addr, uint64_t src) +void MEM_WRITE_64(JitCpu* jitcpu, uint64_t addr, uint64_t src) { - vm_MEM_WRITE_64(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr, src); - check_automod(vmcpu, addr, 64); + vm_MEM_WRITE_64(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src); + check_automod(jitcpu, addr, 64); } - PyObject* vm_set_mem(JitCpu *self, PyObject* args) { PyObject *py_addr; @@ -378,44 +267,15 @@ PyObject* vm_set_mem(JitCpu *self, PyObject* args) size = PyString_Size(py_buffer); PyString_AsStringAndSize(py_buffer, &buffer, &py_length); - ret = vm_write_mem(&(((VmMngr*)self->vmcpu.pyvm)->vm_mngr), addr, buffer, size); + ret = vm_write_mem(&(((VmMngr*)self->pyvm)->vm_mngr), addr, buffer, size); if (ret < 0) RAISE(PyExc_TypeError,"arg must be str"); - check_automod(&self->vmcpu, addr, size*8); + check_automod(self, addr, size*8); Py_INCREF(Py_None); return Py_None; } -PyObject* vm_get_mem(JitCpu *self, PyObject* args) -{ - PyObject *py_addr; - PyObject *py_len; - - uint64_t addr; - uint64_t size; - PyObject *obj_out; - char * buf_out; - int ret; - - if (!PyArg_ParseTuple(args, "OO", &py_addr, &py_len)) - return NULL; - - PyGetInt(py_addr, addr); - PyGetInt(py_len, size); - - ret = vm_read_mem(&(((VmMngr*)self->vmcpu.pyvm)->vm_mngr), addr, &buf_out, size); - if (ret < 0) { - free(buf_out); - PyErr_SetString(PyExc_RuntimeError, "cannot find address"); - return NULL; - } - - obj_out = PyString_FromStringAndSize(buf_out, size); - free(buf_out); - return obj_out; -} - static PyMemberDef JitCpu_members[] = { {NULL} /* Sentinel */ }; @@ -440,9 +300,15 @@ static PyMethodDef JitCpu_methods[] = { {NULL} /* Sentinel */ }; + static int JitCpu_init(JitCpu *self, PyObject *args, PyObject *kwds) { + self->cpu = malloc(sizeof(vm_cpu_t)); + if (self->cpu == NULL) { + fprintf(stderr, "cannot alloc vm_cpu_t\n"); + exit(0); + } return 0; } @@ -484,13 +350,6 @@ getset_reg_u32(R_LO); getset_reg_u32(R_HI); - -#define get_reg_off(reg) do { \ - o = PyLong_FromUnsignedLongLong((uint64_t)offsetof(vm_cpu_t, reg)); \ - PyDict_SetItemString(dict, #reg, o); \ - Py_DECREF(o); \ - } while(0); - PyObject* get_gpreg_offset_all(void) { PyObject *dict = PyDict_New(); @@ -668,10 +527,6 @@ PyObject* get_gpreg_offset_all(void) static PyGetSetDef JitCpu_getseters[] = { - {"cpu", - (getter)JitCpu_get_cpu, (setter)JitCpu_set_cpu, - "first name", - NULL}, {"vmmngr", (getter)JitCpu_get_vmmngr, (setter)JitCpu_set_vmmngr, "vmmngr", diff --git a/miasm2/jitter/arch/JitCore_mips32.h b/miasm2/jitter/arch/JitCore_mips32.h index 7cc9740d..6b7a6200 100644 --- a/miasm2/jitter/arch/JitCore_mips32.h +++ b/miasm2/jitter/arch/JitCore_mips32.h @@ -235,9 +235,6 @@ typedef struct { double F30_new; double F31_new; - PyObject *pyvm; - PyObject *jitter; - }vm_cpu_t; diff --git a/miasm2/jitter/arch/JitCore_msp430.c b/miasm2/jitter/arch/JitCore_msp430.c index 94a1b4e2..e4f26de1 100644 --- a/miasm2/jitter/arch/JitCore_msp430.c +++ b/miasm2/jitter/arch/JitCore_msp430.c @@ -1,5 +1,5 @@ #include <Python.h> -#include "JitCore.h" +#include "../JitCore.h" #include "structmember.h" #include <stdint.h> #include <inttypes.h> @@ -8,24 +8,6 @@ #include "../vm_mngr_py.h" #include "JitCore_msp430.h" -#define RAISE(errtype, msg) {PyObject* p; p = PyErr_Format( errtype, msg ); return p;} - -typedef struct _reg_dict{ - char* name; - unsigned long offset; -} reg_dict; - - -#define PyGetInt(item, value) \ - if (PyInt_Check(item)){ \ - value = (uint64_t)PyInt_AsLong(item); \ - } \ - else if (PyLong_Check(item)){ \ - value = (uint64_t)PyLong_AsUnsignedLongLong(item); \ - } \ - else{ \ - RAISE(PyExc_TypeError,"arg must be int"); \ - } \ reg_dict gpreg_dict[] = { {.name = "PC", .offset = offsetof(vm_cpu_t, PC)}, {.name = "SP", .offset = offsetof(vm_cpu_t, SP)}, @@ -60,20 +42,6 @@ reg_dict gpreg_dict[] = { {.name = "PC", .offset = offsetof(vm_cpu_t, PC)}, /************************** JitCpu object **************************/ -typedef struct { - PyObject_HEAD - PyObject *cpu; /* cpu */ - vm_cpu_t vmcpu; -} JitCpu; - - - -#define get_reg(reg) do { \ - o = PyLong_FromUnsignedLongLong((uint64_t)self->vmcpu.reg); \ - PyDict_SetItemString(dict, #reg, o); \ - Py_DECREF(o); \ - } while(0); - PyObject* cpu_get_gpreg(JitCpu* self) @@ -114,161 +82,17 @@ PyObject* cpu_get_gpreg(JitCpu* self) return dict; } -#define get_reg_off(reg) do { \ - o = PyLong_FromUnsignedLongLong((uint64_t)offsetof(vm_cpu_t, reg)); \ - PyDict_SetItemString(dict, #reg, o); \ - Py_DECREF(o); \ - } while(0); - - -PyObject* get_gpreg_offset_all(void) -{ - PyObject *dict = PyDict_New(); - PyObject *o; - get_reg_off(exception_flags); - get_reg_off(exception_flags_new); - get_reg_off(PC); - get_reg_off(SP); - get_reg_off(R3); - get_reg_off(R4); - get_reg_off(R5); - get_reg_off(R6); - get_reg_off(R7); - get_reg_off(R8); - get_reg_off(R9); - get_reg_off(R10); - get_reg_off(R11); - get_reg_off(R12); - get_reg_off(R13); - get_reg_off(R14); - get_reg_off(R15); - get_reg_off(PC_new); - get_reg_off(SP_new); - get_reg_off(SR_new); - get_reg_off(R3_new); - get_reg_off(R4_new); - get_reg_off(R5_new); - get_reg_off(R6_new); - get_reg_off(R7_new); - get_reg_off(R8_new); - get_reg_off(R9_new); - get_reg_off(R10_new); - get_reg_off(R11_new); - get_reg_off(R12_new); - get_reg_off(R13_new); - get_reg_off(R14_new); - get_reg_off(R15_new); - get_reg_off(zf); - get_reg_off(nf); - get_reg_off(of); - get_reg_off(cf); - get_reg_off(cpuoff); - get_reg_off(gie); - get_reg_off(osc); - get_reg_off(scg0); - get_reg_off(scg1); - get_reg_off(res); - get_reg_off(zf_new); - get_reg_off(nf_new); - get_reg_off(of_new); - get_reg_off(cf_new); - get_reg_off(cpuoff_new); - get_reg_off(gie_new); - get_reg_off(osc_new); - get_reg_off(scg0_new); - get_reg_off(scg1_new); - get_reg_off(res_new); - get_reg_off(pfmem08_0); - get_reg_off(pfmem08_1); - get_reg_off(pfmem08_2); - get_reg_off(pfmem08_3); - get_reg_off(pfmem08_4); - get_reg_off(pfmem08_5); - get_reg_off(pfmem08_6); - get_reg_off(pfmem08_7); - get_reg_off(pfmem08_8); - get_reg_off(pfmem08_9); - get_reg_off(pfmem08_10); - get_reg_off(pfmem08_11); - get_reg_off(pfmem08_12); - get_reg_off(pfmem08_13); - get_reg_off(pfmem08_14); - get_reg_off(pfmem08_15); - get_reg_off(pfmem08_16); - get_reg_off(pfmem08_17); - get_reg_off(pfmem08_18); - get_reg_off(pfmem08_19); - get_reg_off(pfmem16_0); - get_reg_off(pfmem16_1); - get_reg_off(pfmem16_2); - get_reg_off(pfmem16_3); - get_reg_off(pfmem16_4); - get_reg_off(pfmem16_5); - get_reg_off(pfmem16_6); - get_reg_off(pfmem16_7); - get_reg_off(pfmem16_8); - get_reg_off(pfmem16_9); - get_reg_off(pfmem16_10); - get_reg_off(pfmem16_11); - get_reg_off(pfmem16_12); - get_reg_off(pfmem16_13); - get_reg_off(pfmem16_14); - get_reg_off(pfmem16_15); - get_reg_off(pfmem16_16); - get_reg_off(pfmem16_17); - get_reg_off(pfmem16_18); - get_reg_off(pfmem16_19); - get_reg_off(pfmem32_0); - get_reg_off(pfmem32_1); - get_reg_off(pfmem32_2); - get_reg_off(pfmem32_3); - get_reg_off(pfmem32_4); - get_reg_off(pfmem32_5); - get_reg_off(pfmem32_6); - get_reg_off(pfmem32_7); - get_reg_off(pfmem32_8); - get_reg_off(pfmem32_9); - get_reg_off(pfmem32_10); - get_reg_off(pfmem32_11); - get_reg_off(pfmem32_12); - get_reg_off(pfmem32_13); - get_reg_off(pfmem32_14); - get_reg_off(pfmem32_15); - get_reg_off(pfmem32_16); - get_reg_off(pfmem32_17); - get_reg_off(pfmem32_18); - get_reg_off(pfmem32_19); - get_reg_off(pfmem64_0); - get_reg_off(pfmem64_1); - get_reg_off(pfmem64_2); - get_reg_off(pfmem64_3); - get_reg_off(pfmem64_4); - get_reg_off(pfmem64_5); - get_reg_off(pfmem64_6); - get_reg_off(pfmem64_7); - get_reg_off(pfmem64_8); - get_reg_off(pfmem64_9); - get_reg_off(pfmem64_10); - get_reg_off(pfmem64_11); - get_reg_off(pfmem64_12); - get_reg_off(pfmem64_13); - get_reg_off(pfmem64_14); - get_reg_off(pfmem64_15); - get_reg_off(pfmem64_16); - get_reg_off(pfmem64_17); - get_reg_off(pfmem64_18); - get_reg_off(pfmem64_19); - return dict; -} - -PyObject* _vm_set_gpreg(JitCpu* self, PyObject *dict) +PyObject* cpu_set_gpreg(JitCpu* self, PyObject *args) { + PyObject* dict; PyObject *d_key, *d_value = NULL; Py_ssize_t pos = 0; uint64_t val; unsigned int i, found; + if (!PyArg_ParseTuple(args, "O", &dict)) + return NULL; if(!PyDict_Check(dict)) RAISE(PyExc_TypeError, "arg must be dict"); while(PyDict_Next(dict, &pos, &d_key, &d_value)){ @@ -277,12 +101,11 @@ PyObject* _vm_set_gpreg(JitCpu* self, PyObject *dict) PyGetInt(d_value, val); - found = 0; for (i=0; i < sizeof(gpreg_dict)/sizeof(reg_dict); i++){ if (strcmp(PyString_AsString(d_key), gpreg_dict[i].name)) continue; - *((uint32_t*)(((char*)&(self->vmcpu)) + gpreg_dict[i].offset)) = val; + *((uint32_t*)(((char*)(self->cpu)) + gpreg_dict[i].offset)) = val; found = 1; break; } @@ -292,138 +115,16 @@ PyObject* _vm_set_gpreg(JitCpu* self, PyObject *dict) fprintf(stderr, "unkown key: %s\n", PyString_AsString(d_key)); RAISE(PyExc_ValueError, "unkown reg"); } - return NULL; + Py_INCREF(Py_None); + return Py_None; } -/* -uint8_t const bcd2bin_data[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 0, 0, 0, 0, 0, 0, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 0, 0, 0, 0, 0, 0, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 0, 0, 0, 0, 0, 0, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 0, 0, 0, 0, 0, 0, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 0, 0, 0, 0, 0, 0, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 0, 0, 0, 0, 0, 0, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99 -}; -uint8_t const bin2bcd_data[] = { - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, - 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, - 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, - 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, - 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99 -}; - -uint16_t bcdadd_16(uint16_t a, uint16_t b) -{ - int carry = 0; - int i,j = 0; - uint16_t res = 0; - int nib_a, nib_b; - for (i = 0; i < 16; i += 4) { - nib_a = (a >> i) & (0xF); - nib_b = (b >> i) & (0xF); - - j = (carry + nib_a + nib_b); - if (j >= 10) { - carry = 1; - j -= 10; - j &=0xf; - } - else { - carry = 0; - } - res += j << i; - } - return res; -} - -uint16_t bcdadd_cf_16(uint16_t a, uint16_t b) -{ - int carry = 0; - int i,j = 0; - int nib_a, nib_b; - for (i = 0; i < 16; i += 4) { - nib_a = (a >> i) & (0xF); - nib_b = (b >> i) & (0xF); - - j = (carry + nib_a + nib_b); - if (j >= 10) { - carry = 1; - j -= 10; - j &=0xf; - } - else { - carry = 0; - } - } - return carry; -} - - -uint16_t hex2bcd_16(uint16_t a) -{ - return bcd2bin_data[a & 0xFF] + (bcd2bin_data[(a >> 8) & 0xFF] * 100); -} - -uint8_t hex2bcd_8(uint8_t a) -{ - return bcd2bin_data[a & 0xFF]; -} - -uint8_t bcd2hex_8(uint8_t a) -{ - return bin2bcd_data[a & 0xFF]; -} - -uint16_t bcd2hex_16(uint16_t a) -{ - return bcd2bin_data[a % 100] | (bcd2bin_data[(a / 100)] << 8); -} -*/ - -PyObject* cpu_set_gpreg(JitCpu* self, PyObject *args) -{ - PyObject* dict; - if (!PyArg_ParseTuple(args, "O", &dict)) - return NULL; - _vm_set_gpreg(self, dict); - Py_INCREF(Py_None); - return Py_None; -} -PyObject* cpu_set_exception(JitCpu* self, PyObject* args) -{ - PyObject *item1; - uint64_t i; - - if (!PyArg_ParseTuple(args, "O", &item1)) - return NULL; - - PyGetInt(item1, i); - - self->vmcpu.exception_flags = i; - Py_INCREF(Py_None); - return Py_None; -} - -PyObject* cpu_get_exception(JitCpu* self, PyObject* args) -{ - return PyLong_FromUnsignedLongLong((uint64_t)self->vmcpu.exception_flags); -} - PyObject * cpu_init_regs(JitCpu* self) { - memset(&self->vmcpu, 0, sizeof(vm_cpu_t)); + memset(self->cpu, 0, sizeof(vm_cpu_t)); Py_INCREF(Py_None); return Py_None; @@ -450,131 +151,73 @@ PyObject * cpu_dump_gpregs(JitCpu* self, PyObject* args) { vm_cpu_t* vmcpu; - vmcpu = &self->vmcpu; + vmcpu = self->cpu; dump_gpregs(vmcpu); Py_INCREF(Py_None); return Py_None; } - -static void -JitCpu_dealloc(JitCpu* self) -{ - self->ob_type->tp_free((PyObject*)self); -} - - -static PyObject * -JitCpu_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - JitCpu *self; - - self = (JitCpu *)type->tp_alloc(type, 0); - return (PyObject *)self; -} - -static PyObject * -JitCpu_get_cpu(JitCpu *self, void *closure) -{ - return PyLong_FromUnsignedLongLong((uint64_t)&(self->vmcpu)); -} - -static int -JitCpu_set_cpu(JitCpu *self, PyObject *value, void *closure) -{ - PyErr_SetString(PyExc_TypeError, "immutable cpu"); - return -1; -} - - - -static PyObject * -JitCpu_get_vmmngr(JitCpu *self, void *closure) -{ - return self->vmcpu.pyvm; -} - -static PyObject * -JitCpu_set_vmmngr(JitCpu *self, PyObject *value, void *closure) +PyObject* cpu_set_exception(JitCpu* self, PyObject* args) { - self->vmcpu.pyvm = value; - return 0; -} + PyObject *item1; + uint64_t i; -static PyObject * -JitCpu_get_jitter(JitCpu *self, void *closure) -{ - return self->vmcpu.jitter; -} + if (!PyArg_ParseTuple(args, "O", &item1)) + return NULL; -static PyObject * -JitCpu_set_jitter(JitCpu *self, PyObject *value, void *closure) -{ - self->vmcpu.jitter = value; - return 0; -} + PyGetInt(item1, i); -uint8_t MEM_LOOKUP_08(vm_cpu_t* vmcpu, uint64_t addr) -{ - return vm_MEM_LOOKUP_08(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr); + ((vm_cpu_t*)self->cpu)->exception_flags = i; + Py_INCREF(Py_None); + return Py_None; } -uint16_t MEM_LOOKUP_16(vm_cpu_t* vmcpu, uint64_t addr) +PyObject* cpu_get_exception(JitCpu* self, PyObject* args) { - return vm_MEM_LOOKUP_16(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr); + return PyLong_FromUnsignedLongLong((uint64_t)(((vm_cpu_t*)self->cpu)->exception_flags)); } -uint32_t MEM_LOOKUP_32(vm_cpu_t* vmcpu, uint64_t addr) -{ - return vm_MEM_LOOKUP_32(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr); -} -uint64_t MEM_LOOKUP_64(vm_cpu_t* vmcpu, uint64_t addr) -{ - return vm_MEM_LOOKUP_64(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr); -} -void check_automod(vm_cpu_t* vmcpu, uint64_t addr, int size) +void check_automod(JitCpu* jitcpu, uint64_t addr, int size) { PyObject *result; - if (!((((VmMngr*)vmcpu->pyvm)->vm_mngr).exception_flags & EXCEPT_CODE_AUTOMOD)) + if (!(((VmMngr*)jitcpu->pyvm)->vm_mngr.exception_flags & EXCEPT_CODE_AUTOMOD)) return; - result = PyObject_CallMethod((PyObject *)vmcpu->jitter, "automod_cb", "LL", addr, size); + result = PyObject_CallMethod(jitcpu->jitter, "automod_cb", "LL", addr, size); Py_DECREF(result); } -void MEM_WRITE_08(vm_cpu_t* vmcpu, uint64_t addr, uint8_t src) +void MEM_WRITE_08(JitCpu* jitcpu, uint64_t addr, uint8_t src) { - vm_MEM_WRITE_08(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr, src); - check_automod(vmcpu, addr, 8); + vm_MEM_WRITE_08(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src); + check_automod(jitcpu, addr, 8); } -void MEM_WRITE_16(vm_cpu_t* vmcpu, uint64_t addr, uint16_t src) +void MEM_WRITE_16(JitCpu* jitcpu, uint64_t addr, uint16_t src) { - vm_MEM_WRITE_16(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr, src); - check_automod(vmcpu, addr, 16); + vm_MEM_WRITE_16(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src); + check_automod(jitcpu, addr, 16); } -void MEM_WRITE_32(vm_cpu_t* vmcpu, uint64_t addr, uint32_t src) +void MEM_WRITE_32(JitCpu* jitcpu, uint64_t addr, uint32_t src) { - vm_MEM_WRITE_32(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr, src); - check_automod(vmcpu, addr, 32); + vm_MEM_WRITE_32(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src); + check_automod(jitcpu, addr, 32); } -void MEM_WRITE_64(vm_cpu_t* vmcpu, uint64_t addr, uint64_t src) +void MEM_WRITE_64(JitCpu* jitcpu, uint64_t addr, uint64_t src) { - vm_MEM_WRITE_64(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr, src); - check_automod(vmcpu, addr, 64); + vm_MEM_WRITE_64(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src); + check_automod(jitcpu, addr, 64); } - - PyObject* vm_set_mem(JitCpu *self, PyObject* args) { PyObject *py_addr; @@ -597,46 +240,15 @@ PyObject* vm_set_mem(JitCpu *self, PyObject* args) size = PyString_Size(py_buffer); PyString_AsStringAndSize(py_buffer, &buffer, &py_length); - ret = vm_write_mem(&(((VmMngr*)self->vmcpu.pyvm)->vm_mngr), addr, buffer, size); + ret = vm_write_mem(&(((VmMngr*)self->pyvm)->vm_mngr), addr, buffer, size); if (ret < 0) RAISE(PyExc_TypeError,"arg must be str"); - check_automod(&self->vmcpu, addr, size*8); + check_automod(self, addr, size*8); Py_INCREF(Py_None); return Py_None; } -PyObject* vm_get_mem(JitCpu *self, PyObject* args) -{ - PyObject *py_addr; - PyObject *py_len; - - uint64_t addr; - uint64_t size; - PyObject *obj_out; - char * buf_out; - int ret; - - if (!PyArg_ParseTuple(args, "OO", &py_addr, &py_len)) - return NULL; - - PyGetInt(py_addr, addr); - PyGetInt(py_len, size); - - ret = vm_read_mem(&(((VmMngr*)self->vmcpu.pyvm)->vm_mngr), addr, &buf_out, size); - if (ret < 0) { - free(buf_out); - PyErr_SetString(PyExc_RuntimeError, "cannot find address"); - return NULL; - } - - obj_out = PyString_FromStringAndSize(buf_out, size); - free(buf_out); - return obj_out; -} - - - static PyMemberDef JitCpu_members[] = { {NULL} /* Sentinel */ }; @@ -664,6 +276,11 @@ static PyMethodDef JitCpu_methods[] = { static int JitCpu_init(JitCpu *self, PyObject *args, PyObject *kwds) { + self->cpu = malloc(sizeof(vm_cpu_t)); + if (self->cpu == NULL) { + fprintf(stderr, "cannot alloc vm_cpu_t\n"); + exit(0); + } return 0; } @@ -695,12 +312,150 @@ getset_reg_u16(res); +PyObject* get_gpreg_offset_all(void) +{ + PyObject *dict = PyDict_New(); + PyObject *o; + get_reg_off(exception_flags); + get_reg_off(exception_flags_new); + get_reg_off(PC); + get_reg_off(SP); + get_reg_off(R3); + get_reg_off(R4); + get_reg_off(R5); + get_reg_off(R6); + get_reg_off(R7); + get_reg_off(R8); + get_reg_off(R9); + get_reg_off(R10); + get_reg_off(R11); + get_reg_off(R12); + get_reg_off(R13); + get_reg_off(R14); + get_reg_off(R15); + get_reg_off(PC_new); + get_reg_off(SP_new); + get_reg_off(SR_new); + get_reg_off(R3_new); + get_reg_off(R4_new); + get_reg_off(R5_new); + get_reg_off(R6_new); + get_reg_off(R7_new); + get_reg_off(R8_new); + get_reg_off(R9_new); + get_reg_off(R10_new); + get_reg_off(R11_new); + get_reg_off(R12_new); + get_reg_off(R13_new); + get_reg_off(R14_new); + get_reg_off(R15_new); + get_reg_off(zf); + get_reg_off(nf); + get_reg_off(of); + get_reg_off(cf); + get_reg_off(cpuoff); + get_reg_off(gie); + get_reg_off(osc); + get_reg_off(scg0); + get_reg_off(scg1); + get_reg_off(res); + get_reg_off(zf_new); + get_reg_off(nf_new); + get_reg_off(of_new); + get_reg_off(cf_new); + get_reg_off(cpuoff_new); + get_reg_off(gie_new); + get_reg_off(osc_new); + get_reg_off(scg0_new); + get_reg_off(scg1_new); + get_reg_off(res_new); + get_reg_off(pfmem08_0); + get_reg_off(pfmem08_1); + get_reg_off(pfmem08_2); + get_reg_off(pfmem08_3); + get_reg_off(pfmem08_4); + get_reg_off(pfmem08_5); + get_reg_off(pfmem08_6); + get_reg_off(pfmem08_7); + get_reg_off(pfmem08_8); + get_reg_off(pfmem08_9); + get_reg_off(pfmem08_10); + get_reg_off(pfmem08_11); + get_reg_off(pfmem08_12); + get_reg_off(pfmem08_13); + get_reg_off(pfmem08_14); + get_reg_off(pfmem08_15); + get_reg_off(pfmem08_16); + get_reg_off(pfmem08_17); + get_reg_off(pfmem08_18); + get_reg_off(pfmem08_19); + get_reg_off(pfmem16_0); + get_reg_off(pfmem16_1); + get_reg_off(pfmem16_2); + get_reg_off(pfmem16_3); + get_reg_off(pfmem16_4); + get_reg_off(pfmem16_5); + get_reg_off(pfmem16_6); + get_reg_off(pfmem16_7); + get_reg_off(pfmem16_8); + get_reg_off(pfmem16_9); + get_reg_off(pfmem16_10); + get_reg_off(pfmem16_11); + get_reg_off(pfmem16_12); + get_reg_off(pfmem16_13); + get_reg_off(pfmem16_14); + get_reg_off(pfmem16_15); + get_reg_off(pfmem16_16); + get_reg_off(pfmem16_17); + get_reg_off(pfmem16_18); + get_reg_off(pfmem16_19); + get_reg_off(pfmem32_0); + get_reg_off(pfmem32_1); + get_reg_off(pfmem32_2); + get_reg_off(pfmem32_3); + get_reg_off(pfmem32_4); + get_reg_off(pfmem32_5); + get_reg_off(pfmem32_6); + get_reg_off(pfmem32_7); + get_reg_off(pfmem32_8); + get_reg_off(pfmem32_9); + get_reg_off(pfmem32_10); + get_reg_off(pfmem32_11); + get_reg_off(pfmem32_12); + get_reg_off(pfmem32_13); + get_reg_off(pfmem32_14); + get_reg_off(pfmem32_15); + get_reg_off(pfmem32_16); + get_reg_off(pfmem32_17); + get_reg_off(pfmem32_18); + get_reg_off(pfmem32_19); + get_reg_off(pfmem64_0); + get_reg_off(pfmem64_1); + get_reg_off(pfmem64_2); + get_reg_off(pfmem64_3); + get_reg_off(pfmem64_4); + get_reg_off(pfmem64_5); + get_reg_off(pfmem64_6); + get_reg_off(pfmem64_7); + get_reg_off(pfmem64_8); + get_reg_off(pfmem64_9); + get_reg_off(pfmem64_10); + get_reg_off(pfmem64_11); + get_reg_off(pfmem64_12); + get_reg_off(pfmem64_13); + get_reg_off(pfmem64_14); + get_reg_off(pfmem64_15); + get_reg_off(pfmem64_16); + get_reg_off(pfmem64_17); + get_reg_off(pfmem64_18); + get_reg_off(pfmem64_19); + return dict; +} + + + static PyGetSetDef JitCpu_getseters[] = { - {"cpu", - (getter)JitCpu_get_cpu, (setter)JitCpu_set_cpu, - "first name", - NULL}, {"vmmngr", (getter)JitCpu_get_vmmngr, (setter)JitCpu_set_vmmngr, "vmmngr", diff --git a/miasm2/jitter/arch/JitCore_msp430.h b/miasm2/jitter/arch/JitCore_msp430.h index f830028f..179554ad 100644 --- a/miasm2/jitter/arch/JitCore_msp430.h +++ b/miasm2/jitter/arch/JitCore_msp430.h @@ -152,9 +152,6 @@ typedef struct { uint64_t pfmem64_19; - PyObject *pyvm; - PyObject *jitter; - }vm_cpu_t; //#define RETURN_PC return PyLong_FromUnsignedLongLong(vmcpu->PC); diff --git a/miasm2/jitter/arch/JitCore_x86.c b/miasm2/jitter/arch/JitCore_x86.c index c77d45f2..a5bbb7bc 100644 --- a/miasm2/jitter/arch/JitCore_x86.c +++ b/miasm2/jitter/arch/JitCore_x86.c @@ -1,5 +1,5 @@ #include <Python.h> -#include "JitCore.h" +#include "../JitCore.h" #include "structmember.h" #include <stdint.h> #include <inttypes.h> @@ -8,13 +8,6 @@ #include "../vm_mngr_py.h" #include "JitCore_x86.h" -#define RAISE(errtype, msg) {PyObject* p; p = PyErr_Format( errtype, msg ); return p;} -#define RAISE_ret0(errtype, msg) {PyObject* p; p = PyErr_Format( errtype, msg ); return 0;} - -typedef struct _reg_dict{ - char* name; - size_t offset; -} reg_dict; reg_dict gpreg_dict[] = { {.name = "RAX", .offset = offsetof(vm_cpu_t, RAX)}, @@ -58,19 +51,8 @@ reg_dict gpreg_dict[] = { {.name = "RAX", .offset = offsetof(vm_cpu_t, RAX)}, /************************** JitCpu object **************************/ -typedef struct { - PyObject_HEAD - PyObject *cpu; /* cpu */ - vm_cpu_t vmcpu; -} JitCpu; - -#define get_reg(reg) do { \ - o = PyLong_FromUnsignedLongLong((uint64_t)self->vmcpu.reg); \ - PyDict_SetItemString(dict, #reg, o); \ - Py_DECREF(o); \ - } while(0); PyObject* cpu_get_gpreg(JitCpu* self) @@ -120,13 +102,17 @@ PyObject* cpu_get_gpreg(JitCpu* self) -PyObject* _vm_set_gpreg(JitCpu* self, PyObject *dict) + +PyObject* cpu_set_gpreg(JitCpu* self, PyObject *args) { + PyObject* dict; PyObject *d_key, *d_value = NULL; Py_ssize_t pos = 0; uint64_t val; unsigned int i, found; + if (!PyArg_ParseTuple(args, "O", &dict)) + return NULL; if(!PyDict_Check(dict)) RAISE(PyExc_TypeError, "arg must be dict"); while(PyDict_Next(dict, &pos, &d_key, &d_value)){ @@ -139,7 +125,7 @@ PyObject* _vm_set_gpreg(JitCpu* self, PyObject *dict) for (i=0; i < sizeof(gpreg_dict)/sizeof(reg_dict); i++){ if (strcmp(PyString_AsString(d_key), gpreg_dict[i].name)) continue; - *((uint64_t*)(((char*)&(self->vmcpu)) + gpreg_dict[i].offset)) = val; + *((uint64_t*)(((char*)(self->cpu)) + gpreg_dict[i].offset)) = val; found = 1; break; } @@ -149,27 +135,17 @@ PyObject* _vm_set_gpreg(JitCpu* self, PyObject *dict) fprintf(stderr, "unkown key: %s\n", PyString_AsString(d_key)); RAISE(PyExc_ValueError, "unkown reg"); } - return NULL; + Py_INCREF(Py_None); + return Py_None; } -PyObject* cpu_set_gpreg(JitCpu* self, PyObject *args) -{ - PyObject* dict; - if (!PyArg_ParseTuple(args, "O", &dict)) - return NULL; - _vm_set_gpreg(self, dict); - Py_INCREF(Py_None); - return Py_None; -} - - PyObject * cpu_init_regs(JitCpu* self) { - memset(&self->vmcpu, 0, sizeof(vm_cpu_t)); + memset(self->cpu, 0, sizeof(vm_cpu_t)); - self->vmcpu.tsc1 = 0x22222222; - self->vmcpu.tsc2 = 0x11111111; - self->vmcpu.i_f = 1; + ((vm_cpu_t*)self->cpu)->tsc1 = 0x22222222; + ((vm_cpu_t*)self->cpu)->tsc2 = 0x11111111; + ((vm_cpu_t*)self->cpu)->i_f = 1; Py_INCREF(Py_None); return Py_None; @@ -194,13 +170,37 @@ PyObject * cpu_dump_gpregs(JitCpu* self, PyObject* args) { vm_cpu_t* vmcpu; - vmcpu = &self->vmcpu; + vmcpu = self->cpu; dump_gpregs(vmcpu); Py_INCREF(Py_None); return Py_None; } +PyObject* cpu_set_exception(JitCpu* self, PyObject* args) +{ + PyObject *item1; + uint64_t i; + + if (!PyArg_ParseTuple(args, "O", &item1)) + return NULL; + + PyGetInt(item1, i); + + ((vm_cpu_t*)self->cpu)->exception_flags = i; + Py_INCREF(Py_None); + return Py_None; +} + +PyObject* cpu_get_exception(JitCpu* self, PyObject* args) +{ + return PyLong_FromUnsignedLongLong((uint64_t)(((vm_cpu_t*)self->cpu)->exception_flags)); +} + + + + + PyObject* cpu_set_segm_base(JitCpu* self, PyObject* args) { PyObject *item1, *item2; @@ -211,7 +211,7 @@ PyObject* cpu_set_segm_base(JitCpu* self, PyObject* args) PyGetInt(item1, segm_num); PyGetInt(item2, segm_base); - self->vmcpu.segm_base[segm_num] = segm_base; + ((vm_cpu_t*)self->cpu)->segm_base[segm_num] = segm_base; Py_INCREF(Py_None); return Py_None; @@ -226,38 +226,16 @@ PyObject* cpu_get_segm_base(JitCpu* self, PyObject* args) if (!PyArg_ParseTuple(args, "O", &item1)) return NULL; PyGetInt(item1, segm_num); - v = PyInt_FromLong((long)self->vmcpu.segm_base[segm_num]); + v = PyInt_FromLong((long)(((vm_cpu_t*)self->cpu)->segm_base[segm_num])); return v; } -uint64_t segm2addr(vm_cpu_t* vmcpu, uint64_t segm, uint64_t addr) +uint64_t segm2addr(JitCpu* jitcpu, uint64_t segm, uint64_t addr) { - return addr + vmcpu->segm_base[segm]; + return addr + ((vm_cpu_t*)jitcpu->cpu)->segm_base[segm]; } -PyObject* cpu_set_exception(JitCpu* self, PyObject* args) -{ - PyObject *item1; - uint64_t i; - - if (!PyArg_ParseTuple(args, "O", &item1)) - return NULL; - - PyGetInt(item1, i); - - self->vmcpu.exception_flags = i; - Py_INCREF(Py_None); - return Py_None; -} - -PyObject* cpu_get_exception(JitCpu* self, PyObject* args) -{ - return PyLong_FromUnsignedLongLong((uint64_t)self->vmcpu.exception_flags); -} - - - #define UDIV(sizeA) \ uint ## sizeA ## _t udiv ## sizeA (vm_cpu_t* vmcpu, uint ## sizeA ## _t a, uint ## sizeA ## _t b) \ { \ @@ -329,118 +307,39 @@ IMOD(64) -static void -JitCpu_dealloc(JitCpu* self) -{ - self->ob_type->tp_free((PyObject*)self); -} - - -static PyObject * -JitCpu_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - JitCpu *self; - - self = (JitCpu *)type->tp_alloc(type, 0); - return (PyObject *)self; -} - -static PyObject * -JitCpu_get_cpu(JitCpu *self, void *closure) -{ - return PyLong_FromUnsignedLongLong((uint64_t)&(self->vmcpu)); -} - -static int -JitCpu_set_cpu(JitCpu *self, PyObject *value, void *closure) -{ - PyErr_SetString(PyExc_TypeError, "immutable cpu"); - return -1; -} - - - -static PyObject * -JitCpu_get_vmmngr(JitCpu *self, void *closure) -{ - return self->vmcpu.pyvm; -} - -static PyObject * -JitCpu_set_vmmngr(JitCpu *self, PyObject *value, void *closure) -{ - self->vmcpu.pyvm = value; - return 0; -} - -static PyObject * -JitCpu_get_jitter(JitCpu *self, void *closure) -{ - return self->vmcpu.jitter; -} - -static PyObject * -JitCpu_set_jitter(JitCpu *self, PyObject *value, void *closure) -{ - self->vmcpu.jitter = value; - return 0; -} - -uint8_t MEM_LOOKUP_08(vm_cpu_t* vmcpu, uint64_t addr) -{ - return vm_MEM_LOOKUP_08(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr); -} - -uint16_t MEM_LOOKUP_16(vm_cpu_t* vmcpu, uint64_t addr) -{ - return vm_MEM_LOOKUP_16(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr); -} - -uint32_t MEM_LOOKUP_32(vm_cpu_t* vmcpu, uint64_t addr) -{ - return vm_MEM_LOOKUP_32(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr); -} - -uint64_t MEM_LOOKUP_64(vm_cpu_t* vmcpu, uint64_t addr) -{ - return vm_MEM_LOOKUP_64(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr); -} - - - -void check_automod(vm_cpu_t* vmcpu, uint64_t addr, int size) +void check_automod(JitCpu* jitcpu, uint64_t addr, int size) { PyObject *result; - if (!((((VmMngr*)vmcpu->pyvm)->vm_mngr).exception_flags & EXCEPT_CODE_AUTOMOD)) + if (!(((VmMngr*)jitcpu->pyvm)->vm_mngr.exception_flags & EXCEPT_CODE_AUTOMOD)) return; - result = PyObject_CallMethod((PyObject *)vmcpu->jitter, "automod_cb", "LL", addr, size); + result = PyObject_CallMethod(jitcpu->jitter, "automod_cb", "LL", addr, size); Py_DECREF(result); } -void MEM_WRITE_08(vm_cpu_t* vmcpu, uint64_t addr, uint8_t src) +void MEM_WRITE_08(JitCpu* jitcpu, uint64_t addr, uint8_t src) { - vm_MEM_WRITE_08(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr, src); - check_automod(vmcpu, addr, 8); + vm_MEM_WRITE_08(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src); + check_automod(jitcpu, addr, 8); } -void MEM_WRITE_16(vm_cpu_t* vmcpu, uint64_t addr, uint16_t src) +void MEM_WRITE_16(JitCpu* jitcpu, uint64_t addr, uint16_t src) { - vm_MEM_WRITE_16(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr, src); - check_automod(vmcpu, addr, 16); + vm_MEM_WRITE_16(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src); + check_automod(jitcpu, addr, 16); } -void MEM_WRITE_32(vm_cpu_t* vmcpu, uint64_t addr, uint32_t src) +void MEM_WRITE_32(JitCpu* jitcpu, uint64_t addr, uint32_t src) { - vm_MEM_WRITE_32(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr, src); - check_automod(vmcpu, addr, 32); + vm_MEM_WRITE_32(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src); + check_automod(jitcpu, addr, 32); } -void MEM_WRITE_64(vm_cpu_t* vmcpu, uint64_t addr, uint64_t src) +void MEM_WRITE_64(JitCpu* jitcpu, uint64_t addr, uint64_t src) { - vm_MEM_WRITE_64(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr, src); - check_automod(vmcpu, addr, 64); + vm_MEM_WRITE_64(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src); + check_automod(jitcpu, addr, 64); } @@ -467,44 +366,15 @@ PyObject* vm_set_mem(JitCpu *self, PyObject* args) size = PyString_Size(py_buffer); PyString_AsStringAndSize(py_buffer, &buffer, &py_length); - ret = vm_write_mem(&(((VmMngr*)self->vmcpu.pyvm)->vm_mngr), addr, buffer, size); + ret = vm_write_mem(&(((VmMngr*)self->pyvm)->vm_mngr), addr, buffer, size); if (ret < 0) RAISE(PyExc_TypeError,"arg must be str"); - check_automod(&self->vmcpu, addr, size*8); + check_automod(self, addr, size*8); Py_INCREF(Py_None); return Py_None; } -PyObject* vm_get_mem(JitCpu *self, PyObject* args) -{ - PyObject *py_addr; - PyObject *py_len; - - uint64_t addr; - uint64_t size; - PyObject *obj_out; - char * buf_out; - int ret; - - if (!PyArg_ParseTuple(args, "OO", &py_addr, &py_len)) - return NULL; - - PyGetInt(py_addr, addr); - PyGetInt(py_len, size); - - ret = vm_read_mem(&(((VmMngr*)self->vmcpu.pyvm)->vm_mngr), addr, &buf_out, size); - if (ret < 0) { - free(buf_out); - PyErr_SetString(PyExc_RuntimeError, "cannot find address"); - return NULL; - } - - obj_out = PyString_FromStringAndSize(buf_out, size); - free(buf_out); - return obj_out; -} - static PyMemberDef JitCpu_members[] = { {NULL} /* Sentinel */ }; @@ -536,6 +406,11 @@ static PyMethodDef JitCpu_methods[] = { static int JitCpu_init(JitCpu *self, PyObject *args, PyObject *kwds) { + self->cpu = malloc(sizeof(vm_cpu_t)); + if (self->cpu == NULL) { + fprintf(stderr, "cannot alloc vm_cpu_t\n"); + exit(0); + } return 0; } @@ -543,15 +418,15 @@ JitCpu_init(JitCpu *self, PyObject *args, PyObject *kwds) #define getset_reg_E_u32(regname) \ static PyObject *JitCpu_get_E ## regname (JitCpu *self, void *closure) \ { \ - return PyLong_FromUnsignedLongLong((uint32_t)(self->vmcpu.R ## regname & 0xFFFFFFFF )); \ + return PyLong_FromUnsignedLongLong((uint32_t)(((vm_cpu_t*)(self->cpu))->R ## regname & 0xFFFFFFFF )); \ } \ static int JitCpu_set_E ## regname (JitCpu *self, PyObject *value, void *closure) \ { \ uint64_t val; \ PyGetInt_ret0(value, val); \ val &= 0xFFFFFFFF; \ - val |= self->vmcpu.R ##regname & 0xFFFFFFFF00000000ULL; \ - self->vmcpu.R ## regname = val; \ + val |= ((vm_cpu_t*)(self->cpu))->R ##regname & 0xFFFFFFFF00000000ULL; \ + ((vm_cpu_t*)(self->cpu))->R ## regname = val; \ return 0; \ } @@ -560,15 +435,15 @@ JitCpu_init(JitCpu *self, PyObject *args, PyObject *kwds) #define getset_reg_R_u16(regname) \ static PyObject *JitCpu_get_ ## regname (JitCpu *self, void *closure) \ { \ - return PyLong_FromUnsignedLongLong((uint16_t)(self->vmcpu.R ## regname & 0xFFFF )); \ + return PyLong_FromUnsignedLongLong((uint16_t)(((vm_cpu_t*)(self->cpu))->R ## regname & 0xFFFF )); \ } \ static int JitCpu_set_ ## regname (JitCpu *self, PyObject *value, void *closure) \ { \ uint64_t val; \ PyGetInt_ret0(value, val); \ val &= 0xFFFF; \ - val |= self->vmcpu.R ##regname & 0xFFFFFFFFFFFF0000ULL; \ - self->vmcpu.R ## regname = val; \ + val |= ((vm_cpu_t*)(self->cpu))->R ##regname & 0xFFFFFFFFFFFF0000ULL; \ + ((vm_cpu_t*)(self->cpu))->R ## regname = val; \ return 0; \ } @@ -631,12 +506,6 @@ getset_reg_R_u16(BP); getset_reg_R_u16(IP); -#define get_reg_off(reg) do { \ - o = PyLong_FromUnsignedLongLong((uint64_t)offsetof(vm_cpu_t, reg)); \ - PyDict_SetItemString(dict, #reg, o); \ - Py_DECREF(o); \ - } while(0); - PyObject* get_gpreg_offset_all(void) { @@ -849,10 +718,6 @@ PyObject* get_gpreg_offset_all(void) static PyGetSetDef JitCpu_getseters[] = { - {"cpu", - (getter)JitCpu_get_cpu, (setter)JitCpu_set_cpu, - "first name", - NULL}, {"vmmngr", (getter)JitCpu_get_vmmngr, (setter)JitCpu_set_vmmngr, "vmmngr", diff --git a/miasm2/jitter/arch/JitCore_x86.h b/miasm2/jitter/arch/JitCore_x86.h index 6ac4f734..7e518395 100644 --- a/miasm2/jitter/arch/JitCore_x86.h +++ b/miasm2/jitter/arch/JitCore_x86.h @@ -266,15 +266,14 @@ typedef struct { uint64_t MM7_new; uint32_t segm_base[0x10000]; - PyObject *pyvm; - PyObject *jitter; }vm_cpu_t; + void dump_gpregs(vm_cpu_t* vmcpu); -uint64_t segm2addr(vm_cpu_t* vmcpu, uint64_t segm, uint64_t addr); +uint64_t segm2addr(JitCpu* jitcpu, uint64_t segm, uint64_t addr); uint64_t udiv64(vm_cpu_t* vmcpu, uint64_t a, uint64_t b); diff --git a/miasm2/jitter/jitcore.py b/miasm2/jitter/jitcore.py index cf3bf7ae..a3a91d76 100644 --- a/miasm2/jitter/jitcore.py +++ b/miasm2/jitter/jitcore.py @@ -161,7 +161,7 @@ class JitCore(object): """ fc_ptr = self.lbl2jitbloc[label] - return self.exec_wrapper(fc_ptr, cpu.cpu, vmmngr.vmmngr) + return self.exec_wrapper(fc_ptr, cpu) def runbloc(self, cpu, vm, lbl): """Run the bloc starting at lbl. @@ -251,16 +251,14 @@ class JitCore(object): return modified_blocs def updt_automod_code(self, vm): - """Remove code jitted in range [addr, addr + size] + """Remove code jitted in range self.addr_mod @vm: VmMngr instance - @addr: Address of modified code in sandbox - @size: Modification range size (in bits) """ for addr_start, addr_stop in self.addr_mod: - self.del_bloc_in_range(addr_start, addr_stop+1) + self.del_bloc_in_range(addr_start, addr_stop + 1) self.__updt_jitcode_mem_range(vm) self.addr_mod = interval() def automod_cb(self, addr=0, size=0): - self.addr_mod+= interval([(addr, addr+size/8 - 1)]) + self.addr_mod += interval([(addr, addr + size / 8 - 1)]) return None diff --git a/miasm2/jitter/jitcore_python.py b/miasm2/jitter/jitcore_python.py index b768b338..150e3906 100644 --- a/miasm2/jitter/jitcore_python.py +++ b/miasm2/jitter/jitcore_python.py @@ -193,8 +193,6 @@ class JitCore_Python(jitcore.JitCore): # Get Python function corresponding to @label fc_ptr = self.lbl2jitbloc[label] - # Update memory state - self.vmmngr = vmmngr self.cpu = cpu # Execute the function diff --git a/miasm2/jitter/jitcore_tcc.py b/miasm2/jitter/jitcore_tcc.py index 2f8ad23b..573572d8 100644 --- a/miasm2/jitter/jitcore_tcc.py +++ b/miasm2/jitter/jitcore_tcc.py @@ -30,7 +30,8 @@ def gen_core(arch, attrib): txt = "" txt += '#include "%s/queue.h"\n' % lib_dir txt += '#include "%s/vm_mngr.h"\n' % lib_dir - txt += '#include "%s/arch/JitCore.h"\n' % lib_dir + txt += '#include "%s/vm_mngr_py.h"\n' % lib_dir + txt += '#include "%s/JitCore.h"\n' % lib_dir txt += '#include "%s/arch/JitCore_%s.h"\n' % (lib_dir, arch.name) txt += r''' @@ -137,7 +138,7 @@ class JitCore_Tcc(jitcore.JitCore): def jitirblocs(self, label, irblocs): f_name = "bloc_%s" % label.name - f_declaration = 'void %s(block_id * BlockDst, vm_cpu_t* vmcpu, vm_mngr_t* vm_mngr)' % f_name + f_declaration = 'void %s(block_id * BlockDst, JitCpu* jitcpu)' % f_name out = irblocs2C(self.ir_arch, self.resolver, label, irblocs, gen_exception_code=True, log_mn=self.log_mn, diff --git a/miasm2/jitter/vm_mngr_py.c b/miasm2/jitter/vm_mngr_py.c index c5d56719..78d636f6 100644 --- a/miasm2/jitter/vm_mngr_py.c +++ b/miasm2/jitter/vm_mngr_py.c @@ -247,7 +247,6 @@ PyObject* vm_get_mem(VmMngr* self, PyObject* args) ret = vm_read_mem(&self->vm_mngr, addr, &buf_out, size); if (ret < 0) { - free(buf_out); PyErr_SetString(PyExc_RuntimeError, "cannot find address"); return NULL; } diff --git a/setup.py b/setup.py index 2397ca57..f4618abc 100755 --- a/setup.py +++ b/setup.py @@ -28,19 +28,19 @@ def buil_all(): ["miasm2/jitter/vm_mngr.c", "miasm2/jitter/vm_mngr_py.c"]), Extension("miasm2.jitter.arch.JitCore_x86", - ["miasm2/jitter/arch/JitCore.c", + ["miasm2/jitter/JitCore.c", "miasm2/jitter/vm_mngr.c", "miasm2/jitter/arch/JitCore_x86.c"]), Extension("miasm2.jitter.arch.JitCore_arm", - ["miasm2/jitter/arch/JitCore.c", + ["miasm2/jitter/JitCore.c", "miasm2/jitter/vm_mngr.c", "miasm2/jitter/arch/JitCore_arm.c"]), Extension("miasm2.jitter.arch.JitCore_msp430", - ["miasm2/jitter/arch/JitCore.c", + ["miasm2/jitter/JitCore.c", "miasm2/jitter/vm_mngr.c", "miasm2/jitter/arch/JitCore_msp430.c"]), Extension("miasm2.jitter.arch.JitCore_mips32", - ["miasm2/jitter/arch/JitCore.c", + ["miasm2/jitter/JitCore.c", "miasm2/jitter/vm_mngr.c", "miasm2/jitter/arch/JitCore_mips32.c"]), Extension("miasm2.jitter.Jitllvm", @@ -52,19 +52,19 @@ def buil_all(): ["miasm2/jitter/vm_mngr.c", "miasm2/jitter/vm_mngr_py.c"]), Extension("miasm2.jitter.arch.JitCore_x86", - ["miasm2/jitter/arch/JitCore.c", + ["miasm2/jitter/JitCore.c", "miasm2/jitter/vm_mngr.c", "miasm2/jitter/arch/JitCore_x86.c"]), Extension("miasm2.jitter.arch.JitCore_arm", - ["miasm2/jitter/arch/JitCore.c", + ["miasm2/jitter/JitCore.c", "miasm2/jitter/vm_mngr.c", "miasm2/jitter/arch/JitCore_arm.c"]), Extension("miasm2.jitter.arch.JitCore_msp430", - ["miasm2/jitter/arch/JitCore.c", + ["miasm2/jitter/JitCore.c", "miasm2/jitter/vm_mngr.c", "miasm2/jitter/arch/JitCore_msp430.c"]), Extension("miasm2.jitter.arch.JitCore_mips32", - ["miasm2/jitter/arch/JitCore.c", + ["miasm2/jitter/JitCore.c", "miasm2/jitter/vm_mngr.c", "miasm2/jitter/arch/JitCore_mips32.c"]), Extension("miasm2.jitter.Jitllvm", diff --git a/test/ir/ir2C.py b/test/ir/ir2C.py index 48518c50..3a89b328 100644 --- a/test/ir/ir2C.py +++ b/test/ir/ir2C.py @@ -46,9 +46,9 @@ class TestIrIr2C(unittest.TestCase): self.translationTest( ExprOp('fadd', *args[:2]), r'fadd(0x0, 0x1)') self.translationTest( - ExprOp('segm', *args[:2]), r'segm2addr(vmcpu, 0x0, 0x1)') + ExprOp('segm', *args[:2]), r'segm2addr(jitcpu, 0x0, 0x1)') self.translationTest( - ExprOp('imod', *args[:2]), r'imod32(vmcpu, 0x0, 0x1)') + ExprOp('imod', *args[:2]), r'imod32(jitcpu, 0x0, 0x1)') self.translationTest( ExprOp('bcdadd', *args[:2]), r'bcdadd_32(0x0, 0x1)') self.assertRaises(NotImplementedError, translator.from_expr, |