]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
KVM: PPC: Book3S HV: Allow passthrough of an emulated device to an L3 guest
authorSuraj Jitindar Singh <sjitindarsingh@gmail.com>
Fri, 14 Dec 2018 05:29:10 +0000 (16:29 +1100)
committerPaul Mackerras <paulus@ozlabs.org>
Mon, 17 Dec 2018 00:33:50 +0000 (11:33 +1100)
Previously when a device was being emulated by an L1 guest for an L2
guest, that device couldn't then be passed through to an L3 guest. This
was because the L1 guest had no method for accessing L3 memory.

The hcall H_COPY_TOFROM_GUEST provides this access. Thus this setup for
passthrough can now be allowed.

Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
arch/powerpc/kvm/book3s_64_mmu_radix.c
arch/powerpc/kvm/book3s_hv_nested.c

index 5b3f266422d6e6943d0007008860cca17c826dd1..870ef9d5eee69c146dc3dedbfbe0a004fb594ca5 100644 (file)
@@ -37,11 +37,10 @@ unsigned long __kvmhv_copy_tofrom_guest_radix(int lpid, int pid,
        int old_pid, old_lpid;
        bool is_load = !!to;
 
-       /* Can't access quadrants 1 or 2 in non-HV mode */
-       if (kvmhv_on_pseries()) {
-               /* TODO h-call */
-               return -EPERM;
-       }
+       /* Can't access quadrants 1 or 2 in non-HV mode, call the HV to do it */
+       if (kvmhv_on_pseries())
+               return plpar_hcall_norets(H_COPY_TOFROM_GUEST, lpid, pid, eaddr,
+                                         __pa(to), __pa(from), n);
 
        quadrant = 1;
        if (!pid)
index e41a4d196a917605e9e5493d5ddb326185587cb5..9dce4b9c1d9c2f9299d28e79e7b77aa1f250e5ad 100644 (file)
@@ -1284,11 +1284,6 @@ static long int __kvmhv_nested_page_fault(struct kvm_run *run,
                }
 
                /* passthrough of emulated MMIO case */
-               if (kvmhv_on_pseries()) {
-                       pr_err("emulated MMIO passthrough?\n");
-                       return -EINVAL;
-               }
-
                return kvmppc_hv_emulate_mmio(run, vcpu, gpa, ea, writing);
        }
        if (memslot->flags & KVM_MEM_READONLY) {