KVM: arm64: Add context-switch for FEAT_FGT2 registers
authorMarc Zyngier <maz@kernel.org>
Tue, 22 Apr 2025 20:20:18 +0000 (21:20 +0100)
committerMarc Zyngier <maz@kernel.org>
Mon, 19 May 2025 10:36:21 +0000 (11:36 +0100)
Just like the rest of the FGT registers, perform a switch of the
FGT2 equivalent. This avoids the host configuration leaking into
the guest...

Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/kvm/hyp/include/hyp/switch.h

index 0d61ec3e907d4d0c2959cfe892f1446e6a38d79a..f131bca36bd3d1cb2d927a0ef79dd9b7545bed82 100644 (file)
@@ -87,6 +87,21 @@ static inline void __activate_traps_fpsimd32(struct kvm_vcpu *vcpu)
                case HAFGRTR_EL2:                                       \
                        m = &hafgrtr_masks;                             \
                        break;                                          \
+               case HFGRTR2_EL2:                                       \
+                       m = &hfgrtr2_masks;                             \
+                       break;                                          \
+               case HFGWTR2_EL2:                                       \
+                       m = &hfgwtr2_masks;                             \
+                       break;                                          \
+               case HFGITR2_EL2:                                       \
+                       m = &hfgitr2_masks;                             \
+                       break;                                          \
+               case HDFGRTR2_EL2:                                      \
+                       m = &hdfgrtr2_masks;                            \
+                       break;                                          \
+               case HDFGWTR2_EL2:                                      \
+                       m = &hdfgwtr2_masks;                            \
+                       break;                                          \
                default:                                                \
                        BUILD_BUG_ON(1);                                \
                }                                                       \
@@ -120,6 +135,17 @@ static inline void __activate_traps_fpsimd32(struct kvm_vcpu *vcpu)
                case HAFGRTR_EL2:                                       \
                        id = HAFGRTR_GROUP;                             \
                        break;                                          \
+               case HFGRTR2_EL2:                                       \
+               case HFGWTR2_EL2:                                       \
+                       id = HFGRTR2_GROUP;                             \
+                       break;                                          \
+               case HFGITR2_EL2:                                       \
+                       id = HFGITR2_GROUP;                             \
+                       break;                                          \
+               case HDFGRTR2_EL2:                                      \
+               case HDFGWTR2_EL2:                                      \
+                       id = HDFGRTR2_GROUP;                            \
+                       break;                                          \
                default:                                                \
                        BUILD_BUG_ON(1);                                \
                }                                                       \
@@ -182,6 +208,15 @@ static inline void __activate_traps_hfgxtr(struct kvm_vcpu *vcpu)
 
        if (cpu_has_amu())
                update_fgt_traps(hctxt, vcpu, kvm, HAFGRTR_EL2);
+
+       if (!cpus_have_final_cap(ARM64_HAS_FGT2))
+           return;
+
+       update_fgt_traps(hctxt, vcpu, kvm, HFGRTR2_EL2);
+       update_fgt_traps(hctxt, vcpu, kvm, HFGWTR2_EL2);
+       update_fgt_traps(hctxt, vcpu, kvm, HFGITR2_EL2);
+       update_fgt_traps(hctxt, vcpu, kvm, HDFGRTR2_EL2);
+       update_fgt_traps(hctxt, vcpu, kvm, HDFGWTR2_EL2);
 }
 
 #define __deactivate_fgt(htcxt, vcpu, reg)                             \
@@ -205,6 +240,15 @@ static inline void __deactivate_traps_hfgxtr(struct kvm_vcpu *vcpu)
 
        if (cpu_has_amu())
                __deactivate_fgt(hctxt, vcpu, HAFGRTR_EL2);
+
+       if (!cpus_have_final_cap(ARM64_HAS_FGT2))
+           return;
+
+       __deactivate_fgt(hctxt, vcpu, HFGRTR2_EL2);
+       __deactivate_fgt(hctxt, vcpu, HFGWTR2_EL2);
+       __deactivate_fgt(hctxt, vcpu, HFGITR2_EL2);
+       __deactivate_fgt(hctxt, vcpu, HDFGRTR2_EL2);
+       __deactivate_fgt(hctxt, vcpu, HDFGWTR2_EL2);
 }
 
 static inline void  __activate_traps_mpam(struct kvm_vcpu *vcpu)