From: David Woodhouse <[email protected]>

The test asserted that the X86_FEATURE_SEV CPUID bit exactly matches
whether KVM offers KVM_X86_SEV_VM.  That is not an invariant: when all
SEV ASIDs are assigned to SEV-SNP, KVM does not offer the SEV VM type
even though CPUID reports SEV, so the test aborts on an SNP-only host.

Derive SEV availability from KVM_CAP_VM_TYPES (as already done for SEV-ES
and SNP), assert only the one-way implication that a type offered by KVM
is also reported in CPUID, and TEST_REQUIRE() the SEV VM type so the test
skips cleanly when it is unavailable.

Reviewed-by: Tycho Andersen (AMD) <[email protected]>
Signed-off-by: David Woodhouse <[email protected]>
---
 .../testing/selftests/kvm/x86/sev_init2_tests.c  | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/tools/testing/selftests/kvm/x86/sev_init2_tests.c 
b/tools/testing/selftests/kvm/x86/sev_init2_tests.c
index 8db88c355f16..689390c10f7c 100644
--- a/tools/testing/selftests/kvm/x86/sev_init2_tests.c
+++ b/tools/testing/selftests/kvm/x86/sev_init2_tests.c
@@ -130,12 +130,18 @@ int main(int argc, char *argv[])
                            KVM_X86_SEV_VMSA_FEATURES,
                            &supported_vmsa_features);
 
-       have_sev = kvm_cpu_has(X86_FEATURE_SEV);
-       TEST_ASSERT(have_sev == !!(kvm_check_cap(KVM_CAP_VM_TYPES) & 
BIT(KVM_X86_SEV_VM)),
-                   "sev: KVM_CAP_VM_TYPES (%x) does not match cpuid (checking 
%x)",
-                   kvm_check_cap(KVM_CAP_VM_TYPES), 1 << KVM_X86_SEV_VM);
+       /*
+        * Whether a VM type is available depends on KVM, not just CPUID: e.g.
+        * when all SEV ASIDs are assigned to SEV-SNP, KVM does not offer the
+        * SEV VM type even though X86_FEATURE_SEV is set.  Derive availability
+        * from KVM_CAP_VM_TYPES and only assert the one-way implication that a
+        * type offered by KVM must also be reported in CPUID.
+        */
+       have_sev = kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SEV_VM);
+       TEST_ASSERT(!have_sev || kvm_cpu_has(X86_FEATURE_SEV),
+                   "sev: SEV_VM supported without SEV in CPUID");
 
-       TEST_REQUIRE(kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SEV_VM));
+       TEST_REQUIRE(have_sev);
        have_sev_es = kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SEV_ES_VM);
 
        TEST_ASSERT(!have_sev_es || kvm_cpu_has(X86_FEATURE_SEV_ES),
-- 
2.55.0


Reply via email to