MorphOS sets the ISA PIC to level sensitive mode but QEMU does not support that so this causes a freeze if multiple devices try to raise a shared interrupt. Work around it by lowering the interrupt before raising it again if it is already raised. This could be reverted when the i8259 model is fixed.
Signed-off-by: BALATON Zoltan <bala...@eik.bme.hu> --- hw/isa/vt82c686.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/hw/isa/vt82c686.c b/hw/isa/vt82c686.c index 018a119964..3e44a51f92 100644 --- a/hw/isa/vt82c686.c +++ b/hw/isa/vt82c686.c @@ -549,6 +549,7 @@ struct ViaISAState { PCIDevice dev; qemu_irq cpu_intr; qemu_irq *isa_irqs_in; + uint16_t isa_irqs_state; ViaSuperIOState via_sio; MC146818RtcState rtc; PCIIDEState ide; @@ -636,6 +637,14 @@ static void via_isa_set_pci_irq(void *opaque, int irq_num, int level) pic_level |= pci_bus_get_irq_level(bus, i); } } + /* FIXME: workaround for i8259: level sensitive irq not supported */ + if ((s->isa_irqs_state & BIT(pic_irq)) && pic_level) { + qemu_irq_lower(s->isa_irqs_in[pic_irq]); + } else if (pic_level) { + s->isa_irqs_state |= BIT(pic_irq); + } else { + s->isa_irqs_state &= ~BIT(pic_irq); + } /* Now we change the pic irq level according to the via irq mappings. */ qemu_set_irq(s->isa_irqs_in[pic_irq], pic_level); } -- 2.30.8