@@ -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
@@ -2567,7 +2582,8 @@ static const struct sys_reg_desc sys_reg_descs[] = {
25672582 { SYS_DESC (SYS_TTBR0_EL1 ), access_vm_reg , reset_unknown , TTBR0_EL1 },
25682583 { SYS_DESC (SYS_TTBR1_EL1 ), access_vm_reg , reset_unknown , TTBR1_EL1 },
25692584 { SYS_DESC (SYS_TCR_EL1 ), access_vm_reg , reset_val , TCR_EL1 , 0 },
2570- { SYS_DESC (SYS_TCR2_EL1 ), access_vm_reg , reset_val , TCR2_EL1 , 0 },
2585+ { SYS_DESC (SYS_TCR2_EL1 ), access_vm_reg , reset_val , TCR2_EL1 , 0 ,
2586+ .visibility = tcr2_visibility },
25712587
25722588 PTRAUTH_KEY (APIA ),
25732589 PTRAUTH_KEY (APIB ),
@@ -2904,7 +2920,8 @@ static const struct sys_reg_desc sys_reg_descs[] = {
29042920 EL2_REG (TTBR0_EL2 , access_rw , reset_val , 0 ),
29052921 EL2_REG (TTBR1_EL2 , access_rw , reset_val , 0 ),
29062922 EL2_REG (TCR_EL2 , access_rw , reset_val , TCR_EL2_RES1 ),
2907- EL2_REG (TCR2_EL2 , access_tcr2_el2 , reset_val , TCR2_EL2_RES1 ),
2923+ EL2_REG_FILTERED (TCR2_EL2 , access_tcr2_el2 , reset_val , TCR2_EL2_RES1 ,
2924+ tcr2_el2_visibility ),
29082925 EL2_REG_VNCR (VTTBR_EL2 , reset_val , 0 ),
29092926 EL2_REG_VNCR (VTCR_EL2 , reset_val , 0 ),
29102927
@@ -4800,7 +4817,7 @@ void kvm_calculate_traps(struct kvm_vcpu *vcpu)
48004817 if (kvm_has_feat (kvm , ID_AA64ISAR2_EL1 , MOPS , IMP ))
48014818 vcpu -> arch .hcrx_el2 |= (HCRX_EL2_MSCEn | HCRX_EL2_MCE2 );
48024819
4803- if (kvm_has_feat (kvm , ID_AA64MMFR3_EL1 , TCRX , IMP ))
4820+ if (kvm_has_tcr2 (kvm ))
48044821 vcpu -> arch .hcrx_el2 |= HCRX_EL2_TCR2En ;
48054822
48064823 if (kvm_has_fpmr (kvm ))
0 commit comments