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,35 → 186,22 |
break; |
} |
|
/* Read syscall arguments */ |
if (rc >= 0) { |
rc = debug_args_read(phoneid, threadid_buf[thread_idx], |
sc_args); |
} |
|
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); |
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; |
} |
} |
|
} |
|
printf("trace_loop(%d) exiting\n", thread_idx); |
} |
|