KVM: selftests: Test Hyper-V extended hypercall enablement
authorVipin Sharma <vipinsh@google.com>
Mon, 12 Dec 2022 18:37:17 +0000 (10:37 -0800)
committerSean Christopherson <seanjc@google.com>
Wed, 1 Feb 2023 21:46:24 +0000 (13:46 -0800)
Test Hyper-V extended hypercall, HV_EXT_CALL_QUERY_CAPABILITIES
(0x8001), access denied and invalid parameter cases.

Access is denied if CPUID.0x40000003.EBX BIT(20) is not set.
Invalid parameter if call has fast bit set.

Signed-off-by: Vipin Sharma <vipinsh@google.com>
Link: https://lore.kernel.org/r/20221212183720.4062037-11-vipinsh@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
tools/testing/selftests/kvm/include/x86_64/hyperv.h
tools/testing/selftests/kvm/x86_64/hyperv_features.c

index 28eb990..fa65b90 100644 (file)
        KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EBX, 11)
 #define HV_CPU_MANAGEMENT                      \
        KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EBX, 12)
+#define HV_ENABLE_EXTENDED_HYPERCALLS          \
+       KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EBX, 20)
 #define HV_ISOLATION                           \
        KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EBX, 22)
 
 #define HVCALL_FLUSH_GUEST_PHYSICAL_ADDRESS_SPACE 0x00af
 #define HVCALL_FLUSH_GUEST_PHYSICAL_ADDRESS_LIST 0x00b0
 
+/* Extended hypercalls */
+#define HV_EXT_CALL_QUERY_CAPABILITIES         0x8001
+
 #define HV_FLUSH_ALL_PROCESSORS                        BIT(0)
 #define HV_FLUSH_ALL_VIRTUAL_ADDRESS_SPACES    BIT(1)
 #define HV_FLUSH_NON_GLOBAL_MAPPINGS_ONLY      BIT(2)
index 258267d..c5e3b39 100644 (file)
@@ -649,6 +649,15 @@ static void guest_test_hcalls_access(void)
                        hcall->expect = HV_STATUS_SUCCESS;
                        break;
                case 19:
+                       hcall->control = HV_EXT_CALL_QUERY_CAPABILITIES;
+                       hcall->expect = HV_STATUS_ACCESS_DENIED;
+                       break;
+               case 20:
+                       vcpu_set_cpuid_feature(vcpu, HV_ENABLE_EXTENDED_HYPERCALLS);
+                       hcall->control = HV_EXT_CALL_QUERY_CAPABILITIES | HV_HYPERCALL_FAST_BIT;
+                       hcall->expect = HV_STATUS_INVALID_PARAMETER;
+                       break;
+               case 21:
                        kvm_vm_free(vm);
                        return;
                }