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: 3824e0d643
("target/hppa: Export function hppa_set_ior_and_isr()")
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
a9bdc4c95e
commit
5ccd50172a
@ -121,9 +121,10 @@ void hppa_cpu_do_unaligned_access(CPUState *cs, vaddr addr,
|
|||||||
CPUHPPAState *env = &cpu->env;
|
CPUHPPAState *env = &cpu->env;
|
||||||
|
|
||||||
cs->exception_index = EXCP_UNALIGN;
|
cs->exception_index = EXCP_UNALIGN;
|
||||||
|
cpu_restore_state(cs, retaddr);
|
||||||
hppa_set_ior_and_isr(env, addr, MMU_IDX_MMU_DISABLED(mmu_idx));
|
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 */
|
#endif /* CONFIG_USER_ONLY */
|
||||||
|
|
||||||
|
@ -348,9 +348,10 @@ raise_exception_with_ior(CPUHPPAState *env, int excp, uintptr_t retaddr,
|
|||||||
CPUState *cs = env_cpu(env);
|
CPUState *cs = env_cpu(env);
|
||||||
|
|
||||||
cs->exception_index = excp;
|
cs->exception_index = excp;
|
||||||
|
cpu_restore_state(cs, retaddr);
|
||||||
hppa_set_ior_and_isr(env, addr, mmu_disabled);
|
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,
|
void hppa_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr,
|
||||||
|
@ -351,11 +351,12 @@ target_ulong HELPER(probe)(CPUHPPAState *env, target_ulong addr,
|
|||||||
excp = hppa_get_physical_address(env, addr, mmu_idx, 0, &phys,
|
excp = hppa_get_physical_address(env, addr, mmu_idx, 0, &phys,
|
||||||
&prot, NULL);
|
&prot, NULL);
|
||||||
if (excp >= 0) {
|
if (excp >= 0) {
|
||||||
|
cpu_restore_state(env_cpu(env), GETPC());
|
||||||
hppa_set_ior_and_isr(env, addr, MMU_IDX_MMU_DISABLED(mmu_idx));
|
hppa_set_ior_and_isr(env, addr, MMU_IDX_MMU_DISABLED(mmu_idx));
|
||||||
if (excp == EXCP_DTLB_MISS) {
|
if (excp == EXCP_DTLB_MISS) {
|
||||||
excp = EXCP_NA_DTLB_MISS;
|
excp = EXCP_NA_DTLB_MISS;
|
||||||
}
|
}
|
||||||
hppa_dynamic_excp(env, excp, GETPC());
|
helper_excp(env, excp);
|
||||||
}
|
}
|
||||||
return (want & prot) != 0;
|
return (want & prot) != 0;
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user