diff options
| -rw-r--r-- | miasm2/ir/translators/C.py | 14 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr.c | 92 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr.h | 2 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr_py.c | 38 | ||||
| -rw-r--r-- | test/ir/ir2C.py | 4 |
5 files changed, 9 insertions, 141 deletions
diff --git a/miasm2/ir/translators/C.py b/miasm2/ir/translators/C.py index 72759900..a7ba1a20 100644 --- a/miasm2/ir/translators/C.py +++ b/miasm2/ir/translators/C.py @@ -18,13 +18,9 @@ class TranslatorC(Translator): dct_rot = {'<<<': 'rot_left', '>>>': 'rot_right', } - dct_div = {'div8': "div_op", - 'div16': "div_op", - 'div32': "div_op", - 'idiv32': "div_op", # XXX to test - '<<<c_rez': 'rcl_rez_op', - '>>>c_rez': 'rcr_rez_op', - } + dct_rotc = {'<<<c_rez': 'rcl_rez_op', + '>>>c_rez': 'rcr_rez_op', + } def from_ExprId(self, expr): @@ -120,8 +116,8 @@ class TranslatorC(Translator): else: raise NotImplementedError('Unknown op: %r' % expr.op) - elif len(expr.args) == 3 and expr.op in self.dct_div: - return '(%s(%s, %s, %s, %s) &0x%x)' % (self.dct_div[expr.op], + elif len(expr.args) == 3 and expr.op in self.dct_rotc: + return '(%s(%s, %s, %s, %s) &0x%x)' % (self.dct_rotc[expr.op], expr.args[0].size, self.from_expr(expr.args[0]), self.from_expr(expr.args[1]), diff --git a/miasm2/jitter/vm_mngr.c b/miasm2/jitter/vm_mngr.c index 414cdc68..b86bee1a 100644 --- a/miasm2/jitter/vm_mngr.c +++ b/miasm2/jitter/vm_mngr.c @@ -76,37 +76,7 @@ void print_val(uint64_t base, uint64_t addr) fprintf(stderr, "addr 0x%"PRIX64" val 0x%"PRIX64"\n", addr-base, *ptr); } - -int is_mem_mapped(vm_mngr_t* vm_mngr, uint64_t ad) -{ - struct memory_page_node * mpn; - int i; - for (i=0; i < vm_mngr->memory_pages_number; i++) { - mpn = &vm_mngr->memory_pages_array[i]; - if ((mpn->ad <= ad) && (ad <mpn->ad + mpn->size)) - return 1; - } - - return 0; -} - - -/* Return the address base of the memory page containing addr */ -uint64_t get_mem_base_addr(vm_mngr_t* vm_mngr, uint64_t ad, uint64_t *addr_base) -{ - struct memory_page_node * mpn; - int i; - for (i=0; i < vm_mngr->memory_pages_number; i++) { - mpn = &vm_mngr->memory_pages_array[i]; - if ((mpn->ad <= ad) && (ad <mpn->ad + mpn->size)) { - *addr_base = mpn->ad; - return 1; - } - } - return 0; -} - -int midpoint(int imin, int imax) +inline int midpoint(int imin, int imax) { return (imin + imax) / 2; } @@ -694,39 +664,6 @@ unsigned int umul16_hi(unsigned short a, unsigned short b) return (c>>16) & 0xffff; } - - - -unsigned int div_op(unsigned int size, unsigned int a, unsigned int b, unsigned int c) -{ - int64_t num; - if (c == 0) - { - //vmmngr.exception_flags |= EXCEPT_INT_DIV_BY_ZERO; - return 0; - } - num = ((int64_t)a << size) + b; - num/=(int64_t)c; - return num; -} - - -unsigned int rem_op(unsigned int size, unsigned int a, unsigned int b, unsigned int c) -{ - int64_t num; - - if (c == 0) - { - //vmmngr.exception_flags |= EXCEPT_INT_DIV_BY_ZERO; - return 0; - } - - num = ((int64_t)a << size) + b; - num = (int64_t)num-c*(num/c); - return num; -} - - uint64_t rot_left(uint64_t size, uint64_t a, uint64_t b) { uint64_t tmp; @@ -1448,7 +1385,7 @@ void reset_memory_breakpoint(vm_mngr_t* vm_mngr) } - +/* We don't use dichotomy here for the insertion */ int is_mpn_in_tab(vm_mngr_t* vm_mngr, struct memory_page_node* mpn_a) { struct memory_page_node * mpn; @@ -1472,6 +1409,8 @@ int is_mpn_in_tab(vm_mngr_t* vm_mngr, struct memory_page_node* mpn_a) return 0; } + +/* We don't use dichotomy here for the insertion */ void add_memory_page(vm_mngr_t* vm_mngr, struct memory_page_node* mpn_a) { struct memory_page_node * mpn; @@ -1578,29 +1517,6 @@ void remove_memory_breakpoint(vm_mngr_t* vm_mngr, uint64_t ad, unsigned int acce } - - - - - -unsigned int get_memory_page_next(vm_mngr_t* vm_mngr, unsigned int n_ad) -{ - struct memory_page_node * mpn; - uint64_t ad = 0; - int i; - - for (i=0; i < vm_mngr->memory_pages_number; i++) { - mpn = &vm_mngr->memory_pages_array[i]; - if (mpn->ad < n_ad) - continue; - - if (ad == 0 || mpn->ad <ad) - ad = mpn->ad; - } - return ad; -} - - /********************************************/ void hexdump(char* m, unsigned int l) diff --git a/miasm2/jitter/vm_mngr.h b/miasm2/jitter/vm_mngr.h index 93566987..02b5de73 100644 --- a/miasm2/jitter/vm_mngr.h +++ b/miasm2/jitter/vm_mngr.h @@ -196,8 +196,6 @@ unsigned int umul16_lo(unsigned short a, unsigned short b); unsigned int umul16_hi(unsigned short a, unsigned short b); -unsigned int div_op(unsigned int size, unsigned int a, unsigned int b, unsigned int c); -unsigned int rem_op(unsigned int size, unsigned int a, unsigned int b, unsigned int c); uint64_t rot_left(uint64_t size, uint64_t a, uint64_t b); uint64_t rot_right(uint64_t size, uint64_t a, uint64_t b); unsigned int rcl_rez_op(unsigned int size, unsigned int a, unsigned int b, unsigned int cf); diff --git a/miasm2/jitter/vm_mngr_py.c b/miasm2/jitter/vm_mngr_py.c index 8f7c4b6b..0a22c397 100644 --- a/miasm2/jitter/vm_mngr_py.c +++ b/miasm2/jitter/vm_mngr_py.c @@ -66,44 +66,6 @@ PyObject* _vm_get_exception(unsigned int xcpt) RAISE(PyExc_TypeError,"arg must be int"); \ } \ - -PyObject* vm_is_mem_mapped(VmMngr* self, PyObject* item) -{ - PyObject *addr; - uint64_t page_addr; - uint32_t ret; - if (!PyArg_ParseTuple(item, "O", &addr)) - return NULL; - - PyGetInt(addr, page_addr); - - ret = is_mem_mapped(&self->vm_mngr, page_addr); - return PyInt_FromLong((long)ret); -} - - - -PyObject* vm_get_mem_base_addr(VmMngr* self, PyObject* item) -{ - PyObject *addr; - - uint64_t page_addr; - uint64_t addr_base; - unsigned int ret; - - if (!PyArg_ParseTuple(item, "O", &addr)) - return NULL; - - PyGetInt(addr, page_addr); - - ret = get_mem_base_addr(&self->vm_mngr, page_addr, &addr_base); - if (ret == 0){ - Py_INCREF(Py_None); - return Py_None; - } - return PyLong_FromUnsignedLongLong((uint64_t)addr_base); -} - static void sig_alarm(int signo) { global_vmmngr->vm_mngr.exception_flags |= BREAK_SIGALARM; diff --git a/test/ir/ir2C.py b/test/ir/ir2C.py index 8a5f97c4..36683904 100644 --- a/test/ir/ir2C.py +++ b/test/ir/ir2C.py @@ -54,10 +54,6 @@ class TestIrIr2C(unittest.TestCase): self.assertRaises(NotImplementedError, translator.from_expr, ExprOp('X', *args[:2])) - # Ternary operators - self.translationTest( - ExprOp('div8', *args[:3]), r'(div_op(32, 0x0, 0x1, 0x2) &0xffffffff)') - # Other cases self.translationTest( ExprOp('+', *args[:3]), r'(((0x0&0xffffffff)+(0x1&0xffffffff)+(0x2&0xffffffff))&0xffffffff)') |