aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHelge Deller <deller@gmx.de>2024-03-02 22:02:38 +0100
committerHelge Deller <deller@gmx.de>2024-03-03 06:41:19 +0100
commit5ccd50172a80ef9fe695714744b0747d7419b2c4 (patch)
tree386364c31c953f6584453686ad5464458f8fe0bf
parenta9bdc4c95e402599e4184d4814800668479adb2b (diff)
downloadqemu-5ccd50172a80ef9fe695714744b0747d7419b2c4.zip
qemu-5ccd50172a80ef9fe695714744b0747d7419b2c4.tar.gz
qemu-5ccd50172a80ef9fe695714744b0747d7419b2c4.tar.bz2
target/hppa: Restore unwind_breg before calculating ior
When calculating the IOR for the exception handlers, the current unwind_breg value is needed on 64-bit hppa machines. Restore that value by calling cpu_restore_state() earlier, which in turn calls hppa_restore_state_to_opc() which restores the unwind_breg for the current instruction. Signed-off-by: Helge Deller <deller@gmx.de> Fixes: 3824e0d643f3 ("target/hppa: Export function hppa_set_ior_and_isr()") Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
-rw-r--r--target/hppa/cpu.c3
-rw-r--r--target/hppa/mem_helper.c3
-rw-r--r--target/hppa/op_helper.c3
3 files changed, 6 insertions, 3 deletions
diff --git a/target/hppa/cpu.c b/target/hppa/cpu.c
index afe73d4..3831cb6 100644
--- a/target/hppa/cpu.c
+++ b/target/hppa/cpu.c
@@ -121,9 +121,10 @@ void hppa_cpu_do_unaligned_access(CPUState *cs, vaddr addr,
CPUHPPAState *env = &cpu->env;
cs->exception_index = EXCP_UNALIGN;
+ cpu_restore_state(cs, retaddr);
hppa_set_ior_and_isr(env, addr, MMU_IDX_MMU_DISABLED(mmu_idx));
- cpu_loop_exit_restore(cs, retaddr);
+ cpu_loop_exit(cs);
}
#endif /* CONFIG_USER_ONLY */
diff --git a/target/hppa/mem_helper.c b/target/hppa/mem_helper.c
index 66b8fa7..3fc895c 100644
--- a/target/hppa/mem_helper.c
+++ b/target/hppa/mem_helper.c
@@ -348,9 +348,10 @@ raise_exception_with_ior(CPUHPPAState *env, int excp, uintptr_t retaddr,
CPUState *cs = env_cpu(env);
cs->exception_index = excp;
+ cpu_restore_state(cs, retaddr);
hppa_set_ior_and_isr(env, addr, mmu_disabled);
- cpu_loop_exit_restore(cs, retaddr);
+ cpu_loop_exit(cs);
}
void hppa_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr,
diff --git a/target/hppa/op_helper.c b/target/hppa/op_helper.c
index b1f24a5..480fe80 100644
--- a/target/hppa/op_helper.c
+++ b/target/hppa/op_helper.c
@@ -351,11 +351,12 @@ target_ulong HELPER(probe)(CPUHPPAState *env, target_ulong addr,
excp = hppa_get_physical_address(env, addr, mmu_idx, 0, &phys,
&prot, NULL);
if (excp >= 0) {
+ cpu_restore_state(env_cpu(env), GETPC());
hppa_set_ior_and_isr(env, addr, MMU_IDX_MMU_DISABLED(mmu_idx));
if (excp == EXCP_DTLB_MISS) {
excp = EXCP_NA_DTLB_MISS;
}
- hppa_dynamic_excp(env, excp, GETPC());
+ helper_excp(env, excp);
}
return (want & prot) != 0;
#endif