--- sys/platform/pc64/icu/elcr.c +++ sys/platform/pc64/icu/elcr.c @@ -82,12 +82,16 @@ /* * Returns 1 for level trigger, 0 for edge. */ enum intr_trigger elcr_read_trigger(int irq) { KASSERT(elcr_found, ("%s: no ELCR was found!", __func__)); - KASSERT(irq < ISA_IRQ_CNT, ("%s: invalid IRQ %u", __func__, irq)); + KASSERT(irq >= 0 && irq < ISA_IRQ_CNT, + ("%s: invalid IRQ %u", __func__, irq)); + if (irq < 0 || irq >= ISA_IRQ_CNT) /* real guard: KASSERT is + * INVARIANTS-only (systm.h) */ + return (INTR_TRIGGER_EDGE); if (elcr_status & ELCR_MASK(irq)) return (INTR_TRIGGER_LEVEL); else return (INTR_TRIGGER_EDGE); } @@ -96,12 +100,17 @@ /* * Set the trigger mode for a specified IRQ. Mode of 0 means edge triggered, * and a mode of 1 means level triggered. */ void elcr_write_trigger(int irq, enum intr_trigger trigger) { int new_status; KASSERT(elcr_found, ("%s: no ELCR was found!", __func__)); - KASSERT(irq < ISA_IRQ_CNT, ("%s: invalid IRQ %u", __func__, irq)); + KASSERT(irq >= 0 && irq < ISA_IRQ_CNT, + ("%s: invalid IRQ %u", __func__, irq)); + if (irq < 0 || irq >= ISA_IRQ_CNT) /* real guard: never touch the + * ELCR ports with a wild irq */ + return; if (trigger == INTR_TRIGGER_LEVEL) new_status = elcr_status | ELCR_MASK(irq); else