diff options
Diffstat (limited to 'miasm2/jitter')
| -rw-r--r-- | miasm2/jitter/arch/JitCore_aarch64.c | 8 | ||||
| -rw-r--r-- | miasm2/jitter/arch/JitCore_arm.c | 9 | ||||
| -rw-r--r-- | miasm2/jitter/arch/JitCore_mep.c | 9 | ||||
| -rw-r--r-- | miasm2/jitter/arch/JitCore_msp430.c | 7 | ||||
| -rw-r--r-- | miasm2/jitter/arch/JitCore_ppc32.c | 7 | ||||
| -rw-r--r-- | miasm2/jitter/arch/JitCore_x86.c | 28 | ||||
| -rw-r--r-- | miasm2/jitter/codegen.py | 10 | ||||
| -rw-r--r-- | miasm2/jitter/jitcore_python.py | 2 | ||||
| -rw-r--r-- | miasm2/jitter/llvmconvert.py | 16 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr_py.c | 4 |
10 files changed, 83 insertions, 17 deletions
diff --git a/miasm2/jitter/arch/JitCore_aarch64.c b/miasm2/jitter/arch/JitCore_aarch64.c index fc51848a..d8b6d0f9 100644 --- a/miasm2/jitter/arch/JitCore_aarch64.c +++ b/miasm2/jitter/arch/JitCore_aarch64.c @@ -194,6 +194,12 @@ PyObject * cpu_dump_gpregs(JitCpu* self, PyObject* args) } +PyObject * cpu_dump_gpregs_with_attrib(JitCpu* self, PyObject* args) +{ + return cpu_dump_gpregs(self, args); +} + + PyObject* cpu_set_exception(JitCpu* self, PyObject* args) { PyObject *item1; @@ -294,6 +300,8 @@ static PyMethodDef JitCpu_methods[] = { "X"}, {"dump_gpregs", (PyCFunction)cpu_dump_gpregs, METH_NOARGS, "X"}, + {"dump_gpregs_with_attrib", (PyCFunction)cpu_dump_gpregs_with_attrib, METH_VARARGS, + "X"}, {"get_gpreg", (PyCFunction)cpu_get_gpreg, METH_NOARGS, "X"}, {"set_gpreg", (PyCFunction)cpu_set_gpreg, METH_VARARGS, diff --git a/miasm2/jitter/arch/JitCore_arm.c b/miasm2/jitter/arch/JitCore_arm.c index 4f1fd254..dca341d3 100644 --- a/miasm2/jitter/arch/JitCore_arm.c +++ b/miasm2/jitter/arch/JitCore_arm.c @@ -157,6 +157,13 @@ PyObject * cpu_dump_gpregs(JitCpu* self, PyObject* args) } +PyObject * cpu_dump_gpregs_with_attrib(JitCpu* self, PyObject* args) +{ + return cpu_dump_gpregs(self, args); +} + + + PyObject* cpu_set_exception(JitCpu* self, PyObject* args) { PyObject *item1; @@ -276,6 +283,8 @@ static PyMethodDef JitCpu_methods[] = { "X"}, {"dump_gpregs", (PyCFunction)cpu_dump_gpregs, METH_NOARGS, "X"}, + {"dump_gpregs_with_attrib", (PyCFunction)cpu_dump_gpregs_with_attrib, METH_VARARGS, + "X"}, {"get_gpreg", (PyCFunction)cpu_get_gpreg, METH_NOARGS, "X"}, {"set_gpreg", (PyCFunction)cpu_set_gpreg, METH_VARARGS, diff --git a/miasm2/jitter/arch/JitCore_mep.c b/miasm2/jitter/arch/JitCore_mep.c index 44f36290..a089e84f 100644 --- a/miasm2/jitter/arch/JitCore_mep.c +++ b/miasm2/jitter/arch/JitCore_mep.c @@ -223,6 +223,10 @@ PyObject * cpu_dump_gpregs(JitCpu* self, PyObject* args) return Py_None; } +PyObject * cpu_dump_gpregs_with_attrib(JitCpu* self, PyObject* args) +{ + return cpu_dump_gpregs(self, args); +} PyObject* cpu_set_exception(JitCpu* self, PyObject* args) { @@ -244,10 +248,6 @@ PyObject* cpu_get_exception(JitCpu* self, PyObject* args) return PyLong_FromUnsignedLongLong((uint64_t)(((vm_cpu_t*)self->cpu)->exception_flags)); } - - - - void check_automod(JitCpu* jitcpu, uint64_t addr, uint64_t size) { PyObject *result; @@ -322,6 +322,7 @@ static PyMemberDef JitCpu_members[] = { static PyMethodDef JitCpu_methods[] = { {"init_regs", (PyCFunction)cpu_init_regs, METH_NOARGS, "X"}, {"dump_gpregs", (PyCFunction)cpu_dump_gpregs, METH_NOARGS, "X"}, + {"dump_gpregs_with_attrib", (PyCFunction)cpu_dump_gpregs_with_attrib, METH_VARARGS, "X"}, {"get_gpreg", (PyCFunction)cpu_get_gpreg, METH_NOARGS, "X"}, {"set_gpreg", (PyCFunction)cpu_set_gpreg, METH_VARARGS, "X"}, {"get_exception", (PyCFunction)cpu_get_exception, METH_VARARGS, "X"}, diff --git a/miasm2/jitter/arch/JitCore_msp430.c b/miasm2/jitter/arch/JitCore_msp430.c index 12a42782..69f179a4 100644 --- a/miasm2/jitter/arch/JitCore_msp430.c +++ b/miasm2/jitter/arch/JitCore_msp430.c @@ -158,6 +158,11 @@ PyObject * cpu_dump_gpregs(JitCpu* self, PyObject* args) return Py_None; } +PyObject * cpu_dump_gpregs_with_attrib(JitCpu* self, PyObject* args) +{ + return cpu_dump_gpregs(self, args); +} + PyObject* cpu_set_exception(JitCpu* self, PyObject* args) { @@ -259,6 +264,8 @@ static PyMethodDef JitCpu_methods[] = { "X"}, {"dump_gpregs", (PyCFunction)cpu_dump_gpregs, METH_NOARGS, "X"}, + {"dump_gpregs_with_attrib", (PyCFunction)cpu_dump_gpregs_with_attrib, METH_VARARGS, + "X"}, {"get_gpreg", (PyCFunction)cpu_get_gpreg, METH_NOARGS, "X"}, {"set_gpreg", (PyCFunction)cpu_set_gpreg, METH_VARARGS, diff --git a/miasm2/jitter/arch/JitCore_ppc32.c b/miasm2/jitter/arch/JitCore_ppc32.c index dfc46c91..e1a3fcd5 100644 --- a/miasm2/jitter/arch/JitCore_ppc32.c +++ b/miasm2/jitter/arch/JitCore_ppc32.c @@ -109,6 +109,12 @@ cpu_dump_gpregs(JitCpu *self, PyObject *args) { } PyObject * +cpu_dump_gpregs_with_attrib(JitCpu* self, PyObject* args) +{ + return cpu_dump_gpregs(self, args); +} + +PyObject * cpu_set_exception(JitCpu *self, PyObject *args) { PyObject *item1; uint64_t i; @@ -208,6 +214,7 @@ static PyMemberDef JitCpu_members[] = { static PyMethodDef JitCpu_methods[] = { {"init_regs", (PyCFunction)cpu_init_regs, METH_NOARGS, "X"}, {"dump_gpregs", (PyCFunction)cpu_dump_gpregs, METH_NOARGS, "X"}, + {"dump_gpregs_with_attrib", (PyCFunction)cpu_dump_gpregs_with_attrib, METH_VARARGS, "X"}, {"get_gpreg", (PyCFunction)cpu_get_gpreg, METH_NOARGS, "X"}, {"set_gpreg", (PyCFunction)cpu_set_gpreg, METH_VARARGS, "X"}, {"get_exception", (PyCFunction)cpu_get_exception, METH_VARARGS, "X"}, diff --git a/miasm2/jitter/arch/JitCore_x86.c b/miasm2/jitter/arch/JitCore_x86.c index b711f40b..fa47b324 100644 --- a/miasm2/jitter/arch/JitCore_x86.c +++ b/miasm2/jitter/arch/JitCore_x86.c @@ -349,6 +349,32 @@ PyObject * cpu_dump_gpregs(JitCpu* self, PyObject* args) } +PyObject * cpu_dump_gpregs_with_attrib(JitCpu* self, PyObject* args) +{ + vm_cpu_t* vmcpu; + PyObject *item1; + uint64_t attrib; + + if (!PyArg_ParseTuple(args, "O", &item1)) + RAISE(PyExc_TypeError,"Cannot parse arguments"); + + PyGetInt(item1, attrib); + + vmcpu = self->cpu; + if (attrib == 16 || attrib == 32) + dump_gpregs_32(vmcpu); + else if (attrib == 64) + dump_gpregs_64(vmcpu); + else { + RAISE(PyExc_TypeError,"Bad attrib"); + } + + Py_INCREF(Py_None); + return Py_None; +} + + + PyObject* cpu_set_exception(JitCpu* self, PyObject* args) { PyObject *item1; @@ -484,6 +510,8 @@ static PyMethodDef JitCpu_methods[] = { "X"}, {"dump_gpregs", (PyCFunction)cpu_dump_gpregs, METH_NOARGS, "X"}, + {"dump_gpregs_with_attrib", (PyCFunction)cpu_dump_gpregs_with_attrib, METH_VARARGS, + "X"}, {"get_gpreg", (PyCFunction)cpu_get_gpreg, METH_NOARGS, "X"}, {"set_gpreg", (PyCFunction)cpu_set_gpreg, METH_VARARGS, diff --git a/miasm2/jitter/codegen.py b/miasm2/jitter/codegen.py index 32af29a2..a9405472 100644 --- a/miasm2/jitter/codegen.py +++ b/miasm2/jitter/codegen.py @@ -392,11 +392,13 @@ class CGen(object): ) return out - def gen_post_code(self, attrib): + def gen_post_code(self, attrib, pc_value): """Callback to generate code AFTER the instruction execution @attrib: Attributes instance""" out = [] if attrib.log_regs: + # Update PC for dump_gpregs + out.append("%s = %s;" % (self.C_PC, pc_value)) out.append('dump_gpregs(jitcpu->cpu);') return out @@ -408,7 +410,7 @@ class CGen(object): out = [] if isinstance(dst, Expr): - out += self.gen_post_code(attrib) + out += self.gen_post_code(attrib, "DST_value") out.append('BlockDst->address = DST_value;') out += self.gen_post_instr_checks(attrib) out.append('\t\treturn JIT_RET_NO_EXCEPTION;') @@ -423,11 +425,11 @@ class CGen(object): offset in instr_offsets): # Only generate goto for next instructions. # (consecutive instructions) - out += self.gen_post_code(attrib) + out += self.gen_post_code(attrib, "0x%x" % offset) out += self.gen_post_instr_checks(attrib) out.append('goto %s;' % dst) else: - out += self.gen_post_code(attrib) + out += self.gen_post_code(attrib, "0x%x" % offset) out.append('BlockDst->address = DST_value;') out += self.gen_post_instr_checks(attrib) out.append('\t\treturn JIT_RET_NO_EXCEPTION;') diff --git a/miasm2/jitter/jitcore_python.py b/miasm2/jitter/jitcore_python.py index dd4c543e..0b1f5809 100644 --- a/miasm2/jitter/jitcore_python.py +++ b/miasm2/jitter/jitcore_python.py @@ -90,7 +90,7 @@ class JitCore_Python(jitcore.JitCore): # Log registers values if self.log_regs: exec_engine.update_cpu_from_engine() - exec_engine.cpu.dump_gpregs() + exec_engine.cpu.dump_gpregs_with_attrib(self.ir_arch.attrib) # Log instruction if self.log_mn: diff --git a/miasm2/jitter/llvmconvert.py b/miasm2/jitter/llvmconvert.py index 6f024c1e..37ce8d52 100644 --- a/miasm2/jitter/llvmconvert.py +++ b/miasm2/jitter/llvmconvert.py @@ -1292,8 +1292,14 @@ class LLVMFunction(object): self.printf("%.8X %s\n" % (instr_attrib.instr.offset, instr_attrib.instr.to_string(loc_db))) - def gen_post_code(self, attributes): + def gen_post_code(self, attributes, pc_value): if attributes.log_regs: + # Update PC for dump_gpregs + PC = self.llvm_context.PC + t_size = LLVMType.IntType(PC.size) + dst = self.builder.zext(t_size(pc_value), LLVMType.IntType(PC.size)) + self.affect(dst, PC) + fc_ptr = self.mod.get_global(self.llvm_context.logging_func) self.builder.call(fc_ptr, [self.local_vars["vmcpu"]]) @@ -1353,8 +1359,10 @@ class LLVMFunction(object): # We are no longer in the main stream, deactivate cache self.main_stream = False + offset = None if isinstance(dst, ExprInt): - loc_key = self.llvm_context.ir_arch.loc_db.get_or_create_offset_location(int(dst)) + offset = int(dst) + loc_key = self.llvm_context.ir_arch.loc_db.get_or_create_offset_location(offset) dst = ExprLoc(loc_key, dst.size) if isinstance(dst, ExprLoc): @@ -1371,7 +1379,7 @@ class LLVMFunction(object): if (offset in instr_offsets and offset > attrib.instr.offset): # forward local jump (ie. next instruction) - self.gen_post_code(attrib) + self.gen_post_code(attrib, offset) self.gen_post_instr_checks(attrib, offset) self.builder.branch(bbl) return @@ -1389,7 +1397,7 @@ class LLVMFunction(object): if dst.type.width != PC.size: dst = self.builder.zext(dst, LLVMType.IntType(PC.size)) - self.gen_post_code(attrib) + self.gen_post_code(attrib, offset) self.affect(dst, PC) self.gen_post_instr_checks(attrib, dst) self.affect(self.add_ir(ExprInt(0, 8)), ExprId("status", 32)) diff --git a/miasm2/jitter/vm_mngr_py.c b/miasm2/jitter/vm_mngr_py.c index 5ff436bf..93de9bb4 100644 --- a/miasm2/jitter/vm_mngr_py.c +++ b/miasm2/jitter/vm_mngr_py.c @@ -248,7 +248,6 @@ PyObject* vm_get_u8(VmMngr* self, PyObject* args) PyObject *py_addr; uint64_t addr; - uint64_t size; PyObject *obj_out; char * buf_out; int ret; @@ -276,7 +275,6 @@ PyObject* vm_get_u16(VmMngr* self, PyObject* args) PyObject *py_addr; uint64_t addr; - uint64_t size; PyObject *obj_out; char * buf_out; int ret; @@ -304,7 +302,6 @@ PyObject* vm_get_u32(VmMngr* self, PyObject* args) PyObject *py_addr; uint64_t addr; - uint64_t size; PyObject *obj_out; char * buf_out; int ret; @@ -333,7 +330,6 @@ PyObject* vm_get_u64(VmMngr* self, PyObject* args) PyObject *py_addr; uint64_t addr; - uint64_t size; PyObject *obj_out; char * buf_out; int ret; |