KVM: arm64: Add build validation for FGT trap mask values
authorFuad Tabba <tabba@google.com>
Thu, 14 Dec 2023 10:01:51 +0000 (10:01 +0000)
committerMarc Zyngier <maz@kernel.org>
Mon, 18 Dec 2023 11:25:51 +0000 (11:25 +0000)
These checks help ensure that all the bits are accounted for,
that there hasn't been a transcribing error from the spec nor
from the generated mask values, which will be used in subsequent
patches.

Signed-off-by: Fuad Tabba <tabba@google.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20231214100158.2305400-12-tabba@google.com
arch/arm64/kvm/hyp/include/hyp/switch.h

index 0436f0da98a42e37da8362c442a6dc3836cd7c0a..ecccf99619e6c75923aa6d976149abd21f72fc4e 100644 (file)
@@ -79,6 +79,16 @@ static inline void __activate_traps_fpsimd32(struct kvm_vcpu *vcpu)
                clr |= ~hfg & __ ## reg ## _nMASK;                      \
        } while(0)
 
+/*
+ * Validate the fine grain trap masks.
+ * Check that the masks do not overlap and that all bits are accounted for.
+ */
+#define CHECK_FGT_MASKS(reg)                                                   \
+       do {                                                                    \
+               BUILD_BUG_ON((__ ## reg ## _MASK) & (__ ## reg ## _nMASK));     \
+               BUILD_BUG_ON(~((__ ## reg ## _RES0) ^ (__ ## reg ## _MASK) ^    \
+                              (__ ## reg ## _nMASK)));                         \
+       } while(0)
 
 static inline bool cpu_has_amu(void)
 {
@@ -94,6 +104,14 @@ static inline void __activate_traps_hfgxtr(struct kvm_vcpu *vcpu)
        u64 r_clr = 0, w_clr = 0, r_set = 0, w_set = 0, tmp;
        u64 r_val, w_val;
 
+       CHECK_FGT_MASKS(HFGRTR_EL2);
+       CHECK_FGT_MASKS(HFGWTR_EL2);
+       CHECK_FGT_MASKS(HFGITR_EL2);
+       CHECK_FGT_MASKS(HDFGRTR_EL2);
+       CHECK_FGT_MASKS(HDFGWTR_EL2);
+       CHECK_FGT_MASKS(HAFGRTR_EL2);
+       CHECK_FGT_MASKS(HCRX_EL2);
+
        if (!cpus_have_final_cap(ARM64_HAS_FGT))
                return;