diff --git a/drv/commdrv.c b/drv/commdrv.c index 1e0901a..cd97e1f 100644 --- a/drv/commdrv.c +++ b/drv/commdrv.c @@ -886,6 +886,18 @@ int16_t FAR PASCAL _export inicom(DCB FAR *dcb) port->is16550 = (uint8_t)detect16550(port->baseAddr); dbgHex16("KPCOMM: inicom is16550", (uint16_t)port->is16550); + // Disable UART interrupts and clear all pending conditions BEFORE + // hooking ISR. Without this, a stale interrupt from a previous + // session fires the moment hookIsr unmasks the PIC. The ISR sees + // isOpen=FALSE, skips isrDispatch, sends EOI, but the UART's IRQ + // line stays asserted (level-triggered ISA). Result: infinite + // ISR loop, hard lockup. + _outp(port->baseAddr + UART_IER, 0); + (void)_inp(port->baseAddr + UART_IIR); + (void)_inp(port->baseAddr + UART_LSR); + (void)_inp(port->baseAddr + UART_MSR); + (void)_inp(port->baseAddr + UART_RBR); + // Hook ISR if (hookIsr(port) != 0) { dbgStr("KPCOMM: inicom hookIsr FAIL\r\n");