@@ -1527,6 +1527,9 @@ static u8 pmuver_to_perfmon(u8 pmuver)
15271527 }
15281528}
15291529
1530+ static u64 sanitise_id_aa64pfr0_el1 (const struct kvm_vcpu * vcpu , u64 val );
1531+ static u64 sanitise_id_aa64dfr0_el1 (const struct kvm_vcpu * vcpu , u64 val );
1532+
15301533/* Read a sanitised cpufeature ID register by sys_reg_desc */
15311534static u64 __kvm_read_sanitised_id_reg (const struct kvm_vcpu * vcpu ,
15321535 const struct sys_reg_desc * r )
@@ -1540,6 +1543,12 @@ static u64 __kvm_read_sanitised_id_reg(const struct kvm_vcpu *vcpu,
15401543 val = read_sanitised_ftr_reg (id );
15411544
15421545 switch (id ) {
1546+ case SYS_ID_AA64DFR0_EL1 :
1547+ val = sanitise_id_aa64dfr0_el1 (vcpu , val );
1548+ break ;
1549+ case SYS_ID_AA64PFR0_EL1 :
1550+ val = sanitise_id_aa64pfr0_el1 (vcpu , val );
1551+ break ;
15431552 case SYS_ID_AA64PFR1_EL1 :
15441553 if (!kvm_has_mte (vcpu -> kvm ))
15451554 val &= ~ARM64_FEATURE_MASK (ID_AA64PFR1_EL1_MTE );
@@ -1553,6 +1562,7 @@ static u64 __kvm_read_sanitised_id_reg(const struct kvm_vcpu *vcpu,
15531562 val &= ~ARM64_FEATURE_MASK (ID_AA64PFR1_EL1_MTEX );
15541563 val &= ~ARM64_FEATURE_MASK (ID_AA64PFR1_EL1_DF2 );
15551564 val &= ~ARM64_FEATURE_MASK (ID_AA64PFR1_EL1_PFAR );
1565+ val &= ~ARM64_FEATURE_MASK (ID_AA64PFR1_EL1_MPAM_frac );
15561566 break ;
15571567 case SYS_ID_AA64ISAR1_EL1 :
15581568 if (!vcpu_has_ptrauth (vcpu ))
@@ -1684,11 +1694,8 @@ static unsigned int sve_visibility(const struct kvm_vcpu *vcpu,
16841694 return REG_HIDDEN ;
16851695}
16861696
1687- static u64 read_sanitised_id_aa64pfr0_el1 (struct kvm_vcpu * vcpu ,
1688- const struct sys_reg_desc * rd )
1697+ static u64 sanitise_id_aa64pfr0_el1 (const struct kvm_vcpu * vcpu , u64 val )
16891698{
1690- u64 val = read_sanitised_ftr_reg (SYS_ID_AA64PFR0_EL1 );
1691-
16921699 if (!vcpu_has_sve (vcpu ))
16931700 val &= ~ID_AA64PFR0_EL1_SVE_MASK ;
16941701
@@ -1716,6 +1723,13 @@ static u64 read_sanitised_id_aa64pfr0_el1(struct kvm_vcpu *vcpu,
17161723
17171724 val &= ~ID_AA64PFR0_EL1_AMU_MASK ;
17181725
1726+ /*
1727+ * MPAM is disabled by default as KVM also needs a set of PARTID to
1728+ * program the MPAMVPMx_EL2 PARTID remapping registers with. But some
1729+ * older kernels let the guest see the ID bit.
1730+ */
1731+ val &= ~ID_AA64PFR0_EL1_MPAM_MASK ;
1732+
17191733 return val ;
17201734}
17211735
@@ -1729,11 +1743,8 @@ static u64 read_sanitised_id_aa64pfr0_el1(struct kvm_vcpu *vcpu,
17291743 (val); \
17301744})
17311745
1732- static u64 read_sanitised_id_aa64dfr0_el1 (struct kvm_vcpu * vcpu ,
1733- const struct sys_reg_desc * rd )
1746+ static u64 sanitise_id_aa64dfr0_el1 (const struct kvm_vcpu * vcpu , u64 val )
17341747{
1735- u64 val = read_sanitised_ftr_reg (SYS_ID_AA64DFR0_EL1 );
1736-
17371748 val = ID_REG_LIMIT_FIELD_ENUM (val , ID_AA64DFR0_EL1 , DebugVer , V8P8 );
17381749
17391750 /*
@@ -1826,6 +1837,42 @@ static int set_id_dfr0_el1(struct kvm_vcpu *vcpu,
18261837 return set_id_reg (vcpu , rd , val );
18271838}
18281839
1840+ static int set_id_aa64pfr0_el1 (struct kvm_vcpu * vcpu ,
1841+ const struct sys_reg_desc * rd , u64 user_val )
1842+ {
1843+ u64 hw_val = read_sanitised_ftr_reg (SYS_ID_AA64PFR0_EL1 );
1844+ u64 mpam_mask = ID_AA64PFR0_EL1_MPAM_MASK ;
1845+
1846+ /*
1847+ * Commit 011e5f5bf529f ("arm64/cpufeature: Add remaining feature bits
1848+ * in ID_AA64PFR0 register") exposed the MPAM field of AA64PFR0_EL1 to
1849+ * guests, but didn't add trap handling. KVM doesn't support MPAM and
1850+ * always returns an UNDEF for these registers. The guest must see 0
1851+ * for this field.
1852+ *
1853+ * But KVM must also accept values from user-space that were provided
1854+ * by KVM. On CPUs that support MPAM, permit user-space to write
1855+ * the sanitizied value to ID_AA64PFR0_EL1.MPAM, but ignore this field.
1856+ */
1857+ if ((hw_val & mpam_mask ) == (user_val & mpam_mask ))
1858+ user_val &= ~ID_AA64PFR0_EL1_MPAM_MASK ;
1859+
1860+ return set_id_reg (vcpu , rd , user_val );
1861+ }
1862+
1863+ static int set_id_aa64pfr1_el1 (struct kvm_vcpu * vcpu ,
1864+ const struct sys_reg_desc * rd , u64 user_val )
1865+ {
1866+ u64 hw_val = read_sanitised_ftr_reg (SYS_ID_AA64PFR1_EL1 );
1867+ u64 mpam_mask = ID_AA64PFR1_EL1_MPAM_frac_MASK ;
1868+
1869+ /* See set_id_aa64pfr0_el1 for comment about MPAM */
1870+ if ((hw_val & mpam_mask ) == (user_val & mpam_mask ))
1871+ user_val &= ~ID_AA64PFR1_EL1_MPAM_frac_MASK ;
1872+
1873+ return set_id_reg (vcpu , rd , user_val );
1874+ }
1875+
18291876/*
18301877 * cpufeature ID register user accessors
18311878 *
@@ -2162,6 +2209,15 @@ static unsigned int hidden_user_visibility(const struct kvm_vcpu *vcpu,
21622209 .val = mask, \
21632210}
21642211
2212+ /* sys_reg_desc initialiser for cpufeature ID registers that need filtering */
2213+ #define ID_FILTERED (sysreg , name , mask ) { \
2214+ ID_DESC(sysreg), \
2215+ .set_user = set_##name, \
2216+ .visibility = id_visibility, \
2217+ .reset = kvm_read_sanitised_id_reg, \
2218+ .val = (mask), \
2219+ }
2220+
21652221/*
21662222 * sys_reg_desc initialiser for architecturally unallocated cpufeature ID
21672223 * register with encoding Op0=3, Op1=0, CRn=0, CRm=crm, Op2=op2
@@ -2365,19 +2421,16 @@ static const struct sys_reg_desc sys_reg_descs[] = {
23652421
23662422 /* AArch64 ID registers */
23672423 /* CRm=4 */
2368- { SYS_DESC (SYS_ID_AA64PFR0_EL1 ),
2369- .access = access_id_reg ,
2370- .get_user = get_id_reg ,
2371- .set_user = set_id_reg ,
2372- .reset = read_sanitised_id_aa64pfr0_el1 ,
2373- .val = ~(ID_AA64PFR0_EL1_AMU |
2374- ID_AA64PFR0_EL1_MPAM |
2375- ID_AA64PFR0_EL1_SVE |
2376- ID_AA64PFR0_EL1_RAS |
2377- ID_AA64PFR0_EL1_GIC |
2378- ID_AA64PFR0_EL1_AdvSIMD |
2379- ID_AA64PFR0_EL1_FP ), },
2380- ID_WRITABLE (ID_AA64PFR1_EL1 , ~(ID_AA64PFR1_EL1_PFAR |
2424+ ID_FILTERED (ID_AA64PFR0_EL1 , id_aa64pfr0_el1 ,
2425+ ~(ID_AA64PFR0_EL1_AMU |
2426+ ID_AA64PFR0_EL1_MPAM |
2427+ ID_AA64PFR0_EL1_SVE |
2428+ ID_AA64PFR0_EL1_RAS |
2429+ ID_AA64PFR0_EL1_GIC |
2430+ ID_AA64PFR0_EL1_AdvSIMD |
2431+ ID_AA64PFR0_EL1_FP )),
2432+ ID_FILTERED (ID_AA64PFR1_EL1 , id_aa64pfr1_el1 ,
2433+ ~(ID_AA64PFR1_EL1_PFAR |
23812434 ID_AA64PFR1_EL1_DF2 |
23822435 ID_AA64PFR1_EL1_MTEX |
23832436 ID_AA64PFR1_EL1_THE |
@@ -2398,11 +2451,6 @@ static const struct sys_reg_desc sys_reg_descs[] = {
23982451 ID_UNALLOCATED (4 ,7 ),
23992452
24002453 /* CRm=5 */
2401- { SYS_DESC (SYS_ID_AA64DFR0_EL1 ),
2402- .access = access_id_reg ,
2403- .get_user = get_id_reg ,
2404- .set_user = set_id_aa64dfr0_el1 ,
2405- .reset = read_sanitised_id_aa64dfr0_el1 ,
24062454 /*
24072455 * Prior to FEAT_Debugv8.9, the architecture defines context-aware
24082456 * breakpoints (CTX_CMPs) as the highest numbered breakpoints (BRPs).
@@ -2415,10 +2463,11 @@ static const struct sys_reg_desc sys_reg_descs[] = {
24152463 * See DDI0487K.a, section D2.8.3 Breakpoint types and linking
24162464 * of breakpoints for more details.
24172465 */
2418- .val = ID_AA64DFR0_EL1_DoubleLock_MASK |
2419- ID_AA64DFR0_EL1_WRPs_MASK |
2420- ID_AA64DFR0_EL1_PMUVer_MASK |
2421- ID_AA64DFR0_EL1_DebugVer_MASK , },
2466+ ID_FILTERED (ID_AA64DFR0_EL1 , id_aa64dfr0_el1 ,
2467+ ID_AA64DFR0_EL1_DoubleLock_MASK |
2468+ ID_AA64DFR0_EL1_WRPs_MASK |
2469+ ID_AA64DFR0_EL1_PMUVer_MASK |
2470+ ID_AA64DFR0_EL1_DebugVer_MASK ),
24222471 ID_SANITISED (ID_AA64DFR1_EL1 ),
24232472 ID_UNALLOCATED (5 ,2 ),
24242473 ID_UNALLOCATED (5 ,3 ),
0 commit comments