On 12/20/23 16:56, Taylor R Campbell wrote:

My guess is that this is not going to be MSI -- it'll either be i8259
or ioapic.  In that case, it may work to do this:

Thanks a lot for that, here's the result, unfortunately it still
hangs at the first VOP_OPEN() from subr_disk_open.c and the
handler function never gets triggered:

static int
virtio_mmio_cmdline_alloc_interrupts(struct virtio_mmio_softc *msc)
{
        struct virtio_mmio_cmdline_softc *const sc =
                (struct virtio_mmio_cmdline_softc *)msc;
        struct virtio_softc *const vsc = &msc->sc_sc;
        struct ioapic_softc *ioapic;
        struct pic *pic;
        int irq = sc->margs.irq;
        int pin = irq;

        ioapic = ioapic_find_bybase(irq);

        /* we don't enter here */
        if (ioapic != NULL) {
                pic = &ioapic->sc_pic;
                pin = irq - pic->pic_vecbase;
                irq = -1;
        } else
                pic = &i8259_pic;

        msc->sc_ih = intr_establish_xname(irq, pic, pin, IST_EDGE, IPL_BIO,
                virtio_mmio_intr, msc, false, device_xname(vsc->sc_dev));
        if (msc->sc_ih == NULL) {
                aprint_error_dev(vsc->sc_dev,
                    "failed to establish interrupt\n");
                return -1;
        }
        aprint_normal_dev(vsc->sc_dev, "interrupting on %d\n", irq);

        return 0;
}

/* --- */

intr_establish_xname() does get through :

[   1.0000030] viommio: 4K@0xd0000000:5
[   1.0000030] virtio0: block device (id 2, rev. 0x02)
[   1.0000030] ld0 at virtio0: features: 0x100000000<V1>
[   1.0000030] virtio0: interrupting on 5 <---
[ 1.0000030] ld0: 30720 KB, 60 cyl, 16 head, 63 sec, 512 bytes/sect x 61441 sectors
[   1.0107398] boot device: ld0

--
------------------------------------------------------------------------
Emile `iMil' Heitor <imil@{home.imil.net,NetBSD.org}> | https://imil.net

Reply via email to