KVM: selftests: x86: Use host's native hypercall instruction in kvm_hypercall()
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>
This commit is contained in:
committed by
Sean Christopherson
parent
e6df2ae3f5
commit
ea25ace771
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user