Message ID | 1377259425-27903-1-git-send-email-aik@ozlabs.ru |
---|---|
State | New |
Headers | show |
On 23.08.2013, at 14:03, Alexey Kardashevskiy wrote: > From: Benjamin Herrenschmidt <benh@kernel.crashing.org> > > This implements H_XIRR_X hypercall in addition to H_XIRR as > it is mandatory for PAPR+ and there is no way for the guest to > detect whether it is supported or not so just add it. > > As the Partition Adjunct Option is not supported at the moment, > the CPPR parameter of the hypercall is ignored. > > Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> > Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> > --- > hw/intc/xics.c | 14 ++++++++++++++ > include/hw/ppc/spapr.h | 3 ++- > 2 files changed, 16 insertions(+), 1 deletion(-) > > diff --git a/hw/intc/xics.c b/hw/intc/xics.c > index 2e6111d..b7f849a 100644 > --- a/hw/intc/xics.c > +++ b/hw/intc/xics.c > @@ -27,6 +27,7 @@ > > #include "hw/hw.h" > #include "trace.h" > +#include "qemu/timer.h" > #include "hw/ppc/spapr.h" > #include "hw/ppc/xics.h" > #include "qemu/error-report.h" > @@ -679,6 +680,18 @@ static target_ulong h_xirr(PowerPCCPU *cpu, sPAPREnvironment *spapr, > return H_SUCCESS; > } > > +static target_ulong h_xirr_x(PowerPCCPU *cpu, sPAPREnvironment *spapr, > + target_ulong opcode, target_ulong *args) > +{ > + CPUState *cs = CPU(cpu); > + ICPState *ss = spapr->icp->ss + cs->cpu_index; Let's be consistent in coding style and use &...ss[cs->cpu_index];. The rest looks good :). Alex > + uint32_t xirr = icp_accept(ss); > + > + args[0] = xirr; > + args[1] = cpu_get_real_ticks(); > + return H_SUCCESS; > +} > + > static target_ulong h_eoi(PowerPCCPU *cpu, sPAPREnvironment *spapr, > target_ulong opcode, target_ulong *args) > { > @@ -853,6 +866,7 @@ static void xics_realize(DeviceState *dev, Error **errp) > spapr_register_hypercall(H_CPPR, h_cppr); > spapr_register_hypercall(H_IPI, h_ipi); > spapr_register_hypercall(H_XIRR, h_xirr); > + spapr_register_hypercall(H_XIRR_X, h_xirr_x); > spapr_register_hypercall(H_EOI, h_eoi); > spapr_register_hypercall(H_IPOLL, h_ipoll); > > diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h > index 9fc1972..a84b8ff 100644 > --- a/include/hw/ppc/spapr.h > +++ b/include/hw/ppc/spapr.h > @@ -267,7 +267,8 @@ typedef struct sPAPREnvironment { > #define H_GET_EM_PARMS 0x2B8 > #define H_SET_MPP 0x2D0 > #define H_GET_MPP 0x2D4 > -#define MAX_HCALL_OPCODE H_GET_MPP > +#define H_XIRR_X 0x2FC > +#define MAX_HCALL_OPCODE H_XIRR_X > > /* The hcalls above are standardized in PAPR and implemented by pHyp > * as well. > -- > 1.8.4.rc4 >
diff --git a/hw/intc/xics.c b/hw/intc/xics.c index 2e6111d..b7f849a 100644 --- a/hw/intc/xics.c +++ b/hw/intc/xics.c @@ -27,6 +27,7 @@ #include "hw/hw.h" #include "trace.h" +#include "qemu/timer.h" #include "hw/ppc/spapr.h" #include "hw/ppc/xics.h" #include "qemu/error-report.h" @@ -679,6 +680,18 @@ static target_ulong h_xirr(PowerPCCPU *cpu, sPAPREnvironment *spapr, return H_SUCCESS; } +static target_ulong h_xirr_x(PowerPCCPU *cpu, sPAPREnvironment *spapr, + target_ulong opcode, target_ulong *args) +{ + CPUState *cs = CPU(cpu); + ICPState *ss = spapr->icp->ss + cs->cpu_index; + uint32_t xirr = icp_accept(ss); + + args[0] = xirr; + args[1] = cpu_get_real_ticks(); + return H_SUCCESS; +} + static target_ulong h_eoi(PowerPCCPU *cpu, sPAPREnvironment *spapr, target_ulong opcode, target_ulong *args) { @@ -853,6 +866,7 @@ static void xics_realize(DeviceState *dev, Error **errp) spapr_register_hypercall(H_CPPR, h_cppr); spapr_register_hypercall(H_IPI, h_ipi); spapr_register_hypercall(H_XIRR, h_xirr); + spapr_register_hypercall(H_XIRR_X, h_xirr_x); spapr_register_hypercall(H_EOI, h_eoi); spapr_register_hypercall(H_IPOLL, h_ipoll); diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 9fc1972..a84b8ff 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -267,7 +267,8 @@ typedef struct sPAPREnvironment { #define H_GET_EM_PARMS 0x2B8 #define H_SET_MPP 0x2D0 #define H_GET_MPP 0x2D4 -#define MAX_HCALL_OPCODE H_GET_MPP +#define H_XIRR_X 0x2FC +#define MAX_HCALL_OPCODE H_XIRR_X /* The hcalls above are standardized in PAPR and implemented by pHyp * as well.