Skip to content

Commit 338b179

Browse files
author
Marc Zyngier
committed
KVM: arm64: Unify trap handlers injecting an UNDEF
A large number of system register trap handlers only inject an UNDEF exeption, and yet each class of sysreg seems to provide its own, identical function. Let's unify them all, saving us introducing yet another one later. Signed-off-by: Marc Zyngier <[email protected]> Acked-by: Will Deacon <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent 23711a5 commit 338b179

File tree

1 file changed

+25
-40
lines changed

1 file changed

+25
-40
lines changed

arch/arm64/kvm/sys_regs.c

Lines changed: 25 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1038,42 +1038,34 @@ static bool access_pmuserenr(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
10381038
{ SYS_DESC(SYS_PMEVTYPERn_EL0(n)), \
10391039
access_pmu_evtyper, reset_unknown, (PMEVTYPER0_EL0 + n), }
10401040

1041-
static bool access_amu(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
1042-
const struct sys_reg_desc *r)
1041+
static bool undef_access(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
1042+
const struct sys_reg_desc *r)
10431043
{
10441044
kvm_inject_undefined(vcpu);
10451045

10461046
return false;
10471047
}
10481048

10491049
/* Macro to expand the AMU counter and type registers*/
1050-
#define AMU_AMEVCNTR0_EL0(n) { SYS_DESC(SYS_AMEVCNTR0_EL0(n)), access_amu }
1051-
#define AMU_AMEVTYPER0_EL0(n) { SYS_DESC(SYS_AMEVTYPER0_EL0(n)), access_amu }
1052-
#define AMU_AMEVCNTR1_EL0(n) { SYS_DESC(SYS_AMEVCNTR1_EL0(n)), access_amu }
1053-
#define AMU_AMEVTYPER1_EL0(n) { SYS_DESC(SYS_AMEVTYPER1_EL0(n)), access_amu }
1054-
1055-
static bool trap_ptrauth(struct kvm_vcpu *vcpu,
1056-
struct sys_reg_params *p,
1057-
const struct sys_reg_desc *rd)
1058-
{
1059-
/*
1060-
* If we land here, that is because we didn't fixup the access on exit
1061-
* by allowing the PtrAuth sysregs. The only way this happens is when
1062-
* the guest does not have PtrAuth support enabled.
1063-
*/
1064-
kvm_inject_undefined(vcpu);
1065-
1066-
return false;
1067-
}
1050+
#define AMU_AMEVCNTR0_EL0(n) { SYS_DESC(SYS_AMEVCNTR0_EL0(n)), undef_access }
1051+
#define AMU_AMEVTYPER0_EL0(n) { SYS_DESC(SYS_AMEVTYPER0_EL0(n)), undef_access }
1052+
#define AMU_AMEVCNTR1_EL0(n) { SYS_DESC(SYS_AMEVCNTR1_EL0(n)), undef_access }
1053+
#define AMU_AMEVTYPER1_EL0(n) { SYS_DESC(SYS_AMEVTYPER1_EL0(n)), undef_access }
10681054

10691055
static unsigned int ptrauth_visibility(const struct kvm_vcpu *vcpu,
10701056
const struct sys_reg_desc *rd)
10711057
{
10721058
return vcpu_has_ptrauth(vcpu) ? 0 : REG_HIDDEN;
10731059
}
10741060

1061+
/*
1062+
* If we land here on a PtrAuth access, that is because we didn't
1063+
* fixup the access on exit by allowing the PtrAuth sysregs. The only
1064+
* way this happens is when the guest does not have PtrAuth support
1065+
* enabled.
1066+
*/
10751067
#define __PTRAUTH_KEY(k) \
1076-
{ SYS_DESC(SYS_## k), trap_ptrauth, reset_unknown, k, \
1068+
{ SYS_DESC(SYS_## k), undef_access, reset_unknown, k, \
10771069
.visibility = ptrauth_visibility}
10781070

10791071
#define PTRAUTH_KEY(k) \
@@ -1374,13 +1366,6 @@ static bool access_ccsidr(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
13741366
return true;
13751367
}
13761368

1377-
static bool access_mte_regs(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
1378-
const struct sys_reg_desc *r)
1379-
{
1380-
kvm_inject_undefined(vcpu);
1381-
return false;
1382-
}
1383-
13841369
/* sys_reg_desc initialiser for known cpufeature ID registers */
13851370
#define ID_SANITISED(name) { \
13861371
SYS_DESC(SYS_##name), \
@@ -1549,8 +1534,8 @@ static const struct sys_reg_desc sys_reg_descs[] = {
15491534
{ SYS_DESC(SYS_ACTLR_EL1), access_actlr, reset_actlr, ACTLR_EL1 },
15501535
{ SYS_DESC(SYS_CPACR_EL1), NULL, reset_val, CPACR_EL1, 0 },
15511536

1552-
{ SYS_DESC(SYS_RGSR_EL1), access_mte_regs },
1553-
{ SYS_DESC(SYS_GCR_EL1), access_mte_regs },
1537+
{ SYS_DESC(SYS_RGSR_EL1), undef_access },
1538+
{ SYS_DESC(SYS_GCR_EL1), undef_access },
15541539

15551540
{ SYS_DESC(SYS_ZCR_EL1), NULL, reset_val, ZCR_EL1, 0, .visibility = sve_visibility },
15561541
{ SYS_DESC(SYS_TTBR0_EL1), access_vm_reg, reset_unknown, TTBR0_EL1 },
@@ -1576,8 +1561,8 @@ static const struct sys_reg_desc sys_reg_descs[] = {
15761561
{ SYS_DESC(SYS_ERXMISC0_EL1), trap_raz_wi },
15771562
{ SYS_DESC(SYS_ERXMISC1_EL1), trap_raz_wi },
15781563

1579-
{ SYS_DESC(SYS_TFSR_EL1), access_mte_regs },
1580-
{ SYS_DESC(SYS_TFSRE0_EL1), access_mte_regs },
1564+
{ SYS_DESC(SYS_TFSR_EL1), undef_access },
1565+
{ SYS_DESC(SYS_TFSRE0_EL1), undef_access },
15811566

15821567
{ SYS_DESC(SYS_FAR_EL1), access_vm_reg, reset_unknown, FAR_EL1 },
15831568
{ SYS_DESC(SYS_PAR_EL1), NULL, reset_unknown, PAR_EL1 },
@@ -1641,14 +1626,14 @@ static const struct sys_reg_desc sys_reg_descs[] = {
16411626
{ SYS_DESC(SYS_TPIDR_EL0), NULL, reset_unknown, TPIDR_EL0 },
16421627
{ SYS_DESC(SYS_TPIDRRO_EL0), NULL, reset_unknown, TPIDRRO_EL0 },
16431628

1644-
{ SYS_DESC(SYS_AMCR_EL0), access_amu },
1645-
{ SYS_DESC(SYS_AMCFGR_EL0), access_amu },
1646-
{ SYS_DESC(SYS_AMCGCR_EL0), access_amu },
1647-
{ SYS_DESC(SYS_AMUSERENR_EL0), access_amu },
1648-
{ SYS_DESC(SYS_AMCNTENCLR0_EL0), access_amu },
1649-
{ SYS_DESC(SYS_AMCNTENSET0_EL0), access_amu },
1650-
{ SYS_DESC(SYS_AMCNTENCLR1_EL0), access_amu },
1651-
{ SYS_DESC(SYS_AMCNTENSET1_EL0), access_amu },
1629+
{ SYS_DESC(SYS_AMCR_EL0), undef_access },
1630+
{ SYS_DESC(SYS_AMCFGR_EL0), undef_access },
1631+
{ SYS_DESC(SYS_AMCGCR_EL0), undef_access },
1632+
{ SYS_DESC(SYS_AMUSERENR_EL0), undef_access },
1633+
{ SYS_DESC(SYS_AMCNTENCLR0_EL0), undef_access },
1634+
{ SYS_DESC(SYS_AMCNTENSET0_EL0), undef_access },
1635+
{ SYS_DESC(SYS_AMCNTENCLR1_EL0), undef_access },
1636+
{ SYS_DESC(SYS_AMCNTENSET1_EL0), undef_access },
16521637
AMU_AMEVCNTR0_EL0(0),
16531638
AMU_AMEVCNTR0_EL0(1),
16541639
AMU_AMEVCNTR0_EL0(2),

0 commit comments

Comments
 (0)