@@ -446,7 +446,7 @@ static bool access_vm_reg(struct kvm_vcpu *vcpu,
446446 u64 val , mask , shift ;
447447
448448 if (reg_to_encoding (r ) == SYS_TCR2_EL1 &&
449- !kvm_has_feat (vcpu -> kvm , ID_AA64MMFR3_EL1 , TCRX , IMP ))
449+ !kvm_has_tcr2 (vcpu -> kvm ))
450450 return undef_access (vcpu , p , r );
451451
452452 BUG_ON (!p -> is_write );
@@ -471,7 +471,7 @@ static bool access_tcr2_el2(struct kvm_vcpu *vcpu,
471471 struct sys_reg_params * p ,
472472 const struct sys_reg_desc * r )
473473{
474- if (!kvm_has_feat (vcpu -> kvm , ID_AA64MMFR3_EL1 , TCRX , IMP )) {
474+ if (!kvm_has_tcr2 (vcpu -> kvm )) {
475475 kvm_inject_undefined (vcpu );
476476 return false;
477477 }
@@ -2357,6 +2357,21 @@ static unsigned int s1poe_visibility(const struct kvm_vcpu *vcpu,
23572357 return REG_HIDDEN ;
23582358}
23592359
2360+ static unsigned int tcr2_visibility (const struct kvm_vcpu * vcpu ,
2361+ const struct sys_reg_desc * rd )
2362+ {
2363+ if (kvm_has_tcr2 (vcpu -> kvm ))
2364+ return 0 ;
2365+
2366+ return REG_HIDDEN ;
2367+ }
2368+
2369+ static unsigned int tcr2_el2_visibility (const struct kvm_vcpu * vcpu ,
2370+ const struct sys_reg_desc * rd )
2371+ {
2372+ return __el2_visibility (vcpu , rd , tcr2_visibility );
2373+ }
2374+
23602375/*
23612376 * Architected system registers.
23622377 * Important: Must be sorted ascending by Op0, Op1, CRn, CRm, Op2
@@ -2568,7 +2583,8 @@ static const struct sys_reg_desc sys_reg_descs[] = {
25682583 { SYS_DESC (SYS_TTBR0_EL1 ), access_vm_reg , reset_unknown , TTBR0_EL1 },
25692584 { SYS_DESC (SYS_TTBR1_EL1 ), access_vm_reg , reset_unknown , TTBR1_EL1 },
25702585 { SYS_DESC (SYS_TCR_EL1 ), access_vm_reg , reset_val , TCR_EL1 , 0 },
2571- { SYS_DESC (SYS_TCR2_EL1 ), access_vm_reg , reset_val , TCR2_EL1 , 0 },
2586+ { SYS_DESC (SYS_TCR2_EL1 ), access_vm_reg , reset_val , TCR2_EL1 , 0 ,
2587+ .visibility = tcr2_visibility },
25722588
25732589 PTRAUTH_KEY (APIA ),
25742590 PTRAUTH_KEY (APIB ),
@@ -2905,7 +2921,8 @@ static const struct sys_reg_desc sys_reg_descs[] = {
29052921 EL2_REG (TTBR0_EL2 , access_rw , reset_val , 0 ),
29062922 EL2_REG (TTBR1_EL2 , access_rw , reset_val , 0 ),
29072923 EL2_REG (TCR_EL2 , access_rw , reset_val , TCR_EL2_RES1 ),
2908- EL2_REG (TCR2_EL2 , access_tcr2_el2 , reset_val , TCR2_EL2_RES1 ),
2924+ EL2_REG_FILTERED (TCR2_EL2 , access_tcr2_el2 , reset_val , TCR2_EL2_RES1 ,
2925+ tcr2_el2_visibility ),
29092926 EL2_REG_VNCR (VTTBR_EL2 , reset_val , 0 ),
29102927 EL2_REG_VNCR (VTCR_EL2 , reset_val , 0 ),
29112928
@@ -4801,7 +4818,7 @@ void kvm_calculate_traps(struct kvm_vcpu *vcpu)
48014818 if (kvm_has_feat (kvm , ID_AA64ISAR2_EL1 , MOPS , IMP ))
48024819 vcpu -> arch .hcrx_el2 |= (HCRX_EL2_MSCEn | HCRX_EL2_MCE2 );
48034820
4804- if (kvm_has_feat (kvm , ID_AA64MMFR3_EL1 , TCRX , IMP ))
4821+ if (kvm_has_tcr2 (kvm ))
48054822 vcpu -> arch .hcrx_el2 |= HCRX_EL2_TCR2En ;
48064823
48074824 if (kvm_has_fpmr (kvm ))
0 commit comments