Ignore:
File:
1 edited

Legend:

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

    rfd67c9f rd19b3fc  
    3737#include <log.h>
    3838#include <panic.h>
    39 #include <genarch/drivers/i8259/i8259.h>
     39#include <arch/drivers/i8259.h>
    4040#include <halt.h>
    4141#include <cpu.h>
     
    6060void (*disable_irqs_function)(uint16_t irqmask) = NULL;
    6161void (*enable_irqs_function)(uint16_t irqmask) = NULL;
    62 void (*eoi_function)(unsigned int) = NULL;
     62void (*eoi_function)(void) = NULL;
    6363const char *irqs_info = NULL;
    6464
     
    9191}
    9292
    93 static void trap_virtual_eoi(unsigned int irq)
     93static void trap_virtual_eoi(void)
    9494{
    9595        if (eoi_function)
    96                 eoi_function(irq);
     96                eoi_function();
    9797        else
    9898                panic("No eoi_function.");
     
    157157static void tlb_shootdown_ipi(unsigned int n, istate_t *istate)
    158158{
    159         trap_virtual_eoi(0);
     159        trap_virtual_eoi();
    160160        tlb_shootdown_ipi_recv();
    161161}
     
    172172        bool ack = false;
    173173        assert(inum < IRQ_COUNT);
    174         assert(inum != IRQ_PIC1);
     174        assert((inum != IRQ_PIC_SPUR) && (inum != IRQ_PIC1));
    175175
    176176        irq_t *irq = irq_dispatch_and_lock(inum);
     
    182182                if (irq->preack) {
    183183                        /* Send EOI before processing the interrupt */
    184                         trap_virtual_eoi(inum);
     184                        trap_virtual_eoi();
    185185                        ack = true;
    186186                }
     
    188188                irq_spinlock_unlock(&irq->lock, false);
    189189        } else {
     190                /*
     191                 * Spurious interrupt.
     192                 */
    190193#ifdef CONFIG_DEBUG
    191                 log(LF_ARCH, LVL_DEBUG, "cpu%u: unhandled IRQ %u", CPU->id,
    192                     inum);
     194                log(LF_ARCH, LVL_DEBUG, "cpu%u: spurious interrupt (inum=%u)",
     195                    CPU->id, inum);
    193196#endif
    194197        }
    195198
    196199        if (!ack)
    197                 trap_virtual_eoi(inum);
    198 }
    199 
    200 static void pic_spurious(unsigned int n, istate_t *istate)
    201 {
    202         unsigned int inum = n - IVT_IRQBASE;
    203         if (!pic_is_spurious(inum)) {
    204                 /* This is actually not a spurious IRQ, so proceed as usual. */
    205                 irq_interrupt(n, istate);
    206                 return;
    207         }
    208         pic_handle_spurious(n);
    209 #ifdef CONFIG_DEBUG
    210         log(LF_ARCH, LVL_DEBUG, "cpu%u: PIC spurious interrupt %u", CPU->id,
    211             inum);
    212 #endif
     200                trap_virtual_eoi();
    213201}
    214202
     
    221209
    222210        for (i = 0; i < IRQ_COUNT; i++) {
    223                 if ((i != IRQ_PIC0_SPUR) && (i != IRQ_PIC1_SPUR) &&
    224                     (i != IRQ_PIC1))
     211                if ((i != IRQ_PIC_SPUR) && (i != IRQ_PIC1))
    225212                        exc_register(IVT_IRQBASE + i, "irq", true,
    226213                            (iroutine_t) irq_interrupt);
     
    231218        exc_register(VECTOR_SS, "ss_fault", true, (iroutine_t) ss_fault);
    232219        exc_register(VECTOR_GP, "gp_fault", true, (iroutine_t) gp_fault);
    233         exc_register(VECTOR_PIC0_SPUR, "pic0_spurious", true,
    234             (iroutine_t) pic_spurious);
    235         exc_register(VECTOR_PIC1_SPUR, "pic1_spurious", true,
    236             (iroutine_t) pic_spurious);
    237220
    238221#ifdef CONFIG_SMP
Note: See TracChangeset for help on using the changeset viewer.