David van Moolenbroek 521fa314e2 Add trace(1): the MINIX3 system call tracer
Change-Id: Ib970c8647409196902ed53d6e9631a1673a4ab2e
2014-11-04 21:46:31 +00:00

141 lines
3.7 KiB
C

#include "inc.h"
#include <minix/rs.h>
static const struct flags rss_flags[] = {
FLAG(RSS_COPY),
FLAG(RSS_REUSE),
FLAG(RSS_NOBLOCK),
FLAG(RSS_REPLICA),
FLAG(RSS_SELF_LU),
FLAG(RSS_SYS_BASIC_CALLS),
FLAG(RSS_VM_BASIC_CALLS),
FLAG(RSS_NO_BIN_EXP),
};
static void
put_struct_rs_start(struct trace_proc * proc, const char * name,
vir_bytes addr)
{
struct rs_start buf;
if (!put_open_struct(proc, name, 0, addr, &buf, sizeof(buf)))
return;
if (verbose > 0)
put_flags(proc, "rss_flags", rss_flags, COUNT(rss_flags),
"0x%x", buf.rss_flags);
put_buf(proc, "rss_cmd", 0, (vir_bytes)buf.rss_cmd, buf.rss_cmdlen);
put_buf(proc, "rss_label", 0, (vir_bytes)buf.rss_label.l_addr,
buf.rss_label.l_len);
if (verbose > 0 || buf.rss_major != 0)
put_value(proc, "rss_major", "%d", buf.rss_major);
if (verbose > 0 || buf.devman_id != 0)
put_value(proc, "devman_id", "%d", buf.devman_id);
put_value(proc, "rss_uid", "%u", buf.rss_uid);
if (verbose > 0) {
put_endpoint(proc, "rss_sigmgr", buf.rss_sigmgr);
put_endpoint(proc, "rss_scheduler", buf.rss_sigmgr);
}
if (verbose > 1) {
put_value(proc, "rss_priority", "%d", buf.rss_priority);
put_value(proc, "rss_quantum", "%d", buf.rss_quantum);
}
if (verbose > 0) {
put_value(proc, "rss_period", "%ld", buf.rss_period);
put_buf(proc, "rss_script", 0, (vir_bytes)buf.rss_script,
buf.rss_scriptlen);
}
put_close_struct(proc, FALSE /*all*/); /* TODO: the remaining fields */
}
/* This function is shared between rs_up and rs_edit. */
static int
rs_up_out(struct trace_proc * proc, const message * m_out)
{
put_struct_rs_start(proc, "addr", (vir_bytes)m_out->m_rs_req.addr);
return CT_DONE;
}
/*
* This function is shared between rs_down, rs_refresh, rs_restart, and
* rs_clone.
*/
static int
rs_label_out(struct trace_proc * proc, const message * m_out)
{
/*
* We are not using PF_STRING here, because unlike in most places
* (including rs_lookup), the string length does not include the
* terminating NULL character.
*/
put_buf(proc, "label", 0, (vir_bytes)m_out->m_rs_req.addr,
m_out->m_rs_req.len);
return CT_DONE;
}
static int
rs_update_out(struct trace_proc * proc, const message * m_out)
{
/*
* FIXME: this is a value from the wrong message union, and that is
* actually a minix bug.
*/
put_struct_rs_start(proc, "addr", (vir_bytes)m_out->m_rs_req.addr);
/* TODO: interpret these fields */
put_value(proc, "state", "%d", m_out->m_rs_update.state);
put_value(proc, "maxtime", "%d", m_out->m_rs_update.prepare_maxtime);
return CT_DONE;
}
static int
rs_lookup_out(struct trace_proc * proc, const message * m_out)
{
put_buf(proc, "label", PF_STRING, (vir_bytes)m_out->m_rs_req.name,
m_out->m_rs_req.name_len);
return CT_DONE;
}
static void
rs_lookup_in(struct trace_proc * proc, const message * __unused m_out,
const message * m_in, int failed)
{
if (!failed)
put_endpoint(proc, NULL, m_in->m_rs_req.endpoint);
else
put_result(proc);
}
#define RS_CALL(c) [((RS_ ## c) - RS_RQ_BASE)]
static const struct call_handler rs_map[] = {
RS_CALL(UP) = HANDLER("rs_up", rs_up_out, default_in),
RS_CALL(DOWN) = HANDLER("rs_down", rs_label_out, default_in),
RS_CALL(REFRESH) = HANDLER("rs_refresh", rs_label_out, default_in),
RS_CALL(RESTART) = HANDLER("rs_restart", rs_label_out, default_in),
RS_CALL(SHUTDOWN) = HANDLER("rs_shutdown", default_out, default_in),
RS_CALL(CLONE) = HANDLER("rs_clone", rs_label_out, default_in),
RS_CALL(UPDATE) = HANDLER("rs_update", rs_update_out, default_in),
RS_CALL(EDIT) = HANDLER("rs_edit", rs_up_out, default_in),
RS_CALL(LOOKUP) = HANDLER("rs_lookup", rs_lookup_out, rs_lookup_in),
};
const struct calls rs_calls = {
.endpt = RS_PROC_NR,
.base = RS_RQ_BASE,
.map = rs_map,
.count = COUNT(rs_map)
};