On Fri, 15 Nov 2019 17:24:27 +0100 Cédric Le Goater <c...@kaod.org> wrote:
> The CAM line matching sequence in the pseries machine does not change > much apart from the use of the new QOM interfaces. There is an extra > indirection because of the sPAPR IRQ backend of the machine. Only the > XIVE backend implements the new 'match_nvt' handler. > The changelog needs an update since you dropped the indirection you had in v4. > Signed-off-by: Cédric Le Goater <c...@kaod.org> > --- > hw/ppc/spapr.c | 36 ++++++++++++++++++++++++++++++++++++ > 1 file changed, 36 insertions(+) > > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c > index 94f9d27096af..a8f5850f65bb 100644 > --- a/hw/ppc/spapr.c > +++ b/hw/ppc/spapr.c > @@ -4270,6 +4270,39 @@ static void > spapr_pic_print_info(InterruptStatsProvider *obj, > kvm_irqchip_in_kernel() ? "in-kernel" : "emulated"); > } > > +static int spapr_xive_match_nvt(XiveFabric *xfb, uint8_t format, > + uint8_t nvt_blk, uint32_t nvt_idx, > + bool cam_ignore, uint8_t priority, > + uint32_t logic_serv, XiveTCTXMatch *match) > +{ > + SpaprMachineState *spapr = SPAPR_MACHINE(xfb); > + XivePresenter *xptr = XIVE_PRESENTER(spapr->xive); > + XivePresenterClass *xpc = XIVE_PRESENTER_GET_CLASS(xptr); > + int count; > + As suggested by David, you should probably assert() that XIVE is in use for extra paran^Wsafety. With these fixed, Reviewed-by: Greg Kurz <gr...@kaod.org> > + count = xpc->match_nvt(xptr, format, nvt_blk, nvt_idx, cam_ignore, > + priority, logic_serv, match); > + if (count < 0) { > + return count; > + } > + > + /* > + * When we implement the save and restore of the thread interrupt > + * contexts in the enter/exit CPU handlers of the machine and the > + * escalations in QEMU, we should be able to handle non dispatched > + * vCPUs. > + * > + * Until this is done, the sPAPR machine should find at least one > + * matching context always. > + */ > + if (count == 0) { > + qemu_log_mask(LOG_GUEST_ERROR, "XIVE: NVT %x/%x is not dispatched\n", > + nvt_blk, nvt_idx); > + } > + > + return count; > +} > + > int spapr_get_vcpu_id(PowerPCCPU *cpu) > { > return cpu->vcpu_id; > @@ -4366,6 +4399,7 @@ static void spapr_machine_class_init(ObjectClass *oc, > void *data) > PPCVirtualHypervisorClass *vhc = PPC_VIRTUAL_HYPERVISOR_CLASS(oc); > XICSFabricClass *xic = XICS_FABRIC_CLASS(oc); > InterruptStatsProviderClass *ispc = INTERRUPT_STATS_PROVIDER_CLASS(oc); > + XiveFabricClass *xfc = XIVE_FABRIC_CLASS(oc); > > mc->desc = "pSeries Logical Partition (PAPR compliant)"; > mc->ignore_boot_device_suffixes = true; > @@ -4442,6 +4476,7 @@ static void spapr_machine_class_init(ObjectClass *oc, > void *data) > smc->linux_pci_probe = true; > smc->smp_threads_vsmt = true; > smc->nr_xirqs = SPAPR_NR_XIRQS; > + xfc->match_nvt = spapr_xive_match_nvt; > } > > static const TypeInfo spapr_machine_info = { > @@ -4460,6 +4495,7 @@ static const TypeInfo spapr_machine_info = { > { TYPE_PPC_VIRTUAL_HYPERVISOR }, > { TYPE_XICS_FABRIC }, > { TYPE_INTERRUPT_STATS_PROVIDER }, > + { TYPE_XIVE_FABRIC }, > { } > }, > };