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>
(cherry picked from commit 930f1865cc654b637ffe1207fa5b44bf0a156279)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
This commit is contained in:
parent
28facf1598
commit
fd4ce7455f
|
@ -5664,10 +5664,10 @@ static void sparc_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
may_lookup = true;
|
||||||
if (dc->pc & 3) {
|
if (dc->pc & 3) {
|
||||||
switch (dc->pc) {
|
switch (dc->pc) {
|
||||||
case DYNAMIC_PC_LOOKUP:
|
case DYNAMIC_PC_LOOKUP:
|
||||||
may_lookup = true;
|
|
||||||
break;
|
break;
|
||||||
case DYNAMIC_PC:
|
case DYNAMIC_PC:
|
||||||
may_lookup = false;
|
may_lookup = false;
|
||||||
|
@ -5677,10 +5677,24 @@ static void sparc_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
tcg_gen_movi_tl(cpu_pc, dc->pc);
|
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) {
|
if (may_lookup) {
|
||||||
tcg_gen_lookup_and_goto_ptr();
|
tcg_gen_lookup_and_goto_ptr();
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue