/branches/tracing/kernel/generic/include/udebug/udebug.h |
---|
153,7 → 153,8 |
typedef enum { |
UDEBUG_EVENT_FINISHED = 1, /**< Debuging session has finished */ |
UDEBUG_EVENT_STOP, /**< Stopped on DEBUG_STOP request */ |
UDEBUG_EVENT_SYSCALL, /**< A syscall has been executed */ |
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_t; |
162,12 → 163,14 |
typedef enum { |
UDEBUG_EM_FINISHED = UDEBUG_EVMASK(UDEBUG_EVENT_FINISHED), |
UDEBUG_EM_STOP = UDEBUG_EVMASK(UDEBUG_EVENT_STOP), |
UDEBUG_EM_SYSCALL = UDEBUG_EVMASK(UDEBUG_EVENT_SYSCALL), |
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_ALL = |
UDEBUG_EVMASK(UDEBUG_EVENT_FINISHED) | |
UDEBUG_EVMASK(UDEBUG_EVENT_STOP) | |
UDEBUG_EVMASK(UDEBUG_EVENT_SYSCALL) | |
UDEBUG_EVMASK(UDEBUG_EVENT_SYSCALL_B) | |
UDEBUG_EVMASK(UDEBUG_EVENT_SYSCALL_E) | |
UDEBUG_EVMASK(UDEBUG_EVENT_NEW_THREAD) |
} udebug_evmask_t; |
188,7 → 191,8 |
struct thread; |
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); |
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_stoppable_begin(void); |
/branches/tracing/kernel/generic/src/syscall/syscall.c |
---|
99,8 → 99,10 |
unative_t rc; |
istate_t fake_state; |
if (id < SYSCALL_END) { |
THREAD->uspace_state = &fake_state; |
THREAD->uspace_state = &fake_state; |
udebug_syscall_event(a1, a2, a3, a4, a5, a6, id, 0, false); |
if (id < SYSCALL_END) { |
udebug_stoppable_begin(); |
rc = syscall_table[id](a1, a2, a3, a4, a5, a6); |
} else { |
113,7 → 115,7 |
if (THREAD->interrupted) |
thread_exit(); |
udebug_syscall_event(a1, a2, a3, a4, a5, a6, id, rc); |
udebug_syscall_event(a1, a2, a3, a4, a5, a6, id, rc, true); |
udebug_stoppable_end(); |
THREAD->uspace_state = NULL; |
/branches/tracing/kernel/generic/src/udebug/udebug.c |
---|
168,11 → 168,15 |
} |
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) |
unative_t a4, unative_t a5, unative_t a6, unative_t id, unative_t rc, |
bool end_variant) |
{ |
call_t *call; |
ipl_t ipl; |
udebug_event_t etype; |
etype = end_variant ? UDEBUG_EVENT_SYSCALL_E : UDEBUG_EVENT_SYSCALL_B; |
ipl = interrupts_disable(); |
spinlock_lock(&THREAD->debug_lock); |
179,7 → 183,7 |
/* Must only generate events when in debugging session and have go */ |
if (THREAD->debug_active != true || |
THREAD->debug_stop == true || |
(TASK->debug_evmask & UDEBUG_EM_SYSCALL) == 0) { |
(TASK->debug_evmask & UDEBUG_EVMASK(etype)) == 0) { |
spinlock_unlock(&THREAD->debug_lock); |
interrupts_restore(ipl); |
return; |
188,7 → 192,7 |
klog_printf("udebug_syscall_event"); |
call = THREAD->debug_go_call; |
IPC_SET_RETVAL(call->data, 0); |
IPC_SET_ARG1(call->data, UDEBUG_EVENT_SYSCALL); |
IPC_SET_ARG1(call->data, etype); |
IPC_SET_ARG2(call->data, id); |
IPC_SET_ARG3(call->data, rc); |
klog_printf("udebug_syscall_event/ipc_answer"); |
207,7 → 211,7 |
*/ |
THREAD->debug_stop = true; |
THREAD->cur_event = UDEBUG_EVENT_SYSCALL; |
THREAD->cur_event = etype; |
spinlock_unlock(&THREAD->debug_lock); |
spinlock_lock(&TASK->lock); |
/branches/tracing/kernel/generic/src/udebug/udebug_ops.c |
---|
397,7 → 397,8 |
} |
/* Additionally we need to verify that we are inside a syscall */ |
if (t->cur_event != UDEBUG_EVENT_SYSCALL) { |
if (t->cur_event != UDEBUG_EVENT_SYSCALL_B && |
t->cur_event != UDEBUG_EVENT_SYSCALL_E) { |
_thread_op_end(t); |
interrupts_restore(ipl); |
/branches/tracing/uspace/app/sctrace/sctrace.c |
---|
255,7 → 255,7 |
} |
} |
void event_syscall(unsigned thread_id, unsigned thread_hash, unsigned sc_id, int sc_rc) |
void event_syscall_b(unsigned thread_id, unsigned thread_hash, unsigned sc_id, int sc_rc) |
{ |
unsigned sc_args[6]; |
int rv_type; |
277,6 → 277,29 |
/* Print syscall name, id and arguments */ |
printf("%s", syscall_desc[sc_id].name); |
print_sc_args(sc_args, syscall_desc[sc_id].n_args); |
async_serialize_end(); |
} |
void event_syscall_e(unsigned thread_id, unsigned thread_hash, unsigned sc_id, int sc_rc) |
{ |
unsigned sc_args[6]; |
int rv_type; |
int rc; |
/* Read syscall arguments */ |
rc = debug_args_read(phoneid, thread_hash, sc_args); |
async_serialize_start(); |
// printf("[%d] ", thread_id); |
if (rc < 0) { |
printf("error\n"); |
async_serialize_end(); |
return; |
} |
rv_type = syscall_desc[sc_id].rv_type; |
print_sc_retval(sc_rc, rv_type); |
339,9 → 362,12 |
if (rc >= 0) { |
switch (ev_type) { |
case UDEBUG_EVENT_SYSCALL: |
event_syscall(thread_id, thread_hash, val0, (int)val1); |
case UDEBUG_EVENT_SYSCALL_B: |
event_syscall_b(thread_id, thread_hash, val0, (int)val1); |
break; |
case UDEBUG_EVENT_SYSCALL_E: |
event_syscall_e(thread_id, thread_hash, val0, (int)val1); |
break; |
case UDEBUG_EVENT_STOP: |
printf("stop event\n"); |
printf("waiting for resume\n"); |