about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorFabrice Desclaux <fabrice.desclaux@cea.fr>2016-07-08 17:41:45 +0200
committerFabrice Desclaux <fabrice.desclaux@cea.fr>2016-08-30 13:54:16 +0200
commit5e69274b012a063d78f9f877f669628caa6d24f2 (patch)
treec52479c3afc071a655107600c68a6b67d536f4cb
parentdc2728ba627e108bf7b618161be4368a43b2d59a (diff)
downloadmiasm-5e69274b012a063d78f9f877f669628caa6d24f2.tar.gz
miasm-5e69274b012a063d78f9f877f669628caa6d24f2.zip
Jitter: optimize memory write object
-rw-r--r--miasm2/jitter/vm_mngr.c45
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)