Ignore:
File:
1 edited

Legend:

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

    ra000878c r9171f12  
    6363void (* eoi_function)(void) = NULL;
    6464
    65 void decode_istate(int n, istate_t *istate)
    66 {
    67         const char *symbol = symtab_fmt_name_lookup(istate->rip);
    68        
    69         printf("-----EXCEPTION(%d) OCCURED----- ( %s )\n", n, __func__);
    70         printf("%%rip: %#llx (%s)\n", istate->rip, symbol);
    71         printf("ERROR_WORD=%#llx\n", istate->error_word);
    72         printf("%%cs=%#llx, rflags=%#llx, %%cr0=%#llx\n", istate->cs,
    73             istate->rflags, read_cr0());
    74         printf("%%rax=%#llx, %%rcx=%#llx, %%rdx=%#llx\n", istate->rax,
    75             istate->rcx, istate->rdx);
    76         printf("%%rsi=%#llx, %%rdi=%#llx, %%r8=%#llx\n", istate->rsi,
    77             istate->rdi, istate->r8);
    78         printf("%%r9=%#llx, %%r10=%#llx, %%r11=%#llx\n", istate->r9,
    79             istate->r10, istate->r11);
    80         printf("%%rsp=%#llx\n", &istate->stack[0]);
    81        
    82         stack_trace_istate(istate);
     65void istate_decode(istate_t *istate)
     66{
     67        printf("cs =%p\trip=%p\trfl=%p\terr=%p\n",
     68            istate->cs, istate->rip, istate->rflags, istate->error_word);
     69
     70        if (istate_from_uspace(istate))
     71                printf("ss =%p\n", istate->ss);
     72       
     73        printf("rax=%p\trbx=%p\trcx=%p\trdx=%p\n",
     74            istate->rax, istate->rbx, istate->rcx, istate->rdx);
     75        printf("rsi=%p\trdi=%p\trbp=%p\trsp=%p\n",
     76            istate->rsi, istate->rdi, istate->rbp,
     77            istate_from_uspace(istate) ? istate->rsp : (uintptr_t)&istate->rsp);
     78        printf("r8 =%p\tr9 =%p\tr10=%p\tr11=%p\n",
     79            istate->r8, istate->r9, istate->r10, istate->r11);
     80        printf("r12=%p\tr13=%p\tr14=%p\tr15=%p\n",
     81            istate->r12, istate->r13, istate->r14, istate->r15);
    8382}
    8483
     
    9291}
    9392
    94 static void null_interrupt(int n, istate_t *istate)
    95 {
    96         fault_if_from_uspace(istate, "Unserviced interrupt: %d.", n);
    97         decode_istate(n, istate);
    98         panic("Unserviced interrupt.");
    99 }
    100 
    101 static void de_fault(int n, istate_t *istate)
     93static void null_interrupt(unsigned int n, istate_t *istate)
     94{
     95        fault_if_from_uspace(istate, "Unserviced interrupt: %u.", n);
     96        panic_badtrap(istate, n, "Unserviced interrupt.");
     97}
     98
     99static void de_fault(unsigned int n, istate_t *istate)
    102100{
    103101        fault_if_from_uspace(istate, "Divide error.");
    104         decode_istate(n, istate);
    105         panic("Divide error.");
    106 }
    107 
    108 /** General Protection Fault. */
    109 static void gp_fault(int n, istate_t *istate)
     102        panic_badtrap(istate, n, "Divide error.");
     103}
     104
     105/** General Protection Fault.
     106 *
     107 */
     108static void gp_fault(unsigned int n, istate_t *istate)
    110109{
    111110        if (TASK) {
    112                 size_t ver;
    113 
    114                 spinlock_lock(&TASK->lock);
    115                 ver = TASK->arch.iomapver;
    116                 spinlock_unlock(&TASK->lock);
    117 
     111                irq_spinlock_lock(&TASK->lock, false);
     112                size_t ver = TASK->arch.iomapver;
     113                irq_spinlock_unlock(&TASK->lock, false);
     114               
    118115                if (CPU->arch.iomapver_copy != ver) {
    119116                        /*
     
    129126                fault_if_from_uspace(istate, "General protection fault.");
    130127        }
    131 
    132         decode_istate(n, istate);
    133         panic("General protection fault.");
    134 }
    135 
    136 static void ss_fault(int n, istate_t *istate)
     128        panic_badtrap(istate, n, "General protection fault.");
     129}
     130
     131static void ss_fault(unsigned int n, istate_t *istate)
    137132{
    138133        fault_if_from_uspace(istate, "Stack fault.");
    139         decode_istate(n, istate);
    140         panic("Stack fault.");
    141 }
    142 
    143 static void nm_fault(int n, istate_t *istate)
     134        panic_badtrap(istate, n, "Stack fault.");
     135}
     136
     137static void nm_fault(unsigned int n, istate_t *istate)
    144138{
    145139#ifdef CONFIG_FPU_LAZY
     
    152146
    153147#ifdef CONFIG_SMP
    154 static void tlb_shootdown_ipi(int n, istate_t *istate)
     148static void tlb_shootdown_ipi(unsigned int n, istate_t *istate)
    155149{
    156150        trap_virtual_eoi();
     
    159153#endif
    160154
    161 /** Handler of IRQ exceptions */
    162 static void irq_interrupt(int n, istate_t *istate)
     155/** Handler of IRQ exceptions.
     156 *
     157 */
     158static void irq_interrupt(unsigned int n, istate_t *istate)
    163159{
    164160        ASSERT(n >= IVT_IRQBASE);
    165161       
    166         int inum = n - IVT_IRQBASE;
     162        unsigned int inum = n - IVT_IRQBASE;
    167163        bool ack = false;
    168164        ASSERT(inum < IRQ_COUNT);
     
    174170                 * The IRQ handler was found.
    175171                 */
    176                  
     172               
    177173                if (irq->preack) {
    178174                        /* Send EOI before processing the interrupt */
     
    181177                }
    182178                irq->handler(irq);
    183                 spinlock_unlock(&irq->lock);
     179                irq_spinlock_unlock(&irq->lock, false);
    184180        } else {
    185181                /*
     
    187183                 */
    188184#ifdef CONFIG_DEBUG
    189                 printf("cpu%d: spurious interrupt (inum=%d)\n", CPU->id, inum);
     185                printf("cpu%u: spurious interrupt (inum=%u)\n", CPU->id, inum);
    190186#endif
    191187        }
     
    197193void interrupt_init(void)
    198194{
    199         int i;
     195        unsigned int i;
    200196       
    201197        for (i = 0; i < IVT_ITEMS; i++)
    202                 exc_register(i, "null", (iroutine) null_interrupt);
     198                exc_register(i, "null", false, (iroutine_t) null_interrupt);
    203199       
    204200        for (i = 0; i < IRQ_COUNT; i++) {
    205201                if ((i != IRQ_PIC_SPUR) && (i != IRQ_PIC1))
    206                         exc_register(IVT_IRQBASE + i, "irq",
    207                             (iroutine) irq_interrupt);
     202                        exc_register(IVT_IRQBASE + i, "irq", true,
     203                            (iroutine_t) irq_interrupt);
    208204        }
    209205       
    210         exc_register(0, "de_fault", (iroutine) de_fault);
    211         exc_register(7, "nm_fault", (iroutine) nm_fault);
    212         exc_register(12, "ss_fault", (iroutine) ss_fault);
    213         exc_register(13, "gp_fault", (iroutine) gp_fault);
    214         exc_register(14, "ident_mapper", (iroutine) ident_page_fault);
     206        exc_register(0, "de_fault", true, (iroutine_t) de_fault);
     207        exc_register(7, "nm_fault", true, (iroutine_t) nm_fault);
     208        exc_register(12, "ss_fault", true, (iroutine_t) ss_fault);
     209        exc_register(13, "gp_fault", true, (iroutine_t) gp_fault);
    215210       
    216211#ifdef CONFIG_SMP
    217         exc_register(VECTOR_TLB_SHOOTDOWN_IPI, "tlb_shootdown",
    218             (iroutine) tlb_shootdown_ipi);
     212        exc_register(VECTOR_TLB_SHOOTDOWN_IPI, "tlb_shootdown", true,
     213            (iroutine_t) tlb_shootdown_ipi);
    219214#endif
    220215}
Note: See TracChangeset for help on using the changeset viewer.