Changeset cea12e9 in mainline for kernel/arch/ia32/src/interrupt.c


Ignore:
Timestamp:
2006-10-27T11:13:13Z (18 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
16d71f41
Parents:
8c84448
Message:

ia32: adopt new IRQ interface, mouse not tested yet

File:
1 edited

Legend:

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

    r8c84448 rcea12e9  
    5252#include <ipc/sysipc.h>
    5353#include <interrupt.h>
     54#include <ddi/irq.h>
    5455
    5556/*
     
    6162void (* eoi_function)(void) = NULL;
    6263
    63 void PRINT_INFO_ERRCODE(istate_t *istate)
     64void decode_istate(istate_t *istate)
    6465{
    6566        char *symbol = get_symtab_entry(istate->eip);
     
    8485}
    8586
    86 void null_interrupt(int n, istate_t *istate)
     87static void trap_virtual_eoi(void)
     88{
     89        if (eoi_function)
     90                eoi_function();
     91        else
     92                panic("no eoi_function\n");
     93
     94}
     95
     96static void null_interrupt(int n, istate_t *istate)
    8797{
    8898        fault_if_from_uspace(istate, "unserviced interrupt: %d", n);
    8999
    90         PRINT_INFO_ERRCODE(istate);
     100        decode_istate(istate);
    91101        panic("unserviced interrupt: %d\n", n);
    92102}
    93103
    94104/** General Protection Fault. */
    95 void gp_fault(int n, istate_t *istate)
     105static void gp_fault(int n, istate_t *istate)
    96106{
    97107        if (TASK) {
     
    116126        }
    117127
    118         PRINT_INFO_ERRCODE(istate);
     128        decode_istate(istate);
    119129        panic("general protection fault\n");
    120130}
    121131
    122 void ss_fault(int n, istate_t *istate)
     132static void ss_fault(int n, istate_t *istate)
    123133{
    124134        fault_if_from_uspace(istate, "stack fault");
    125135
    126         PRINT_INFO_ERRCODE(istate);
     136        decode_istate(istate);
    127137        panic("stack fault\n");
    128138}
    129139
    130 void simd_fp_exception(int n, istate_t *istate)
     140static void simd_fp_exception(int n, istate_t *istate)
    131141{
    132142        uint32_t mxcsr;
     
    139149                             (unative_t)mxcsr);
    140150
    141         PRINT_INFO_ERRCODE(istate);
     151        decode_istate(istate);
    142152        printf("MXCSR: %#zx\n",(unative_t)(mxcsr));
    143153        panic("SIMD FP exception(19)\n");
    144154}
    145155
    146 void nm_fault(int n, istate_t *istate)
     156static void nm_fault(int n, istate_t *istate)
    147157{
    148158#ifdef CONFIG_FPU_LAZY     
     
    154164}
    155165
    156 void syscall(int n, istate_t *istate)
    157 {
    158         panic("Obsolete syscall handler.");
    159 }
    160 
    161 void tlb_shootdown_ipi(int n, istate_t *istate)
     166#ifdef CONFIG_SMP
     167static void tlb_shootdown_ipi(int n, istate_t *istate)
    162168{
    163169        trap_virtual_eoi();
    164170        tlb_shootdown_ipi_recv();
    165171}
     172#endif
     173
     174/** Handler of IRQ exceptions */
     175static void irq_interrupt(int n, istate_t *istate)
     176{
     177        ASSERT(n >= IVT_IRQBASE);
     178       
     179        int inum = n - IVT_IRQBASE;
     180        ASSERT(inum < IRQ_COUNT);
     181        ASSERT((inum != IRQ_PIC_SPUR) && (inum != IRQ_PIC1));
     182
     183        irq_t *irq = irq_dispatch_and_lock(inum);
     184        if (irq) {
     185                /*
     186                 * The IRQ handler was found.
     187                 */
     188                irq->handler(irq, irq->arg);
     189                spinlock_unlock(&irq->lock);
     190        } else {
     191                /*
     192                 * Spurious interrupt.
     193                 */
     194#ifdef CONFIG_DEBUG
     195                printf("cpu%d: spurious interrupt (inum=%d)\n", CPU->id, inum);
     196#endif
     197        }
     198        trap_virtual_eoi();
     199}
     200
     201void interrupt_init(void)
     202{
     203        int i;
     204       
     205        for (i = 0; i < IVT_ITEMS; i++)
     206                exc_register(i, "null", (iroutine) null_interrupt);
     207       
     208        for (i = 0; i < IRQ_COUNT; i++) {
     209                if ((i != IRQ_PIC_SPUR) && (i != IRQ_PIC1))
     210                        exc_register(IVT_IRQBASE + i, "irq", (iroutine) irq_interrupt);
     211        }
     212       
     213        exc_register(7, "nm_fault", (iroutine) nm_fault);
     214        exc_register(12, "ss_fault", (iroutine) ss_fault);
     215        exc_register(13, "gp_fault", (iroutine) gp_fault);
     216        exc_register(19, "simd_fp", (iroutine) simd_fp_exception);
     217       
     218#ifdef CONFIG_SMP
     219        exc_register(VECTOR_TLB_SHOOTDOWN_IPI, "tlb_shootdown", (iroutine) tlb_shootdown_ipi);
     220#endif
     221}
    166222
    167223void trap_virtual_enable_irqs(uint16_t irqmask)
     
    181237}
    182238
    183 void trap_virtual_eoi(void)
    184 {
    185         if (eoi_function)
    186                 eoi_function();
    187         else
    188                 panic("no eoi_function\n");
    189 
    190 }
    191 
    192239/** @}
    193240 */
Note: See TracChangeset for help on using the changeset viewer.