/branches/tracing/kernel/generic/include/proc/task.h |
---|
100,6 → 100,7 |
call_t *debug_begin_call; |
int not_stoppable_count; |
struct task *debugger; |
udebug_evmask_t debug_evmask; |
/** Kernel answerbox */ |
answerbox_t kernel_box; |
/branches/tracing/kernel/generic/include/udebug/udebug.h |
---|
48,6 → 48,10 |
*/ |
UDEBUG_M_END, |
/** Set which events should be captured. |
*/ |
UDEBUG_M_SET_EVMASK, |
/** Make sure the debugged task is still there. |
* This message is answered when the debugged task dies |
* or the debugging session ends. |
153,6 → 157,20 |
UDEBUG_EVENT_NEW_THREAD /**< The task created a new thread */ |
} udebug_event_t; |
#define UDEBUG_EVMASK(event) (1 << ((event) - 1)) |
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_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_NEW_THREAD) |
} udebug_evmask_t; |
#ifdef KERNEL |
typedef enum { |
/branches/tracing/kernel/generic/include/udebug/udebug_ops.h |
---|
39,6 → 39,7 |
int udebug_begin(call_t *call); |
int udebug_end(void); |
int udebug_set_evmask(udebug_evmask_t mask); |
int udebug_go(thread_t *t, call_t *call); |
int udebug_stop(thread_t *t, call_t *call); |
/branches/tracing/kernel/generic/src/proc/task.c |
---|
175,6 → 175,7 |
ta->dt_state = UDEBUG_TS_INACTIVE; |
ta->debug_begin_call = NULL; |
ta->not_stoppable_count = 0; |
ta->debug_evmask = 0; |
ipc_answerbox_init(&ta->kernel_box, ta); |
ta->kb_thread = NULL; |
/branches/tracing/kernel/generic/src/udebug/udebug_ipc.c |
---|
147,6 → 147,19 |
ipc_answer(&TASK->kernel_box, call); |
} |
static void udebug_receive_set_evmask(call_t *call) |
{ |
int rc; |
udebug_evmask_t mask; |
mask = IPC_GET_ARG2(call->data); |
rc = udebug_set_evmask(mask); |
IPC_SET_RETVAL(call->data, rc); |
ipc_answer(&TASK->kernel_box, call); |
} |
static void udebug_receive_go(call_t *call) |
{ |
thread_t *t; |
431,6 → 444,9 |
case UDEBUG_M_END: |
udebug_receive_end(call); |
break; |
case UDEBUG_M_SET_EVMASK: |
udebug_receive_set_evmask(call); |
break; |
case UDEBUG_M_GO: |
udebug_receive_go(call); |
break; |
/branches/tracing/kernel/generic/src/udebug/udebug.c |
---|
178,7 → 178,8 |
/* Must only generate events when in debugging session and have go */ |
if (THREAD->debug_active != true || |
THREAD->debug_stop == true) { |
THREAD->debug_stop == true || |
(TASK->debug_evmask & UDEBUG_EM_SYSCALL) == 0) { |
spinlock_unlock(&THREAD->debug_lock); |
interrupts_restore(ipl); |
return; |
/branches/tracing/kernel/generic/src/udebug/udebug_ops.c |
---|
204,6 → 204,34 |
return 0; |
} |
int udebug_set_evmask(udebug_evmask_t mask) |
{ |
ipl_t ipl; |
klog_printf("udebug_set_mask()"); |
ipl = interrupts_disable(); |
klog_printf("debugging task %llu", TASK->taskid); |
spinlock_lock(&TASK->lock); |
if (TASK->dt_state != UDEBUG_TS_ACTIVE) { |
spinlock_unlock(&TASK->lock); |
interrupts_restore(ipl); |
klog_printf("udebug_set_mask(): not active debuging session"); |
return EINVAL; |
} |
TASK->debug_evmask = mask; |
spinlock_unlock(&TASK->lock); |
interrupts_restore(ipl); |
return 0; |
} |
int udebug_go(thread_t *t, call_t *call) |
{ |
ipl_t ipl; |
/branches/tracing/uspace/app/sctrace/debug_api.c |
---|
50,6 → 50,12 |
return async_req_1_0(phoneid, IPC_M_DEBUG_ALL, UDEBUG_M_END); |
} |
int debug_set_evmask(unsigned phoneid, udebug_evmask_t mask) |
{ |
return async_req_2_0(phoneid, IPC_M_DEBUG_ALL, UDEBUG_M_SET_EVMASK, |
mask); |
} |
int debug_thread_read(unsigned phoneid, void *buffer, unsigned n, |
unsigned *copied, unsigned *needed) |
{ |
/branches/tracing/uspace/app/sctrace/debug_api.h |
---|
35,8 → 35,11 |
#ifndef DEBUG_API_H_ |
#define DEBUG_API_H_ |
#include <udebug.h> |
int debug_begin(unsigned phoneid); |
int debug_end(unsigned phoneid); |
int debug_set_evmask(unsigned phoneid, udebug_evmask_t mask); |
int debug_thread_read(unsigned phoneid, void *buffer, unsigned n, |
unsigned *copied, unsigned *needed); |
int debug_mem_read(unsigned phoneid, void *buffer, unsigned addr, unsigned n); |
/branches/tracing/uspace/app/sctrace/sctrace.c |
---|
73,17 → 73,22 |
{ |
int rc; |
printf("ipc_connect_task(%d)...\n", taskid); |
printf("ipc_connect_task(%d)... ", taskid); |
rc = ipc_connect_kbox(taskid); |
printf("-> %d\n", rc); |
phoneid = rc; |
if (rc < 0) return rc; |
printf("debug_begin()\n"); |
printf("debug_begin()... "); |
rc = debug_begin(phoneid); |
printf("-> %d\n", rc); |
if (rc < 0) return rc; |
printf("debug_set_evmask(0x%x)... ", UDEBUG_EM_ALL); |
rc = debug_set_evmask(phoneid, UDEBUG_EM_ALL); |
printf("-> %d\n", rc); |
if (rc < 0) return rc; |
return 0; |
} |