Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2900 → Rev 2901

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