mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2024-12-22 23:25:29 +00:00
Unhandled interrupt will halt execution
This commit is contained in:
parent
3151451c87
commit
9cdca5a32b
|
@ -63,6 +63,7 @@ module Common =
|
|||
let UC_ERR_FETCH_UNALIGNED = 18
|
||||
let UC_ERR_HOOK_EXIST = 19
|
||||
let UC_ERR_RESOURCE = 20
|
||||
let UC_ERR_UNHANDLED_INTERRUPT = 21
|
||||
let UC_MEM_READ = 16
|
||||
let UC_MEM_WRITE = 17
|
||||
let UC_MEM_FETCH = 18
|
||||
|
|
|
@ -58,6 +58,7 @@ const (
|
|||
ERR_FETCH_UNALIGNED = 18
|
||||
ERR_HOOK_EXIST = 19
|
||||
ERR_RESOURCE = 20
|
||||
ERR_UNHANDLED_INTERRUPT = 21
|
||||
MEM_READ = 16
|
||||
MEM_WRITE = 17
|
||||
MEM_FETCH = 18
|
||||
|
|
|
@ -60,6 +60,7 @@ public interface UnicornConst {
|
|||
public static final int UC_ERR_FETCH_UNALIGNED = 18;
|
||||
public static final int UC_ERR_HOOK_EXIST = 19;
|
||||
public static final int UC_ERR_RESOURCE = 20;
|
||||
public static final int UC_ERR_UNHANDLED_INTERRUPT = 21;
|
||||
public static final int UC_MEM_READ = 16;
|
||||
public static final int UC_MEM_WRITE = 17;
|
||||
public static final int UC_MEM_FETCH = 18;
|
||||
|
|
|
@ -56,6 +56,7 @@ UC_ERR_WRITE_UNALIGNED = 17
|
|||
UC_ERR_FETCH_UNALIGNED = 18
|
||||
UC_ERR_HOOK_EXIST = 19
|
||||
UC_ERR_RESOURCE = 20
|
||||
UC_ERR_UNHANDLED_INTERRUPT = 21
|
||||
UC_MEM_READ = 16
|
||||
UC_MEM_WRITE = 17
|
||||
UC_MEM_FETCH = 18
|
||||
|
|
|
@ -145,6 +145,7 @@ typedef enum uc_err {
|
|||
UC_ERR_FETCH_UNALIGNED, // Unaligned fetch
|
||||
UC_ERR_HOOK_EXIST, // hook for this event already existed
|
||||
UC_ERR_RESOURCE, // Insufficient resource: uc_emu_start()
|
||||
UC_ERR_UNHANDLED_INTERRUPT // Unhandled CPU interrupt.
|
||||
} uc_err;
|
||||
|
||||
|
||||
|
|
|
@ -130,9 +130,18 @@ int cpu_exec(struct uc_struct *uc, CPUArchState *env) // qq
|
|||
ret = cpu->exception_index;
|
||||
break;
|
||||
#else
|
||||
bool catched = false;
|
||||
// Unicorn: call registered interrupt callbacks
|
||||
HOOK_FOREACH(uc, hook, UC_HOOK_INTR) {
|
||||
((uc_cb_hookintr_t)hook->callback)(uc, cpu->exception_index, hook->user_data);
|
||||
catched = true;
|
||||
}
|
||||
// Unicorn: If un-catched interrupt, stop executions.
|
||||
if (!catched) {
|
||||
cpu->halted = 1;
|
||||
uc->invalid_error = UC_ERR_UNHANDLED_INTERRUPT;
|
||||
ret = EXCP_HLT;
|
||||
break;
|
||||
}
|
||||
cpu->exception_index = -1;
|
||||
#if defined(TARGET_X86_64)
|
||||
|
|
|
@ -13,15 +13,12 @@ class VldrPcInsn(regress.RegressTest):
|
|||
# mov gs, eax; mov eax, 1
|
||||
code = '8ee8b801000000'.decode('hex')
|
||||
uc.mem_write(0x1000, code)
|
||||
|
||||
uc.reg_write(UC_X86_REG_EAX, 0xFFFFFFFF)
|
||||
# this should throw an error
|
||||
# the eax test is just to prove the second instruction doesn't execute
|
||||
try:
|
||||
|
||||
with self.assertRaises(UcError) as ex_ctx:
|
||||
uc.emu_start(0x1000, 0x1000 + len(code))
|
||||
except UcError:
|
||||
return
|
||||
self.assertEqual(uc.reg_read(UC_X86_REG_EAX), 1)
|
||||
|
||||
self.assertEquals(ex_ctx.exception.errno, UC_ERR_UNHANDLED_INTERRUPT)
|
||||
|
||||
if __name__ == '__main__':
|
||||
regress.main()
|
||||
|
|
2
uc.c
2
uc.c
|
@ -96,6 +96,8 @@ const char *uc_strerror(uc_err code)
|
|||
return "Fetch from unaligned memory (UC_ERR_FETCH_UNALIGNED)";
|
||||
case UC_ERR_RESOURCE:
|
||||
return "Insufficient resource (UC_ERR_RESOURCE)";
|
||||
case UC_ERR_UNHANDLED_INTERRUPT:
|
||||
return "Unhandled machine interrupt (UC_ERR_UNHANDLED_INTERRUPT)";
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue