about summary refs log tree commit diff stats
path: root/miasm2/arch/x86/sem.py
diff options
context:
space:
mode:
Diffstat (limited to 'miasm2/arch/x86/sem.py')
-rw-r--r--miasm2/arch/x86/sem.py66
1 files changed, 46 insertions, 20 deletions
diff --git a/miasm2/arch/x86/sem.py b/miasm2/arch/x86/sem.py
index 0312891b..e32b8001 100644
--- a/miasm2/arch/x86/sem.py
+++ b/miasm2/arch/x86/sem.py
@@ -23,6 +23,8 @@ from miasm2.arch.x86.arch import mn_x86, repeat_mn, replace_regs
 from miasm2.expression.expression_helper import expr_cmps, expr_cmpu
 from miasm2.ir.ir import IntermediateRepresentation, IRBlock, AssignBlock
 from miasm2.core.sembuilder import SemBuilder
+from miasm2.jitter.csts import EXCEPT_DIV_BY_ZERO, EXCEPT_ILLEGAL_INSN, \
+    EXCEPT_PRIV_INSN, EXCEPT_SOFT_BP, EXCEPT_INT_XX
 import math
 import struct
 
@@ -36,22 +38,6 @@ ctx = {'mRAX': mRAX,
        }
 sbuild = SemBuilder(ctx)
 
-# interrupt with eip update after instr
-EXCEPT_SOFT_BP = (1 << 1)
-EXCEPT_INT_XX = (1 << 2)
-
-EXCEPT_BREAKPOINT_INTERN = (1 << 10)
-
-EXCEPT_NUM_UPDT_EIP = (1 << 11)
-# interrupt with eip at instr
-EXCEPT_UNK_MEM_AD = (1 << 12)
-EXCEPT_THROW_SEH = (1 << 13)
-EXCEPT_UNK_EIP = (1 << 14)
-EXCEPT_ACCESS_VIOL = (1 << 14)
-EXCEPT_INT_DIV_BY_ZERO = (1 << 16)
-EXCEPT_PRIV_INSN = (1 << 17)
-EXCEPT_ILLEGAL_INSN = (1 << 18)
-EXCEPT_UNK_MNEMO = (1 << 19)
 
 
 """
@@ -1441,7 +1427,7 @@ def loope(ir, instr, dst):
 # XXX size to do; eflag
 
 
-def div(_, instr, src1):
+def div(ir, instr, src1):
     e = []
     size = src1.size
     if size == 8:
@@ -1461,12 +1447,32 @@ def div(_, instr, src1):
     else:
         e.append(m2_expr.ExprAff(s1, c_r[:size]))
         e.append(m2_expr.ExprAff(s2, c_d[:size]))
-    return e, []
+
+    lbl_div = m2_expr.ExprId(ir.gen_label(), ir.IRDst.size)
+    lbl_except = m2_expr.ExprId(ir.gen_label(), ir.IRDst.size)
+    lbl_next = m2_expr.ExprId(ir.get_next_label(instr), ir.IRDst.size)
+
+    do_div = []
+    do_div += e
+    do_div.append(m2_expr.ExprAff(ir.IRDst, lbl_next))
+    blk_div = IRBlock(lbl_div.name, [do_div])
+
+    do_except = []
+    do_except.append(m2_expr.ExprAff(exception_flags, m2_expr.ExprInt(
+        EXCEPT_DIV_BY_ZERO, exception_flags.size)))
+    do_except.append(m2_expr.ExprAff(ir.IRDst, lbl_next))
+    blk_except = IRBlock(lbl_except.name, [do_except])
+
+    e = []
+    e.append(m2_expr.ExprAff(ir.IRDst,
+                             m2_expr.ExprCond(src1, lbl_div, lbl_except)))
+
+    return e, [blk_div, blk_except]
 
 
 # XXX size to do; eflag
 
-def idiv(_, instr, src1):
+def idiv(ir, instr, src1):
     e = []
     size = src1.size
 
@@ -1487,7 +1493,27 @@ def idiv(_, instr, src1):
     else:
         e.append(m2_expr.ExprAff(s1, c_r[:size]))
         e.append(m2_expr.ExprAff(s2, c_d[:size]))
-    return e, []
+
+    lbl_div = m2_expr.ExprId(ir.gen_label(), ir.IRDst.size)
+    lbl_except = m2_expr.ExprId(ir.gen_label(), ir.IRDst.size)
+    lbl_next = m2_expr.ExprId(ir.get_next_label(instr), ir.IRDst.size)
+
+    do_div = []
+    do_div += e
+    do_div.append(m2_expr.ExprAff(ir.IRDst, lbl_next))
+    blk_div = IRBlock(lbl_div.name, [do_div])
+
+    do_except = []
+    do_except.append(m2_expr.ExprAff(exception_flags, m2_expr.ExprInt(
+        EXCEPT_DIV_BY_ZERO, exception_flags.size)))
+    do_except.append(m2_expr.ExprAff(ir.IRDst, lbl_next))
+    blk_except = IRBlock(lbl_except.name, [do_except])
+
+    e = []
+    e.append(m2_expr.ExprAff(ir.IRDst,
+                             m2_expr.ExprCond(src1, lbl_div, lbl_except)))
+
+    return e, [blk_div, blk_except]
 
 
 # XXX size to do; eflag