Added an invalid instruction hook (#1132)
* first draft for an invalid instruction hook * Fixed documentation on return value of invalid insn hook
This commit is contained in:
committed by
Nguyen Anh Quynh
parent
8b659c61b2
commit
07f94ad1fc
@@ -103,13 +103,6 @@ int cpu_exec(struct uc_struct *uc, CPUArchState *env) // qq
|
||||
/* if an exception is pending, we execute it here */
|
||||
if (cpu->exception_index >= 0) {
|
||||
//printf(">>> GOT INTERRUPT. exception idx = %x\n", cpu->exception_index); // qq
|
||||
if (uc->stop_interrupt && uc->stop_interrupt(cpu->exception_index)) {
|
||||
cpu->halted = 1;
|
||||
uc->invalid_error = UC_ERR_INSN_INVALID;
|
||||
ret = EXCP_HLT;
|
||||
break;
|
||||
}
|
||||
|
||||
if (cpu->exception_index >= EXCP_INTERRUPT) {
|
||||
/* exit request from the cpu execution loop */
|
||||
ret = cpu->exception_index;
|
||||
@@ -129,17 +122,30 @@ int cpu_exec(struct uc_struct *uc, CPUArchState *env) // qq
|
||||
ret = cpu->exception_index;
|
||||
break;
|
||||
#else
|
||||
// Unicorn: call registered interrupt callbacks
|
||||
HOOK_FOREACH_VAR_DECLARE;
|
||||
HOOK_FOREACH(uc, hook, UC_HOOK_INTR) {
|
||||
((uc_cb_hookintr_t)hook->callback)(uc, cpu->exception_index, hook->user_data);
|
||||
catched = true;
|
||||
if (uc->stop_interrupt && uc->stop_interrupt(cpu->exception_index)) {
|
||||
// Unicorn: call registered invalid instruction callbacks
|
||||
HOOK_FOREACH_VAR_DECLARE;
|
||||
HOOK_FOREACH(uc, hook, UC_HOOK_INSN_INVALID) {
|
||||
catched = ((uc_cb_hookinsn_invalid_t)hook->callback)(uc, hook->user_data);
|
||||
if (catched)
|
||||
break;
|
||||
}
|
||||
if (!catched)
|
||||
uc->invalid_error = UC_ERR_INSN_INVALID;
|
||||
} else {
|
||||
// Unicorn: call registered interrupt callbacks
|
||||
HOOK_FOREACH_VAR_DECLARE;
|
||||
HOOK_FOREACH(uc, hook, UC_HOOK_INTR) {
|
||||
((uc_cb_hookintr_t)hook->callback)(uc, cpu->exception_index, hook->user_data);
|
||||
catched = true;
|
||||
}
|
||||
if (!catched)
|
||||
uc->invalid_error = UC_ERR_EXCEPTION;
|
||||
}
|
||||
|
||||
// Unicorn: If un-catched interrupt, stop executions.
|
||||
if (!catched) {
|
||||
cpu->halted = 1;
|
||||
uc->invalid_error = UC_ERR_EXCEPTION;
|
||||
ret = EXCP_HLT;
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user