KVM: PPC: Book3S HV P9: Reflect userspace hcalls to hash guests to support PR KVM
authorNicholas Piggin <npiggin@gmail.com>
Fri, 28 May 2021 09:07:49 +0000 (19:07 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 10 Jun 2021 12:12:15 +0000 (22:12 +1000)
The reflection of sc 1 interrupts from guest PR=1 to the guest kernel is
required to support a hash guest running PR KVM where its guest is
making hcalls with sc 1.

In preparation for hash guest support, add this hcall reflection to the
P9 path. The P7/8 path does this in its realmode hcall handler
(sc_1_fast_return).

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20210528090752.3542186-30-npiggin@gmail.com
arch/powerpc/kvm/book3s_hv.c

index dee740a..493f67f 100644 (file)
@@ -1457,13 +1457,23 @@ static int kvmppc_handle_exit_hv(struct kvm_vcpu *vcpu,
                         * Guest userspace executed sc 1. This can only be
                         * reached by the P9 path because the old path
                         * handles this case in realmode hcall handlers.
-                        *
-                        * Radix guests can not run PR KVM or nested HV hash
-                        * guests which might run PR KVM, so this is always
-                        * a privilege fault. Send a program check to guest
-                        * kernel.
                         */
-                       kvmppc_core_queue_program(vcpu, SRR1_PROGPRIV);
+                       if (!kvmhv_vcpu_is_radix(vcpu)) {
+                               /*
+                                * A guest could be running PR KVM, so this
+                                * may be a PR KVM hcall. It must be reflected
+                                * to the guest kernel as a sc interrupt.
+                                */
+                               kvmppc_core_queue_syscall(vcpu);
+                       } else {
+                               /*
+                                * Radix guests can not run PR KVM or nested HV
+                                * hash guests which might run PR KVM, so this
+                                * is always a privilege fault. Send a program
+                                * check to guest kernel.
+                                */
+                               kvmppc_core_queue_program(vcpu, SRR1_PROGPRIV);
+                       }
                        r = RESUME_GUEST;
                        break;
                }