diff options
| author | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2016-07-08 17:41:45 +0200 |
|---|---|---|
| committer | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2016-08-30 13:54:16 +0200 |
| commit | 5e69274b012a063d78f9f877f669628caa6d24f2 (patch) | |
| tree | c52479c3afc071a655107600c68a6b67d536f4cb | |
| parent | dc2728ba627e108bf7b618161be4368a43b2d59a (diff) | |
| download | miasm-5e69274b012a063d78f9f877f669628caa6d24f2.tar.gz miasm-5e69274b012a063d78f9f877f669628caa6d24f2.zip | |
Jitter: optimize memory write object
| -rw-r--r-- | miasm2/jitter/vm_mngr.c | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/miasm2/jitter/vm_mngr.c b/miasm2/jitter/vm_mngr.c index 3584fa51..2b0ae1fd 100644 --- a/miasm2/jitter/vm_mngr.c +++ b/miasm2/jitter/vm_mngr.c @@ -396,8 +396,41 @@ void dump_code_bloc(vm_mngr_t* vm_mngr) void code_bloc_add_write(vm_mngr_t* vm_mngr, uint64_t addr, uint64_t size) { PyObject* range; + PyObject* element; + int list_size; + uint64_t addr_start, addr_stop; + list_size = PyList_Size(vm_mngr->code_bloc_memory_w); + if (list_size > 0) { + /* check match on upper bound */ + element = PyList_GetItem(vm_mngr->code_bloc_memory_w, list_size - 1); + + addr_start = (uint64_t)PyLong_AsUnsignedLongLong(PyTuple_GetItem(element, 0)); + addr_stop = (uint64_t)PyLong_AsUnsignedLongLong(PyTuple_GetItem(element, 1)); + + if (addr_stop == addr) { + range = PyTuple_New(2); + PyTuple_SetItem(range, 0, PyLong_FromUnsignedLongLong((uint64_t)addr_start)); + PyTuple_SetItem(range, 1, PyLong_FromUnsignedLongLong((uint64_t)addr+size)); + PyList_SetItem(vm_mngr->code_bloc_memory_w, list_size - 1, range); + return; + + } + + /* check match on lower bound */ + element = PyList_GetItem(vm_mngr->code_bloc_memory_w, 0); + addr_start = (uint64_t)PyLong_AsUnsignedLongLong(PyTuple_GetItem(element, 0)); + + if (addr_start == addr + size) { + range = PyTuple_New(2); + PyTuple_SetItem(range, 0, PyLong_FromUnsignedLongLong((uint64_t)addr)); + PyTuple_SetItem(range, 1, PyLong_FromUnsignedLongLong((uint64_t)addr_start)); + PyList_SetItem(vm_mngr->code_bloc_memory_w, 0, range); + return; + } + + } range = PyTuple_New(2); PyTuple_SetItem(range, 0, PyLong_FromUnsignedLongLong((uint64_t)addr)); PyTuple_SetItem(range, 1, PyLong_FromUnsignedLongLong((uint64_t)addr+size)); @@ -432,6 +465,17 @@ void check_write_code_bloc(vm_mngr_t* vm_mngr, uint64_t my_size, uint64_t addr) void reset_code_bloc_write(vm_mngr_t* vm_mngr) { + int i; + int list_size; + PyObject* element; + + list_size = PyList_Size(vm_mngr->code_bloc_memory_w); + + for (i=0;i<list_size; i++) { + element = PyList_GetItem(vm_mngr->code_bloc_memory_w, i); + Py_DECREF(element); + } + Py_DECREF(vm_mngr->code_bloc_memory_w); vm_mngr->code_bloc_memory_w = PyList_New(0); @@ -1423,7 +1467,6 @@ void init_code_bloc_pool(vm_mngr_t* vm_mngr) vm_mngr->code_bloc_memory_w = PyList_New(0); - } void init_memory_breakpoint(vm_mngr_t* vm_mngr) |