diff options
| -rw-r--r-- | miasm2/jitter/codegen.py | 3 | ||||
| -rw-r--r-- | miasm2/jitter/jitload.py | 1 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr.c | 10 |
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); } |