Skip to content

Commit a88c7c2

Browse files
Sebastian Ottoupton
authored andcommitted
KVM: selftests: arm64: Test writes to MIDR,REVIDR,AIDR
Assert that MIDR_EL1, REVIDR_EL1, AIDR_EL1 are writable from userspace, that the changed values are visible to guests, and that they are preserved across a vCPU reset. Signed-off-by: Sebastian Ott <sebott@redhat.com> Link: https://lore.kernel.org/r/20250225005401.679536-6-oliver.upton@linux.dev Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
1 parent 3adaee7 commit a88c7c2

File tree

1 file changed

+30
-7
lines changed

1 file changed

+30
-7
lines changed

tools/testing/selftests/kvm/arm64/set_id_regs.c

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,9 @@ static void guest_code(void)
230230
GUEST_REG_SYNC(SYS_ID_AA64MMFR2_EL1);
231231
GUEST_REG_SYNC(SYS_ID_AA64ZFR0_EL1);
232232
GUEST_REG_SYNC(SYS_CTR_EL0);
233+
GUEST_REG_SYNC(SYS_MIDR_EL1);
234+
GUEST_REG_SYNC(SYS_REVIDR_EL1);
235+
GUEST_REG_SYNC(SYS_AIDR_EL1);
233236

234237
GUEST_DONE();
235238
}
@@ -609,18 +612,31 @@ static void test_ctr(struct kvm_vcpu *vcpu)
609612
test_reg_vals[encoding_to_range_idx(SYS_CTR_EL0)] = ctr;
610613
}
611614

612-
static void test_vcpu_ftr_id_regs(struct kvm_vcpu *vcpu)
615+
static void test_id_reg(struct kvm_vcpu *vcpu, u32 id)
613616
{
614617
u64 val;
615618

619+
val = vcpu_get_reg(vcpu, KVM_ARM64_SYS_REG(id));
620+
val++;
621+
vcpu_set_reg(vcpu, KVM_ARM64_SYS_REG(id), val);
622+
test_reg_vals[encoding_to_range_idx(id)] = val;
623+
}
624+
625+
static void test_vcpu_ftr_id_regs(struct kvm_vcpu *vcpu)
626+
{
616627
test_clidr(vcpu);
617628
test_ctr(vcpu);
618629

619-
val = vcpu_get_reg(vcpu, KVM_ARM64_SYS_REG(SYS_MPIDR_EL1));
620-
val++;
621-
vcpu_set_reg(vcpu, KVM_ARM64_SYS_REG(SYS_MPIDR_EL1), val);
630+
test_id_reg(vcpu, SYS_MPIDR_EL1);
631+
ksft_test_result_pass("%s\n", __func__);
632+
}
633+
634+
static void test_vcpu_non_ftr_id_regs(struct kvm_vcpu *vcpu)
635+
{
636+
test_id_reg(vcpu, SYS_MIDR_EL1);
637+
test_id_reg(vcpu, SYS_REVIDR_EL1);
638+
test_id_reg(vcpu, SYS_AIDR_EL1);
622639

623-
test_reg_vals[encoding_to_range_idx(SYS_MPIDR_EL1)] = val;
624640
ksft_test_result_pass("%s\n", __func__);
625641
}
626642

@@ -647,6 +663,9 @@ static void test_reset_preserves_id_regs(struct kvm_vcpu *vcpu)
647663
test_assert_id_reg_unchanged(vcpu, SYS_MPIDR_EL1);
648664
test_assert_id_reg_unchanged(vcpu, SYS_CLIDR_EL1);
649665
test_assert_id_reg_unchanged(vcpu, SYS_CTR_EL0);
666+
test_assert_id_reg_unchanged(vcpu, SYS_MIDR_EL1);
667+
test_assert_id_reg_unchanged(vcpu, SYS_REVIDR_EL1);
668+
test_assert_id_reg_unchanged(vcpu, SYS_AIDR_EL1);
650669

651670
ksft_test_result_pass("%s\n", __func__);
652671
}
@@ -660,8 +679,11 @@ int main(void)
660679
int test_cnt;
661680

662681
TEST_REQUIRE(kvm_has_cap(KVM_CAP_ARM_SUPPORTED_REG_MASK_RANGES));
682+
TEST_REQUIRE(kvm_has_cap(KVM_CAP_ARM_WRITABLE_IMP_ID_REGS));
663683

664-
vm = vm_create_with_one_vcpu(&vcpu, guest_code);
684+
vm = vm_create(1);
685+
vm_enable_cap(vm, KVM_CAP_ARM_WRITABLE_IMP_ID_REGS, 0);
686+
vcpu = vm_vcpu_add(vm, 0, guest_code);
665687

666688
/* Check for AARCH64 only system */
667689
val = vcpu_get_reg(vcpu, KVM_ARM64_SYS_REG(SYS_ID_AA64PFR0_EL1));
@@ -675,13 +697,14 @@ int main(void)
675697
ARRAY_SIZE(ftr_id_aa64isar2_el1) + ARRAY_SIZE(ftr_id_aa64pfr0_el1) +
676698
ARRAY_SIZE(ftr_id_aa64pfr1_el1) + ARRAY_SIZE(ftr_id_aa64mmfr0_el1) +
677699
ARRAY_SIZE(ftr_id_aa64mmfr1_el1) + ARRAY_SIZE(ftr_id_aa64mmfr2_el1) +
678-
ARRAY_SIZE(ftr_id_aa64zfr0_el1) - ARRAY_SIZE(test_regs) + 2 +
700+
ARRAY_SIZE(ftr_id_aa64zfr0_el1) - ARRAY_SIZE(test_regs) + 3 +
679701
MPAM_IDREG_TEST;
680702

681703
ksft_set_plan(test_cnt);
682704

683705
test_vm_ftr_id_regs(vcpu, aarch64_only);
684706
test_vcpu_ftr_id_regs(vcpu);
707+
test_vcpu_non_ftr_id_regs(vcpu);
685708
test_user_set_mpam_reg(vcpu);
686709

687710
test_guest_reg_read(vcpu);

0 commit comments

Comments
 (0)