target/arm: fix missing exception class
The DAIF and PAC checks used raise_exception_ra to raise an exception
and unwind CPU state but raise_exception_ra is currently designed for
handling data aborts as the syndrome is partially precomputed and
encoded in the TB and then merged in merge_syn_data_abort when handling
the data abort. Using raise_exception_ra for DAIF and PAC checks
results in an empty syndrome being retrieved from data[2] in
restore_state_to_opc and setting ESR to 0. This manifested as:
kvm [571]: Unknown exception class: esr: 0x000000 –
Unknown/Uncategorized
when launching a KVM guest when the host qemu used a CPU supporting
EL2+pointer authentication and enabling pointer authentication in the
guest.
Rework raise_exception_ra such that the state is restored before raising
the exception so that the exception is not clobbered by
restore_state_to_opc.
Fixes: 0d43e1a2d2
("target/arm: Add PAuth helpers")
Cc: Richard Henderson <richard.henderson@linaro.org>
Cc: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Jamie Iles <jamie@nuviainc.com>
[PMM: added comment]
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
0711a63435
commit
6e0c60a2be
@ -63,8 +63,15 @@ void raise_exception(CPUARMState *env, uint32_t excp,
|
||||
void raise_exception_ra(CPUARMState *env, uint32_t excp, uint32_t syndrome,
|
||||
uint32_t target_el, uintptr_t ra)
|
||||
{
|
||||
CPUState *cs = do_raise_exception(env, excp, syndrome, target_el);
|
||||
cpu_loop_exit_restore(cs, ra);
|
||||
CPUState *cs = env_cpu(env);
|
||||
|
||||
/*
|
||||
* restore_state_to_opc() will set env->exception.syndrome, so
|
||||
* we must restore CPU state here before setting the syndrome
|
||||
* the caller passed us, and cannot use cpu_loop_exit_restore().
|
||||
*/
|
||||
cpu_restore_state(cs, ra, true);
|
||||
raise_exception(env, excp, syndrome, target_el);
|
||||
}
|
||||
|
||||
uint64_t HELPER(neon_tbl)(CPUARMState *env, uint32_t desc,
|
||||
|
Loading…
Reference in New Issue
Block a user