about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--miasm2/jitter/arch/JitCore_x86.c13
-rw-r--r--miasm2/jitter/jitcore.py9
-rw-r--r--miasm2/jitter/jitload.py1
-rw-r--r--miasm2/jitter/vm_mngr.c42
-rw-r--r--miasm2/jitter/vm_mngr.h11
-rw-r--r--miasm2/jitter/vm_mngr_py.c38
6 files changed, 93 insertions, 21 deletions
diff --git a/miasm2/jitter/arch/JitCore_x86.c b/miasm2/jitter/arch/JitCore_x86.c
index cd24522d..6a503d83 100644
--- a/miasm2/jitter/arch/JitCore_x86.c
+++ b/miasm2/jitter/arch/JitCore_x86.c
@@ -322,42 +322,31 @@ IMOD(16)
 IMOD(32)
 IMOD(64)
 
-
-
-
 void check_automod(JitCpu* jitcpu, uint64_t addr, uint64_t size)
 {
-	PyObject *result;
-
 	if (!(((VmMngr*)jitcpu->pyvm)->vm_mngr.exception_flags & EXCEPT_CODE_AUTOMOD))
 		return;
-	result = PyObject_CallMethod(jitcpu->jitter, "automod_cb", "LL", addr, size);
-	Py_DECREF(result);
-
+	code_bloc_add_write(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, size/8);
 }
 
 void MEM_WRITE_08(JitCpu* jitcpu, uint64_t addr, uint8_t src)
 {
 	vm_MEM_WRITE_08(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src);
-	check_automod(jitcpu, addr, 8);
 }
 
 void MEM_WRITE_16(JitCpu* jitcpu, uint64_t addr, uint16_t src)
 {
 	vm_MEM_WRITE_16(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src);
-	check_automod(jitcpu, addr, 16);
 }
 
 void MEM_WRITE_32(JitCpu* jitcpu, uint64_t addr, uint32_t src)
 {
 	vm_MEM_WRITE_32(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src);
-	check_automod(jitcpu, addr, 32);
 }
 
 void MEM_WRITE_64(JitCpu* jitcpu, uint64_t addr, uint64_t src)
 {
 	vm_MEM_WRITE_64(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src);
-	check_automod(jitcpu, addr, 64);
 }
 
 
diff --git a/miasm2/jitter/jitcore.py b/miasm2/jitter/jitcore.py
index 6048d62e..5c2584f0 100644
--- a/miasm2/jitter/jitcore.py
+++ b/miasm2/jitter/jitcore.py
@@ -264,11 +264,8 @@ class JitCore(object):
         """Remove code jitted in range self.addr_mod
         @vm: VmMngr instance
         """
-        for addr_start, addr_stop in self.addr_mod:
-            self.del_bloc_in_range(addr_start, addr_stop + 1)
+        for addr_start, addr_stop in vm.get_code_bloc_write():
+            self.del_bloc_in_range(addr_start, addr_stop)
         self.__updt_jitcode_mem_range(vm)
         self.addr_mod = interval()
-
-    def automod_cb(self, addr=0, size=0):
-        self.addr_mod += interval([(addr, addr + size / 8 - 1)])
-        return None
+        vm.reset_code_bloc_write()
diff --git a/miasm2/jitter/jitload.py b/miasm2/jitter/jitload.py
index 8943e2c7..c9be1597 100644
--- a/miasm2/jitter/jitload.py
+++ b/miasm2/jitter/jitload.py
@@ -245,6 +245,7 @@ class jitter:
             "Tell the JiT backend to update blocs modified"
 
             self.jit.updt_automod_code(jitter.vm)
+            self.vm.reset_code_bloc_write()
             self.vm.set_exception(0)
 
             return True
diff --git a/miasm2/jitter/vm_mngr.c b/miasm2/jitter/vm_mngr.c
index f9d19b9d..67599c39 100644
--- a/miasm2/jitter/vm_mngr.c
+++ b/miasm2/jitter/vm_mngr.c
@@ -393,6 +393,24 @@ 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)
+{
+	if (vm_mngr->code_bloc_valid == 0) {
+		vm_mngr->code_bloc_valid = 1;
+		vm_mngr->code_bloc_memory_w_start = addr;
+		vm_mngr->code_bloc_memory_w_stop = addr + size;
+	} else {
+		if (vm_mngr->code_bloc_memory_w_stop != addr) {
+			fprintf(stderr,
+				"Error: sparse write %"PRIx64" %"PRIx64"\n",
+				vm_mngr->code_bloc_memory_w_stop,
+				addr);
+			exit(-1);
+		}
+		vm_mngr->code_bloc_memory_w_stop = addr + size;
+	}
+}
+
 void check_write_code_bloc(vm_mngr_t* vm_mngr, uint64_t my_size, uint64_t addr)
 {
 	struct code_bloc_node * cbp;
@@ -404,18 +422,32 @@ void check_write_code_bloc(vm_mngr_t* vm_mngr, uint64_t my_size, uint64_t addr)
 			    (addr < cbp->ad_stop)){
 #ifdef DEBUG_MIASM_AUTOMOD_CODE
 				fprintf(stderr, "**********************************\n");
-				fprintf(stderr, "self modifying code %"PRIX64" %.8X\n",
+				fprintf(stderr, "self modifying code %"PRIX64" %"PRIX64"\n",
 				       addr, my_size);
 				fprintf(stderr, "**********************************\n");
 #endif
 				vm_mngr->exception_flags |= EXCEPT_CODE_AUTOMOD;
-
+				code_bloc_add_write(vm_mngr, addr, my_size/8);
 				break;
 			}
 		}
 	}
 }
 
+void reset_code_bloc_write(vm_mngr_t* vm_mngr)
+{
+	vm_mngr->code_bloc_valid = 0;
+	vm_mngr->code_bloc_memory_w_start = 0;
+	vm_mngr->code_bloc_memory_w_stop = 0;
+}
+
+int get_code_bloc_write(vm_mngr_t* vm_mngr, uint64_t* start, uint64_t* stop)
+{
+	*start = vm_mngr->code_bloc_memory_w_start;
+	*stop = vm_mngr->code_bloc_memory_w_stop;
+	return vm_mngr->code_bloc_valid;
+}
+
 PyObject* addr2BlocObj(vm_mngr_t* vm_mngr, uint64_t addr)
 {
 	PyObject* pyaddr;
@@ -1390,6 +1422,12 @@ void init_code_bloc_pool(vm_mngr_t* vm_mngr)
 	LIST_INIT(&vm_mngr->code_bloc_pool);
 	vm_mngr->code_bloc_pool_ad_min = 0xffffffff;
 	vm_mngr->code_bloc_pool_ad_max = 0;
+
+	vm_mngr->code_bloc_valid = 0;
+	vm_mngr->code_bloc_memory_w_start = 0;
+	vm_mngr->code_bloc_memory_w_stop = 0;
+
+
 }
 
 void init_memory_breakpoint(vm_mngr_t* vm_mngr)
diff --git a/miasm2/jitter/vm_mngr.h b/miasm2/jitter/vm_mngr.h
index fb0a3c92..eb13855f 100644
--- a/miasm2/jitter/vm_mngr.h
+++ b/miasm2/jitter/vm_mngr.h
@@ -90,6 +90,14 @@ typedef struct {
 	uint64_t exception_flags;
 	uint64_t exception_flags_new;
 	PyObject *addr2obj;
+
+
+
+	uint64_t code_bloc_valid;
+	uint64_t code_bloc_memory_w_start;
+	uint64_t code_bloc_memory_w_stop;
+
+
 }vm_mngr_t;
 
 
@@ -282,6 +290,9 @@ void remove_memory_breakpoint(vm_mngr_t* vm_mngr, uint64_t ad, unsigned int acce
 void add_memory_page(vm_mngr_t* vm_mngr, struct memory_page_node* mpn);
 
 void check_write_code_bloc(vm_mngr_t* vm_mngr, uint64_t my_size, uint64_t addr);
+void code_bloc_add_write(vm_mngr_t* vm_mngr, uint64_t addr, uint64_t size);
+void reset_code_bloc_write(vm_mngr_t* vm_mngr);
+int get_code_bloc_write(vm_mngr_t* vm_mngr, uint64_t* start, uint64_t* stop);
 
 
 char* dump(vm_mngr_t* vm_mngr);
diff --git a/miasm2/jitter/vm_mngr_py.c b/miasm2/jitter/vm_mngr_py.c
index 215517ee..af41709e 100644
--- a/miasm2/jitter/vm_mngr_py.c
+++ b/miasm2/jitter/vm_mngr_py.c
@@ -460,6 +460,39 @@ PyObject* vm_is_mapped(VmMngr* self, PyObject* args)
 	return PyLong_FromUnsignedLongLong((uint64_t)ret);
 }
 
+PyObject* vm_reset_code_bloc_write(VmMngr* self, PyObject* args)
+{
+	reset_code_bloc_write(&self->vm_mngr);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+PyObject* vm_get_code_bloc_write(VmMngr* self, PyObject* args)
+{
+	uint64_t start, stop;
+	PyObject* range;
+	PyObject* result;
+	uint32_t valid;
+
+	valid = get_code_bloc_write(&self->vm_mngr, &start, &stop);
+	if (!valid) {
+		result = PyList_New(0);
+		return result;
+	}
+
+	range = PyTuple_New(2);
+	PyTuple_SetItem(range, 0, PyLong_FromUnsignedLongLong((uint64_t)start));
+	PyTuple_SetItem(range, 1, PyLong_FromUnsignedLongLong((uint64_t)stop));
+
+
+	result = PyList_New(1);
+	PyList_SET_ITEM(result, 0, range);
+
+	return result;
+}
+
+
+
 
 static PyObject *
 vm_set_big_endian(VmMngr *self, PyObject *value, void *closure)
@@ -529,6 +562,8 @@ static PyMethodDef VmMngr_methods[] = {
 	 "X"},
 	{"is_mapped", (PyCFunction)vm_is_mapped, METH_VARARGS,
 	 "X"},
+	{"reset_code_bloc_write", (PyCFunction)vm_reset_code_bloc_write, METH_VARARGS,
+	 "X"},
 	{"add_code_bloc",(PyCFunction)vm_add_code_bloc, METH_VARARGS,
 	 "X"},
 	{"get_mem", (PyCFunction)vm_get_mem, METH_VARARGS,
@@ -551,13 +586,14 @@ static PyMethodDef VmMngr_methods[] = {
 	 "X"},
 	{"reset_code_bloc_pool", (PyCFunction)vm_reset_code_bloc_pool, METH_VARARGS,
 	 "X"},
+	{"get_code_bloc_write", (PyCFunction)vm_get_code_bloc_write, METH_VARARGS,
+	 "X"},
 	{"set_alarm", (PyCFunction)set_alarm, METH_VARARGS,
 	 "X"},
 	{"get_exception",(PyCFunction)vm_get_exception, METH_VARARGS,
 	 "X"},
 	{"get_exception",(PyCFunction)vm_get_exception, METH_VARARGS,
 	 "X"},
-
 	{"set_big_endian",(PyCFunction)vm_set_big_endian, METH_VARARGS,
 	 "X"},
 	{"set_little_endian",(PyCFunction)vm_set_little_endian, METH_VARARGS,