Skip to content

Commit 7a765aa

Browse files
Marc Zyngieroupton
authored andcommitted
KVM: arm64: Make ID_AA64PFR1_EL1.RAS_frac writable
Allow userspace to write to RAS_frac, under the condition that the host supports RASv1p1 with RAS_frac==1. Other configurations will result in RAS_frac being exposed as 0, and therefore implicitly not writable. To avoid the clutter, the ID_AA64PFR1_EL1 sanitisation is moved to its own function. Signed-off-by: Marc Zyngier <[email protected]> Reviewed-by: Cornelia Huck <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Oliver Upton <[email protected]>
1 parent 1fab657 commit 7a765aa

File tree

1 file changed

+27
-14
lines changed

1 file changed

+27
-14
lines changed

arch/arm64/kvm/sys_regs.c

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1584,6 +1584,7 @@ static u8 pmuver_to_perfmon(u8 pmuver)
15841584
}
15851585

15861586
static u64 sanitise_id_aa64pfr0_el1(const struct kvm_vcpu *vcpu, u64 val);
1587+
static u64 sanitise_id_aa64pfr1_el1(const struct kvm_vcpu *vcpu, u64 val);
15871588
static u64 sanitise_id_aa64dfr0_el1(const struct kvm_vcpu *vcpu, u64 val);
15881589

15891590
/* Read a sanitised cpufeature ID register by sys_reg_desc */
@@ -1606,19 +1607,7 @@ static u64 __kvm_read_sanitised_id_reg(const struct kvm_vcpu *vcpu,
16061607
val = sanitise_id_aa64pfr0_el1(vcpu, val);
16071608
break;
16081609
case SYS_ID_AA64PFR1_EL1:
1609-
if (!kvm_has_mte(vcpu->kvm)) {
1610-
val &= ~ARM64_FEATURE_MASK(ID_AA64PFR1_EL1_MTE);
1611-
val &= ~ARM64_FEATURE_MASK(ID_AA64PFR1_EL1_MTE_frac);
1612-
}
1613-
1614-
val &= ~ARM64_FEATURE_MASK(ID_AA64PFR1_EL1_SME);
1615-
val &= ~ARM64_FEATURE_MASK(ID_AA64PFR1_EL1_RNDR_trap);
1616-
val &= ~ARM64_FEATURE_MASK(ID_AA64PFR1_EL1_NMI);
1617-
val &= ~ARM64_FEATURE_MASK(ID_AA64PFR1_EL1_GCS);
1618-
val &= ~ARM64_FEATURE_MASK(ID_AA64PFR1_EL1_THE);
1619-
val &= ~ARM64_FEATURE_MASK(ID_AA64PFR1_EL1_MTEX);
1620-
val &= ~ARM64_FEATURE_MASK(ID_AA64PFR1_EL1_PFAR);
1621-
val &= ~ARM64_FEATURE_MASK(ID_AA64PFR1_EL1_MPAM_frac);
1610+
val = sanitise_id_aa64pfr1_el1(vcpu, val);
16221611
break;
16231612
case SYS_ID_AA64PFR2_EL1:
16241613
/* We only expose FPMR */
@@ -1834,6 +1823,31 @@ static u64 sanitise_id_aa64pfr0_el1(const struct kvm_vcpu *vcpu, u64 val)
18341823
return val;
18351824
}
18361825

1826+
static u64 sanitise_id_aa64pfr1_el1(const struct kvm_vcpu *vcpu, u64 val)
1827+
{
1828+
u64 pfr0 = read_sanitised_ftr_reg(SYS_ID_AA64PFR0_EL1);
1829+
1830+
if (!kvm_has_mte(vcpu->kvm)) {
1831+
val &= ~ARM64_FEATURE_MASK(ID_AA64PFR1_EL1_MTE);
1832+
val &= ~ARM64_FEATURE_MASK(ID_AA64PFR1_EL1_MTE_frac);
1833+
}
1834+
1835+
if (!(cpus_have_final_cap(ARM64_HAS_RASV1P1_EXTN) &&
1836+
SYS_FIELD_GET(ID_AA64PFR0_EL1, RAS, pfr0) == ID_AA64PFR0_EL1_RAS_IMP))
1837+
val &= ~ARM64_FEATURE_MASK(ID_AA64PFR1_EL1_RAS_frac);
1838+
1839+
val &= ~ARM64_FEATURE_MASK(ID_AA64PFR1_EL1_SME);
1840+
val &= ~ARM64_FEATURE_MASK(ID_AA64PFR1_EL1_RNDR_trap);
1841+
val &= ~ARM64_FEATURE_MASK(ID_AA64PFR1_EL1_NMI);
1842+
val &= ~ARM64_FEATURE_MASK(ID_AA64PFR1_EL1_GCS);
1843+
val &= ~ARM64_FEATURE_MASK(ID_AA64PFR1_EL1_THE);
1844+
val &= ~ARM64_FEATURE_MASK(ID_AA64PFR1_EL1_MTEX);
1845+
val &= ~ARM64_FEATURE_MASK(ID_AA64PFR1_EL1_PFAR);
1846+
val &= ~ARM64_FEATURE_MASK(ID_AA64PFR1_EL1_MPAM_frac);
1847+
1848+
return val;
1849+
}
1850+
18371851
static u64 sanitise_id_aa64dfr0_el1(const struct kvm_vcpu *vcpu, u64 val)
18381852
{
18391853
val = ID_REG_LIMIT_FIELD_ENUM(val, ID_AA64DFR0_EL1, DebugVer, V8P8);
@@ -2952,7 +2966,6 @@ static const struct sys_reg_desc sys_reg_descs[] = {
29522966
ID_AA64PFR1_EL1_SME |
29532967
ID_AA64PFR1_EL1_RES0 |
29542968
ID_AA64PFR1_EL1_MPAM_frac |
2955-
ID_AA64PFR1_EL1_RAS_frac |
29562969
ID_AA64PFR1_EL1_MTE)),
29572970
ID_WRITABLE(ID_AA64PFR2_EL1, ID_AA64PFR2_EL1_FPMR),
29582971
ID_UNALLOCATED(4,3),

0 commit comments

Comments
 (0)