Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ia32/src/interrupt.c

    rd19b3fc rfd67c9f  
    3939#include <debug.h>
    4040#include <panic.h>
    41 #include <arch/drivers/i8259.h>
     41#include <genarch/drivers/i8259/i8259.h>
    4242#include <halt.h>
    4343#include <cpu.h>
     
    6363void (*disable_irqs_function)(uint16_t irqmask) = NULL;
    6464void (*enable_irqs_function)(uint16_t irqmask) = NULL;
    65 void (*eoi_function)(void) = NULL;
     65void (*eoi_function)(unsigned int) = NULL;
    6666const char *irqs_info = NULL;
    6767
     
    9090}
    9191
    92 static void trap_virtual_eoi(void)
     92static void trap_virtual_eoi(unsigned int inum)
    9393{
    9494        if (eoi_function)
    95                 eoi_function();
     95                eoi_function(inum);
    9696        else
    9797                panic("No eoi_function.");
     
    179179    istate_t *istate __attribute__((unused)))
    180180{
    181         trap_virtual_eoi();
     181        trap_virtual_eoi(0);
    182182        tlb_shootdown_ipi_recv();
    183183}
     
    192192        bool ack = false;
    193193        assert(inum < IRQ_COUNT);
    194         assert((inum != IRQ_PIC_SPUR) && (inum != IRQ_PIC1));
     194        assert(inum != IRQ_PIC1);
    195195
    196196        irq_t *irq = irq_dispatch_and_lock(inum);
     
    202202                if (irq->preack) {
    203203                        /* Send EOI before processing the interrupt */
    204                         trap_virtual_eoi();
     204                        trap_virtual_eoi(inum);
    205205                        ack = true;
    206206                }
     
    208208                irq_spinlock_unlock(&irq->lock, false);
    209209        } else {
    210                 /*
    211                  * Spurious interrupt.
    212                  */
    213210#ifdef CONFIG_DEBUG
    214                 printf("cpu%u: spurious interrupt (inum=%u)\n", CPU->id, inum);
     211                log(LF_ARCH, LVL_DEBUG, "cpu%u: unhandled IRQ %u", CPU->id,
     212                    inum);
    215213#endif
    216214        }
    217215
    218216        if (!ack)
    219                 trap_virtual_eoi();
     217                trap_virtual_eoi(inum);
     218}
     219
     220static void pic_spurious(unsigned int n, istate_t *istate)
     221{
     222        unsigned int inum = n - IVT_IRQBASE;
     223        if (!pic_is_spurious(inum)) {
     224                /* This is actually not a spurious IRQ, so proceed as usual. */
     225                irq_interrupt(n, istate);
     226                return;
     227        }
     228        pic_handle_spurious(n);
     229#ifdef CONFIG_DEBUG
     230        log(LF_ARCH, LVL_DEBUG, "cpu%u: PIC spurious interrupt %u", CPU->id,
     231            inum);
     232#endif
    220233}
    221234
     
    228241
    229242        for (i = 0; i < IRQ_COUNT; i++) {
    230                 if ((i != IRQ_PIC_SPUR) && (i != IRQ_PIC1))
     243                if ((i != IRQ_PIC0_SPUR) && (i != IRQ_PIC1_SPUR) &&
     244                    (i != IRQ_PIC1))
    231245                        exc_register(IVT_IRQBASE + i, "irq", true,
    232246                            (iroutine_t) irq_interrupt);
     
    239253        exc_register(VECTOR_GP, "gp_fault", true, (iroutine_t) gp_fault);
    240254        exc_register(VECTOR_XM, "simd_fp", true, (iroutine_t) simd_fp_exception);
     255        exc_register(VECTOR_PIC0_SPUR, "pic0_spurious", true,
     256            (iroutine_t) pic_spurious);
     257        exc_register(VECTOR_PIC1_SPUR, "pic1_spurious", true,
     258            (iroutine_t) pic_spurious);
    241259
    242260#ifdef CONFIG_SMP
Note: See TracChangeset for help on using the changeset viewer.