about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--miasm2/arch/mips32/arch.py1
-rw-r--r--miasm2/arch/mips32/sem.py12
-rw-r--r--miasm2/ir/symbexec.py10
-rw-r--r--test/arch/mips32/arch.py2
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",