From 5d37e21db501bcebaac9346b82c2d969b0c56c02 Mon Sep 17 00:00:00 2001 From: lazymio Date: Fri, 20 May 2022 13:15:23 +0200 Subject: [PATCH] Don't call hooks if there is already an unhandled exception --- qemu/accel/tcg/cputlb.c | 59 ++++++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/qemu/accel/tcg/cputlb.c b/qemu/accel/tcg/cputlb.c index 80fbf2cb..62233bc0 100644 --- a/qemu/accel/tcg/cputlb.c +++ b/qemu/accel/tcg/cputlb.c @@ -1441,36 +1441,41 @@ load_helper(CPUArchState *env, target_ulong addr, TCGMemOpIdx oi, // memory might be still unmapped while reading or fetching if (mr == NULL) { handled = false; - if (code_read) { - // code fetching - error_code = UC_ERR_FETCH_UNMAPPED; - HOOK_FOREACH(uc, hook, UC_HOOK_MEM_FETCH_UNMAPPED) { - if (hook->to_delete) - continue; - if (!HOOK_BOUND_CHECK(hook, addr)) - 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; + // if there is already an unhandled eror, skip callbacks. + if (uc->invalid_error == UC_ERR_OK) { + if (code_read) { + // code fetching + error_code = UC_ERR_FETCH_UNMAPPED; + HOOK_FOREACH(uc, hook, UC_HOOK_MEM_FETCH_UNMAPPED) { + if (hook->to_delete) + continue; + if (!HOOK_BOUND_CHECK(hook, addr)) + 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 - if (uc->stop_request) - break; + // the last callback may already asked to stop emulation + if (uc->stop_request) + 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 { - // 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; - } + error_code = uc->invalid_error; } if (handled) {