@@ -799,142 +799,132 @@ void kvm_arch_flush_shadow_all(struct kvm *kvm)
799
799
* This list should get updated as new features get added to the NV
800
800
* support, and new extension to the architecture.
801
801
*/
802
- static u64 limit_nv_id_reg ( u32 id , u64 val )
802
+ static void limit_nv_id_regs ( struct kvm * kvm )
803
803
{
804
- u64 tmp ;
805
-
806
- switch (id ) {
807
- case SYS_ID_AA64ISAR0_EL1 :
808
- /* Support everything but TME */
809
- val &= ~NV_FTR (ISAR0 , TME );
810
- break ;
811
-
812
- case SYS_ID_AA64ISAR1_EL1 :
813
- /* Support everything but Spec Invalidation and LS64 */
814
- val &= ~(NV_FTR (ISAR1 , LS64 ) |
815
- NV_FTR (ISAR1 , SPECRES ));
816
- break ;
817
-
818
- case SYS_ID_AA64PFR0_EL1 :
819
- /* No AMU, MPAM, S-EL2, RAS or SVE */
820
- val &= ~(GENMASK_ULL (55 , 52 ) |
821
- NV_FTR (PFR0 , AMU ) |
822
- NV_FTR (PFR0 , MPAM ) |
823
- NV_FTR (PFR0 , SEL2 ) |
824
- NV_FTR (PFR0 , RAS ) |
825
- NV_FTR (PFR0 , SVE ) |
826
- NV_FTR (PFR0 , EL3 ) |
827
- NV_FTR (PFR0 , EL2 ) |
828
- NV_FTR (PFR0 , EL1 ));
829
- /* 64bit EL1/EL2/EL3 only */
830
- val |= FIELD_PREP (NV_FTR (PFR0 , EL1 ), 0b0001 );
831
- val |= FIELD_PREP (NV_FTR (PFR0 , EL2 ), 0b0001 );
832
- val |= FIELD_PREP (NV_FTR (PFR0 , EL3 ), 0b0001 );
833
- break ;
834
-
835
- case SYS_ID_AA64PFR1_EL1 :
836
- /* Only support BTI, SSBS, CSV2_frac */
837
- val &= (NV_FTR (PFR1 , BT ) |
838
- NV_FTR (PFR1 , SSBS ) |
839
- NV_FTR (PFR1 , CSV2_frac ));
840
- break ;
841
-
842
- case SYS_ID_AA64MMFR0_EL1 :
843
- /* Hide ECV, ExS, Secure Memory */
844
- val &= ~(NV_FTR (MMFR0 , ECV ) |
845
- NV_FTR (MMFR0 , EXS ) |
846
- NV_FTR (MMFR0 , TGRAN4_2 ) |
847
- NV_FTR (MMFR0 , TGRAN16_2 ) |
848
- NV_FTR (MMFR0 , TGRAN64_2 ) |
849
- NV_FTR (MMFR0 , SNSMEM ));
850
-
851
- /* Disallow unsupported S2 page sizes */
852
- switch (PAGE_SIZE ) {
853
- case SZ_64K :
854
- val |= FIELD_PREP (NV_FTR (MMFR0 , TGRAN16_2 ), 0b0001 );
855
- fallthrough ;
856
- case SZ_16K :
857
- val |= FIELD_PREP (NV_FTR (MMFR0 , TGRAN4_2 ), 0b0001 );
858
- fallthrough ;
859
- case SZ_4K :
860
- /* Support everything */
861
- break ;
862
- }
863
- /*
864
- * Since we can't support a guest S2 page size smaller than
865
- * the host's own page size (due to KVM only populating its
866
- * own S2 using the kernel's page size), advertise the
867
- * limitation using FEAT_GTG.
868
- */
869
- switch (PAGE_SIZE ) {
870
- case SZ_4K :
871
- val |= FIELD_PREP (NV_FTR (MMFR0 , TGRAN4_2 ), 0b0010 );
872
- fallthrough ;
873
- case SZ_16K :
874
- val |= FIELD_PREP (NV_FTR (MMFR0 , TGRAN16_2 ), 0b0010 );
875
- fallthrough ;
876
- case SZ_64K :
877
- val |= FIELD_PREP (NV_FTR (MMFR0 , TGRAN64_2 ), 0b0010 );
878
- break ;
879
- }
880
- /* Cap PARange to 48bits */
881
- tmp = FIELD_GET (NV_FTR (MMFR0 , PARANGE ), val );
882
- if (tmp > 0b0101 ) {
883
- val &= ~NV_FTR (MMFR0 , PARANGE );
884
- val |= FIELD_PREP (NV_FTR (MMFR0 , PARANGE ), 0b0101 );
885
- }
886
- break ;
887
-
888
- case SYS_ID_AA64MMFR1_EL1 :
889
- val &= (NV_FTR (MMFR1 , HCX ) |
890
- NV_FTR (MMFR1 , PAN ) |
891
- NV_FTR (MMFR1 , LO ) |
892
- NV_FTR (MMFR1 , HPDS ) |
893
- NV_FTR (MMFR1 , VH ) |
894
- NV_FTR (MMFR1 , VMIDBits ));
895
- break ;
896
-
897
- case SYS_ID_AA64MMFR2_EL1 :
898
- val &= ~(NV_FTR (MMFR2 , BBM ) |
899
- NV_FTR (MMFR2 , TTL ) |
900
- GENMASK_ULL (47 , 44 ) |
901
- NV_FTR (MMFR2 , ST ) |
902
- NV_FTR (MMFR2 , CCIDX ) |
903
- NV_FTR (MMFR2 , VARange ));
904
-
905
- /* Force TTL support */
906
- val |= FIELD_PREP (NV_FTR (MMFR2 , TTL ), 0b0001 );
907
- break ;
908
-
909
- case SYS_ID_AA64MMFR4_EL1 :
910
- val = 0 ;
911
- if (!cpus_have_final_cap (ARM64_HAS_HCR_NV1 ))
912
- val |= FIELD_PREP (NV_FTR (MMFR4 , E2H0 ),
913
- ID_AA64MMFR4_EL1_E2H0_NI_NV1 );
914
- break ;
915
-
916
- case SYS_ID_AA64DFR0_EL1 :
917
- /* Only limited support for PMU, Debug, BPs and WPs */
918
- val &= (NV_FTR (DFR0 , PMUVer ) |
919
- NV_FTR (DFR0 , WRPs ) |
920
- NV_FTR (DFR0 , BRPs ) |
921
- NV_FTR (DFR0 , DebugVer ));
922
-
923
- /* Cap Debug to ARMv8.1 */
924
- tmp = FIELD_GET (NV_FTR (DFR0 , DebugVer ), val );
925
- if (tmp > 0b0111 ) {
926
- val &= ~NV_FTR (DFR0 , DebugVer );
927
- val |= FIELD_PREP (NV_FTR (DFR0 , DebugVer ), 0b0111 );
928
- }
804
+ u64 val , tmp ;
805
+
806
+ /* Support everything but TME */
807
+ val = kvm_read_vm_id_reg (kvm , SYS_ID_AA64ISAR0_EL1 );
808
+ val &= ~NV_FTR (ISAR0 , TME );
809
+ kvm_set_vm_id_reg (kvm , SYS_ID_AA64ISAR0_EL1 , val );
810
+
811
+ /* Support everything but Spec Invalidation and LS64 */
812
+ val = kvm_read_vm_id_reg (kvm , SYS_ID_AA64ISAR1_EL1 );
813
+ val &= ~(NV_FTR (ISAR1 , LS64 ) |
814
+ NV_FTR (ISAR1 , SPECRES ));
815
+ kvm_set_vm_id_reg (kvm , SYS_ID_AA64ISAR1_EL1 , val );
816
+
817
+ /* No AMU, MPAM, S-EL2, RAS or SVE */
818
+ val = kvm_read_vm_id_reg (kvm , SYS_ID_AA64PFR0_EL1 );
819
+ val &= ~(GENMASK_ULL (55 , 52 ) |
820
+ NV_FTR (PFR0 , AMU ) |
821
+ NV_FTR (PFR0 , MPAM ) |
822
+ NV_FTR (PFR0 , SEL2 ) |
823
+ NV_FTR (PFR0 , RAS ) |
824
+ NV_FTR (PFR0 , SVE ) |
825
+ NV_FTR (PFR0 , EL3 ) |
826
+ NV_FTR (PFR0 , EL2 ) |
827
+ NV_FTR (PFR0 , EL1 ));
828
+ /* 64bit EL1/EL2/EL3 only */
829
+ val |= FIELD_PREP (NV_FTR (PFR0 , EL1 ), 0b0001 );
830
+ val |= FIELD_PREP (NV_FTR (PFR0 , EL2 ), 0b0001 );
831
+ val |= FIELD_PREP (NV_FTR (PFR0 , EL3 ), 0b0001 );
832
+ kvm_set_vm_id_reg (kvm , SYS_ID_AA64PFR0_EL1 , val );
833
+
834
+ /* Only support BTI, SSBS, CSV2_frac */
835
+ val = kvm_read_vm_id_reg (kvm , SYS_ID_AA64PFR1_EL1 );
836
+ val &= (NV_FTR (PFR1 , BT ) |
837
+ NV_FTR (PFR1 , SSBS ) |
838
+ NV_FTR (PFR1 , CSV2_frac ));
839
+ kvm_set_vm_id_reg (kvm , SYS_ID_AA64PFR1_EL1 , val );
840
+
841
+ /* Hide ECV, ExS, Secure Memory */
842
+ val = kvm_read_vm_id_reg (kvm , SYS_ID_AA64MMFR0_EL1 );
843
+ val &= ~(NV_FTR (MMFR0 , ECV ) |
844
+ NV_FTR (MMFR0 , EXS ) |
845
+ NV_FTR (MMFR0 , TGRAN4_2 ) |
846
+ NV_FTR (MMFR0 , TGRAN16_2 ) |
847
+ NV_FTR (MMFR0 , TGRAN64_2 ) |
848
+ NV_FTR (MMFR0 , SNSMEM ));
849
+
850
+ /* Disallow unsupported S2 page sizes */
851
+ switch (PAGE_SIZE ) {
852
+ case SZ_64K :
853
+ val |= FIELD_PREP (NV_FTR (MMFR0 , TGRAN16_2 ), 0b0001 );
854
+ fallthrough ;
855
+ case SZ_16K :
856
+ val |= FIELD_PREP (NV_FTR (MMFR0 , TGRAN4_2 ), 0b0001 );
857
+ fallthrough ;
858
+ case SZ_4K :
859
+ /* Support everything */
929
860
break ;
930
-
931
- default :
932
- /* Unknown register, just wipe it clean */
933
- val = 0 ;
861
+ }
862
+ /*
863
+ * Since we can't support a guest S2 page size smaller than
864
+ * the host's own page size (due to KVM only populating its
865
+ * own S2 using the kernel's page size), advertise the
866
+ * limitation using FEAT_GTG.
867
+ */
868
+ switch (PAGE_SIZE ) {
869
+ case SZ_4K :
870
+ val |= FIELD_PREP (NV_FTR (MMFR0 , TGRAN4_2 ), 0b0010 );
871
+ fallthrough ;
872
+ case SZ_16K :
873
+ val |= FIELD_PREP (NV_FTR (MMFR0 , TGRAN16_2 ), 0b0010 );
874
+ fallthrough ;
875
+ case SZ_64K :
876
+ val |= FIELD_PREP (NV_FTR (MMFR0 , TGRAN64_2 ), 0b0010 );
934
877
break ;
935
878
}
936
-
937
- return val ;
879
+ /* Cap PARange to 48bits */
880
+ tmp = FIELD_GET (NV_FTR (MMFR0 , PARANGE ), val );
881
+ if (tmp > 0b0101 ) {
882
+ val &= ~NV_FTR (MMFR0 , PARANGE );
883
+ val |= FIELD_PREP (NV_FTR (MMFR0 , PARANGE ), 0b0101 );
884
+ }
885
+ kvm_set_vm_id_reg (kvm , SYS_ID_AA64MMFR0_EL1 , val );
886
+
887
+ val = kvm_read_vm_id_reg (kvm , SYS_ID_AA64MMFR1_EL1 );
888
+ val &= (NV_FTR (MMFR1 , HCX ) |
889
+ NV_FTR (MMFR1 , PAN ) |
890
+ NV_FTR (MMFR1 , LO ) |
891
+ NV_FTR (MMFR1 , HPDS ) |
892
+ NV_FTR (MMFR1 , VH ) |
893
+ NV_FTR (MMFR1 , VMIDBits ));
894
+ kvm_set_vm_id_reg (kvm , SYS_ID_AA64MMFR1_EL1 , val );
895
+
896
+ val = kvm_read_vm_id_reg (kvm , SYS_ID_AA64MMFR2_EL1 );
897
+ val &= ~(NV_FTR (MMFR2 , BBM ) |
898
+ NV_FTR (MMFR2 , TTL ) |
899
+ GENMASK_ULL (47 , 44 ) |
900
+ NV_FTR (MMFR2 , ST ) |
901
+ NV_FTR (MMFR2 , CCIDX ) |
902
+ NV_FTR (MMFR2 , VARange ));
903
+
904
+ /* Force TTL support */
905
+ val |= FIELD_PREP (NV_FTR (MMFR2 , TTL ), 0b0001 );
906
+ kvm_set_vm_id_reg (kvm , SYS_ID_AA64MMFR2_EL1 , val );
907
+
908
+ val = 0 ;
909
+ if (!cpus_have_final_cap (ARM64_HAS_HCR_NV1 ))
910
+ val |= FIELD_PREP (NV_FTR (MMFR4 , E2H0 ),
911
+ ID_AA64MMFR4_EL1_E2H0_NI_NV1 );
912
+ kvm_set_vm_id_reg (kvm , SYS_ID_AA64MMFR4_EL1 , val );
913
+
914
+ /* Only limited support for PMU, Debug, BPs and WPs */
915
+ val = kvm_read_vm_id_reg (kvm , SYS_ID_AA64DFR0_EL1 );
916
+ val &= (NV_FTR (DFR0 , PMUVer ) |
917
+ NV_FTR (DFR0 , WRPs ) |
918
+ NV_FTR (DFR0 , BRPs ) |
919
+ NV_FTR (DFR0 , DebugVer ));
920
+
921
+ /* Cap Debug to ARMv8.1 */
922
+ tmp = FIELD_GET (NV_FTR (DFR0 , DebugVer ), val );
923
+ if (tmp > 0b0111 ) {
924
+ val &= ~NV_FTR (DFR0 , DebugVer );
925
+ val |= FIELD_PREP (NV_FTR (DFR0 , DebugVer ), 0b0111 );
926
+ }
927
+ kvm_set_vm_id_reg (kvm , SYS_ID_AA64DFR0_EL1 , val );
938
928
}
939
929
940
930
u64 kvm_vcpu_sanitise_vncr_reg (const struct kvm_vcpu * vcpu , enum vcpu_sysreg sr )
@@ -979,9 +969,7 @@ int kvm_init_nv_sysregs(struct kvm *kvm)
979
969
goto out ;
980
970
}
981
971
982
- for (int i = 0 ; i < KVM_ARM_ID_REG_NUM ; i ++ )
983
- kvm -> arch .id_regs [i ] = limit_nv_id_reg (IDX_IDREG (i ),
984
- kvm -> arch .id_regs [i ]);
972
+ limit_nv_id_regs (kvm );
985
973
986
974
/* VTTBR_EL2 */
987
975
res0 = res1 = 0 ;
0 commit comments