diff options
| author | Camille Mougey <commial@gmail.com> | 2018-05-18 13:17:57 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-05-18 13:17:57 +0200 |
| commit | f45613e84c4de409342d1b971e7ce0234173ffc4 (patch) | |
| tree | 244766e52d6fd83917de117ee3c14b830de8cb84 /miasm2/jitter/jitcore.py | |
| parent | f6a9db54b4f385d680abfe91b33c7c5f577118cb (diff) | |
| parent | 53273fa3b21e618cd9cc745624787450bc441476 (diff) | |
| download | miasm-f45613e84c4de409342d1b971e7ce0234173ffc4.tar.gz miasm-f45613e84c4de409342d1b971e7ce0234173ffc4.zip | |
Merge pull request #747 from serpilliere/asmblobk_bad_jit
Asmblobk bad jit
Diffstat (limited to '')
| -rw-r--r-- | miasm2/jitter/jitcore.py | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/miasm2/jitter/jitcore.py b/miasm2/jitter/jitcore.py index f2b1375d..4402ef49 100644 --- a/miasm2/jitter/jitcore.py +++ b/miasm2/jitter/jitcore.py @@ -17,7 +17,7 @@ # from hashlib import md5 -from miasm2.core import asmblock +from miasm2.core.asmblock import disasmEngine, AsmLabel, AsmBlockBad from miasm2.core.interval import interval from miasm2.core.utils import BoundedDict from miasm2.jitter.csts import * @@ -57,13 +57,15 @@ class JitCore(object): "max_exec_per_call": 0 # 0 means no limit } - self.mdis = asmblock.disasmEngine(ir_arch.arch, ir_arch.attrib, bs, - lines_wd=self.options["jit_maxline"], - symbol_pool=ir_arch.symbol_pool, - follow_call=False, - dontdis_retcall=False, - split_dis=self.split_dis, - dis_block_callback=self.disasm_cb) + self.mdis = disasmEngine( + ir_arch.arch, ir_arch.attrib, bs, + lines_wd=self.options["jit_maxline"], + symbol_pool=ir_arch.symbol_pool, + follow_call=False, + dontdis_retcall=False, + split_dis=self.split_dis, + dis_block_callback=self.disasm_cb + ) def set_options(self, **kwargs): @@ -135,7 +137,7 @@ class JitCore(object): """ # Get the block - if isinstance(addr, asmblock.AsmLabel): + if isinstance(addr, AsmLabel): addr = addr.offset # Prepare disassembler @@ -143,13 +145,9 @@ class JitCore(object): self.mdis.dis_block_callback = self.disasm_cb # Disassemble it - try: - cur_block = self.mdis.dis_block(addr) - except IOError: - # vm_exception_flag is set - label = self.ir_arch.symbol_pool.getby_offset_create(addr) - cur_block = asmblock.AsmBlockBad(label) - + cur_block = self.mdis.dis_block(addr) + if isinstance(cur_block, AsmBlockBad): + return cur_block # Logging if self.log_newbloc: print cur_block @@ -165,6 +163,7 @@ class JitCore(object): # Update jitcode mem range self.add_bloc_to_mem_interval(vm, cur_block) + return cur_block def runbloc(self, cpu, lbl, breakpoints): """Run the block starting at lbl. @@ -177,7 +176,16 @@ class JitCore(object): if not lbl in self.lbl2jitbloc: # Need to JiT the block - self.disbloc(lbl, cpu.vmmngr) + cur_block = self.disbloc(lbl, cpu.vmmngr) + if isinstance(cur_block, AsmBlockBad): + errno = cur_block.errno + if errno == AsmBlockBad.ERROR_IO: + cpu.vmmngr.set_exception(EXCEPT_ACCESS_VIOL) + elif errno == AsmBlockBad.ERROR_CANNOT_DISASM: + cpu.set_exception(EXCEPT_UNK_MNEMO) + else: + raise RuntimeError("Unhandled disasm result %r" % errno) + return lbl # Run the block and update cpu/vmmngr state return self.exec_wrapper(lbl, cpu, self.lbl2jitbloc.data, breakpoints, |