Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2902 → Rev 2903

/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;