@@ -41,10 +41,27 @@ struct feature_id_reg {
4141
4242static struct feature_id_reg feat_id_regs [] = {
4343 REG_FEAT (TCR2_EL1 , ID_AA64MMFR3_EL1 , TCRX , IMP ),
44+ REG_FEAT (TCR2_EL2 , ID_AA64MMFR3_EL1 , TCRX , IMP ),
4445 REG_FEAT (PIRE0_EL1 , ID_AA64MMFR3_EL1 , S1PIE , IMP ),
46+ REG_FEAT (PIRE0_EL2 , ID_AA64MMFR3_EL1 , S1PIE , IMP ),
4547 REG_FEAT (PIR_EL1 , ID_AA64MMFR3_EL1 , S1PIE , IMP ),
48+ REG_FEAT (PIR_EL2 , ID_AA64MMFR3_EL1 , S1PIE , IMP ),
4649 REG_FEAT (POR_EL1 , ID_AA64MMFR3_EL1 , S1POE , IMP ),
4750 REG_FEAT (POR_EL0 , ID_AA64MMFR3_EL1 , S1POE , IMP ),
51+ REG_FEAT (POR_EL2 , ID_AA64MMFR3_EL1 , S1POE , IMP ),
52+ REG_FEAT (HCRX_EL2 , ID_AA64MMFR1_EL1 , HCX , IMP ),
53+ REG_FEAT (HFGRTR_EL2 , ID_AA64MMFR0_EL1 , FGT , IMP ),
54+ REG_FEAT (HFGWTR_EL2 , ID_AA64MMFR0_EL1 , FGT , IMP ),
55+ REG_FEAT (HFGITR_EL2 , ID_AA64MMFR0_EL1 , FGT , IMP ),
56+ REG_FEAT (HDFGRTR_EL2 , ID_AA64MMFR0_EL1 , FGT , IMP ),
57+ REG_FEAT (HDFGWTR_EL2 , ID_AA64MMFR0_EL1 , FGT , IMP ),
58+ REG_FEAT (HAFGRTR_EL2 , ID_AA64MMFR0_EL1 , FGT , IMP ),
59+ REG_FEAT (HFGRTR2_EL2 , ID_AA64MMFR0_EL1 , FGT , FGT2 ),
60+ REG_FEAT (HFGWTR2_EL2 , ID_AA64MMFR0_EL1 , FGT , FGT2 ),
61+ REG_FEAT (HFGITR2_EL2 , ID_AA64MMFR0_EL1 , FGT , FGT2 ),
62+ REG_FEAT (HDFGRTR2_EL2 , ID_AA64MMFR0_EL1 , FGT , FGT2 ),
63+ REG_FEAT (HDFGWTR2_EL2 , ID_AA64MMFR0_EL1 , FGT , FGT2 ),
64+ REG_FEAT (ZCR_EL2 , ID_AA64PFR0_EL1 , SVE , IMP ),
4865};
4966
5067bool filter_reg (__u64 reg )
@@ -678,6 +695,60 @@ static __u64 pauth_generic_regs[] = {
678695 ARM64_SYS_REG (3 , 0 , 2 , 3 , 1 ), /* APGAKEYHI_EL1 */
679696};
680697
698+ static __u64 el2_regs [] = {
699+ SYS_REG (VPIDR_EL2 ),
700+ SYS_REG (VMPIDR_EL2 ),
701+ SYS_REG (SCTLR_EL2 ),
702+ SYS_REG (ACTLR_EL2 ),
703+ SYS_REG (HCR_EL2 ),
704+ SYS_REG (MDCR_EL2 ),
705+ SYS_REG (CPTR_EL2 ),
706+ SYS_REG (HSTR_EL2 ),
707+ SYS_REG (HFGRTR_EL2 ),
708+ SYS_REG (HFGWTR_EL2 ),
709+ SYS_REG (HFGITR_EL2 ),
710+ SYS_REG (HACR_EL2 ),
711+ SYS_REG (ZCR_EL2 ),
712+ SYS_REG (HCRX_EL2 ),
713+ SYS_REG (TTBR0_EL2 ),
714+ SYS_REG (TTBR1_EL2 ),
715+ SYS_REG (TCR_EL2 ),
716+ SYS_REG (TCR2_EL2 ),
717+ SYS_REG (VTTBR_EL2 ),
718+ SYS_REG (VTCR_EL2 ),
719+ SYS_REG (VNCR_EL2 ),
720+ SYS_REG (HDFGRTR2_EL2 ),
721+ SYS_REG (HDFGWTR2_EL2 ),
722+ SYS_REG (HFGRTR2_EL2 ),
723+ SYS_REG (HFGWTR2_EL2 ),
724+ SYS_REG (HDFGRTR_EL2 ),
725+ SYS_REG (HDFGWTR_EL2 ),
726+ SYS_REG (HAFGRTR_EL2 ),
727+ SYS_REG (HFGITR2_EL2 ),
728+ SYS_REG (SPSR_EL2 ),
729+ SYS_REG (ELR_EL2 ),
730+ SYS_REG (AFSR0_EL2 ),
731+ SYS_REG (AFSR1_EL2 ),
732+ SYS_REG (ESR_EL2 ),
733+ SYS_REG (FAR_EL2 ),
734+ SYS_REG (HPFAR_EL2 ),
735+ SYS_REG (MAIR_EL2 ),
736+ SYS_REG (PIRE0_EL2 ),
737+ SYS_REG (PIR_EL2 ),
738+ SYS_REG (POR_EL2 ),
739+ SYS_REG (AMAIR_EL2 ),
740+ SYS_REG (VBAR_EL2 ),
741+ SYS_REG (CONTEXTIDR_EL2 ),
742+ SYS_REG (TPIDR_EL2 ),
743+ SYS_REG (CNTVOFF_EL2 ),
744+ SYS_REG (CNTHCTL_EL2 ),
745+ SYS_REG (CNTHP_CTL_EL2 ),
746+ SYS_REG (CNTHP_CVAL_EL2 ),
747+ SYS_REG (CNTHV_CTL_EL2 ),
748+ SYS_REG (CNTHV_CVAL_EL2 ),
749+ SYS_REG (SP_EL2 ),
750+ };
751+
681752#define BASE_SUBLIST \
682753 { "base", .regs = base_regs, .regs_n = ARRAY_SIZE(base_regs), }
683754#define VREGS_SUBLIST \
@@ -704,6 +775,14 @@ static __u64 pauth_generic_regs[] = {
704775 .regs = pauth_generic_regs, \
705776 .regs_n = ARRAY_SIZE(pauth_generic_regs), \
706777 }
778+ #define EL2_SUBLIST \
779+ { \
780+ .name = "EL2", \
781+ .capability = KVM_CAP_ARM_EL2, \
782+ .feature = KVM_ARM_VCPU_HAS_EL2, \
783+ .regs = el2_regs, \
784+ .regs_n = ARRAY_SIZE(el2_regs), \
785+ }
707786
708787static struct vcpu_reg_list vregs_config = {
709788 .sublists = {
@@ -753,12 +832,78 @@ static struct vcpu_reg_list pauth_pmu_config = {
753832 },
754833};
755834
835+ static struct vcpu_reg_list el2_vregs_config = {
836+ .sublists = {
837+ BASE_SUBLIST ,
838+ EL2_SUBLIST ,
839+ VREGS_SUBLIST ,
840+ {0 },
841+ },
842+ };
843+
844+ static struct vcpu_reg_list el2_vregs_pmu_config = {
845+ .sublists = {
846+ BASE_SUBLIST ,
847+ EL2_SUBLIST ,
848+ VREGS_SUBLIST ,
849+ PMU_SUBLIST ,
850+ {0 },
851+ },
852+ };
853+
854+ static struct vcpu_reg_list el2_sve_config = {
855+ .sublists = {
856+ BASE_SUBLIST ,
857+ EL2_SUBLIST ,
858+ SVE_SUBLIST ,
859+ {0 },
860+ },
861+ };
862+
863+ static struct vcpu_reg_list el2_sve_pmu_config = {
864+ .sublists = {
865+ BASE_SUBLIST ,
866+ EL2_SUBLIST ,
867+ SVE_SUBLIST ,
868+ PMU_SUBLIST ,
869+ {0 },
870+ },
871+ };
872+
873+ static struct vcpu_reg_list el2_pauth_config = {
874+ .sublists = {
875+ BASE_SUBLIST ,
876+ EL2_SUBLIST ,
877+ VREGS_SUBLIST ,
878+ PAUTH_SUBLIST ,
879+ {0 },
880+ },
881+ };
882+
883+ static struct vcpu_reg_list el2_pauth_pmu_config = {
884+ .sublists = {
885+ BASE_SUBLIST ,
886+ EL2_SUBLIST ,
887+ VREGS_SUBLIST ,
888+ PAUTH_SUBLIST ,
889+ PMU_SUBLIST ,
890+ {0 },
891+ },
892+ };
893+
756894struct vcpu_reg_list * vcpu_configs [] = {
757895 & vregs_config ,
758896 & vregs_pmu_config ,
759897 & sve_config ,
760898 & sve_pmu_config ,
761899 & pauth_config ,
762900 & pauth_pmu_config ,
901+
902+ & el2_vregs_config ,
903+ & el2_vregs_pmu_config ,
904+ & el2_sve_config ,
905+ & el2_sve_pmu_config ,
906+ & el2_pauth_config ,
907+ & el2_pauth_pmu_config ,
763908};
764909int vcpu_configs_n = ARRAY_SIZE (vcpu_configs );
0 commit comments