X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=translate-all.c;h=b3ee876526a814458ae6293f46c618df27e2ae41;hb=93587e3af3a259deac89c12863d93653d69d22b8;hp=9bac061c9b4e85b179eeee7380b1a3c07dc8f264;hpb=6b4e463ff35284a3c02c5ceab3351bb07137c77c;p=mirror_qemu.git diff --git a/translate-all.c b/translate-all.c index 9bac061c9b..b3ee876526 100644 --- a/translate-all.c +++ b/translate-all.c @@ -57,6 +57,7 @@ #include "qemu/timer.h" #include "qemu/main-loop.h" #include "exec/log.h" +#include "sysemu/cpus.h" /* #define DEBUG_TB_INVALIDATE */ /* #define DEBUG_TB_FLUSH */ @@ -333,6 +334,19 @@ bool cpu_restore_state(CPUState *cpu, uintptr_t retaddr) TranslationBlock *tb; bool r = false; + /* A retaddr of zero is invalid so we really shouldn't have ended + * up here. The target code has likely forgotten to check retaddr + * != 0 before attempting to restore state. We return early to + * avoid blowing up on a recursive tb_lock(). The target must have + * previously survived a failed cpu_restore_state because + * tb_find_pc(0) would have failed anyway. It still should be + * fixed though. + */ + + if (!retaddr) { + return r; + } + tb_lock(); tb = tb_find_pc(retaddr); if (tb) { @@ -1930,7 +1944,7 @@ void cpu_interrupt(CPUState *cpu, int mask) { g_assert(qemu_mutex_iothread_locked()); cpu->interrupt_request |= mask; - cpu->tcg_exit_req = 1; + cpu->icount_decr.u16.high = -1; } /*