about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--miasm2/arch/x86/arch.py6
-rw-r--r--miasm2/arch/x86/regs.py5
-rw-r--r--miasm2/arch/x86/sem.py1
-rw-r--r--miasm2/jitter/arch/JitCore_x86.c20
-rw-r--r--miasm2/jitter/arch/JitCore_x86.h2
-rw-r--r--test/arch/x86/unit/mn_int.py31
-rw-r--r--test/test_all.py1
7 files changed, 62 insertions, 4 deletions
diff --git a/miasm2/arch/x86/arch.py b/miasm2/arch/x86/arch.py
index 916b5428..2b9b3cb1 100644
--- a/miasm2/arch/x86/arch.py
+++ b/miasm2/arch/x86/arch.py
@@ -1041,8 +1041,10 @@ class x86_imm(imm_noarg):
         return swap_uint(self.l, v)
 
 
-class x86_imm_fix(imm_noarg):
+class x86_imm_fix_08(imm_noarg):
     parser = base_expr
+    intsize = 8
+    intmask = (1 << intsize) - 1
 
     def decodeval(self, v):
         return self.ival
@@ -2980,7 +2982,7 @@ u16 = bs(l=16, cls=(x86_16, m_arg))
 u32 = bs(l=32, cls=(x86_32, m_arg))
 s3264 = bs(l=32, cls=(x86_s32to64, m_arg))
 
-u08_3 = bs(l=0, cls=(x86_imm_fix, m_arg), ival = 3)
+u08_3 = bs(l=0, cls=(x86_imm_fix_08, m_arg), ival = 3)
 
 d0 = bs("000", fname='reg')
 d1 = bs("001", fname='reg')
diff --git a/miasm2/arch/x86/regs.py b/miasm2/arch/x86/regs.py
index 9c87834f..3bca8fe2 100644
--- a/miasm2/arch/x86/regs.py
+++ b/miasm2/arch/x86/regs.py
@@ -6,6 +6,7 @@ IP = ExprId('IP', 16)
 EIP = ExprId('EIP', 32)
 RIP = ExprId('RIP', 64)
 exception_flags = ExprId('exception_flags', 32)
+interrupt_num = ExprId('interrupt_num', 8)
 
 # GP
 
@@ -399,7 +400,7 @@ all_regs_ids = [
     XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15,
 
 
-    exception_flags,
+    exception_flags, interrupt_num,
 ] + fltregs32_expr
 
 all_regs_ids_no_alias = [
@@ -421,7 +422,7 @@ all_regs_ids_no_alias = [
     XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15,
 
 
-    exception_flags,
+    exception_flags, interrupt_num,
 ] + fltregs32_expr
 
 all_regs_ids_byname = dict([(x.name, x) for x in all_regs_ids])
diff --git a/miasm2/arch/x86/sem.py b/miasm2/arch/x86/sem.py
index 1dd5bc67..41a2c229 100644
--- a/miasm2/arch/x86/sem.py
+++ b/miasm2/arch/x86/sem.py
@@ -2799,6 +2799,7 @@ def l_int(ir, instr, a):
         except_int = EXCEPT_INT_XX
     e.append(m2_expr.ExprAff(exception_flags,
                      m2_expr.ExprInt32(except_int)))
+    e.append(m2_expr.ExprAff(interrupt_num, a))
     return e, []
 
 
diff --git a/miasm2/jitter/arch/JitCore_x86.c b/miasm2/jitter/arch/JitCore_x86.c
index dd4ce7cb..9d15cd20 100644
--- a/miasm2/jitter/arch/JitCore_x86.c
+++ b/miasm2/jitter/arch/JitCore_x86.c
@@ -197,9 +197,25 @@ PyObject* cpu_get_exception(JitCpu* self, PyObject* args)
 	return PyLong_FromUnsignedLongLong((uint64_t)(((vm_cpu_t*)self->cpu)->exception_flags));
 }
 
+PyObject* cpu_set_interrupt_num(JitCpu* self, PyObject* args)
+{
+	PyObject *item1;
+	uint64_t i;
 
+	if (!PyArg_ParseTuple(args, "O", &item1))
+		return NULL;
+
+	PyGetInt(item1, i);
 
+	((vm_cpu_t*)self->cpu)->interrupt_num = i;
+	Py_INCREF(Py_None);
+	return Py_None;
+}
 
+PyObject* cpu_get_interrupt_num(JitCpu* self, PyObject* args)
+{
+	return PyLong_FromUnsignedLongLong((uint64_t)(((vm_cpu_t*)self->cpu)->interrupt_num));
+}
 
 PyObject* cpu_set_segm_base(JitCpu* self, PyObject* args)
 {
@@ -349,6 +365,10 @@ static PyMethodDef JitCpu_methods[] = {
 	 "X"},
 	{"get_mem", (PyCFunction)vm_get_mem, METH_VARARGS,
 	 "X"},
+	{"get_interrupt_num", (PyCFunction)cpu_get_interrupt_num, METH_VARARGS,
+	 "X"},
+	{"set_interrupt_num", (PyCFunction)cpu_set_interrupt_num, METH_VARARGS,
+	 "X"},
 	{NULL}  /* Sentinel */
 };
 
diff --git a/miasm2/jitter/arch/JitCore_x86.h b/miasm2/jitter/arch/JitCore_x86.h
index 7e518395..c90c10b8 100644
--- a/miasm2/jitter/arch/JitCore_x86.h
+++ b/miasm2/jitter/arch/JitCore_x86.h
@@ -2,6 +2,8 @@
 typedef struct {
 	uint32_t exception_flags;
 	uint32_t exception_flags_new;
+	uint32_t interrupt_num;
+	uint32_t interrupt_num_new;
 
 
 	/* gpregs */
diff --git a/test/arch/x86/unit/mn_int.py b/test/arch/x86/unit/mn_int.py
new file mode 100644
index 00000000..119e5b08
--- /dev/null
+++ b/test/arch/x86/unit/mn_int.py
@@ -0,0 +1,31 @@
+#! /usr/bin/env python
+from miasm2.jitter.csts import EXCEPT_INT_XX
+from asm_test import Asm_Test
+
+
+class Test_INT(Asm_Test):
+    TXT = '''
+    main:
+       INT 0x42
+       RET
+    '''
+
+    def set_int_num(self, jitter):
+        self.int_num = jitter.cpu.get_interrupt_num()
+        jitter.cpu.set_exception(0)
+        return True
+
+    def __init__(self):
+        super(Test_INT, self).__init__()
+        self.int_num = 0
+        self.myjit.add_exception_handler(EXCEPT_INT_XX,
+                                         self.set_int_num)
+
+    def check(self):
+        assert self.int_num == 0x42
+        self.myjit.cpu.set_interrupt_num(14)
+        assert self.myjit.cpu.get_interrupt_num() == 14
+
+
+if __name__ == "__main__":
+    [test()() for test in [Test_INT]]
diff --git a/test/test_all.py b/test/test_all.py
index c7e421e3..28da3d5a 100644
--- a/test/test_all.py
+++ b/test/test_all.py
@@ -38,6 +38,7 @@ for script in ["x86/sem.py",
                "x86/unit/mn_stack.py",
                "x86/unit/mn_daa.py",
                "x86/unit/mn_das.py",
+               "x86/unit/mn_int.py",
                "arm/arch.py",
                "arm/sem.py",
                "aarch64/unit/mn_ubfm.py",