Ignore:
Timestamp:
2019-04-06T08:10:27Z (5 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
534bcdf
Parents:
ef56a43
Message:

Handle PIC spurious IRQs with care

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/genarch/src/drivers/i8259/i8259.c

    ref56a43 rfd67c9f  
    9090                    (uint8_t) (x & (~(irqmask & 0xff))));
    9191        }
    92         if (irqmask >> 8) {
     92        if (irqmask >> PIC_IRQ_COUNT) {
    9393                x = pio_read_8(&saved_pic1->port2);
    9494                pio_write_8(&saved_pic1->port2,
    95                     (uint8_t) (x & (~(irqmask >> 8))));
     95                    (uint8_t) (x & (~(irqmask >> PIC_IRQ_COUNT))));
    9696        }
    9797}
     
    106106                    (uint8_t) (x | (irqmask & 0xff)));
    107107        }
    108         if (irqmask >> 8) {
     108        if (irqmask >> PIC_IRQ_COUNT) {
    109109                x = pio_read_8(&saved_pic1->port2);
    110                 pio_write_8(&saved_pic1->port2, (uint8_t) (x | (irqmask >> 8)));
     110                pio_write_8(&saved_pic1->port2,
     111                    (uint8_t) (x | (irqmask >> PIC_IRQ_COUNT)));
    111112        }
    112113}
     
    114115void pic_eoi(unsigned int irq)
    115116{
    116         if (irq >= 8)
     117        if (irq >= PIC_IRQ_COUNT)
    117118                pio_write_8(&saved_pic1->port1, PIC_OCW4 | PIC_OCW4_NSEOI);
    118119        pio_write_8(&saved_pic0->port1, PIC_OCW4 | PIC_OCW4_NSEOI);
    119120}
    120121
     122bool pic_is_spurious(unsigned int irq)
     123{
     124        pio_write_8(&saved_pic0->port1, PIC_OCW3 | PIC_OCW3_READ_ISR);
     125        pio_write_8(&saved_pic1->port1, PIC_OCW3 | PIC_OCW3_READ_ISR);
     126        uint8_t isr_lo = pio_read_8(&saved_pic0->port1);
     127        uint8_t isr_hi = pio_read_8(&saved_pic1->port1);
     128        return !(((isr_hi << PIC_IRQ_COUNT) | isr_lo) & (1 << irq));
     129}
     130
     131void pic_handle_spurious(unsigned int irq)
     132{
     133        /* For spurious IRQs from pic1, we need to isssue an EOI to pic0 */
     134        if (irq >= PIC_IRQ_COUNT)
     135                pio_write_8(&saved_pic0->port1, PIC_OCW4 | PIC_OCW4_NSEOI);
     136}
     137
    121138/** @}
    122139 */
Note: See TracChangeset for help on using the changeset viewer.