mirror of https://github.com/xemu-project/xemu.git
target/arm: Honour HCR_EL2.TGE when raising synchronous exceptions
Whene we raise a synchronous exception, if HCR_EL2.TGE is set then exceptions targeting NS EL1 must be redirected to EL2. Implement this in raise_exception() -- all synchronous exceptions go through this function. (Asynchronous exceptions go via arm_cpu_exec_interrupt(), which already honours HCR_EL2.TGE when it determines the target EL in arm_phys_excp_target_el().) Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20180724115950.17316-4-peter.maydell@linaro.org
This commit is contained in:
parent
30ac6339dc
commit
7556edfb4d
|
@ -33,6 +33,20 @@ static void raise_exception(CPUARMState *env, uint32_t excp,
|
||||||
{
|
{
|
||||||
CPUState *cs = CPU(arm_env_get_cpu(env));
|
CPUState *cs = CPU(arm_env_get_cpu(env));
|
||||||
|
|
||||||
|
if ((env->cp15.hcr_el2 & HCR_TGE) &&
|
||||||
|
target_el == 1 && !arm_is_secure(env)) {
|
||||||
|
/*
|
||||||
|
* Redirect NS EL1 exceptions to NS EL2. These are reported with
|
||||||
|
* their original syndrome register value, with the exception of
|
||||||
|
* SIMD/FP access traps, which are reported as uncategorized
|
||||||
|
* (see DDI0478C.a D1.10.4)
|
||||||
|
*/
|
||||||
|
target_el = 2;
|
||||||
|
if (syndrome >> ARM_EL_EC_SHIFT == EC_ADVSIMDFPACCESSTRAP) {
|
||||||
|
syndrome = syn_uncategorized();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
assert(!excp_is_internal(excp));
|
assert(!excp_is_internal(excp));
|
||||||
cs->exception_index = excp;
|
cs->exception_index = excp;
|
||||||
env->exception.syndrome = syndrome;
|
env->exception.syndrome = syndrome;
|
||||||
|
|
Loading…
Reference in New Issue