KVM: selftests: x86: Use host's native hypercall instruction in kvm_hypercall()
authorVishal Annapurve <vannapurve@google.com>
Wed, 11 Jan 2023 00:44:45 +0000 (00:44 +0000)
committerSean Christopherson <seanjc@google.com>
Tue, 24 Jan 2023 18:06:33 +0000 (10:06 -0800)
Use the host CPU's native hypercall instruction, i.e. VMCALL vs. VMMCALL,
in kvm_hypercall(), as relying on KVM to patch in the native hypercall on
a #UD for the "wrong" hypercall requires KVM_X86_QUIRK_FIX_HYPERCALL_INSN
to be enabled and flat out doesn't work if guest memory is encrypted with
a private key, e.g. for SEV VMs.

Suggested-by: Sean Christopherson <seanjc@google.com>
Reviewed-by: David Matlack <dmatlack@google.com>
Signed-off-by: Vishal Annapurve <vannapurve@google.com>
Link: https://lore.kernel.org/r/20230111004445.416840-4-vannapurve@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
tools/testing/selftests/kvm/lib/x86_64/processor.c

index 84915bc..ae1e573 100644 (file)
@@ -1144,9 +1144,15 @@ uint64_t kvm_hypercall(uint64_t nr, uint64_t a0, uint64_t a1, uint64_t a2,
 {
        uint64_t r;
 
-       asm volatile("vmcall"
+       asm volatile("test %[use_vmmcall], %[use_vmmcall]\n\t"
+                    "jnz 1f\n\t"
+                    "vmcall\n\t"
+                    "jmp 2f\n\t"
+                    "1: vmmcall\n\t"
+                    "2:"
                     : "=a"(r)
-                    : "a"(nr), "b"(a0), "c"(a1), "d"(a2), "S"(a3));
+                    : "a"(nr), "b"(a0), "c"(a1), "d"(a2), "S"(a3),
+                      [use_vmmcall] "r" (host_cpu_is_amd));
        return r;
 }