diff options
Diffstat (limited to 'miasm2/jitter')
| -rw-r--r-- | miasm2/jitter/arch/JitCore_aarch64.c | 12 | ||||
| -rw-r--r-- | miasm2/jitter/arch/JitCore_arm.c | 8 | ||||
| -rw-r--r-- | miasm2/jitter/arch/JitCore_mips32.c | 8 | ||||
| -rw-r--r-- | miasm2/jitter/arch/JitCore_msp430.c | 8 | ||||
| -rw-r--r-- | miasm2/jitter/arch/JitCore_x86.c | 14 | ||||
| -rw-r--r-- | miasm2/jitter/codegen.py | 63 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr_py.c | 53 |
7 files changed, 93 insertions, 73 deletions
diff --git a/miasm2/jitter/arch/JitCore_aarch64.c b/miasm2/jitter/arch/JitCore_aarch64.c index 8674b684..03113d30 100644 --- a/miasm2/jitter/arch/JitCore_aarch64.c +++ b/miasm2/jitter/arch/JitCore_aarch64.c @@ -115,7 +115,7 @@ PyObject* cpu_set_gpreg(JitCpu* self, PyObject *args) unsigned int i, found; if (!PyArg_ParseTuple(args, "O", &dict)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); if(!PyDict_Check(dict)) RAISE(PyExc_TypeError, "arg must be dict"); while(PyDict_Next(dict, &pos, &d_key, &d_value)){ @@ -194,7 +194,7 @@ PyObject* cpu_set_exception(JitCpu* self, PyObject* args) uint64_t i; if (!PyArg_ParseTuple(args, "O", &item1)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); PyGetInt(item1, i); @@ -248,10 +248,6 @@ void MEM_WRITE_64(JitCpu* jitcpu, uint64_t addr, uint64_t src) } - - - - PyObject* vm_set_mem(JitCpu *self, PyObject* args) { PyObject *py_addr; @@ -261,10 +257,10 @@ PyObject* vm_set_mem(JitCpu *self, PyObject* args) char * buffer; uint64_t size; uint64_t addr; - int ret = 0x1337; + int ret; if (!PyArg_ParseTuple(args, "OO", &py_addr, &py_buffer)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); PyGetInt(py_addr, addr); diff --git a/miasm2/jitter/arch/JitCore_arm.c b/miasm2/jitter/arch/JitCore_arm.c index 869a9a7c..d6e27acc 100644 --- a/miasm2/jitter/arch/JitCore_arm.c +++ b/miasm2/jitter/arch/JitCore_arm.c @@ -79,7 +79,7 @@ PyObject* cpu_set_gpreg(JitCpu* self, PyObject *args) unsigned int i, found; if (!PyArg_ParseTuple(args, "O", &dict)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); if(!PyDict_Check(dict)) RAISE(PyExc_TypeError, "arg must be dict"); while(PyDict_Next(dict, &pos, &d_key, &d_value)){ @@ -147,7 +147,7 @@ PyObject* cpu_set_exception(JitCpu* self, PyObject* args) uint64_t i; if (!PyArg_ParseTuple(args, "O", &item1)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); PyGetInt(item1, i); @@ -225,10 +225,10 @@ PyObject* vm_set_mem(JitCpu *self, PyObject* args) char * buffer; uint64_t size; uint64_t addr; - int ret = 0x1337; + int ret; if (!PyArg_ParseTuple(args, "OO", &py_addr, &py_buffer)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); PyGetInt(py_addr, addr); diff --git a/miasm2/jitter/arch/JitCore_mips32.c b/miasm2/jitter/arch/JitCore_mips32.c index fc5589ff..04e4d883 100644 --- a/miasm2/jitter/arch/JitCore_mips32.c +++ b/miasm2/jitter/arch/JitCore_mips32.c @@ -109,7 +109,7 @@ PyObject* cpu_set_gpreg(JitCpu* self, PyObject *args) unsigned int i, found; if (!PyArg_ParseTuple(args, "O", &dict)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); if(!PyDict_Check(dict)) RAISE(PyExc_TypeError, "arg must be dict"); while(PyDict_Next(dict, &pos, &d_key, &d_value)){ @@ -190,7 +190,7 @@ PyObject* cpu_set_exception(JitCpu* self, PyObject* args) uint64_t i; if (!PyArg_ParseTuple(args, "O", &item1)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); PyGetInt(item1, i); @@ -254,10 +254,10 @@ PyObject* vm_set_mem(JitCpu *self, PyObject* args) char * buffer; uint64_t size; uint64_t addr; - int ret = 0x1337; + int ret; if (!PyArg_ParseTuple(args, "OO", &py_addr, &py_buffer)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); PyGetInt(py_addr, addr); diff --git a/miasm2/jitter/arch/JitCore_msp430.c b/miasm2/jitter/arch/JitCore_msp430.c index bfa35926..d30655dd 100644 --- a/miasm2/jitter/arch/JitCore_msp430.c +++ b/miasm2/jitter/arch/JitCore_msp430.c @@ -92,7 +92,7 @@ PyObject* cpu_set_gpreg(JitCpu* self, PyObject *args) unsigned int i, found; if (!PyArg_ParseTuple(args, "O", &dict)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); if(!PyDict_Check(dict)) RAISE(PyExc_TypeError, "arg must be dict"); while(PyDict_Next(dict, &pos, &d_key, &d_value)){ @@ -164,7 +164,7 @@ PyObject* cpu_set_exception(JitCpu* self, PyObject* args) uint64_t i; if (!PyArg_ParseTuple(args, "O", &item1)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); PyGetInt(item1, i); @@ -227,10 +227,10 @@ PyObject* vm_set_mem(JitCpu *self, PyObject* args) char * buffer; uint64_t size; uint64_t addr; - int ret = 0x1337; + int ret; if (!PyArg_ParseTuple(args, "OO", &py_addr, &py_buffer)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); PyGetInt(py_addr, addr); diff --git a/miasm2/jitter/arch/JitCore_x86.c b/miasm2/jitter/arch/JitCore_x86.c index 8b52b8eb..3198eff3 100644 --- a/miasm2/jitter/arch/JitCore_x86.c +++ b/miasm2/jitter/arch/JitCore_x86.c @@ -138,7 +138,7 @@ PyObject* cpu_set_gpreg(JitCpu* self, PyObject *args) unsigned int i, found; if (!PyArg_ParseTuple(args, "O", &dict)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); if(!PyDict_Check(dict)) RAISE(PyExc_TypeError, "arg must be dict"); while(PyDict_Next(dict, &pos, &d_key, &d_value)){ @@ -238,7 +238,7 @@ PyObject* cpu_set_exception(JitCpu* self, PyObject* args) uint64_t i; if (!PyArg_ParseTuple(args, "O", &item1)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); PyGetInt(item1, i); @@ -258,7 +258,7 @@ PyObject* cpu_set_interrupt_num(JitCpu* self, PyObject* args) uint64_t i; if (!PyArg_ParseTuple(args, "O", &item1)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); PyGetInt(item1, i); @@ -278,7 +278,7 @@ PyObject* cpu_set_segm_base(JitCpu* self, PyObject* args) uint64_t segm_num, segm_base; if (!PyArg_ParseTuple(args, "OO", &item1, &item2)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); PyGetInt(item1, segm_num); PyGetInt(item2, segm_base); @@ -295,7 +295,7 @@ PyObject* cpu_get_segm_base(JitCpu* self, PyObject* args) PyObject* v; if (!PyArg_ParseTuple(args, "O", &item1)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); PyGetInt(item1, segm_num); v = PyInt_FromLong((long)(((vm_cpu_t*)self->cpu)->segm_base[segm_num])); return v; @@ -355,10 +355,10 @@ PyObject* vm_set_mem(JitCpu *self, PyObject* args) char * buffer; uint64_t size; uint64_t addr; - int ret = 0x1337; + int ret; if (!PyArg_ParseTuple(args, "OO", &py_addr, &py_buffer)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); PyGetInt(py_addr, addr); diff --git a/miasm2/jitter/codegen.py b/miasm2/jitter/codegen.py index e91f3505..b2398dd2 100644 --- a/miasm2/jitter/codegen.py +++ b/miasm2/jitter/codegen.py @@ -8,7 +8,7 @@ from miasm2.ir.translators import Translator from miasm2.core.asmblock import expr_is_label, AsmBlockBad, AsmLabel # Miasm to C translator -translator = Translator.to_language("C") +TRANSLATOR = Translator.to_language("C") SIZE_TO_MASK = {x: 2**x - 1 for x in (1, 2, 3, 7, 8, 16, 32, 64)} @@ -32,6 +32,9 @@ class Attributes(object): class CGen(object): + """ + Helper to generate C code for a given AsmBlock + """ IMPLICIT_EXCEPTION_OP = set(['umod', 'udiv']) @@ -104,6 +107,7 @@ class CGen(object): self.init_arch_C() def init_arch_C(self): + """Iinitialize jitter internals""" self.id_to_c_id = {} for reg in self.ir_arch.arch.regs.all_regs_ids: self.id_to_c_id[reg] = m2_expr.ExprId('mycpu->%s' % reg, reg.size) @@ -112,24 +116,29 @@ class CGen(object): @staticmethod def label_to_jitlabel(lbl): + """Convert AsmLabel to a jitter label name""" assert lbl.offset is not None return "jitblock_%X" % lbl.offset def dst_to_c(self, src): + """Translate Expr @src into C code""" if not isinstance(src, m2_expr.Expr): src = m2_expr.ExprInt(src, self.PC.size) return self.id_to_c(src) def patch_c_id(self, expr): + """Replace ExprId in @expr with corresponding C variables""" return expr.replace_expr(self.id_to_c_id) def id_to_c(self, expr): - return translator.from_expr(self.patch_c_id(expr)) - - def get_post_instr_label(self, offset): - return self.ir_arch.symbol_pool.getby_name_create("lbl_gen_post_instr_%.8X" % (offset)) + """Translate Expr @expr into corresponding C code""" + return TRANSLATOR.from_expr(self.patch_c_id(expr)) def add_label_index(self, dst2index, lbl): + """Insert @lbl to the dictionnary @dst2index with a uniq value + @dst2index: AsmLabel -> uniq value + @lbl: AsmLabel istance""" + dst2index[lbl] = len(dst2index) def assignblk_to_irbloc(self, instr, assignblk): @@ -260,10 +269,14 @@ class CGen(object): return c_prefetch, c_var, c_main, c_mem, c_updt def gen_check_memory_exception(self, address): + """Generate C code to check memory exceptions + @address: address of the faulty instruction""" dst = self.dst_to_c(address) return (self.CODE_EXCEPTION_MEM_AT_INSTR % (self.C_PC, dst, dst)).split('\n') def gen_check_cpu_exception(self, address): + """Generate C code to check cpu exceptions + @address: address of the faulty instruction""" dst = self.dst_to_c(address) return (self.CODE_EXCEPTION_AT_INSTR % (self.C_PC, dst, dst)).split('\n') @@ -279,29 +292,25 @@ class CGen(object): src2, src2b = self.traverse_expr_dst(expr.src2, dst2index) return ("((%s)?(%s):(%s))" % (cond, src1, src2), "((%s)?(%s):(%s))" % (cond, src1b, src2b)) - elif isinstance(expr, m2_expr.ExprInt): + if isinstance(expr, m2_expr.ExprInt): offset = int(expr) self.add_label_index(dst2index, offset) - return ("%s" % dst2index[offset], - hex(offset)) - elif expr_is_label(expr): + return ("%s" % dst2index[offset], hex(offset)) + if expr_is_label(expr): label = expr.name if label.offset != None: offset = label.offset self.add_label_index(dst2index, offset) - return ("%s" % dst2index[offset], - hex(offset)) - else: - self.add_label_index(dst2index, label) - return ("%s" % dst2index[label], - "0") + return ("%s" % dst2index[offset], hex(offset)) + self.add_label_index(dst2index, label) + return ("%s" % dst2index[label], "0") - else: - dst2index[expr] = -1 - return ("-1", - self.id_to_c(expr)) + dst2index[expr] = -1 + return ("-1", self.id_to_c(expr)) def gen_assignblk_dst(self, dst): + """Generate C code to handle instruction destination + @dst: instruction destination Expr""" dst2index = {} (ret, retb) = self.traverse_expr_dst(dst, dst2index) ret = "DST_case = %s;" % ret @@ -311,6 +320,8 @@ class CGen(object): '%s' % retb], dst2index def gen_post_instr_checks(self, attrib): + """Generate C code for handling potential exceptions + @attrib: Attributes instance""" out = [] if attrib.mem_read | attrib.mem_write: out += (self.CODE_VM_EXCEPTION_POST_INSTR % (self.C_PC)).split('\n') @@ -323,6 +334,9 @@ class CGen(object): return out def gen_pre_code(self, instr_attrib): + """Callback to generate code BEFORE the instruction execution + @instr_attrib: Attributes instance""" + out = [] if instr_attrib.log_mn: @@ -331,12 +345,18 @@ class CGen(object): return out def gen_post_code(self, attrib): + """Callback to generate code AFTER the instruction execution + @attrib: Attributes instance""" out = [] if attrib.log_regs: out.append('dump_gpregs(jitcpu->cpu);') return out def gen_goto_code(self, attrib, instr_offsets, dst): + """Generate C code for a potential destination @dst + @attrib: instruction Attributes + @instr_offsets: instructions offsets list + @dst: potential instruction destination""" if isinstance(dst, AsmLabel) and dst.offset is None: # Generate goto for local labels return ['goto %s;' % dst.name] @@ -479,7 +499,7 @@ class CGen(object): @log_regs: generate code to log registers states """ - instr_attrib = Attributes() + instr_attrib = Attributes(log_mn, log_regs) instr_attrib.instr = instr irblocks_attributes = [] @@ -505,6 +525,9 @@ class CGen(object): return self.CODE_BAD_BLOCK.split("\n") def get_block_post_label(self, block): + """Get label next to the @block + @block: AsmBlock instance""" + last_instr = block.lines[-1] offset = last_instr.offset + last_instr.l return self.ir_arch.symbol_pool.getby_offset_create(offset) diff --git a/miasm2/jitter/vm_mngr_py.c b/miasm2/jitter/vm_mngr_py.c index 4436add2..5f25b707 100644 --- a/miasm2/jitter/vm_mngr_py.c +++ b/miasm2/jitter/vm_mngr_py.c @@ -76,7 +76,9 @@ PyObject* set_alarm(VmMngr* self) { global_vmmngr = self; signal(SIGALRM, sig_alarm); - return PyLong_FromUnsignedLongLong((uint64_t)0); + + Py_INCREF(Py_None); + return Py_None; } @@ -90,7 +92,6 @@ PyObject* vm_add_memory_page(VmMngr* self, PyObject* args) uint64_t buf_size; char* buf_data; Py_ssize_t length; - uint64_t ret = 0x1337beef; uint64_t page_addr; uint64_t page_access; char* name_ptr; @@ -98,7 +99,7 @@ PyObject* vm_add_memory_page(VmMngr* self, PyObject* args) struct memory_page_node * mpn; if (!PyArg_ParseTuple(args, "OOO|O", &addr, &access, &item_str, &name)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); PyGetInt(addr, page_addr); PyGetInt(access, page_access); @@ -128,8 +129,8 @@ PyObject* vm_add_memory_page(VmMngr* self, PyObject* args) memcpy(mpn->ad_hp, buf_data, buf_size); add_memory_page(&self->vm_mngr, mpn); - return PyLong_FromUnsignedLongLong((uint64_t)ret); - + Py_INCREF(Py_None); + return Py_None; } @@ -138,14 +139,12 @@ PyObject* vm_set_mem_access(VmMngr* self, PyObject* args) { PyObject *addr; PyObject *access; - - uint64_t ret = 0x1337beef; uint64_t page_addr; uint64_t page_access; struct memory_page_node * mpn; if (!PyArg_ParseTuple(args, "OO", &addr, &access)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); PyGetInt(addr, page_addr); PyGetInt(access, page_access); @@ -157,7 +156,9 @@ PyObject* vm_set_mem_access(VmMngr* self, PyObject* args) } mpn->access = page_access; - return PyLong_FromUnsignedLongLong((uint64_t)ret); + + Py_INCREF(Py_None); + return Py_None; } PyObject* vm_set_mem(VmMngr* self, PyObject* args) @@ -169,15 +170,15 @@ PyObject* vm_set_mem(VmMngr* self, PyObject* args) char * buffer; uint64_t size; uint64_t addr; - int ret = 0x1337; + int ret; if (!PyArg_ParseTuple(args, "OO", &py_addr, &py_buffer)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); PyGetInt(py_addr, addr); - if(!PyString_Check(py_buffer)) - RAISE(PyExc_TypeError,"arg must be str"); + if (!PyString_Check(py_buffer)) + RAISE(PyExc_TypeError,"arg must be str"); size = PyString_Size(py_buffer); PyString_AsStringAndSize(py_buffer, &buffer, &py_length); @@ -202,7 +203,7 @@ PyObject* vm_get_mem_access(VmMngr* self, PyObject* args) struct memory_page_node * mpn; if (!PyArg_ParseTuple(args, "O", &py_addr)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); PyGetInt(py_addr, page_addr); @@ -227,15 +228,14 @@ PyObject* vm_get_mem(VmMngr* self, PyObject* args) int ret; if (!PyArg_ParseTuple(args, "OO", &py_addr, &py_len)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); PyGetInt(py_addr, addr); PyGetInt(py_len, size); ret = vm_read_mem(&self->vm_mngr, addr, &buf_out, size); if (ret < 0) { - PyErr_SetString(PyExc_RuntimeError, "cannot find address"); - return NULL; + RAISE(PyExc_TypeError,"Cannot find address"); } obj_out = PyString_FromStringAndSize(buf_out, size); @@ -255,7 +255,7 @@ PyObject* vm_add_memory_breakpoint(VmMngr* self, PyObject* args) uint64_t b_access; if (!PyArg_ParseTuple(args, "OOO", &ad, &size, &access)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); PyGetInt(ad, b_ad); PyGetInt(size, b_size); @@ -283,7 +283,7 @@ PyObject* vm_remove_memory_breakpoint(VmMngr* self, PyObject* args) uint64_t b_access; if (!PyArg_ParseTuple(args, "OO", &ad, &access)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); PyGetInt(ad, b_ad); PyGetInt(access, b_access); @@ -300,7 +300,7 @@ PyObject* vm_set_exception(VmMngr* self, PyObject* args) uint64_t i; if (!PyArg_ParseTuple(args, "O", &item1)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); PyGetInt(item1, i); @@ -363,7 +363,7 @@ PyObject* py_add_mem_read(VmMngr* self, PyObject* args) uint64_t size; if (!PyArg_ParseTuple(args, "OO", &py_addr, &py_size)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); PyGetInt(py_addr, addr); PyGetInt(py_size, size); @@ -381,7 +381,7 @@ PyObject* py_add_mem_write(VmMngr* self, PyObject* args) uint64_t size; if (!PyArg_ParseTuple(args, "OO", &py_addr, &py_size)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); PyGetInt(py_addr, addr); PyGetInt(py_size, size); @@ -482,13 +482,12 @@ PyObject* vm_add_code_bloc(VmMngr *self, PyObject *args) { PyObject *item1; PyObject *item2; - uint64_t ret = 0x1337beef; uint64_t ad_start, ad_stop, ad_code = 0; struct code_bloc_node * cbp; if (!PyArg_ParseTuple(args, "OO", &item1, &item2)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); PyGetInt(item1, ad_start); PyGetInt(item2, ad_stop); @@ -498,7 +497,9 @@ PyObject* vm_add_code_bloc(VmMngr *self, PyObject *args) cbp->ad_stop = ad_stop; cbp->ad_code = ad_code; add_code_bloc(&self->vm_mngr, cbp); - return PyLong_FromUnsignedLongLong((uint64_t)ret); + + Py_INCREF(Py_None); + return Py_None; } PyObject* vm_dump_code_bloc_pool(VmMngr* self) @@ -520,7 +521,7 @@ PyObject* vm_is_mapped(VmMngr* self, PyObject* args) int ret; if (!PyArg_ParseTuple(args, "OO", &ad, &size)) - return NULL; + RAISE(PyExc_TypeError,"Cannot parse arguments"); PyGetInt(ad, b_ad); PyGetInt(size, b_size); |