[PATCH 1/3] KVM: ARM: fix the size of TTBCR_{T0SZ,T1SZ} masks
Christoffer Dall
christoffer.dall at linaro.org
Thu Sep 26 12:07:20 EDT 2013
On Thu, Sep 26, 2013 at 04:49:26PM +0100, Jonathan Austin wrote:
> The T{0,1}SZ fields of TTBCR are 3 bits wide when using the long descriptor
> format. Likewise, the T0SZ field of the HTCR is 3-bits. KVM currently
> defines TTBCR_T{0,1}SZ as 3, not 7.
>
> The T0SZ mask is used to calculate the value for the HTCR, both to pick out
> TTBCR.T0SZ and mask off the equivalent field in the HTCR during
> read-modify-write. The incorrect mask size causes the (UNKNOWN) reset value
> of HTCR.T0SZ to leak in to the calculated HTCR value. Linux will hang when
> initializing KVM if HTCR's reset value has bit 2 set (sometimes the case on
> A7/TC2)
>
> Fixing T0SZ allows A7 cores to boot and T1SZ is also fixed for completeness.
>
> Signed-off-by: Jonathan Austin <jonathan.austin at arm.com>
> Acked-by: Marc Zyngier <marc.zyngier at arm.com>
> ---
> arch/arm/include/asm/kvm_arm.h | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm/include/asm/kvm_arm.h b/arch/arm/include/asm/kvm_arm.h
> index 64e9696..d556f03 100644
> --- a/arch/arm/include/asm/kvm_arm.h
> +++ b/arch/arm/include/asm/kvm_arm.h
> @@ -95,12 +95,12 @@
> #define TTBCR_IRGN1 (3 << 24)
> #define TTBCR_EPD1 (1 << 23)
> #define TTBCR_A1 (1 << 22)
> -#define TTBCR_T1SZ (3 << 16)
> +#define TTBCR_T1SZ (7 << 16)
> #define TTBCR_SH0 (3 << 12)
> #define TTBCR_ORGN0 (3 << 10)
> #define TTBCR_IRGN0 (3 << 8)
> #define TTBCR_EPD0 (1 << 7)
> -#define TTBCR_T0SZ 3
> +#define TTBCR_T0SZ (7 << 0)
> #define HTCR_MASK (TTBCR_T0SZ | TTBCR_IRGN0 | TTBCR_ORGN0 | TTBCR_SH0)
>
> /* Hyp System Trap Register */
> --
> 1.7.9.5
>
Good catch!
ack.
-Christoffer
More information about the linux-arm-kernel
mailing list