/branches/tracing/uspace/app/sctrace/ipc_desc.h |
---|
0,0 → 1,20 |
/** @addtogroup sctrace |
* @{ |
*/ |
/** @file |
*/ |
#ifndef IPC_DESC_H_ |
#define IPC_DESC_H_ |
typedef struct { |
int number; |
char *name; |
} ipc_m_desc_t; |
extern ipc_m_desc_t ipc_methods[]; |
#endif |
/** @} |
*/ |
/branches/tracing/uspace/app/sctrace/ipc.h |
---|
0,0 → 1,18 |
/** @addtogroup sctrace |
* @{ |
*/ |
/** @file |
*/ |
#ifndef IPC_H_ |
#define IPC_H_ |
#include <ipc/ipc.h> |
void ipc_parse_call_out(int phone, ipc_call_t *call); |
void ipc_parse_call_in(ipc_call_t *call); |
#endif |
/** @} |
*/ |
/branches/tracing/uspace/app/sctrace/sctrace.c |
---|
14,6 → 14,7 |
#include <async.h> |
#include "syscalls.h" |
#include "ipc.h" |
#include "errors.h" |
#include "debug_api.h" |
111,21 → 112,53 |
putchar(')'); |
} |
void sc_ipc_call_async_fast(unsigned *sc_args) |
{ |
ipc_call_t call; |
int phoneid; |
phoneid = sc_args[0]; |
IPC_SET_METHOD(call, sc_args[1]); |
IPC_SET_ARG1(call, sc_args[2]); |
IPC_SET_ARG2(call, sc_args[3]); |
IPC_SET_ARG3(call, sc_args[4]); |
IPC_SET_ARG4(call, sc_args[5]); |
IPC_SET_ARG5(call, 0); |
ipc_parse_call_out(phoneid, &call); |
} |
void sc_ipc_call_async_slow(unsigned *sc_args) |
{ |
unsigned ipc_args[6]; |
ipc_call_t call; |
int rc; |
memset(ipc_args, 0, sizeof(ipc_args)); |
rc = debug_mem_read(phoneid, ipc_args, sc_args[1], sizeof(ipc_args)); |
memset(&call, 0, sizeof(call)); |
rc = debug_mem_read(phoneid, &call.args, sc_args[1], sizeof(call.args)); |
if (rc >= 0) { |
printf("args: (%u, %u, %u, %u, %u, %u)\n", |
ipc_args[0], ipc_args[1], ipc_args[2], |
ipc_args[3], ipc_args[4], ipc_args[5]); |
ipc_parse_call_out(sc_args[0], &call); |
} |
} |
void sc_ipc_wait(unsigned *sc_args, int sc_rc) |
{ |
ipc_call_t call; |
int rc; |
if (sc_rc == 0) return 0; |
memset(&call, 0, sizeof(call)); |
rc = debug_mem_read(phoneid, &call, sc_args[0], sizeof(call)); |
printf("debug_mem_read(phone %d, dest %d, app-mem src %d, size %d -> %d\n", |
phoneid, (int)&call, sc_args[0], sizeof(call), rc); |
if (rc >= 0) { |
ipc_parse_call_in(&call); |
} |
} |
void event_syscall(unsigned thread_id, unsigned thread_hash, unsigned sc_id, int sc_rc) |
{ |
unsigned sc_args[6]; |
152,9 → 185,15 |
print_sc_retval(sc_rc, rv_type); |
switch (sc_id) { |
case SYS_IPC_CALL_ASYNC_FAST: |
sc_ipc_call_async_fast(sc_args); |
break; |
case SYS_IPC_CALL_ASYNC_SLOW: |
sc_ipc_call_async_slow(sc_args); |
break; |
case SYS_IPC_WAIT: |
sc_ipc_wait(sc_args, sc_rc); |
break; |
default: |
break; |
} |
/branches/tracing/uspace/app/sctrace/ipc_desc.c |
---|
0,0 → 1,25 |
/** @addtogroup sctrace |
* @{ |
*/ |
/** @file |
*/ |
#include "ipc_desc.h" |
ipc_m_desc_t ipc_methods[] = { |
/* System methods */ |
{ 1, "CONNECT_TO_ME" }, |
{ 2, "CONNECT_ME_TO" }, |
{ 3, "PHONE_HUNGUP" }, |
{ 4, "SHARE_OUT" }, |
{ 5, "SHARE_IN" }, |
{ 6, "DATA_WRITE" }, |
{ 7, "DATA_READ" }, |
{ 8, "DEBUG_ALL" }, |
/* Well-known methods */ |
{ 512, "PING" } |
}; |
/** @} |
*/ |
/branches/tracing/uspace/app/sctrace/ipc.c |
---|
0,0 → 1,42 |
/** @addtogroup sctrace |
* @{ |
*/ |
/** @file |
*/ |
#include <stdio.h> |
#include "ipc_desc.h" |
#include "ipc.h" |
void ipc_parse_call_out(int phone, ipc_call_t *call) |
{ |
printf("ipc_parse_call_out()\n"); |
printf("phone: %d, method: %d, args: (%u, %u, %u, %u, %u)\n", |
phone, |
IPC_GET_METHOD(*call), |
IPC_GET_ARG1(*call), |
IPC_GET_ARG2(*call), |
IPC_GET_ARG3(*call), |
IPC_GET_ARG4(*call), |
IPC_GET_ARG5(*call) |
); |
} |
void ipc_parse_call_in(ipc_call_t *call) |
{ |
printf("ipc_parse_call_in()\n"); |
printf("phone: %d, method: %d, args: (%u, %u, %u, %u, %u)\n", |
call->in_phone_hash, |
IPC_GET_METHOD(*call), |
IPC_GET_ARG1(*call), |
IPC_GET_ARG2(*call), |
IPC_GET_ARG3(*call), |
IPC_GET_ARG4(*call), |
IPC_GET_ARG5(*call) |
); |
} |
/** @} |
*/ |
/branches/tracing/uspace/app/sctrace/Makefile |
---|
43,6 → 43,8 |
OUTPUT = sctrace |
SOURCES = sctrace.c \ |
syscalls.c \ |
ipc.c \ |
ipc_desc.c \ |
errors.c \ |
debug_api.c |