Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/interrupt/interrupt.c

    rda1bafb r07640dfd  
    3232/**
    3333 * @file
    34  * @brief Interrupt redirector.
     34 * @brief       Interrupt redirector.
    3535 *
    3636 * This file provides means of registering interrupt handlers
    3737 * by kernel functions and calling the handlers when interrupts
    3838 * occur.
    39  *
    4039 */
    4140
     
    6261
    6362/** Register exception handler
    64  *
    65  * @param n       Exception number
    66  * @param name    Description
    67  * @param handler Exception handler
    68  *
    69  */
    70 iroutine exc_register(int n, const char *name, iroutine handler)
     63 *
     64 * @param n Exception number
     65 * @param name Description
     66 * @param f Exception handler
     67 */
     68iroutine exc_register(int n, const char *name, iroutine f)
    7169{
    7270        ASSERT(n < IVT_ITEMS);
    7371       
     72        iroutine old;
     73       
    7474        spinlock_lock(&exctbl_lock);
    7575       
    76         iroutine old = exc_table[n].f;
    77         exc_table[n].f = handler;
     76        old = exc_table[n].f;
     77        exc_table[n].f = f;
    7878        exc_table[n].name = name;
    7979       
     
    8787 * Called directly from the assembler code.
    8888 * CPU is interrupts_disable()'d.
    89  *
    9089 */
    9190void exc_dispatch(int n, istate_t *istate)
    9291{
    9392        ASSERT(n < IVT_ITEMS);
    94        
     93
    9594        /* Account user cycles */
    96         if (THREAD) {
    97                 irq_spinlock_lock(&THREAD->lock, false);
     95        if (THREAD)
    9896                thread_update_accounting(true);
    99                 irq_spinlock_unlock(&THREAD->lock, false);
    100         }
    101        
     97
    10298#ifdef CONFIG_UDEBUG
     99        if (THREAD) THREAD->udebug.uspace_state = istate;
     100#endif
     101       
     102        exc_table[n].f(n + IVT_FIRST, istate);
     103
     104#ifdef CONFIG_UDEBUG
     105        if (THREAD) THREAD->udebug.uspace_state = NULL;
     106#endif
     107
     108        /* This is a safe place to exit exiting thread */
     109        if (THREAD && THREAD->interrupted && istate_from_uspace(istate))
     110                thread_exit();
     111
    103112        if (THREAD)
    104                 THREAD->udebug.uspace_state = istate;
    105 #endif
    106        
    107         exc_table[n].f(n + IVT_FIRST, istate);
    108        
    109 #ifdef CONFIG_UDEBUG
    110         if (THREAD)
    111                 THREAD->udebug.uspace_state = NULL;
    112 #endif
    113        
    114         /* This is a safe place to exit exiting thread */
    115         if ((THREAD) && (THREAD->interrupted) && (istate_from_uspace(istate)))
    116                 thread_exit();
    117        
    118         if (THREAD) {
    119                 irq_spinlock_lock(&THREAD->lock, false);
    120113                thread_update_accounting(false);
    121                 irq_spinlock_unlock(&THREAD->lock, false);
    122         }
    123 }
    124 
    125 /** Default 'null' exception handler
    126  *
    127  */
     114}
     115
     116/** Default 'null' exception handler */
    128117static void exc_undef(int n, istate_t *istate)
    129118{
     
    132121}
    133122
    134 /** Terminate thread and task if exception came from userspace.
    135  *
    136  */
     123/** Terminate thread and task if exception came from userspace. */
    137124void fault_if_from_uspace(istate_t *istate, const char *fmt, ...)
    138125{
     126        task_t *task = TASK;
     127        va_list args;
     128
    139129        if (!istate_from_uspace(istate))
    140130                return;
    141        
     131
    142132        printf("Task %s (%" PRIu64 ") killed due to an exception at "
    143             "program counter %p.\n", TASK->name, TASK->taskid,
     133            "program counter %p.\n", task->name, task->taskid,
    144134            istate_get_pc(istate));
    145        
     135
    146136        stack_trace_istate(istate);
    147        
     137
    148138        printf("Kill message: ");
    149        
    150         va_list args;
    151139        va_start(args, fmt);
    152140        vprintf(fmt, args);
    153141        va_end(args);
    154142        printf("\n");
    155        
     143
    156144        /*
    157145         * Userspace can subscribe for FAULT events to take action
     
    164152                event_notify_3(EVENT_FAULT, LOWER32(TASK->taskid),
    165153                    UPPER32(TASK->taskid), (unative_t) THREAD);
    166                
     154
    167155#ifdef CONFIG_UDEBUG
    168156                /* Wait for a debugging session. */
     
    170158#endif
    171159        }
    172        
    173         task_kill(TASK->taskid);
     160
     161        task_kill(task->taskid);
    174162        thread_exit();
    175163}
     
    177165#ifdef CONFIG_KCONSOLE
    178166
    179 /** Print all exceptions
    180  *
    181  */
     167/** kconsole cmd - print all exceptions */
    182168static int cmd_exc_print(cmd_arg_t *argv)
    183169{
    184170#if (IVT_ITEMS > 0)
    185171        unsigned int i;
    186        
     172
    187173        spinlock_lock(&exctbl_lock);
    188        
     174
    189175#ifdef __32_BITS__
    190176        printf("Exc Description          Handler    Symbol\n");
    191177        printf("--- -------------------- ---------- --------\n");
    192178#endif
    193        
     179
    194180#ifdef __64_BITS__
    195181        printf("Exc Description          Handler            Symbol\n");
     
    199185        for (i = 0; i < IVT_ITEMS; i++) {
    200186                const char *symbol = symtab_fmt_name_lookup((unative_t) exc_table[i].f);
    201                
     187
    202188#ifdef __32_BITS__
    203189                printf("%-3u %-20s %10p %s\n", i + IVT_FIRST, exc_table[i].name,
    204190                        exc_table[i].f, symbol);
    205191#endif
    206                
     192
    207193#ifdef __64_BITS__
    208194                printf("%-3u %-20s %18p %s\n", i + IVT_FIRST, exc_table[i].name,
     
    225211}
    226212
     213
    227214static cmd_info_t exc_info = {
    228215        .name = "exc",
     
    234221};
    235222
    236 #endif /* CONFIG_KCONSOLE */
    237 
    238 /** Initialize generic exception handling support
    239  *
    240  */
     223#endif
     224
     225/** Initialize generic exception handling support */
    241226void exc_init(void)
    242227{
    243         (void) exc_undef;
    244        
    245 #if (IVT_ITEMS > 0)
    246         unsigned int i;
    247        
     228        int i;
     229
    248230        for (i = 0; i < IVT_ITEMS; i++)
    249231                exc_register(i, "undef", (iroutine) exc_undef);
    250 #endif
    251        
     232
    252233#ifdef CONFIG_KCONSOLE
    253234        cmd_initialize(&exc_info);
Note: See TracChangeset for help on using the changeset viewer.