Message ID | 20190314063855.27890-1-clg@kaod.org |
---|---|
State | New |
Headers | show |
Series | ppc/xics/spapr: Fix H_IPOLL implementation | expand |
On Thu, 14 Mar 2019 07:38:55 +0100 Cédric Le Goater <clg@kaod.org> wrote: > From: Benjamin Herrenschmidt <benh@kernel.crashing.org> > > H_IPOLL takes the CPU# of the processor to poll as an argument, > it doesn't operate on self. > True. > Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> > Signed-off-by: Cédric Le Goater <clg@kaod.org> > --- Reviewed-by: Greg Kurz <groug@kaod.org> > hw/intc/xics_spapr.c | 9 ++++++++- > 1 file changed, 8 insertions(+), 1 deletion(-) > > diff --git a/hw/intc/xics_spapr.c b/hw/intc/xics_spapr.c > index 607e1c167ba2..9d2b8adef7c5 100644 > --- a/hw/intc/xics_spapr.c > +++ b/hw/intc/xics_spapr.c > @@ -95,8 +95,15 @@ static target_ulong h_eoi(PowerPCCPU *cpu, SpaprMachineState *spapr, > static target_ulong h_ipoll(PowerPCCPU *cpu, SpaprMachineState *spapr, > target_ulong opcode, target_ulong *args) > { > + ICPState *icp = xics_icp_get(XICS_FABRIC(spapr), args[0]); > uint32_t mfrr; > - uint32_t xirr = icp_ipoll(spapr_cpu_state(cpu)->icp, &mfrr); > + uint32_t xirr; > + > + if (!icp) { > + return H_PARAMETER; > + } > + > + xirr = icp_ipoll(icp, &mfrr); > > args[0] = xirr; > args[1] = mfrr;
On Thu, Mar 14, 2019 at 07:53:15AM +0100, Greg Kurz wrote: > On Thu, 14 Mar 2019 07:38:55 +0100 > Cédric Le Goater <clg@kaod.org> wrote: > > > From: Benjamin Herrenschmidt <benh@kernel.crashing.org> > > > > H_IPOLL takes the CPU# of the processor to poll as an argument, > > it doesn't operate on self. > > > > True. Applied to ppc-for-4.0. > > > Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> > > Signed-off-by: Cédric Le Goater <clg@kaod.org> > > --- > > Reviewed-by: Greg Kurz <groug@kaod.org> > > > hw/intc/xics_spapr.c | 9 ++++++++- > > 1 file changed, 8 insertions(+), 1 deletion(-) > > > > diff --git a/hw/intc/xics_spapr.c b/hw/intc/xics_spapr.c > > index 607e1c167ba2..9d2b8adef7c5 100644 > > --- a/hw/intc/xics_spapr.c > > +++ b/hw/intc/xics_spapr.c > > @@ -95,8 +95,15 @@ static target_ulong h_eoi(PowerPCCPU *cpu, SpaprMachineState *spapr, > > static target_ulong h_ipoll(PowerPCCPU *cpu, SpaprMachineState *spapr, > > target_ulong opcode, target_ulong *args) > > { > > + ICPState *icp = xics_icp_get(XICS_FABRIC(spapr), args[0]); > > uint32_t mfrr; > > - uint32_t xirr = icp_ipoll(spapr_cpu_state(cpu)->icp, &mfrr); > > + uint32_t xirr; > > + > > + if (!icp) { > > + return H_PARAMETER; > > + } > > + > > + xirr = icp_ipoll(icp, &mfrr); > > > > args[0] = xirr; > > args[1] = mfrr; >
diff --git a/hw/intc/xics_spapr.c b/hw/intc/xics_spapr.c index 607e1c167ba2..9d2b8adef7c5 100644 --- a/hw/intc/xics_spapr.c +++ b/hw/intc/xics_spapr.c @@ -95,8 +95,15 @@ static target_ulong h_eoi(PowerPCCPU *cpu, SpaprMachineState *spapr, static target_ulong h_ipoll(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { + ICPState *icp = xics_icp_get(XICS_FABRIC(spapr), args[0]); uint32_t mfrr; - uint32_t xirr = icp_ipoll(spapr_cpu_state(cpu)->icp, &mfrr); + uint32_t xirr; + + if (!icp) { + return H_PARAMETER; + } + + xirr = icp_ipoll(icp, &mfrr); args[0] = xirr; args[1] = mfrr;