Ejemplo n.º 1
0
/* 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;
}
Ejemplo n.º 2
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;
}
Ejemplo n.º 3
0
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;
}