On Tue, 24 Sep 2019 at 16:23, Heyi Guo <guoheyi@xxxxxxxxxx> wrote: > > Override qemu_irq handler to support trigger SDEI event transparently > after guest binds interrupt to SDEI event. We don't have good way to > get GIC device and to guarantee SDEI device is initialized after GIC, > so we search GIC in system bus when the first SDEI request happens or > in VMSTATE post_load(). > > Signed-off-by: Heyi Guo <guoheyi@xxxxxxxxxx> > Cc: Peter Maydell <peter.maydell@xxxxxxxxxx> > Cc: Dave Martin <Dave.Martin@xxxxxxx> > Cc: Marc Zyngier <marc.zyngier@xxxxxxx> > Cc: Mark Rutland <mark.rutland@xxxxxxx> > Cc: James Morse <james.morse@xxxxxxx> > +static void override_qemu_irq(QemuSDEState *s, int32_t event, uint32_t intid) > +{ > + qemu_irq irq; > + QemuSDE *sde; > + CPUState *cs; > + int cpu; > + > + /* SPI */ > + if (intid >= GIC_INTERNAL) { > + cs = arm_get_cpu_by_id(0); > + irq = qdev_get_gpio_in(s->gic_dev, > + gic_int_to_irq(s->num_irq, intid, 0)); > + if (irq) { > + qemu_irq_intercept_in(&irq, qemu_sdei_irq_handler, 1); > + } I'm not sure what this code is trying to do, but qemu_irq_intercept_in() is a function for internal use by the qtest testing infrastructure, so it shouldn't be used in 'real' QEMU code. > + sde = get_sde_no_check(s, event, cs); > + sde->irq = irq; > + put_sde(sde, cs); > + return; > + } > @@ -1042,6 +1152,17 @@ void sdei_handle_request(CPUState *cs, struct kvm_run *run) > return; > } > > + if (!sde_state->gic_dev) { > + /* Search for ARM GIC device */ > + qbus_walk_children(sysbus_get_default(), dev_walkerfn, > + NULL, NULL, NULL, sde_state); > + if (!sde_state->gic_dev) { > + error_report("Cannot find ARM GIC device!"); > + run->hypercall.args[0] = SDEI_NOT_SUPPORTED; > + return; > + } > + } Walking through the qbus tree looking for particular devices isn't really something I'd recommend either. thanks -- PMM _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm