diff options
Diffstat (limited to 'miasm2/jitter/jitcore.py')
| -rw-r--r-- | miasm2/jitter/jitcore.py | 36 |
1 files changed, 21 insertions, 15 deletions
diff --git a/miasm2/jitter/jitcore.py b/miasm2/jitter/jitcore.py index 74c438a7..04bd707a 100644 --- a/miasm2/jitter/jitcore.py +++ b/miasm2/jitter/jitcore.py @@ -51,8 +51,6 @@ class JitCore(object): self.blocs_mem_interval = interval() self.disasm_cb = None self.split_dis = set() - self.addr_mod = interval() - self.options = {"jit_maxline": 50 # Maximum number of line jitted } @@ -95,6 +93,11 @@ class JitCore(object): if cur_bloc.lines: cur_bloc.ad_min = cur_bloc.lines[0].offset cur_bloc.ad_max = cur_bloc.lines[-1].offset + cur_bloc.lines[-1].l + else: + # 1 byte block for unknown mnemonic + cur_bloc.ad_min = cur_bloc.label.offset + cur_bloc.ad_max = cur_bloc.label.offset+1 + def add_bloc_to_mem_interval(self, vm, bloc): "Update vm to include bloc addresses in its memory range" @@ -142,16 +145,13 @@ class JitCore(object): cur_bloc = self.mdis.dis_bloc(addr) except IOError: # vm_exception_flag is set - cur_bloc = asmbloc.asm_bloc(label) + label = self.ir_arch.symbol_pool.getby_offset_create(addr) + cur_bloc = asmbloc.asm_block_bad(label) # Logging if self.log_newbloc: print cur_bloc - # Check for empty blocks - if not cur_bloc.lines: - raise ValueError("Cannot JIT a block without any assembly line") - # Update label -> bloc self.lbl2bloc[cur_bloc.label] = cur_bloc @@ -259,15 +259,21 @@ class JitCore(object): return modified_blocs - def updt_automod_code(self, vm): - """Remove code jitted in range self.addr_mod + def updt_automod_code_range(self, vm, mem_range): + """Remove jitted code in range @mem_range @vm: VmMngr instance + @mem_range: list of start/stop addresses """ - 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 mem_range: + self.del_bloc_in_range(addr_start, addr_stop) self.__updt_jitcode_mem_range(vm) - self.addr_mod = interval() + vm.reset_memory_access() - def automod_cb(self, addr=0, size=0): - self.addr_mod += interval([(addr, addr + size / 8 - 1)]) - return None + def updt_automod_code(self, vm): + """Remove jitted code updated by memory write + @vm: VmMngr instance + """ + mem_range = [] + for addr_start, addr_stop in vm.get_memory_write(): + mem_range.append((addr_start, addr_stop)) + self.updt_automod_code_range(vm, mem_range) |