Sparc: fix exceptions in delay slot
authorBlue Swirl <blauwirbel@gmail.com>
Sun, 11 Apr 2010 19:47:49 +0000 (19:47 +0000)
committerBlue Swirl <blauwirbel@gmail.com>
Sun, 11 Apr 2010 19:47:49 +0000 (19:47 +0000)
Fix a case where an exception happens with the
instruction in the delay slot.

Recovery of branch condition in the exception handling
code was not converted to TCG. Because the condition
was bogus, wrong NPC could be selected from the two
candidates.

A nice bug report with a test case can be found in:
https://bugs.launchpad.net/qemu/+bug/551814

Fix based on patch by Fabrice Bellard.

Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
target-sparc/translate.c

index 8b988fb5cd6e7085d55b0efc9a1b4e6e0039c179..2c07385d5040822570cca28c06224d9f1cfa368c 100644 (file)
@@ -4932,12 +4932,12 @@ void gen_pc_load(CPUState *env, TranslationBlock *tb,
     if (npc == 1) {
         /* dynamic NPC: already stored */
     } else if (npc == 2) {
-        target_ulong t2 = (target_ulong)(unsigned long)puc;
-        /* jump PC: use T2 and the jump targets of the translation */
-        if (t2)
+        /* jump PC: use 'cond' and the jump targets of the translation */
+        if (env->cond) {
             env->npc = gen_opc_jump_pc[0];
-        else
+        } else {
             env->npc = gen_opc_jump_pc[1];
+        }
     } else {
         env->npc = npc;
     }