Skip to content

Commit 9f3b4ce

Browse files
Suraj Jitindar Singhshaoyingxu
authored andcommitted
KVM: arm64: Move non per vcpu flag checks out of kvm_arm_update_id_reg()
There are features which are masked in kvm_arm_update_id_reg() which cannot change throughout the lifecycle of a VM. Thus rather than masking them each time the register is read, mask them at idreg init time so that the value in the kvm id_reg correctly reflects the state of support for that feature. Move masking of AA64PFR0_EL1.GIC and AA64PFR0_EL1.AMU into read_sanitised_id_aa64pfr0_el1(). Create read_sanitised_id_aa64pfr1_el1() and mask AA64PFR1_EL1.SME. Create read_sanitised_id_aa64isar2_el1() and mask AA64ISAR2_EL1.WFxT. Create read_sanitised_id_[mmfr4|aa64mmfr2] and mask CCIDX. Signed-off-by: Suraj Jitindar Singh <surajjs@amazon.com>
1 parent c5ed021 commit 9f3b4ce

File tree

1 file changed

+86
-12
lines changed

1 file changed

+86
-12
lines changed

arch/arm64/kvm/sys_regs.c

Lines changed: 86 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
13961402
static 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

Comments
 (0)