]> git.itanic.dy.fi Git - linux-stable/commitdiff
KVM: x86: Prepare kvm_hv_flush_tlb() to handle L2's GPAs
authorVitaly Kuznetsov <vkuznets@redhat.com>
Tue, 1 Nov 2022 14:53:51 +0000 (15:53 +0100)
committerPaolo Bonzini <pbonzini@redhat.com>
Fri, 18 Nov 2022 17:59:07 +0000 (12:59 -0500)
To handle L2 TLB flush requests, KVM needs to translate the specified
L2 GPA to L1 GPA to read hypercall arguments from there.

No functional change as KVM doesn't handle VMCALL/VMMCALL from L2 yet.

Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
Reviewed-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-Id: <20221101145426.251680-14-vkuznets@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/hyperv.c

index fca9c51891f5f6e6b4e55a42a9d21a701bd8bbe6..cb145987f5b854962d7d315a29de30b85dc2a99d 100644 (file)
@@ -23,6 +23,7 @@
 #include "ioapic.h"
 #include "cpuid.h"
 #include "hyperv.h"
+#include "mmu.h"
 #include "xen.h"
 
 #include <linux/cpu.h>
@@ -1908,6 +1909,19 @@ static u64 kvm_hv_flush_tlb(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *hc)
         */
        BUILD_BUG_ON(KVM_HV_MAX_SPARSE_VCPU_SET_BITS > 64);
 
+       /*
+        * 'Slow' hypercall's first parameter is the address in guest's memory
+        * where hypercall parameters are placed. This is either a GPA or a
+        * nested GPA when KVM is handling the call from L2 ('direct' TLB
+        * flush).  Translate the address here so the memory can be uniformly
+        * read with kvm_read_guest().
+        */
+       if (!hc->fast && is_guest_mode(vcpu)) {
+               hc->ingpa = translate_nested_gpa(vcpu, hc->ingpa, 0, NULL);
+               if (unlikely(hc->ingpa == INVALID_GPA))
+                       return HV_STATUS_INVALID_HYPERCALL_INPUT;
+       }
+
        if (hc->code == HVCALL_FLUSH_VIRTUAL_ADDRESS_LIST ||
            hc->code == HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE) {
                if (hc->fast) {