@@ -2176,22 +2176,26 @@ static bool bad_redir_trap(struct kvm_vcpu *vcpu,
21762176 .val = 0, \
21772177}
21782178
2179- /* sys_reg_desc initialiser for known cpufeature ID registers */
2180- #define AA32_ID_SANITISED (name ) { \
2179+ /* sys_reg_desc initialiser for writable ID registers */
2180+ #define ID_WRITABLE (name , mask ) { \
21812181 ID_DESC(name), \
21822182 .set_user = set_id_reg, \
2183- .visibility = aa32_id_visibility, \
2183+ .visibility = id_visibility, \
21842184 .reset = kvm_read_sanitised_id_reg, \
2185- .val = 0 , \
2185+ .val = mask , \
21862186}
21872187
2188- /* sys_reg_desc initialiser for writable ID registers */
2189- #define ID_WRITABLE (name , mask ) { \
2188+ /*
2189+ * 32bit ID regs are fully writable when the guest is 32bit
2190+ * capable. Nothing in the KVM code should rely on 32bit features
2191+ * anyway, only 64bit, so let the VMM do its worse.
2192+ */
2193+ #define AA32_ID_WRITABLE (name ) { \
21902194 ID_DESC(name), \
21912195 .set_user = set_id_reg, \
2192- .visibility = id_visibility, \
2196+ .visibility = aa32_id_visibility, \
21932197 .reset = kvm_read_sanitised_id_reg, \
2194- .val = mask, \
2198+ .val = GENMASK(31, 0), \
21952199}
21962200
21972201/*
@@ -2380,40 +2384,39 @@ static const struct sys_reg_desc sys_reg_descs[] = {
23802384
23812385 /* AArch64 mappings of the AArch32 ID registers */
23822386 /* CRm=1 */
2383- AA32_ID_SANITISED (ID_PFR0_EL1 ),
2384- AA32_ID_SANITISED (ID_PFR1_EL1 ),
2387+ AA32_ID_WRITABLE (ID_PFR0_EL1 ),
2388+ AA32_ID_WRITABLE (ID_PFR1_EL1 ),
23852389 { SYS_DESC (SYS_ID_DFR0_EL1 ),
23862390 .access = access_id_reg ,
23872391 .get_user = get_id_reg ,
23882392 .set_user = set_id_dfr0_el1 ,
23892393 .visibility = aa32_id_visibility ,
23902394 .reset = read_sanitised_id_dfr0_el1 ,
2391- .val = ID_DFR0_EL1_PerfMon_MASK |
2392- ID_DFR0_EL1_CopDbg_MASK , },
2395+ .val = GENMASK (31 , 0 ), },
23932396 ID_HIDDEN (ID_AFR0_EL1 ),
2394- AA32_ID_SANITISED (ID_MMFR0_EL1 ),
2395- AA32_ID_SANITISED (ID_MMFR1_EL1 ),
2396- AA32_ID_SANITISED (ID_MMFR2_EL1 ),
2397- AA32_ID_SANITISED (ID_MMFR3_EL1 ),
2397+ AA32_ID_WRITABLE (ID_MMFR0_EL1 ),
2398+ AA32_ID_WRITABLE (ID_MMFR1_EL1 ),
2399+ AA32_ID_WRITABLE (ID_MMFR2_EL1 ),
2400+ AA32_ID_WRITABLE (ID_MMFR3_EL1 ),
23982401
23992402 /* CRm=2 */
2400- AA32_ID_SANITISED (ID_ISAR0_EL1 ),
2401- AA32_ID_SANITISED (ID_ISAR1_EL1 ),
2402- AA32_ID_SANITISED (ID_ISAR2_EL1 ),
2403- AA32_ID_SANITISED (ID_ISAR3_EL1 ),
2404- AA32_ID_SANITISED (ID_ISAR4_EL1 ),
2405- AA32_ID_SANITISED (ID_ISAR5_EL1 ),
2406- AA32_ID_SANITISED (ID_MMFR4_EL1 ),
2407- AA32_ID_SANITISED (ID_ISAR6_EL1 ),
2403+ AA32_ID_WRITABLE (ID_ISAR0_EL1 ),
2404+ AA32_ID_WRITABLE (ID_ISAR1_EL1 ),
2405+ AA32_ID_WRITABLE (ID_ISAR2_EL1 ),
2406+ AA32_ID_WRITABLE (ID_ISAR3_EL1 ),
2407+ AA32_ID_WRITABLE (ID_ISAR4_EL1 ),
2408+ AA32_ID_WRITABLE (ID_ISAR5_EL1 ),
2409+ AA32_ID_WRITABLE (ID_MMFR4_EL1 ),
2410+ AA32_ID_WRITABLE (ID_ISAR6_EL1 ),
24082411
24092412 /* CRm=3 */
2410- AA32_ID_SANITISED (MVFR0_EL1 ),
2411- AA32_ID_SANITISED (MVFR1_EL1 ),
2412- AA32_ID_SANITISED (MVFR2_EL1 ),
2413+ AA32_ID_WRITABLE (MVFR0_EL1 ),
2414+ AA32_ID_WRITABLE (MVFR1_EL1 ),
2415+ AA32_ID_WRITABLE (MVFR2_EL1 ),
24132416 ID_UNALLOCATED (3 ,3 ),
2414- AA32_ID_SANITISED (ID_PFR2_EL1 ),
2417+ AA32_ID_WRITABLE (ID_PFR2_EL1 ),
24152418 ID_HIDDEN (ID_DFR1_EL1 ),
2416- AA32_ID_SANITISED (ID_MMFR5_EL1 ),
2419+ AA32_ID_WRITABLE (ID_MMFR5_EL1 ),
24172420 ID_UNALLOCATED (3 ,7 ),
24182421
24192422 /* AArch64 ID registers */
0 commit comments