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 8b988fb..2c07385 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;
     }