Don't call hooks if there is already an unhandled exception
This commit is contained in:
@@ -1441,36 +1441,41 @@ load_helper(CPUArchState *env, target_ulong addr, TCGMemOpIdx oi,
|
|||||||
// memory might be still unmapped while reading or fetching
|
// memory might be still unmapped while reading or fetching
|
||||||
if (mr == NULL) {
|
if (mr == NULL) {
|
||||||
handled = false;
|
handled = false;
|
||||||
if (code_read) {
|
// if there is already an unhandled eror, skip callbacks.
|
||||||
// code fetching
|
if (uc->invalid_error == UC_ERR_OK) {
|
||||||
error_code = UC_ERR_FETCH_UNMAPPED;
|
if (code_read) {
|
||||||
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_FETCH_UNMAPPED) {
|
// code fetching
|
||||||
if (hook->to_delete)
|
error_code = UC_ERR_FETCH_UNMAPPED;
|
||||||
continue;
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_FETCH_UNMAPPED) {
|
||||||
if (!HOOK_BOUND_CHECK(hook, addr))
|
if (hook->to_delete)
|
||||||
continue;
|
continue;
|
||||||
if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_FETCH_UNMAPPED, addr, size - uc->size_recur_mem, 0, hook->user_data)))
|
if (!HOOK_BOUND_CHECK(hook, addr))
|
||||||
break;
|
continue;
|
||||||
|
if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_FETCH_UNMAPPED, addr, size - uc->size_recur_mem, 0, hook->user_data)))
|
||||||
|
break;
|
||||||
|
|
||||||
// the last callback may already asked to stop emulation
|
// the last callback may already asked to stop emulation
|
||||||
if (uc->stop_request)
|
if (uc->stop_request)
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// data reading
|
||||||
|
error_code = UC_ERR_READ_UNMAPPED;
|
||||||
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_READ_UNMAPPED) {
|
||||||
|
if (hook->to_delete)
|
||||||
|
continue;
|
||||||
|
if (!HOOK_BOUND_CHECK(hook, addr))
|
||||||
|
continue;
|
||||||
|
if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_READ_UNMAPPED, addr, size - uc->size_recur_mem, 0, hook->user_data)))
|
||||||
|
break;
|
||||||
|
|
||||||
|
// the last callback may already asked to stop emulation
|
||||||
|
if (uc->stop_request)
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// data reading
|
error_code = uc->invalid_error;
|
||||||
error_code = UC_ERR_READ_UNMAPPED;
|
|
||||||
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_READ_UNMAPPED) {
|
|
||||||
if (hook->to_delete)
|
|
||||||
continue;
|
|
||||||
if (!HOOK_BOUND_CHECK(hook, addr))
|
|
||||||
continue;
|
|
||||||
if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_READ_UNMAPPED, addr, size - uc->size_recur_mem, 0, hook->user_data)))
|
|
||||||
break;
|
|
||||||
|
|
||||||
// the last callback may already asked to stop emulation
|
|
||||||
if (uc->stop_request)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (handled) {
|
if (handled) {
|
||||||
|
|||||||
Reference in New Issue
Block a user