/* Takes a raw vector/trap number (32-47) */ int pic_check_spurious(int trap_nr) { if (trap_nr == PIC1_SPURIOUS && !(pic_get_isr() & (1 << 7))) { ++ pic1_spurious_irqs; return 1; } if (trap_nr == PIC2_SPURIOUS && !(pic_get_isr() & (1 << 15))) { ++ pic2_spurious_irqs; pic_send_eoi(PIC1_OFFSET + 2); return 1; } return 0; }
/* Takes a raw vector/trap number (32-47), not a device IRQ (0-15) */ bool pic_check_spurious(int trap_nr) { /* the PIC may send spurious irqs via one of the chips irq 7. if the isr * doesn't show that irq, then it was spurious, and we don't send an eoi. * Check out http://wiki.osdev.org/8259_PIC#Spurious_IRQs */ if ((trap_nr == PIC1_SPURIOUS) && !(pic_get_isr() & (1 << 7))) { printd("Spurious PIC1 irq!\n"); /* want to know if this happens */ return TRUE; } if ((trap_nr == PIC2_SPURIOUS) && !(pic_get_isr() & (1 << 15))) { printd("Spurious PIC2 irq!\n"); /* want to know if this happens */ /* for the cascaded PIC, we *do* need to send an EOI to the master's * cascade irq (2). */ pic_send_eoi(2 + PIC1_OFFSET); return TRUE; } return FALSE; }
INLINE int pic_is_spurious(unsigned irq) { uint16_t isr = pic_get_isr(); if (irq == 7) return isr != 128; else if (irq == 15) { if (isr != 0x8004) { pic_eoi(2); return 0; } else return 1; } else return 0; }