]> git.baikalelectronics.ru Git - kernel.git/commitdiff
KVM: selftests: Test all possible "invalid" PERF_CAPABILITIES.LBR_FMT vals
authorSean Christopherson <seanjc@google.com>
Thu, 4 Aug 2022 19:18:15 +0000 (12:18 -0700)
committerPaolo Bonzini <pbonzini@redhat.com>
Wed, 10 Aug 2022 19:08:29 +0000 (15:08 -0400)
Test all possible input values to verify that KVM rejects all values
except the exact host value.  Due to the LBR format affecting the core
functionality of LBRs, KVM can't emulate "other" formats, so even though
there are a variety of legal values, KVM should reject anything but an
exact host match.

Suggested-by: Like Xu <like.xu.linux@gmail.com>
Signed-off-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
tools/testing/selftests/kvm/x86_64/vmx_pmu_caps_test.c

index 6ec901dab61e8a52ffddd8d6e0022b97dfc2fadf..069589c52f41937b8779d02d89680f42bfa22064 100644 (file)
@@ -59,6 +59,7 @@ int main(int argc, char *argv[])
        int ret;
        union cpuid10_eax eax;
        union perf_capabilities host_cap;
+       uint64_t val;
 
        host_cap.capabilities = kvm_get_feature_msr(MSR_IA32_PERF_CAPABILITIES);
        host_cap.capabilities &= (PMU_CAP_FW_WRITES | PMU_CAP_LBR_FMT);
@@ -91,11 +92,17 @@ int main(int argc, char *argv[])
        vcpu_set_msr(vcpu, MSR_IA32_PERF_CAPABILITIES, host_cap.lbr_format);
        ASSERT_EQ(vcpu_get_msr(vcpu, MSR_IA32_PERF_CAPABILITIES), (u64)host_cap.lbr_format);
 
-       /* testcase 3, check invalid LBR format is rejected */
-       /* Note, on Arch LBR capable platforms, LBR_FMT in perf capability msr is 0x3f,
-        * to avoid the failure, use a true invalid format 0x30 for the test. */
-       ret = _vcpu_set_msr(vcpu, MSR_IA32_PERF_CAPABILITIES, 0x30);
-       TEST_ASSERT(ret == 0, "Bad PERF_CAPABILITIES didn't fail.");
+       /*
+        * Testcase 3, check that an "invalid" LBR format is rejected.  Only an
+        * exact match of the host's format (and 0/disabled) is allowed.
+        */
+       for (val = 1; val <= PMU_CAP_LBR_FMT; val++) {
+               if (val == (host_cap.capabilities & PMU_CAP_LBR_FMT))
+                       continue;
+
+               ret = _vcpu_set_msr(vcpu, MSR_IA32_PERF_CAPABILITIES, val);
+               TEST_ASSERT(!ret, "Bad LBR FMT = 0x%lx didn't fail", val);
+       }
 
        printf("Completed perf capability tests.\n");
        kvm_vm_free(vm);