@@ -1264,16 +1264,10 @@ static u64 kvm_arm_update_id_reg(const struct kvm_vcpu *vcpu, u32 encoding, u64
12641264 case SYS_ID_AA64PFR0_EL1 :
12651265 if (!vcpu_has_sve (vcpu ))
12661266 val &= ~ARM64_FEATURE_MASK (ID_AA64PFR0_EL1_SVE );
1267- if (kvm_vgic_global_state .type == VGIC_V3 ) {
1268- val &= ~ARM64_FEATURE_MASK (ID_AA64PFR0_EL1_GIC );
1269- val |= FIELD_PREP (ARM64_FEATURE_MASK (ID_AA64PFR0_EL1_GIC ), 1 );
1270- }
12711267 break ;
12721268 case SYS_ID_AA64PFR1_EL1 :
12731269 if (!kvm_has_mte (vcpu -> kvm ))
12741270 val &= ~ARM64_FEATURE_MASK (ID_AA64PFR1_EL1_MTE );
1275-
1276- val &= ~ARM64_FEATURE_MASK (ID_AA64PFR1_EL1_SME );
12771271 break ;
12781272 case SYS_ID_AA64ISAR1_EL1 :
12791273 if (!vcpu_has_ptrauth (vcpu ))
@@ -1286,8 +1280,6 @@ static u64 kvm_arm_update_id_reg(const struct kvm_vcpu *vcpu, u32 encoding, u64
12861280 if (!vcpu_has_ptrauth (vcpu ))
12871281 val &= ~(ARM64_FEATURE_MASK (ID_AA64ISAR2_EL1_APA3 ) |
12881282 ARM64_FEATURE_MASK (ID_AA64ISAR2_EL1_GPA3 ));
1289- if (!cpus_have_final_cap (ARM64_HAS_WFXT ))
1290- val &= ~ARM64_FEATURE_MASK (ID_AA64ISAR2_EL1_WFxT );
12911283 break ;
12921284 }
12931285
@@ -1393,6 +1385,20 @@ static unsigned int sve_visibility(const struct kvm_vcpu *vcpu,
13931385 return REG_HIDDEN ;
13941386}
13951387
1388+ static u64 read_sanitised_id_mmfr4_el1 (struct kvm_vcpu * vcpu ,
1389+ const struct sys_reg_desc * rd )
1390+ {
1391+ u64 val ;
1392+ u32 id = reg_to_encoding (rd );
1393+
1394+ val = read_sanitised_ftr_reg (id );
1395+
1396+ /* CCIDX is not supported */
1397+ val &= ~ARM64_FEATURE_MASK (ID_MMFR4_CCIDX );
1398+
1399+ return val ;
1400+ }
1401+
13961402static u64 read_sanitised_id_aa64pfr0_el1 (struct kvm_vcpu * vcpu ,
13971403 const struct sys_reg_desc * rd )
13981404{
@@ -1419,6 +1425,25 @@ static u64 read_sanitised_id_aa64pfr0_el1(struct kvm_vcpu *vcpu,
14191425
14201426 val &= ~ARM64_FEATURE_MASK (ID_AA64PFR0_EL1_AMU );
14211427
1428+ if (kvm_vgic_global_state .type == VGIC_V3 ) {
1429+ val &= ~ARM64_FEATURE_MASK (ID_AA64PFR0_EL1_GIC );
1430+ val |= FIELD_PREP (ARM64_FEATURE_MASK (ID_AA64PFR0_EL1_GIC ), 1 );
1431+ }
1432+
1433+ return val ;
1434+ }
1435+
1436+ static u64 read_sanitised_id_aa64pfr1_el1 (struct kvm_vcpu * vcpu ,
1437+ const struct sys_reg_desc * rd )
1438+ {
1439+ u64 val ;
1440+ u32 id = reg_to_encoding (rd );
1441+
1442+ val = read_sanitised_ftr_reg (id );
1443+
1444+ /* SME is not supported */
1445+ val &= ~ARM64_FEATURE_MASK (ID_AA64PFR1_EL1_SME );
1446+
14221447 return val ;
14231448}
14241449
@@ -1541,6 +1566,34 @@ static int set_id_dfr0_el1(struct kvm_vcpu *vcpu,
15411566 return pmuver_update (vcpu , rd , val , perfmon_to_pmuver (perfmon ), valid_pmu );
15421567}
15431568
1569+ static u64 read_sanitised_id_aa64isar2_el1 (struct kvm_vcpu * vcpu ,
1570+ const struct sys_reg_desc * rd )
1571+ {
1572+ u64 val ;
1573+ u32 id = reg_to_encoding (rd );
1574+
1575+ val = read_sanitised_ftr_reg (id );
1576+
1577+ if (!cpus_have_final_cap (ARM64_HAS_WFXT ))
1578+ val &= ~ARM64_FEATURE_MASK (ID_AA64ISAR2_EL1_WFxT );
1579+
1580+ return val ;
1581+ }
1582+
1583+ static u64 read_sanitised_id_aa64mmfr2_el1 (struct kvm_vcpu * vcpu ,
1584+ const struct sys_reg_desc * rd )
1585+ {
1586+ u64 val ;
1587+ u32 id = reg_to_encoding (rd );
1588+
1589+ val = read_sanitised_ftr_reg (id );
1590+
1591+ /* CCIDX is not supported */
1592+ val &= ~ID_AA64MMFR2_EL1_CCIDX_MASK ;
1593+
1594+ return val ;
1595+ }
1596+
15441597/*
15451598 * cpufeature ID register user accessors
15461599 *
@@ -1814,7 +1867,13 @@ static const struct sys_reg_desc sys_reg_descs[] = {
18141867 AA32_ID_SANITISED (ID_ISAR3_EL1 ),
18151868 AA32_ID_SANITISED (ID_ISAR4_EL1 ),
18161869 AA32_ID_SANITISED (ID_ISAR5_EL1 ),
1817- AA32_ID_SANITISED (ID_MMFR4_EL1 ),
1870+ { SYS_DESC (SYS_ID_MMFR4_EL1 ),
1871+ .access = access_id_reg ,
1872+ .get_user = get_id_reg ,
1873+ .set_user = set_id_reg ,
1874+ .visibility = aa32_id_visibility ,
1875+ .reset = read_sanitised_id_mmfr4_el1 ,
1876+ .val = 0 , },
18181877 AA32_ID_SANITISED (ID_ISAR6_EL1 ),
18191878
18201879 /* CRm=3 */
@@ -1835,7 +1894,12 @@ static const struct sys_reg_desc sys_reg_descs[] = {
18351894 .set_user = set_id_reg ,
18361895 .reset = read_sanitised_id_aa64pfr0_el1 ,
18371896 .val = ID_AA64PFR0_EL1_CSV2_MASK | ID_AA64PFR0_EL1_CSV3_MASK , },
1838- ID_SANITISED (ID_AA64PFR1_EL1 ),
1897+ { SYS_DESC (SYS_ID_AA64PFR1_EL1 ),
1898+ .access = access_id_reg ,
1899+ .get_user = get_id_reg ,
1900+ .set_user = set_id_reg ,
1901+ .reset = read_sanitised_id_aa64pfr1_el1 ,
1902+ .val = 0 , },
18391903 ID_UNALLOCATED (4 ,2 ),
18401904 ID_UNALLOCATED (4 ,3 ),
18411905 ID_SANITISED (ID_AA64ZFR0_EL1 ),
@@ -1861,7 +1925,12 @@ static const struct sys_reg_desc sys_reg_descs[] = {
18611925 /* CRm=6 */
18621926 ID_SANITISED (ID_AA64ISAR0_EL1 ),
18631927 ID_SANITISED (ID_AA64ISAR1_EL1 ),
1864- ID_SANITISED (ID_AA64ISAR2_EL1 ),
1928+ { SYS_DESC (SYS_ID_AA64ISAR2_EL1 ),
1929+ .access = access_id_reg ,
1930+ .get_user = get_id_reg ,
1931+ .set_user = set_id_reg ,
1932+ .reset = read_sanitised_id_aa64isar2_el1 ,
1933+ .val = 0 , },
18651934 ID_UNALLOCATED (6 ,3 ),
18661935 ID_UNALLOCATED (6 ,4 ),
18671936 ID_UNALLOCATED (6 ,5 ),
@@ -1871,7 +1940,12 @@ static const struct sys_reg_desc sys_reg_descs[] = {
18711940 /* CRm=7 */
18721941 ID_SANITISED (ID_AA64MMFR0_EL1 ),
18731942 ID_SANITISED (ID_AA64MMFR1_EL1 ),
1874- ID_SANITISED (ID_AA64MMFR2_EL1 ),
1943+ { SYS_DESC (SYS_ID_AA64MMFR2_EL1 ),
1944+ .access = access_id_reg ,
1945+ .get_user = get_id_reg ,
1946+ .set_user = set_id_reg ,
1947+ .reset = read_sanitised_id_aa64mmfr2_el1 ,
1948+ .val = 0 , },
18751949 ID_UNALLOCATED (7 ,3 ),
18761950 ID_UNALLOCATED (7 ,4 ),
18771951 ID_UNALLOCATED (7 ,5 ),
0 commit comments