]> git.proxmox.com Git - mirror_qemu.git/commitdiff
translate-all: exit cpu_restore_state early if translating
authorAlex Bennée <alex.bennee@linaro.org>
Thu, 2 Mar 2017 10:31:32 +0000 (10:31 +0000)
committerAlex Bennée <alex.bennee@linaro.org>
Thu, 9 Mar 2017 10:41:43 +0000 (10:41 +0000)
The translation code uses cpu_ld*_code which can trigger a tlb_fill
which if it fails will erroneously attempts a fault resolution. This
never works during translation as the TB being generated hasn't been
added yet. The target should have checked retaddr before calling
cpu_restore_state but for those that have yet to be fixed we do it
here to avoid a recursive tb_lock() under MTTCG's new locking regime.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <rth@twiddle.net>
translate-all.c

index d42d003e674d4d0f806e9dfe0d159c8adacfb8d4..34480aebba5a7a404e1387146db644e4d614acaf 100644 (file)
@@ -333,6 +333,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) {