arm: fix aa64_generate_debug_exceptions to work with EL2
The test was incomplete and incorrectly caused debug exceptions to be generated when returning to EL2 after a failed attempt to single-step an EL1 instruction. Fix this while cleaning up the function a little. Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20181109152119.9242-8-alex.bennee@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
b281ba4223
commit
22af90255e
@ -2764,23 +2764,35 @@ static inline bool arm_v7m_csselr_razwi(ARMCPU *cpu)
|
|||||||
return (cpu->clidr & R_V7M_CLIDR_CTYPE_ALL_MASK) != 0;
|
return (cpu->clidr & R_V7M_CLIDR_CTYPE_ALL_MASK) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* See AArch64.GenerateDebugExceptionsFrom() in ARM ARM pseudocode */
|
||||||
static inline bool aa64_generate_debug_exceptions(CPUARMState *env)
|
static inline bool aa64_generate_debug_exceptions(CPUARMState *env)
|
||||||
{
|
{
|
||||||
if (arm_is_secure(env)) {
|
int cur_el = arm_current_el(env);
|
||||||
/* MDCR_EL3.SDD disables debug events from Secure state */
|
int debug_el;
|
||||||
if (extract32(env->cp15.mdcr_el3, 16, 1) != 0
|
|
||||||
|| arm_current_el(env) == 3) {
|
if (cur_el == 3) {
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (arm_current_el(env) == arm_debug_target_el(env)) {
|
/* MDCR_EL3.SDD disables debug events from Secure state */
|
||||||
if ((extract32(env->cp15.mdscr_el1, 13, 1) == 0)
|
if (arm_is_secure_below_el3(env)
|
||||||
|| (env->daif & PSTATE_D)) {
|
&& extract32(env->cp15.mdcr_el3, 16, 1)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
/*
|
||||||
|
* Same EL to same EL debug exceptions need MDSCR_KDE enabled
|
||||||
|
* while not masking the (D)ebug bit in DAIF.
|
||||||
|
*/
|
||||||
|
debug_el = arm_debug_target_el(env);
|
||||||
|
|
||||||
|
if (cur_el == debug_el) {
|
||||||
|
return extract32(env->cp15.mdscr_el1, 13, 1)
|
||||||
|
&& !(env->daif & PSTATE_D);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Otherwise the debug target needs to be a higher EL */
|
||||||
|
return debug_el > cur_el;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool aa32_generate_debug_exceptions(CPUARMState *env)
|
static inline bool aa32_generate_debug_exceptions(CPUARMState *env)
|
||||||
@ -2833,9 +2845,6 @@ static inline bool aa32_generate_debug_exceptions(CPUARMState *env)
|
|||||||
* since the pseudocode has it at all callsites except for the one in
|
* since the pseudocode has it at all callsites except for the one in
|
||||||
* CheckSoftwareStep(), where it is elided because both branches would
|
* CheckSoftwareStep(), where it is elided because both branches would
|
||||||
* always return the same value.
|
* always return the same value.
|
||||||
*
|
|
||||||
* Parts of the pseudocode relating to EL2 and EL3 are omitted because we
|
|
||||||
* don't yet implement those exception levels or their associated trap bits.
|
|
||||||
*/
|
*/
|
||||||
static inline bool arm_generate_debug_exceptions(CPUARMState *env)
|
static inline bool arm_generate_debug_exceptions(CPUARMState *env)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user