about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--miasm2/jitter/codegen.py3
-rw-r--r--miasm2/jitter/jitload.py1
-rw-r--r--miasm2/jitter/vm_mngr.c10
3 files changed, 10 insertions, 4 deletions
diff --git a/miasm2/jitter/codegen.py b/miasm2/jitter/codegen.py
index 7bdbf890..068839e7 100644
--- a/miasm2/jitter/codegen.py
+++ b/miasm2/jitter/codegen.py
@@ -331,6 +331,9 @@ class CGen(object):
         if attrib.set_exception or attrib.op_set_exception:
             out += (self.CODE_CPU_EXCEPTION_POST_INSTR % (self.C_PC, dst)).split('\n')
 
+        if attrib.mem_read | attrib.mem_write:
+            out.append("reset_code_bloc_write(&((VmMngr*)jitcpu->pyvm)->vm_mngr);")
+
         return out
 
     def gen_pre_code(self, attrib):
diff --git a/miasm2/jitter/jitload.py b/miasm2/jitter/jitload.py
index c9be1597..8943e2c7 100644
--- a/miasm2/jitter/jitload.py
+++ b/miasm2/jitter/jitload.py
@@ -245,7 +245,6 @@ 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 5cf6f162..3584fa51 100644
--- a/miasm2/jitter/vm_mngr.c
+++ b/miasm2/jitter/vm_mngr.c
@@ -409,6 +409,9 @@ void check_write_code_bloc(vm_mngr_t* vm_mngr, uint64_t my_size, uint64_t addr)
 {
 	struct code_bloc_node * cbp;
 
+	if (vm_mngr->exception_flags & EXCEPT_CODE_AUTOMOD)
+		return;
+
 	if (!(addr + my_size/8 <= vm_mngr->code_bloc_pool_ad_min ||
 	      addr >=vm_mngr->code_bloc_pool_ad_max)){
 		LIST_FOREACH(cbp, &vm_mngr->code_bloc_pool, next){
@@ -421,9 +424,6 @@ void check_write_code_bloc(vm_mngr_t* vm_mngr, uint64_t my_size, uint64_t addr)
 				fprintf(stderr, "**********************************\n");
 #endif
 				vm_mngr->exception_flags |= EXCEPT_CODE_AUTOMOD;
-				printf("self modifying code %"PRIX64" %"PRIX64"\n",
-				       addr, my_size);
-				code_bloc_add_write(vm_mngr, addr, my_size/8);
 				break;
 			}
 		}
@@ -462,22 +462,26 @@ PyObject* addr2BlocObj(vm_mngr_t* vm_mngr, uint64_t addr)
 void vm_MEM_WRITE_08(vm_mngr_t* vm_mngr, uint64_t addr, unsigned char src)
 {
 	check_write_code_bloc(vm_mngr, 8, addr);
+	code_bloc_add_write(vm_mngr, addr, 1);
 	memory_page_write(vm_mngr, 8, addr, src);
 }
 
 void vm_MEM_WRITE_16(vm_mngr_t* vm_mngr, uint64_t addr, unsigned short src)
 {
 	check_write_code_bloc(vm_mngr, 16, addr);
+	code_bloc_add_write(vm_mngr, addr, 2);
 	memory_page_write(vm_mngr, 16, addr, src);
 }
 void vm_MEM_WRITE_32(vm_mngr_t* vm_mngr, uint64_t addr, unsigned int src)
 {
 	check_write_code_bloc(vm_mngr, 32, addr);
+	code_bloc_add_write(vm_mngr, addr, 4);
 	memory_page_write(vm_mngr, 32, addr, src);
 }
 void vm_MEM_WRITE_64(vm_mngr_t* vm_mngr, uint64_t addr, uint64_t src)
 {
 	check_write_code_bloc(vm_mngr, 64, addr);
+	code_bloc_add_write(vm_mngr, addr, 8);
 	memory_page_write(vm_mngr, 64, addr, src);
 }