On 11/11/15 18:15, Aravinda Prasad wrote: > This patch adds support in QEMU to handle "ibm,nmi-register" > and "ibm,nmi-interlock" RTAS calls. > > The machine check notification address is saved when the > OS issues "ibm,nmi-register" RTAS call. > > This patch also handles the case when multiple processors > experience machine check at or about the same time by > handling "ibm,nmi-interlock" call. In such cases, as per > PAPR, subsequent processors serialize waiting for the first > processor to issue the "ibm,nmi-interlock" call. The second > processor waits till the first processor, which also > received a machine check error, is done reading the error > log. The first processor issues "ibm,nmi-interlock" call > when the error log is consumed. This patch implements the > releasing part of the error-log while subsequent patch > (which builds error log) handles the locking part. > > Signed-off-by: Aravinda Prasad <aravi...@linux.vnet.ibm.com> > --- > hw/ppc/spapr_rtas.c | 29 +++++++++++++++++++++++++++++ > include/hw/ppc/spapr.h | 8 +++++++- > 2 files changed, 36 insertions(+), 1 deletion(-) > > diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c > index 9869bc9..fd4d2af 100644 > --- a/hw/ppc/spapr_rtas.c > +++ b/hw/ppc/spapr_rtas.c > @@ -597,6 +597,31 @@ out: > rtas_st(rets, 0, rc); > } > > +static void rtas_ibm_nmi_register(PowerPCCPU *cpu, > + sPAPRMachineState *spapr, > + uint32_t token, uint32_t nargs, > + target_ulong args, > + uint32_t nret, target_ulong rets) > +{ > + qemu_mutex_init(&spapr->mc_in_progress); > + spapr->guest_machine_check_addr = rtas_ld(args, 1); > + rtas_st(rets, 0, RTAS_OUT_SUCCESS); > +} > + > +static void rtas_ibm_nmi_interlock(PowerPCCPU *cpu, > + sPAPRMachineState *spapr, > + uint32_t token, uint32_t nargs, > + target_ulong args, > + uint32_t nret, target_ulong rets) > +{ > + /* > + * VCPU issuing "ibm,nmi-interlock" is done with NMI handling, > + * hence unlock mc_in_progress. > + */ > + qemu_mutex_unlock(&spapr->mc_in_progress); > + rtas_st(rets, 0, RTAS_OUT_SUCCESS); > +}
Maybe the interlock function should return an error if the nmi_register function has not been called before? OTOH, RTAS is not supposed to do excessive parameter checking, so this is maybe not worth the effort. Thomas