From d7da2a10402f1644128b66414ca8f86bdea9ae7c Mon Sep 17 00:00:00 2001 From: Blue Swirl Date: Sun, 11 Apr 2010 19:47:49 +0000 Subject: [PATCH] Sparc: fix exceptions in delay slot 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 --- target-sparc/translate.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/target-sparc/translate.c b/target-sparc/translate.c index 8b988fb5cd..2c07385d50 100644 --- a/target-sparc/translate.c +++ b/target-sparc/translate.c @@ -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; }