[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [Qemu-arm] [PATCH 2/6] target-arm: Fix handling of SCR.
From: |
Sergey Fedorov |
Subject: |
Re: [Qemu-devel] [Qemu-arm] [PATCH 2/6] target-arm: Fix handling of SCR.SMD |
Date: |
Mon, 8 Feb 2016 18:40:21 +0300 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 |
On 05.02.2016 19:45, 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 <address@hidden>
Reviewed-by: Sergey Fedorov <address@hidden>
> ---
> 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 313c0f8..4fedae5 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