diff options
| -rw-r--r-- | miasm2/arch/mips32/arch.py | 1 | ||||
| -rw-r--r-- | miasm2/arch/mips32/sem.py | 12 | ||||
| -rw-r--r-- | miasm2/ir/symbexec.py | 10 | ||||
| -rw-r--r-- | test/arch/mips32/arch.py | 2 |
4 files changed, 25 insertions, 0 deletions
diff --git a/miasm2/arch/mips32/arch.py b/miasm2/arch/mips32/arch.py index 19f8b26f..8a49c4f8 100644 --- a/miasm2/arch/mips32/arch.py +++ b/miasm2/arch/mips32/arch.py @@ -691,6 +691,7 @@ mips32op("seb", [bs('011111'), bs('00000'), rt, rd, bs('10000'), bs('100000' mips32op("wsbh", [bs('011111'), bs('00000'), rt, rd, bs('00010'), bs('100000')], [rd, rt]) mips32op("di", [bs('010000'), bs('01011'), rt, bs('01100'), bs('00000'), bs('0'), bs('00'), bs('000')]) +mips32op("ei", [bs('010000'), bs('01011'), rt, bs('01100'), bs('00000'), bs('1'), bs('00'), bs('000')]) mips32op("tlbp", [bs('010000'), bs('1'), bs('0'*19), bs('001000')]) diff --git a/miasm2/arch/mips32/sem.py b/miasm2/arch/mips32/sem.py index 8f8efdf4..e83d9b48 100644 --- a/miasm2/arch/mips32/sem.py +++ b/miasm2/arch/mips32/sem.py @@ -420,6 +420,14 @@ def mflo(ir, instr, a): e.append(ExprAff(a, R_LO)) return e, [] +def di(ir, instr, a): + return [], [] + +def ei(ir, instr, a): + return [], [] + +def ehb(ir, instr, a): + return [], [] mnemo_func = { "addiu": addiu, @@ -498,6 +506,10 @@ mnemo_func = { "mfhi" : mfhi, "mflo" : mflo, + "di" : di, + "ei" : ei, + "ehb" : ehb, + } def get_mnemo_expr(ir, instr, *args): diff --git a/miasm2/ir/symbexec.py b/miasm2/ir/symbexec.py index 87ad7359..5bdcac2f 100644 --- a/miasm2/ir/symbexec.py +++ b/miasm2/ir/symbexec.py @@ -99,6 +99,8 @@ class symbexec(object): return None def eval_ExprId(self, e, eval_cache=None): + if eval_cache is None: + eval_cache = {} if isinstance(e.name, asmbloc.asm_label) and e.name.offset is not None: return ExprInt_from(e, e.name.offset) if not e in self.symbols: @@ -110,6 +112,8 @@ class symbexec(object): return e def eval_ExprMem(self, e, eval_cache=None): + if eval_cache is None: + eval_cache = {} a_val = self.expr_simp(self.eval_expr(e.arg, eval_cache)) if a_val != e.arg: a = self.expr_simp(ExprMem(a_val, size=e.size)) @@ -198,6 +202,8 @@ class symbexec(object): return tmp def eval_expr_visit(self, e, eval_cache=None): + if eval_cache is None: + eval_cache = {} # print 'visit', e, e.is_term if e.is_term: return e @@ -217,6 +223,8 @@ class symbexec(object): return e def eval_expr(self, e, eval_cache=None): + if eval_cache is None: + eval_cache = {} r = e.visit(lambda x: self.eval_expr_visit(x, eval_cache)) return r @@ -321,6 +329,8 @@ class symbexec(object): # give mem stored overlapping requested mem ptr def get_mem_overlapping(self, e, eval_cache=None): + if eval_cache is None: + eval_cache = {} if not isinstance(e, ExprMem): raise ValueError('mem overlap bad arg') ov = [] diff --git a/test/arch/mips32/arch.py b/test/arch/mips32/arch.py index 2f1f5821..8ecb0a5a 100644 --- a/test/arch/mips32/arch.py +++ b/test/arch/mips32/arch.py @@ -194,6 +194,8 @@ reg_tests_mips32 = [ "7C02B420"), ("8BA0F468 DI ZERO", "41606000"), + ("XXXXXXXX EI ZERO", + "41606020"), ("8BA0F78C WSBH V1, V1", "7C0318A0"), ("8BA0F790 ROTR V1, V1, 0x10", |