Message ID | 1455206609-28009-3-git-send-email-peter.maydell@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, Feb 11, 2016 at 04:03:25PM +0000, Peter Maydell wrote: > We weren't quite implementing the handling of SCR.SMD correctly. > The condition governing whether the SMD bit should apply only > for NS state is "is EL3 is AArch32", not "is the current EL AArch32". > Fix the condition, and clarify the comment both to reflect this and > to expand slightly on what's going on for the v7-no-Virtualization case. > > Signed-off-by: Peter Maydell <peter.maydell@linaro.org> > Reviewed-by: Sergey Fedorov <serge.fdrv@gmail.com> Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com> > --- > The bit about forcing SMD to zero confused me, anyway, since I > expected it to mean "in this function", not elsewhere... > --- > target-arm/op_helper.c | 12 +++++++----- > 1 file changed, 7 insertions(+), 5 deletions(-) > > diff --git a/target-arm/op_helper.c b/target-arm/op_helper.c > index bd48549..4c0980e 100644 > --- a/target-arm/op_helper.c > +++ b/target-arm/op_helper.c > @@ -614,12 +614,14 @@ void HELPER(pre_smc)(CPUARMState *env, uint32_t syndrome) > int cur_el = arm_current_el(env); > bool secure = arm_is_secure(env); > bool smd = env->cp15.scr_el3 & SCR_SMD; > - /* On ARMv8 AArch32, SMD only applies to NS state. > - * On ARMv7 SMD only applies to NS state and only if EL2 is available. > - * For ARMv7 non EL2, we force SMD to zero so we don't need to re-check > - * the EL2 condition here. > + /* On ARMv8 with EL3 AArch64, SMD applies to both S and NS state. > + * On ARMv8 with EL3 AArch32, or ARMv7 with the Virtualization > + * extensions, SMD only applies to NS state. > + * On ARMv7 without the Virtualization extensions, the SMD bit > + * doesn't exist, but we forbid the guest to set it to 1 in scr_write(), > + * so we need not special case this here. > */ > - bool undef = is_a64(env) ? smd : (!secure && smd); > + bool undef = arm_feature(env, ARM_FEATURE_AARCH64) ? smd : smd && !secure; > > if (arm_is_psci_call(cpu, EXCP_SMC)) { > /* If PSCI is enabled and this looks like a valid PSCI call then > -- > 1.9.1 >
diff --git a/target-arm/op_helper.c b/target-arm/op_helper.c index bd48549..4c0980e 100644 --- a/target-arm/op_helper.c +++ b/target-arm/op_helper.c @@ -614,12 +614,14 @@ void HELPER(pre_smc)(CPUARMState *env, uint32_t syndrome) int cur_el = arm_current_el(env); bool secure = arm_is_secure(env); bool smd = env->cp15.scr_el3 & SCR_SMD; - /* On ARMv8 AArch32, SMD only applies to NS state. - * On ARMv7 SMD only applies to NS state and only if EL2 is available. - * For ARMv7 non EL2, we force SMD to zero so we don't need to re-check - * the EL2 condition here. + /* On ARMv8 with EL3 AArch64, SMD applies to both S and NS state. + * On ARMv8 with EL3 AArch32, or ARMv7 with the Virtualization + * extensions, SMD only applies to NS state. + * On ARMv7 without the Virtualization extensions, the SMD bit + * doesn't exist, but we forbid the guest to set it to 1 in scr_write(), + * so we need not special case this here. */ - bool undef = is_a64(env) ? smd : (!secure && smd); + bool undef = arm_feature(env, ARM_FEATURE_AARCH64) ? smd : smd && !secure; if (arm_is_psci_call(cpu, EXCP_SMC)) { /* If PSCI is enabled and this looks like a valid PSCI call then