diff options
| -rw-r--r-- | miasm2/arch/x86/arch.py | 6 | ||||
| -rw-r--r-- | miasm2/arch/x86/regs.py | 5 | ||||
| -rw-r--r-- | miasm2/arch/x86/sem.py | 1 | ||||
| -rw-r--r-- | miasm2/jitter/arch/JitCore_x86.c | 20 | ||||
| -rw-r--r-- | miasm2/jitter/arch/JitCore_x86.h | 2 | ||||
| -rw-r--r-- | test/arch/x86/unit/mn_int.py | 31 | ||||
| -rw-r--r-- | test/test_all.py | 1 |
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", |