diff options
| author | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2016-08-01 09:31:23 +0200 |
|---|---|---|
| committer | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2016-08-30 11:08:19 +0200 |
| commit | 4daf9861f4b07bbf10803a5593d473c2268bfbb6 (patch) | |
| tree | 4ed2e6305f697e92f4ba2da1a9619b0ccfa637d2 | |
| parent | d441330ab409cfb0a8d3e0ebcfccafef54c32cd0 (diff) | |
| download | miasm-4daf9861f4b07bbf10803a5593d473c2268bfbb6.tar.gz miasm-4daf9861f4b07bbf10803a5593d473c2268bfbb6.zip | |
Jitter: suport mips32
| -rw-r--r-- | miasm2/arch/mips32/jit.py | 63 | ||||
| -rw-r--r-- | miasm2/jitter/arch/JitCore_mips32.h | 1 |
2 files changed, 64 insertions, 0 deletions
diff --git a/miasm2/arch/mips32/jit.py b/miasm2/arch/mips32/jit.py index aca85de5..332e8d13 100644 --- a/miasm2/arch/mips32/jit.py +++ b/miasm2/arch/mips32/jit.py @@ -5,6 +5,7 @@ from miasm2.core import asmbloc from miasm2.core.utils import * from miasm2.arch.mips32.sem import ir_mips32l, ir_mips32b from miasm2.jitter.codegen import CGen +import miasm2.expression.expression as m2_expr log = logging.getLogger('jit_mips32') hnd = logging.StreamHandler() @@ -12,8 +13,69 @@ hnd.setFormatter(logging.Formatter("[%(levelname)s]: %(message)s")) log.addHandler(hnd) log.setLevel(logging.CRITICAL) + +class mipsCGen(CGen): + CODE_INIT = CGen.CODE_INIT + r""" + unsigned int branch_dst_pc; + unsigned int branch_dst_irdst; + unsigned int branch_dst_set=0; + """ + + CODE_RETURN_NO_EXCEPTION = r""" + %s: + if (branch_dst_set) { + %s = %s; + BlockDst->address = %s; + } else { + BlockDst->address = %s; + } + return JIT_RET_NO_EXCEPTION; + """ + + def __init__(self, ir_arch): + super(mipsCGen, self).__init__(ir_arch) + self.delay_slot_dst = m2_expr.ExprId("branch_dst_irdst") + self.delay_slot_set = m2_expr.ExprId("branch_dst_set") + + def block2assignblks(self, block): + irblocks_list = super(mipsCGen, self).block2assignblks(block) + for instr, irblocks in zip(block.lines, irblocks_list): + if not instr.breakflow(): + continue + for irblock in irblocks: + for i, assignblock in enumerate(irblock.irs): + if self.ir_arch.pc not in assignblock: + continue + # Add internal branch destination + assignblock[self.delay_slot_dst] = assignblock[ + self.ir_arch.pc] + assignblock[self.delay_slot_set] = m2_expr.ExprInt(1, 32) + # Replace IRDst with next instruction + assignblock[self.ir_arch.IRDst] = m2_expr.ExprId( + self.ir_arch.get_next_instr(instr)) + irblock.dst = m2_expr.ExprId( + self.ir_arch.get_next_instr(instr)) + return irblocks_list + + def gen_finalize(self, block): + """ + Generate the C code for the final block instruction + """ + + lbl = self.get_block_post_label(block) + out = (self.CODE_RETURN_NO_EXCEPTION % (lbl.name, + self.C_PC, + m2_expr.ExprId('branch_dst_irdst'), + m2_expr.ExprId('branch_dst_irdst'), + self.id_to_c(m2_expr.ExprInt(lbl.offset, 32))) + ).split('\n') + return out + + class jitter_mips32l(jitter): + C_Gen = mipsCGen + def __init__(self, *args, **kwargs): sp = asmbloc.asm_symbol_pool() jitter.__init__(self, ir_mips32l(sp), *args, **kwargs) @@ -38,6 +100,7 @@ class jitter_mips32l(jitter): class jitter_mips32b(jitter_mips32l): + def __init__(self, *args, **kwargs): sp = asmbloc.asm_symbol_pool() jitter.__init__(self, ir_mips32b(sp), *args, **kwargs) diff --git a/miasm2/jitter/arch/JitCore_mips32.h b/miasm2/jitter/arch/JitCore_mips32.h index de98f069..c257b63c 100644 --- a/miasm2/jitter/arch/JitCore_mips32.h +++ b/miasm2/jitter/arch/JitCore_mips32.h @@ -751,6 +751,7 @@ typedef struct { }vm_cpu_t; +void dump_gpregs(vm_cpu_t* vmcpu); //#define RETURN_PC return PyLong_FromUnsignedLongLong(vmcpu->PC); #define RETURN_PC return BlockDst; |