Ignore:
File:
1 edited

Legend:

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

    r5bcf1f9 r04e3d9f  
    4545#include <console/console.h>
    4646#include <console/cmd.h>
     47#include <ipc/event.h>
    4748#include <synch/mutex.h>
    4849#include <time/delay.h>
     
    162163{
    163164        fault_if_from_uspace(istate, "Unhandled exception %u.", n);
    164         panic_badtrap(istate, n, "Unhandled exception %u.", n);
     165        panic("Unhandled exception %u.", n);
    165166}
    166167
     
    175176        printf("Task %s (%" PRIu64 ") killed due to an exception at "
    176177            "program counter %p.\n", TASK->name, TASK->taskid,
    177             (void *) istate_get_pc(istate));
     178            istate_get_pc(istate));
    178179       
    179180        stack_trace_istate(istate);
     
    187188        printf("\n");
    188189       
    189         task_kill_self(true);
    190 }
    191 
    192 /** Get istate structure of a thread.
    193  *
    194  * Get pointer to the istate structure at the bottom of the kernel stack.
    195  *
    196  * This function can be called in interrupt or user context. In interrupt
    197  * context the istate structure is created by the low-level exception
    198  * handler. In user context the istate structure is created by the
    199  * low-level syscall handler.
    200  */
    201 istate_t *istate_get(thread_t *thread)
    202 {
    203190        /*
    204          * The istate structure should be right at the bottom of the kernel
    205          * stack.
     191         * Userspace can subscribe for FAULT events to take action
     192         * whenever a thread faults. (E.g. take a dump, run a debugger).
     193         * The notification is always available, but unless Udebug is enabled,
     194         * that's all you get.
    206195         */
    207         return (istate_t *) ((uint8_t *) thread->kstack + THREAD_STACK_SIZE -
    208             sizeof(istate_t));
     196        if (event_is_subscribed(EVENT_FAULT)) {
     197                /* Notify the subscriber that a fault occurred. */
     198                event_notify_3(EVENT_FAULT, LOWER32(TASK->taskid),
     199                    UPPER32(TASK->taskid), (unative_t) THREAD);
     200               
     201#ifdef CONFIG_UDEBUG
     202                /* Wait for a debugging session. */
     203                udebug_thread_fault();
     204#endif
     205        }
     206       
     207        task_kill(TASK->taskid);
     208        thread_exit();
    209209}
    210210
     
    263263               
    264264                const char *symbol =
    265                     symtab_fmt_name_lookup((sysarg_t) exc_table[i].handler);
     265                    symtab_fmt_name_lookup((unative_t) exc_table[i].handler);
    266266               
    267267#ifdef __32_BITS__
Note: See TracChangeset for help on using the changeset viewer.