xref: /minix/minix/usr.bin/trace/service/rs.c (revision 23199f62)
1521fa314SDavid van Moolenbroek 
2521fa314SDavid van Moolenbroek #include "inc.h"
3521fa314SDavid van Moolenbroek 
4521fa314SDavid van Moolenbroek #include <minix/rs.h>
5521fa314SDavid van Moolenbroek 
6521fa314SDavid van Moolenbroek static const struct flags rss_flags[] = {
7521fa314SDavid van Moolenbroek 	FLAG(RSS_COPY),
8521fa314SDavid van Moolenbroek 	FLAG(RSS_REUSE),
9521fa314SDavid van Moolenbroek 	FLAG(RSS_NOBLOCK),
10521fa314SDavid van Moolenbroek 	FLAG(RSS_REPLICA),
11521fa314SDavid van Moolenbroek 	FLAG(RSS_SELF_LU),
12521fa314SDavid van Moolenbroek 	FLAG(RSS_SYS_BASIC_CALLS),
13521fa314SDavid van Moolenbroek 	FLAG(RSS_VM_BASIC_CALLS),
14521fa314SDavid van Moolenbroek 	FLAG(RSS_NO_BIN_EXP),
15521fa314SDavid van Moolenbroek };
16521fa314SDavid van Moolenbroek 
17521fa314SDavid van Moolenbroek static void
put_struct_rs_start(struct trace_proc * proc,const char * name,vir_bytes addr)18521fa314SDavid van Moolenbroek put_struct_rs_start(struct trace_proc * proc, const char * name,
19521fa314SDavid van Moolenbroek 	vir_bytes addr)
20521fa314SDavid van Moolenbroek {
21521fa314SDavid van Moolenbroek 	struct rs_start buf;
22521fa314SDavid van Moolenbroek 
23521fa314SDavid van Moolenbroek 	if (!put_open_struct(proc, name, 0, addr, &buf, sizeof(buf)))
24521fa314SDavid van Moolenbroek 		return;
25521fa314SDavid van Moolenbroek 
26521fa314SDavid van Moolenbroek 	if (verbose > 0)
27521fa314SDavid van Moolenbroek 		put_flags(proc, "rss_flags", rss_flags, COUNT(rss_flags),
28521fa314SDavid van Moolenbroek 		    "0x%x", buf.rss_flags);
29521fa314SDavid van Moolenbroek 	put_buf(proc, "rss_cmd", 0, (vir_bytes)buf.rss_cmd, buf.rss_cmdlen);
30*23199f62SDavid van Moolenbroek 	put_buf(proc, "rss_progname", 0, (vir_bytes)buf.rss_progname,
31*23199f62SDavid van Moolenbroek 	    buf.rss_prognamelen);
32521fa314SDavid van Moolenbroek 	put_buf(proc, "rss_label", 0, (vir_bytes)buf.rss_label.l_addr,
33521fa314SDavid van Moolenbroek 	    buf.rss_label.l_len);
34521fa314SDavid van Moolenbroek 	if (verbose > 0 || buf.rss_major != 0)
35521fa314SDavid van Moolenbroek 		put_value(proc, "rss_major", "%d", buf.rss_major);
36521fa314SDavid van Moolenbroek 	if (verbose > 0 || buf.devman_id != 0)
37521fa314SDavid van Moolenbroek 		put_value(proc, "devman_id", "%d", buf.devman_id);
38521fa314SDavid van Moolenbroek 	put_value(proc, "rss_uid", "%u", buf.rss_uid);
39521fa314SDavid van Moolenbroek 	if (verbose > 0) {
40521fa314SDavid van Moolenbroek 		put_endpoint(proc, "rss_sigmgr", buf.rss_sigmgr);
41521fa314SDavid van Moolenbroek 		put_endpoint(proc, "rss_scheduler", buf.rss_sigmgr);
42521fa314SDavid van Moolenbroek 	}
43521fa314SDavid van Moolenbroek 	if (verbose > 1) {
44521fa314SDavid van Moolenbroek 		put_value(proc, "rss_priority", "%d", buf.rss_priority);
45521fa314SDavid van Moolenbroek 		put_value(proc, "rss_quantum", "%d", buf.rss_quantum);
46521fa314SDavid van Moolenbroek 	}
47521fa314SDavid van Moolenbroek 	if (verbose > 0) {
48521fa314SDavid van Moolenbroek 		put_value(proc, "rss_period", "%ld", buf.rss_period);
49521fa314SDavid van Moolenbroek 		put_buf(proc, "rss_script", 0, (vir_bytes)buf.rss_script,
50521fa314SDavid van Moolenbroek 		    buf.rss_scriptlen);
51521fa314SDavid van Moolenbroek 	}
52521fa314SDavid van Moolenbroek 
53521fa314SDavid van Moolenbroek 	put_close_struct(proc, FALSE /*all*/); /* TODO: the remaining fields */
54521fa314SDavid van Moolenbroek }
55521fa314SDavid van Moolenbroek 
56521fa314SDavid van Moolenbroek /* This function is shared between rs_up and rs_edit. */
57521fa314SDavid van Moolenbroek static int
rs_up_out(struct trace_proc * proc,const message * m_out)58521fa314SDavid van Moolenbroek rs_up_out(struct trace_proc * proc, const message * m_out)
59521fa314SDavid van Moolenbroek {
60521fa314SDavid van Moolenbroek 
61521fa314SDavid van Moolenbroek 	put_struct_rs_start(proc, "addr", (vir_bytes)m_out->m_rs_req.addr);
62521fa314SDavid van Moolenbroek 
63521fa314SDavid van Moolenbroek 	return CT_DONE;
64521fa314SDavid van Moolenbroek }
65521fa314SDavid van Moolenbroek 
66521fa314SDavid van Moolenbroek /*
67521fa314SDavid van Moolenbroek  * This function is shared between rs_down, rs_refresh, rs_restart, and
68521fa314SDavid van Moolenbroek  * rs_clone.
69521fa314SDavid van Moolenbroek  */
70521fa314SDavid van Moolenbroek static int
rs_label_out(struct trace_proc * proc,const message * m_out)71521fa314SDavid van Moolenbroek rs_label_out(struct trace_proc * proc, const message * m_out)
72521fa314SDavid van Moolenbroek {
73521fa314SDavid van Moolenbroek 
74521fa314SDavid van Moolenbroek 	/*
75521fa314SDavid van Moolenbroek 	 * We are not using PF_STRING here, because unlike in most places
76521fa314SDavid van Moolenbroek 	 * (including rs_lookup), the string length does not include the
77521fa314SDavid van Moolenbroek 	 * terminating NULL character.
78521fa314SDavid van Moolenbroek 	 */
79521fa314SDavid van Moolenbroek 	put_buf(proc, "label", 0, (vir_bytes)m_out->m_rs_req.addr,
80521fa314SDavid van Moolenbroek 	    m_out->m_rs_req.len);
81521fa314SDavid van Moolenbroek 
82521fa314SDavid van Moolenbroek 	return CT_DONE;
83521fa314SDavid van Moolenbroek }
84521fa314SDavid van Moolenbroek 
85521fa314SDavid van Moolenbroek static int
rs_update_out(struct trace_proc * proc,const message * m_out)86521fa314SDavid van Moolenbroek rs_update_out(struct trace_proc * proc, const message * m_out)
87521fa314SDavid van Moolenbroek {
88521fa314SDavid van Moolenbroek 
89521fa314SDavid van Moolenbroek 	/*
90521fa314SDavid van Moolenbroek 	 * FIXME: this is a value from the wrong message union, and that is
91521fa314SDavid van Moolenbroek 	 * actually a minix bug.
92521fa314SDavid van Moolenbroek 	 */
93521fa314SDavid van Moolenbroek 	put_struct_rs_start(proc, "addr", (vir_bytes)m_out->m_rs_req.addr);
94521fa314SDavid van Moolenbroek 
95521fa314SDavid van Moolenbroek 	/* TODO: interpret these fields */
96521fa314SDavid van Moolenbroek 	put_value(proc, "state", "%d", m_out->m_rs_update.state);
97521fa314SDavid van Moolenbroek 	put_value(proc, "maxtime", "%d", m_out->m_rs_update.prepare_maxtime);
98521fa314SDavid van Moolenbroek 
99521fa314SDavid van Moolenbroek 	return CT_DONE;
100521fa314SDavid van Moolenbroek }
101521fa314SDavid van Moolenbroek 
102521fa314SDavid van Moolenbroek static int
rs_lookup_out(struct trace_proc * proc,const message * m_out)103521fa314SDavid van Moolenbroek rs_lookup_out(struct trace_proc * proc, const message * m_out)
104521fa314SDavid van Moolenbroek {
105521fa314SDavid van Moolenbroek 
106521fa314SDavid van Moolenbroek 	put_buf(proc, "label", PF_STRING, (vir_bytes)m_out->m_rs_req.name,
107521fa314SDavid van Moolenbroek 	    m_out->m_rs_req.name_len);
108521fa314SDavid van Moolenbroek 
109521fa314SDavid van Moolenbroek 	return CT_DONE;
110521fa314SDavid van Moolenbroek }
111521fa314SDavid van Moolenbroek 
112521fa314SDavid van Moolenbroek static void
rs_lookup_in(struct trace_proc * proc,const message * __unused m_out,const message * m_in,int failed)113521fa314SDavid van Moolenbroek rs_lookup_in(struct trace_proc * proc, const message * __unused m_out,
114521fa314SDavid van Moolenbroek 	const message * m_in, int failed)
115521fa314SDavid van Moolenbroek {
116521fa314SDavid van Moolenbroek 
117521fa314SDavid van Moolenbroek 	if (!failed)
118521fa314SDavid van Moolenbroek 		put_endpoint(proc, NULL, m_in->m_rs_req.endpoint);
119521fa314SDavid van Moolenbroek 	else
120521fa314SDavid van Moolenbroek 		put_result(proc);
121521fa314SDavid van Moolenbroek }
122521fa314SDavid van Moolenbroek 
123521fa314SDavid van Moolenbroek #define RS_CALL(c) [((RS_ ## c) - RS_RQ_BASE)]
124521fa314SDavid van Moolenbroek 
125521fa314SDavid van Moolenbroek static const struct call_handler rs_map[] = {
126521fa314SDavid van Moolenbroek 	RS_CALL(UP) = HANDLER("rs_up", rs_up_out, default_in),
127521fa314SDavid van Moolenbroek 	RS_CALL(DOWN) = HANDLER("rs_down", rs_label_out, default_in),
128521fa314SDavid van Moolenbroek 	RS_CALL(REFRESH) = HANDLER("rs_refresh", rs_label_out, default_in),
129521fa314SDavid van Moolenbroek 	RS_CALL(RESTART) = HANDLER("rs_restart", rs_label_out, default_in),
130521fa314SDavid van Moolenbroek 	RS_CALL(SHUTDOWN) = HANDLER("rs_shutdown", default_out, default_in),
131521fa314SDavid van Moolenbroek 	RS_CALL(CLONE) = HANDLER("rs_clone", rs_label_out, default_in),
132521fa314SDavid van Moolenbroek 	RS_CALL(UPDATE) = HANDLER("rs_update", rs_update_out, default_in),
133521fa314SDavid van Moolenbroek 	RS_CALL(EDIT) = HANDLER("rs_edit", rs_up_out, default_in),
134521fa314SDavid van Moolenbroek 	RS_CALL(LOOKUP) = HANDLER("rs_lookup", rs_lookup_out, rs_lookup_in),
135521fa314SDavid van Moolenbroek };
136521fa314SDavid van Moolenbroek 
137521fa314SDavid van Moolenbroek const struct calls rs_calls = {
138521fa314SDavid van Moolenbroek 	.endpt = RS_PROC_NR,
139521fa314SDavid van Moolenbroek 	.base = RS_RQ_BASE,
140521fa314SDavid van Moolenbroek 	.map = rs_map,
141521fa314SDavid van Moolenbroek 	.count = COUNT(rs_map)
142521fa314SDavid van Moolenbroek };
143