mirror of https://github.com/xemu-project/xemu.git
target/sparc: Clear may_lookup for npc == DYNAMIC_PC
With pairs of jmp+rett, pc == DYNAMIC_PC_LOOKUP and
npc == DYNAMIC_PC. Make sure that we exit for interrupts.
Cc: qemu-stable@nongnu.org
Fixes: 633c42834c
("target/sparc: Introduce DYNAMIC_PC_LOOKUP")
Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
a95260486a
commit
930f1865cc
|
@ -5654,10 +5654,10 @@ static void sparc_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
|
|||
break;
|
||||
}
|
||||
|
||||
may_lookup = true;
|
||||
if (dc->pc & 3) {
|
||||
switch (dc->pc) {
|
||||
case DYNAMIC_PC_LOOKUP:
|
||||
may_lookup = true;
|
||||
break;
|
||||
case DYNAMIC_PC:
|
||||
may_lookup = false;
|
||||
|
@ -5667,10 +5667,24 @@ static void sparc_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
|
|||
}
|
||||
} else {
|
||||
tcg_gen_movi_tl(cpu_pc, dc->pc);
|
||||
may_lookup = true;
|
||||
}
|
||||
|
||||
save_npc(dc);
|
||||
if (dc->npc & 3) {
|
||||
switch (dc->npc) {
|
||||
case JUMP_PC:
|
||||
gen_generic_branch(dc);
|
||||
break;
|
||||
case DYNAMIC_PC:
|
||||
may_lookup = false;
|
||||
break;
|
||||
case DYNAMIC_PC_LOOKUP:
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
} else {
|
||||
tcg_gen_movi_tl(cpu_npc, dc->npc);
|
||||
}
|
||||
if (may_lookup) {
|
||||
tcg_gen_lookup_and_goto_ptr();
|
||||
} else {
|
||||
|
|
Loading…
Reference in New Issue