Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2898 → Rev 2899

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