@@ -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