@@ -74,8 +74,6 @@ enum kvm_mode kvm_get_mode(void);
7474static inline enum kvm_mode kvm_get_mode (void ) { return KVM_MODE_NONE ; };
7575#endif
7676
77- DECLARE_STATIC_KEY_FALSE (userspace_irqchip_in_use );
78-
7977extern unsigned int __ro_after_init kvm_sve_max_vl ;
8078extern unsigned int __ro_after_init kvm_host_sve_max_vl ;
8179int __init kvm_arm_init_sve (void );
@@ -374,7 +372,7 @@ struct kvm_arch {
374372
375373 u64 ctr_el0 ;
376374
377- /* Masks for VNCR-baked sysregs */
375+ /* Masks for VNCR-backed and general EL2 sysregs */
378376 struct kvm_sysreg_masks * sysreg_masks ;
379377
380378 /*
@@ -408,6 +406,9 @@ struct kvm_vcpu_fault_info {
408406 r = __VNCR_START__ + ((VNCR_ ## r) / 8), \
409407 __after_##r = __MAX__(__before_##r - 1, r)
410408
409+ #define MARKER (m ) \
410+ m, __after_##m = m - 1
411+
411412enum vcpu_sysreg {
412413 __INVALID_SYSREG__ , /* 0 is reserved as an invalid value */
413414 MPIDR_EL1 , /* MultiProcessor Affinity Register */
@@ -468,13 +469,15 @@ enum vcpu_sysreg {
468469 /* EL2 registers */
469470 SCTLR_EL2 , /* System Control Register (EL2) */
470471 ACTLR_EL2 , /* Auxiliary Control Register (EL2) */
471- MDCR_EL2 , /* Monitor Debug Configuration Register (EL2) */
472472 CPTR_EL2 , /* Architectural Feature Trap Register (EL2) */
473473 HACR_EL2 , /* Hypervisor Auxiliary Control Register */
474474 ZCR_EL2 , /* SVE Control Register (EL2) */
475475 TTBR0_EL2 , /* Translation Table Base Register 0 (EL2) */
476476 TTBR1_EL2 , /* Translation Table Base Register 1 (EL2) */
477477 TCR_EL2 , /* Translation Control Register (EL2) */
478+ PIRE0_EL2 , /* Permission Indirection Register 0 (EL2) */
479+ PIR_EL2 , /* Permission Indirection Register 1 (EL2) */
480+ POR_EL2 , /* Permission Overlay Register 2 (EL2) */
478481 SPSR_EL2 , /* EL2 saved program status register */
479482 ELR_EL2 , /* EL2 exception link register */
480483 AFSR0_EL2 , /* Auxiliary Fault Status Register 0 (EL2) */
@@ -494,7 +497,13 @@ enum vcpu_sysreg {
494497 CNTHV_CTL_EL2 ,
495498 CNTHV_CVAL_EL2 ,
496499
497- __VNCR_START__ , /* Any VNCR-capable reg goes after this point */
500+ /* Anything from this can be RES0/RES1 sanitised */
501+ MARKER (__SANITISED_REG_START__ ),
502+ TCR2_EL2 , /* Extended Translation Control Register (EL2) */
503+ MDCR_EL2 , /* Monitor Debug Configuration Register (EL2) */
504+
505+ /* Any VNCR-capable reg goes after this point */
506+ MARKER (__VNCR_START__ ),
498507
499508 VNCR (SCTLR_EL1 ),/* System Control Register */
500509 VNCR (ACTLR_EL1 ),/* Auxiliary Control Register */
@@ -554,7 +563,7 @@ struct kvm_sysreg_masks {
554563 struct {
555564 u64 res0 ;
556565 u64 res1 ;
557- } mask [NR_SYS_REGS - __VNCR_START__ ];
566+ } mask [NR_SYS_REGS - __SANITISED_REG_START__ ];
558567};
559568
560569struct kvm_cpu_context {
@@ -1002,13 +1011,13 @@ static inline u64 *___ctxt_sys_reg(const struct kvm_cpu_context *ctxt, int r)
10021011
10031012#define ctxt_sys_reg (c ,r ) (*__ctxt_sys_reg(c,r))
10041013
1005- u64 kvm_vcpu_sanitise_vncr_reg (const struct kvm_vcpu * , enum vcpu_sysreg );
1014+ u64 kvm_vcpu_apply_reg_masks (const struct kvm_vcpu * , enum vcpu_sysreg , u64 );
10061015#define __vcpu_sys_reg (v ,r ) \
10071016 (*({ \
10081017 const struct kvm_cpu_context *ctxt = &(v)->arch.ctxt; \
10091018 u64 *__r = __ctxt_sys_reg(ctxt, (r)); \
1010- if (vcpu_has_nv((v)) && (r) >= __VNCR_START__) \
1011- *__r = kvm_vcpu_sanitise_vncr_reg ((v), (r)); \
1019+ if (vcpu_has_nv((v)) && (r) >= __SANITISED_REG_START__) \
1020+ *__r = kvm_vcpu_apply_reg_masks ((v), (r), *__r); \
10121021 __r; \
10131022 }))
10141023
@@ -1037,6 +1046,10 @@ static inline bool __vcpu_read_sys_reg_from_cpu(int reg, u64 *val)
10371046 case TTBR0_EL1 : * val = read_sysreg_s (SYS_TTBR0_EL12 ); break ;
10381047 case TTBR1_EL1 : * val = read_sysreg_s (SYS_TTBR1_EL12 ); break ;
10391048 case TCR_EL1 : * val = read_sysreg_s (SYS_TCR_EL12 ); break ;
1049+ case TCR2_EL1 : * val = read_sysreg_s (SYS_TCR2_EL12 ); break ;
1050+ case PIR_EL1 : * val = read_sysreg_s (SYS_PIR_EL12 ); break ;
1051+ case PIRE0_EL1 : * val = read_sysreg_s (SYS_PIRE0_EL12 ); break ;
1052+ case POR_EL1 : * val = read_sysreg_s (SYS_POR_EL12 ); break ;
10401053 case ESR_EL1 : * val = read_sysreg_s (SYS_ESR_EL12 ); break ;
10411054 case AFSR0_EL1 : * val = read_sysreg_s (SYS_AFSR0_EL12 ); break ;
10421055 case AFSR1_EL1 : * val = read_sysreg_s (SYS_AFSR1_EL12 ); break ;
@@ -1083,6 +1096,10 @@ static inline bool __vcpu_write_sys_reg_to_cpu(u64 val, int reg)
10831096 case TTBR0_EL1 : write_sysreg_s (val , SYS_TTBR0_EL12 ); break ;
10841097 case TTBR1_EL1 : write_sysreg_s (val , SYS_TTBR1_EL12 ); break ;
10851098 case TCR_EL1 : write_sysreg_s (val , SYS_TCR_EL12 ); break ;
1099+ case TCR2_EL1 : write_sysreg_s (val , SYS_TCR2_EL12 ); break ;
1100+ case PIR_EL1 : write_sysreg_s (val , SYS_PIR_EL12 ); break ;
1101+ case PIRE0_EL1 : write_sysreg_s (val , SYS_PIRE0_EL12 ); break ;
1102+ case POR_EL1 : write_sysreg_s (val , SYS_POR_EL12 ); break ;
10861103 case ESR_EL1 : write_sysreg_s (val , SYS_ESR_EL12 ); break ;
10871104 case AFSR0_EL1 : write_sysreg_s (val , SYS_AFSR0_EL12 ); break ;
10881105 case AFSR1_EL1 : write_sysreg_s (val , SYS_AFSR1_EL12 ); break ;
@@ -1503,4 +1520,13 @@ void kvm_set_vm_id_reg(struct kvm *kvm, u32 reg, u64 val);
15031520 (system_supports_fpmr() && \
15041521 kvm_has_feat((k), ID_AA64PFR2_EL1, FPMR, IMP))
15051522
1523+ #define kvm_has_tcr2 (k ) \
1524+ (kvm_has_feat((k), ID_AA64MMFR3_EL1, TCRX, IMP))
1525+
1526+ #define kvm_has_s1pie (k ) \
1527+ (kvm_has_feat((k), ID_AA64MMFR3_EL1, S1PIE, IMP))
1528+
1529+ #define kvm_has_s1poe (k ) \
1530+ (kvm_has_feat((k), ID_AA64MMFR3_EL1, S1POE, IMP))
1531+
15061532#endif /* __ARM64_KVM_HOST_H__ */
0 commit comments