KVM: selftests: Test post-KVM_RUN writes to PERF_CAPABILITIES
authorSean Christopherson <seanjc@google.com>
Sat, 11 Mar 2023 00:46:14 +0000 (16:46 -0800)
committerSean Christopherson <seanjc@google.com>
Thu, 6 Apr 2023 21:58:44 +0000 (14:58 -0700)
Now that KVM disallows changing PERF_CAPABILITIES after KVM_RUN, expand
the host side checks to verify KVM rejects any attempts to change bits
from userspace.

Link: https://lore.kernel.org/r/20230311004618.920745-18-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
tools/testing/selftests/kvm/x86_64/vmx_pmu_caps_test.c

index 44fc6101a547206d4b037fb29609a2e8fb5d2002..6fc86f5eba0b4217f558852642af5f785cf73ff5 100644 (file)
@@ -85,6 +85,7 @@ static void test_guest_wrmsr_perf_capabilities(union perf_capabilities host_cap)
        struct kvm_vcpu *vcpu;
        struct kvm_vm *vm = vm_create_with_one_vcpu(&vcpu, guest_code);
        struct ucall uc;
+       int r, i;
 
        vm_init_descriptor_tables(vm);
        vcpu_init_descriptor_tables(vcpu);
@@ -106,6 +107,18 @@ static void test_guest_wrmsr_perf_capabilities(union perf_capabilities host_cap)
 
        ASSERT_EQ(vcpu_get_msr(vcpu, MSR_IA32_PERF_CAPABILITIES), host_cap.capabilities);
 
+       vcpu_set_msr(vcpu, MSR_IA32_PERF_CAPABILITIES, host_cap.capabilities);
+
+       r = _vcpu_set_msr(vcpu, MSR_IA32_PERF_CAPABILITIES, 0);
+       TEST_ASSERT(!r, "Post-KVM_RUN write '0' didn't fail");
+
+       for (i = 0; i < 64; i++) {
+               r = _vcpu_set_msr(vcpu, MSR_IA32_PERF_CAPABILITIES,
+                                 host_cap.capabilities ^ BIT_ULL(i));
+               TEST_ASSERT(!r, "Post-KVM_RUN write '0x%llx'didn't fail",
+                           host_cap.capabilities ^ BIT_ULL(i));
+       }
+
        kvm_vm_free(vm);
 }