@@ -230,6 +230,9 @@ static void guest_code(void)
230
230
GUEST_REG_SYNC (SYS_ID_AA64MMFR2_EL1 );
231
231
GUEST_REG_SYNC (SYS_ID_AA64ZFR0_EL1 );
232
232
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 );
233
236
234
237
GUEST_DONE ();
235
238
}
@@ -609,18 +612,31 @@ static void test_ctr(struct kvm_vcpu *vcpu)
609
612
test_reg_vals [encoding_to_range_idx (SYS_CTR_EL0 )] = ctr ;
610
613
}
611
614
612
- static void test_vcpu_ftr_id_regs (struct kvm_vcpu * vcpu )
615
+ static void test_id_reg (struct kvm_vcpu * vcpu , u32 id )
613
616
{
614
617
u64 val ;
615
618
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
+ {
616
627
test_clidr (vcpu );
617
628
test_ctr (vcpu );
618
629
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 );
622
639
623
- test_reg_vals [encoding_to_range_idx (SYS_MPIDR_EL1 )] = val ;
624
640
ksft_test_result_pass ("%s\n" , __func__ );
625
641
}
626
642
@@ -647,6 +663,9 @@ static void test_reset_preserves_id_regs(struct kvm_vcpu *vcpu)
647
663
test_assert_id_reg_unchanged (vcpu , SYS_MPIDR_EL1 );
648
664
test_assert_id_reg_unchanged (vcpu , SYS_CLIDR_EL1 );
649
665
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 );
650
669
651
670
ksft_test_result_pass ("%s\n" , __func__ );
652
671
}
@@ -660,8 +679,11 @@ int main(void)
660
679
int test_cnt ;
661
680
662
681
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 ));
663
683
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 );
665
687
666
688
/* Check for AARCH64 only system */
667
689
val = vcpu_get_reg (vcpu , KVM_ARM64_SYS_REG (SYS_ID_AA64PFR0_EL1 ));
@@ -675,13 +697,14 @@ int main(void)
675
697
ARRAY_SIZE (ftr_id_aa64isar2_el1 ) + ARRAY_SIZE (ftr_id_aa64pfr0_el1 ) +
676
698
ARRAY_SIZE (ftr_id_aa64pfr1_el1 ) + ARRAY_SIZE (ftr_id_aa64mmfr0_el1 ) +
677
699
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 +
679
701
MPAM_IDREG_TEST ;
680
702
681
703
ksft_set_plan (test_cnt );
682
704
683
705
test_vm_ftr_id_regs (vcpu , aarch64_only );
684
706
test_vcpu_ftr_id_regs (vcpu );
707
+ test_vcpu_non_ftr_id_regs (vcpu );
685
708
test_user_set_mpam_reg (vcpu );
686
709
687
710
test_guest_reg_read (vcpu );
0 commit comments