Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2866 → Rev 2867

/branches/tracing/uspace/app/sctrace/sctrace.c
121,16 → 121,55
}
}
 
void event_syscall(unsigned thread_idx, unsigned sc_id, int sc_rc)
{
unsigned sc_args[6];
int rv_type;
int rc;
 
/* Read syscall arguments */
rc = debug_args_read(phoneid, threadid_buf[thread_idx], sc_args);
 
async_serialize_start();
 
printf("[%d] ", thread_idx);
 
if (rc < 0) {
printf("error\n");
async_serialize_end();
return;
}
 
/* Print syscall name, id and arguments */
printf("%s", syscall_desc[sc_id].name);
print_sc_args(sc_args, syscall_desc[sc_id].n_args);
rv_type = syscall_desc[sc_id].rv_type;
print_sc_retval(sc_rc, rv_type);
 
switch (sc_id) {
case SYS_IPC_CALL_ASYNC_SLOW:
sc_ipc_call_async_slow(sc_args);
break;
default:
break;
}
 
async_serialize_end();
}
 
void event_new_thread(unsigned hash)
{
async_serialize_start();
printf("new thread, hash 0x%x\n", hash);
async_serialize_end();
}
 
void trace_loop(void *thread_idx_arg)
{
int rc;
unsigned sc_args[6];
unsigned copied;
unsigned ev_type;
unsigned sc_id;
int sc_rc;
int rv_type;
unsigned thread_idx;
unsigned val0, val1;
 
thread_idx = (unsigned)thread_idx_arg;
printf("trace_loop(%d)\n", thread_idx);
137,9 → 176,9
 
while (!abort_trace) {
 
/* Run thread until a syscall is executed */
/* Run thread until an event occurs */
rc = debug_go(phoneid, threadid_buf[thread_idx],
&ev_type, &sc_id, &sc_rc);
&ev_type, &val0, &val1);
 
printf("rc = %d, ev_type=%d\n", rc, ev_type);
if (ev_type == UDEBUG_EVENT_FINISHED) {
147,33 → 186,20
break;
}
 
/* Read syscall arguments */
if (rc >= 0) {
rc = debug_args_read(phoneid, threadid_buf[thread_idx],
sc_args);
switch (ev_type) {
case UDEBUG_EVENT_SYSCALL:
event_syscall(thread_idx, val0, (int)val1);
break;
case UDEBUG_EVENT_NEW_THREAD:
event_new_thread(val0);
break;
default:
printf("unknown event type %d\n", ev_type);
break;
}
}
 
async_serialize_start();
 
printf("[%d] ", thread_idx);
 
/* Print syscall name, id and arguments */
if (rc >= 0) {
printf("%s", syscall_desc[sc_id].name);
print_sc_args(sc_args, syscall_desc[sc_id].n_args);
rv_type = syscall_desc[sc_id].rv_type;
print_sc_retval(sc_rc, rv_type);
}
 
async_serialize_end();
 
switch (sc_id) {
case SYS_IPC_CALL_ASYNC_SLOW:
sc_ipc_call_async_slow(sc_args);
break;
default:
break;
}
}
 
printf("trace_loop(%d) exiting\n", thread_idx);