[PATCH] arm64: KVM: Fix HCR_EL2 and VTCR_EL2 configuration bits
Pranavkumar Sawargaonkar
pranavkumar at linaro.org
Thu May 9 07:40:11 EDT 2013
This patch does following fixes:
1. Make HCR_* flags as unsigned long long constants
Reason : By default, compiler assumes numeric constants as
signed hence sign extending it when assigned to unsigned variable
such as hcr_el2 (in VCPU context). This accidently sets HCR_ID and
HCR_CD making entire guest memory non-cacheable. On real HW, this
breaks Stage2 ttbl walks and also breaks VirtIO.
2. VTCR_EL2_ORGN0_WBWA and VTCR_EL2_IRGN0_WBWA macros.
Signed-off-by: Pranavkumar Sawargaonkar <pranavkumar at linaro.org>
Signed-off-by: Anup Patel <anup.patel at linaro.org>
---
arch/arm64/include/asm/kvm_arm.h | 73 +++++++++++++++++++-------------------
1 file changed, 37 insertions(+), 36 deletions(-)
diff --git a/arch/arm64/include/asm/kvm_arm.h b/arch/arm64/include/asm/kvm_arm.h
index 8ced0ca..0a951db 100644
--- a/arch/arm64/include/asm/kvm_arm.h
+++ b/arch/arm64/include/asm/kvm_arm.h
@@ -18,44 +18,45 @@
#ifndef __ARM64_KVM_ARM_H__
#define __ARM64_KVM_ARM_H__
+#include <linux/const.h>
#include <asm/types.h>
/* Hyp Configuration Register (HCR) bits */
-#define HCR_ID (1 << 33)
-#define HCR_CD (1 << 32)
+#define HCR_ID (_AC(0x1, ULL) << 33)
+#define HCR_CD (_AC(0x1, ULL) << 32)
#define HCR_RW_SHIFT 31
-#define HCR_RW (1 << HCR_RW_SHIFT)
-#define HCR_TRVM (1 << 30)
-#define HCR_HCD (1 << 29)
-#define HCR_TDZ (1 << 28)
-#define HCR_TGE (1 << 27)
-#define HCR_TVM (1 << 26)
-#define HCR_TTLB (1 << 25)
-#define HCR_TPU (1 << 24)
-#define HCR_TPC (1 << 23)
-#define HCR_TSW (1 << 22)
-#define HCR_TAC (1 << 21)
-#define HCR_TIDCP (1 << 20)
-#define HCR_TSC (1 << 19)
-#define HCR_TID3 (1 << 18)
-#define HCR_TID2 (1 << 17)
-#define HCR_TID1 (1 << 16)
-#define HCR_TID0 (1 << 15)
-#define HCR_TWE (1 << 14)
-#define HCR_TWI (1 << 13)
-#define HCR_DC (1 << 12)
-#define HCR_BSU (3 << 10)
-#define HCR_BSU_IS (1 << 10)
-#define HCR_FB (1 << 9)
-#define HCR_VA (1 << 8)
-#define HCR_VI (1 << 7)
-#define HCR_VF (1 << 6)
-#define HCR_AMO (1 << 5)
-#define HCR_IMO (1 << 4)
-#define HCR_FMO (1 << 3)
-#define HCR_PTW (1 << 2)
-#define HCR_SWIO (1 << 1)
-#define HCR_VM (1)
+#define HCR_RW (_AC(0x1, ULL) << HCR_RW_SHIFT)
+#define HCR_TRVM (_AC(0x1, ULL) << 30)
+#define HCR_HCD (_AC(0x1, ULL) << 29)
+#define HCR_TDZ (_AC(0x1, ULL) << 28)
+#define HCR_TGE (_AC(0x1, ULL) << 27)
+#define HCR_TVM (_AC(0x1, ULL) << 26)
+#define HCR_TTLB (_AC(0x1, ULL) << 25)
+#define HCR_TPU (_AC(0x1, ULL) << 24)
+#define HCR_TPC (_AC(0x1, ULL) << 23)
+#define HCR_TSW (_AC(0x1, ULL) << 22)
+#define HCR_TAC (_AC(0x1, ULL) << 21)
+#define HCR_TIDCP (_AC(0x1, ULL) << 20)
+#define HCR_TSC (_AC(0x1, ULL) << 19)
+#define HCR_TID3 (_AC(0x1, ULL) << 18)
+#define HCR_TID2 (_AC(0x1, ULL) << 17)
+#define HCR_TID1 (_AC(0x1, ULL) << 16)
+#define HCR_TID0 (_AC(0x1, ULL) << 15)
+#define HCR_TWE (_AC(0x1, ULL) << 14)
+#define HCR_TWI (_AC(0x1, ULL) << 13)
+#define HCR_DC (_AC(0x1, ULL) << 12)
+#define HCR_BSU (_AC(0x3, ULL) << 10)
+#define HCR_BSU_IS (_AC(0x1, ULL) << 10)
+#define HCR_FB (_AC(0x1, ULL) << 9)
+#define HCR_VA (_AC(0x1, ULL) << 8)
+#define HCR_VI (_AC(0x1, ULL) << 7)
+#define HCR_VF (_AC(0x1, ULL) << 6)
+#define HCR_AMO (_AC(0x1, ULL) << 5)
+#define HCR_IMO (_AC(0x1, ULL) << 4)
+#define HCR_FMO (_AC(0x1, ULL) << 3)
+#define HCR_PTW (_AC(0x1, ULL) << 2)
+#define HCR_SWIO (_AC(0x1, ULL) << 1)
+#define HCR_VM (_AC(0x1, ULL))
/*
* The bits we set in HCR:
@@ -111,9 +112,9 @@
#define VTCR_EL2_SH0_MASK (3 << 12)
#define VTCR_EL2_SH0_INNER (3 << 12)
#define VTCR_EL2_ORGN0_MASK (3 << 10)
-#define VTCR_EL2_ORGN0_WBWA (3 << 10)
+#define VTCR_EL2_ORGN0_WBWA (1 << 10)
#define VTCR_EL2_IRGN0_MASK (3 << 8)
-#define VTCR_EL2_IRGN0_WBWA (3 << 8)
+#define VTCR_EL2_IRGN0_WBWA (1 << 8)
#define VTCR_EL2_SL0_MASK (3 << 6)
#define VTCR_EL2_SL0_LVL1 (1 << 6)
#define VTCR_EL2_T0SZ_MASK 0x3f
--
1.7.9.5
More information about the linux-arm-kernel
mailing list