/branches/tracing/kernel/generic/include/udebug/udebug.h |
---|
155,7 → 155,8 |
UDEBUG_EVENT_STOP, /**< Stopped on DEBUG_STOP request */ |
UDEBUG_EVENT_SYSCALL_B, /**< Before beginning syscall execution */ |
UDEBUG_EVENT_SYSCALL_E, /**< After finishing syscall execution */ |
UDEBUG_EVENT_NEW_THREAD /**< The task created a new thread */ |
UDEBUG_EVENT_THREAD_B, /**< The task created a new thread */ |
UDEBUG_EVENT_THREAD_E, /**< A thread exited */ |
} udebug_event_t; |
#define UDEBUG_EVMASK(event) (1 << ((event) - 1)) |
165,13 → 166,15 |
UDEBUG_EM_STOP = UDEBUG_EVMASK(UDEBUG_EVENT_STOP), |
UDEBUG_EM_SYSCALL_B = UDEBUG_EVMASK(UDEBUG_EVENT_SYSCALL_B), |
UDEBUG_EM_SYSCALL_E = UDEBUG_EVMASK(UDEBUG_EVENT_SYSCALL_E), |
UDEBUG_EM_NEW_THREAD = UDEBUG_EVMASK(UDEBUG_EVENT_NEW_THREAD), |
UDEBUG_EM_THREAD_B = UDEBUG_EVMASK(UDEBUG_EVENT_THREAD_B), |
UDEBUG_EM_THREAD_E = UDEBUG_EVMASK(UDEBUG_EVENT_THREAD_E), |
UDEBUG_EM_ALL = |
UDEBUG_EVMASK(UDEBUG_EVENT_FINISHED) | |
UDEBUG_EVMASK(UDEBUG_EVENT_STOP) | |
UDEBUG_EVMASK(UDEBUG_EVENT_SYSCALL_B) | |
UDEBUG_EVMASK(UDEBUG_EVENT_SYSCALL_E) | |
UDEBUG_EVMASK(UDEBUG_EVENT_NEW_THREAD) |
UDEBUG_EVMASK(UDEBUG_EVENT_THREAD_B) | |
UDEBUG_EVMASK(UDEBUG_EVENT_THREAD_E) |
} udebug_evmask_t; |
#ifdef KERNEL |
193,8 → 196,10 |
void udebug_syscall_event(unative_t a1, unative_t a2, unative_t a3, |
unative_t a4, unative_t a5, unative_t a6, unative_t id, unative_t rc, |
bool end_variant); |
void udebug_new_thread_event(struct thread *t); |
void udebug_thread_b_event(struct thread *t); |
void udebug_thread_e_event(void); |
void udebug_stoppable_begin(void); |
void udebug_stoppable_end(void); |
/branches/tracing/kernel/generic/src/proc/thread.c |
---|
456,6 → 456,9 |
ipl_t ipl; |
if (THREAD->flags & THREAD_FLAG_USPACE) { |
/* Generate udebug THREAD_E event */ |
udebug_thread_e_event(); |
if (atomic_predec(&TASK->lifecount) == 0) { |
/* |
* We are the last userspace thread in the task that |
756,7 → 759,8 |
thread_attach(t, TASK); |
thread_ready(t); |
udebug_new_thread_event(t); |
/* Generate udebug THREAD_B event */ |
udebug_thread_b_event(t); |
return 0; |
} else |
/branches/tracing/kernel/generic/src/udebug/udebug.c |
---|
228,7 → 228,7 |
waitq_sleep(&THREAD->go_wq); |
} |
void udebug_new_thread_event(struct thread *t) |
void udebug_thread_b_event(struct thread *t) |
{ |
call_t *call; |
ipl_t ipl; |
236,7 → 236,7 |
ipl = interrupts_disable(); |
spinlock_lock(&THREAD->debug_lock); |
klog_printf("udebug_new_thread_event"); |
klog_printf("udebug_thread_b_event"); |
klog_printf("- check state"); |
/* Must only generate events when in debugging session */ |
253,7 → 253,7 |
call = THREAD->debug_go_call; |
IPC_SET_RETVAL(call->data, 0); |
IPC_SET_ARG1(call->data, UDEBUG_EVENT_NEW_THREAD); |
IPC_SET_ARG1(call->data, UDEBUG_EVENT_THREAD_B); |
IPC_SET_ARG2(call->data, (unative_t)t); |
/* |
263,7 → 263,7 |
*/ |
THREAD->debug_stop = true; |
THREAD->cur_event = UDEBUG_EVENT_NEW_THREAD; |
THREAD->cur_event = UDEBUG_EVENT_THREAD_B; |
spinlock_unlock(&THREAD->debug_lock); |
spinlock_lock(&TASK->lock); |
276,6 → 276,54 |
waitq_sleep(&THREAD->go_wq); |
} |
void udebug_thread_e_event(void) |
{ |
call_t *call; |
ipl_t ipl; |
ipl = interrupts_disable(); |
spinlock_lock(&THREAD->debug_lock); |
klog_printf("udebug_thread_e_event"); |
klog_printf("- check state"); |
/* Must only generate events when in debugging session */ |
if (THREAD->debug_active != true) { |
klog_printf("- debug_active: %s, debug_stop: %s", |
THREAD->debug_active ? "yes(+)" : "no(-)", |
THREAD->debug_stop ? "yes(-)" : "no(+)"); |
spinlock_unlock(&THREAD->debug_lock); |
interrupts_restore(ipl); |
return; |
} |
klog_printf("- trigger event"); |
call = THREAD->debug_go_call; |
IPC_SET_RETVAL(call->data, 0); |
IPC_SET_ARG1(call->data, UDEBUG_EVENT_THREAD_E); |
/* |
* Make sure debug_stop is true when going to sleep |
* in case we get woken up by DEBUG_END. (At which |
* point it must be back to the initial true value). |
*/ |
THREAD->debug_stop = true; |
THREAD->cur_event = UDEBUG_EVENT_THREAD_E; |
spinlock_unlock(&THREAD->debug_lock); |
spinlock_lock(&TASK->lock); |
ipc_answer(&TASK->answerbox, THREAD->debug_go_call); |
spinlock_unlock(&TASK->lock); |
interrupts_restore(ipl); |
klog_printf("- sleep"); |
waitq_sleep(&THREAD->go_wq); |
} |
/** |
* Terminate task debugging session. |
* |
/branches/tracing/uspace/app/sctrace/sctrace.c |
---|
326,7 → 326,7 |
async_serialize_end(); |
} |
void event_new_thread(unsigned hash) |
void event_thread_b(unsigned hash) |
{ |
async_serialize_start(); |
printf("new thread, hash 0x%x\n", hash); |
378,9 → 378,13 |
} |
printf("resumed\n"); |
break; |
case UDEBUG_EVENT_NEW_THREAD: |
event_new_thread(val0); |
case UDEBUG_EVENT_THREAD_B: |
event_thread_b(val0); |
break; |
case UDEBUG_EVENT_THREAD_E: |
printf("thread 0x%x exited\n", val0); |
abort_trace = 1; |
break; |
default: |
printf("unknown event type %d\n", ev_type); |
break; |