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 6ec901d..069589c 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);