Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2870 → Rev 2871

/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