Ignore:
File:
1 edited

Legend:

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

    r2a103b5 rd19b3fc  
    3939#include <debug.h>
    4040#include <panic.h>
    41 #include <genarch/drivers/i8259/i8259.h>
    42 #include <genarch/pic/pic_ops.h>
     41#include <arch/drivers/i8259.h>
    4342#include <halt.h>
    4443#include <cpu.h>
     
    6261 */
    6362
    64 pic_ops_t *pic_ops = NULL;
     63void (*disable_irqs_function)(uint16_t irqmask) = NULL;
     64void (*enable_irqs_function)(uint16_t irqmask) = NULL;
     65void (*eoi_function)(void) = NULL;
     66const char *irqs_info = NULL;
    6567
    6668void istate_decode(istate_t *istate)
     
    8688            istate_from_uspace(istate) ? istate->esp :
    8789            (uint32_t) &istate->esp);
     90}
     91
     92static void trap_virtual_eoi(void)
     93{
     94        if (eoi_function)
     95                eoi_function();
     96        else
     97                panic("No eoi_function.");
     98
    8899}
    89100
     
    168179    istate_t *istate __attribute__((unused)))
    169180{
    170         pic_ops->eoi(0);
     181        trap_virtual_eoi();
    171182        tlb_shootdown_ipi_recv();
    172183}
     
    181192        bool ack = false;
    182193        assert(inum < IRQ_COUNT);
    183         assert(inum != IRQ_PIC1);
     194        assert((inum != IRQ_PIC_SPUR) && (inum != IRQ_PIC1));
    184195
    185196        irq_t *irq = irq_dispatch_and_lock(inum);
     
    191202                if (irq->preack) {
    192203                        /* Send EOI before processing the interrupt */
    193                         pic_ops->eoi(inum);
     204                        trap_virtual_eoi();
    194205                        ack = true;
    195206                }
     
    197208                irq_spinlock_unlock(&irq->lock, false);
    198209        } else {
     210                /*
     211                 * Spurious interrupt.
     212                 */
    199213#ifdef CONFIG_DEBUG
    200                 log(LF_ARCH, LVL_DEBUG, "cpu%u: unhandled IRQ %u", CPU->id,
    201                     inum);
     214                printf("cpu%u: spurious interrupt (inum=%u)\n", CPU->id, inum);
    202215#endif
    203216        }
    204217
    205218        if (!ack)
    206                 pic_ops->eoi(inum);
    207 }
    208 
    209 static void pic_spurious(unsigned int n, istate_t *istate)
    210 {
    211         unsigned int inum = n - IVT_IRQBASE;
    212         if (!pic_ops->is_spurious(inum)) {
    213                 /* This is actually not a spurious IRQ, so proceed as usual. */
    214                 irq_interrupt(n, istate);
    215                 return;
    216         }
    217         pic_ops->handle_spurious(n);
    218 #ifdef CONFIG_DEBUG
    219         log(LF_ARCH, LVL_DEBUG, "cpu%u: PIC spurious interrupt %u", CPU->id,
    220             inum);
    221 #endif
     219                trap_virtual_eoi();
    222220}
    223221
     
    230228
    231229        for (i = 0; i < IRQ_COUNT; i++) {
    232                 if ((i != IRQ_PIC0_SPUR) && (i != IRQ_PIC1_SPUR) &&
    233                     (i != IRQ_PIC1))
     230                if ((i != IRQ_PIC_SPUR) && (i != IRQ_PIC1))
    234231                        exc_register(IVT_IRQBASE + i, "irq", true,
    235232                            (iroutine_t) irq_interrupt);
     
    242239        exc_register(VECTOR_GP, "gp_fault", true, (iroutine_t) gp_fault);
    243240        exc_register(VECTOR_XM, "simd_fp", true, (iroutine_t) simd_fp_exception);
    244         exc_register(VECTOR_PIC0_SPUR, "pic0_spurious", true,
    245             (iroutine_t) pic_spurious);
    246         exc_register(VECTOR_PIC1_SPUR, "pic1_spurious", true,
    247             (iroutine_t) pic_spurious);
    248241
    249242#ifdef CONFIG_SMP
     
    253246}
    254247
     248void trap_virtual_enable_irqs(uint16_t irqmask)
     249{
     250        if (enable_irqs_function)
     251                enable_irqs_function(irqmask);
     252        else
     253                panic("No enable_irqs_function.");
     254}
     255
     256void trap_virtual_disable_irqs(uint16_t irqmask)
     257{
     258        if (disable_irqs_function)
     259                disable_irqs_function(irqmask);
     260        else
     261                panic("No disable_irqs_function.");
     262}
     263
    255264/** @}
    256265 */
Note: See TracChangeset for help on using the changeset viewer.