KVM: arm64: Explicitly trap unsupported HFGxTR_EL2 features
authorFuad Tabba <tabba@google.com>
Thu, 14 Dec 2023 10:01:45 +0000 (10:01 +0000)
committerMarc Zyngier <maz@kernel.org>
Mon, 18 Dec 2023 09:22:32 +0000 (09:22 +0000)
Do not rely on the value of __HFGRTR_EL2_nMASK to trap
unsupported features, since the nMASK can (and will) change as
new traps are added and as its value is updated. Instead,
explicitly specify the trap bits.

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

index f99d8af0b9afb0ff31b549d08c6234f9a272eef2..7b4909dfd1f5675fb5eb85187206f95675cfba26 100644 (file)
@@ -110,12 +110,15 @@ static inline void __activate_traps_hfgxtr(struct kvm_vcpu *vcpu)
                compute_clr_set(vcpu, HFGWTR_EL2, w_clr, w_set);
        }
 
-       /* The default is not to trap anything but ACCDATA_EL1 */
-       r_val = __HFGRTR_EL2_nMASK & ~HFGxTR_EL2_nACCDATA_EL1;
+       /* The default to trap everything not handled or supported in KVM. */
+       tmp = HFGxTR_EL2_nAMAIR2_EL1 | HFGxTR_EL2_nMAIR2_EL1 | HFGxTR_EL2_nS2POR_EL1 |
+             HFGxTR_EL2_nPOR_EL1 | HFGxTR_EL2_nPOR_EL0 | HFGxTR_EL2_nACCDATA_EL1;
+
+       r_val = __HFGRTR_EL2_nMASK & ~tmp;
        r_val |= r_set;
        r_val &= ~r_clr;
 
-       w_val = __HFGWTR_EL2_nMASK & ~HFGxTR_EL2_nACCDATA_EL1;
+       w_val = __HFGWTR_EL2_nMASK & ~tmp;
        w_val |= w_set;
        w_val &= ~w_clr;