On 3/26/20 9:38 AM, Ram Pai wrote: > XIVE interrupt controller use an Event Queue (EQ) to enqueue event The XIVE interrupt controller uses ... (my bad) > notifications when an exception occurs. The EQ is a single memory page > provided by the O/S defining a circular buffer, one per server and > priority couple. > > On baremetal, the EQ page is configured with an OPAL call. On pseries, > an extra hop is necessary and the guest OS uses the hcall > H_INT_SET_QUEUE_CONFIG to configure the XIVE interrupt controller. > > The XIVE controller being Hypervisor privileged, it will not be allowed > to enqueue event notifications for a Secure VM unless the EQ pages are > shared by the Secure VM. > > Hypervisor/Ultravisor still requires support for the TIMA and ESB page > fault handlers. Until this is complete, QEMU can use the emulated XIVE > device for Secure VMs, option "kernel_irqchip=off" on the QEMU pseries > machine. > > Cc: kvm-ppc@xxxxxxxxxxxxxxx > Cc: linuxppc-dev@xxxxxxxxxxxxxxxx > Cc: Michael Ellerman <mpe@xxxxxxxxxxxxxx> > Cc: Thiago Jung Bauermann <bauerman@xxxxxxxxxxxxx> > Cc: Michael Anderson <andmike@xxxxxxxxxxxxx> > Cc: Sukadev Bhattiprolu <sukadev@xxxxxxxxxxxxxxxxxx> > Cc: Alexey Kardashevskiy <aik@xxxxxxxxx> > Cc: Paul Mackerras <paulus@xxxxxxxxxx> > Cc: Greg Kurz <groug@xxxxxxxx> > Cc: Cedric Le Goater <clg@xxxxxxxxxx> clg@xxxxxxxxxx is insecure. Please use clg@xxxxxxxx. > Cc: David Gibson <david@xxxxxxxxxxxxxxxxxxxxx> > Signed-off-by: Ram Pai <linuxram@xxxxxxxxxx> Reviewed-by: Cedric Le Goater <clg@xxxxxxxx> Thanks, C. > > v2: better description of the patch from Cedric. > --- > arch/powerpc/sysdev/xive/spapr.c | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/arch/powerpc/sysdev/xive/spapr.c b/arch/powerpc/sysdev/xive/spapr.c > index 55dc61c..608b52f 100644 > --- a/arch/powerpc/sysdev/xive/spapr.c > +++ b/arch/powerpc/sysdev/xive/spapr.c > @@ -26,6 +26,8 @@ > #include <asm/xive.h> > #include <asm/xive-regs.h> > #include <asm/hvcall.h> > +#include <asm/svm.h> > +#include <asm/ultravisor.h> > > #include "xive-internal.h" > > @@ -501,6 +503,9 @@ static int xive_spapr_configure_queue(u32 target, struct xive_q *q, u8 prio, > rc = -EIO; > } else { > q->qpage = qpage; > + if (is_secure_guest()) > + uv_share_page(PHYS_PFN(qpage_phys), > + 1 << xive_alloc_order(order)); > } > fail: > return rc; > @@ -534,6 +539,8 @@ static void xive_spapr_cleanup_queue(unsigned int cpu, struct xive_cpu *xc, > hw_cpu, prio); > > alloc_order = xive_alloc_order(xive_queue_shift); > + if (is_secure_guest()) > + uv_unshare_page(PHYS_PFN(__pa(q->qpage)), 1 << alloc_order); > free_pages((unsigned long)q->qpage, alloc_order); > q->qpage = NULL; > } >