xref: /minix/minix/usr.bin/trace/service/rs.c (revision e3b78ef1)
1 
2 #include "inc.h"
3 
4 #include <minix/rs.h>
5 
6 static const struct flags rss_flags[] = {
7 	FLAG(RSS_COPY),
8 	FLAG(RSS_REUSE),
9 	FLAG(RSS_NOBLOCK),
10 	FLAG(RSS_REPLICA),
11 	FLAG(RSS_SELF_LU),
12 	FLAG(RSS_SYS_BASIC_CALLS),
13 	FLAG(RSS_VM_BASIC_CALLS),
14 	FLAG(RSS_NO_BIN_EXP),
15 };
16 
17 static void
18 put_struct_rs_start(struct trace_proc * proc, const char * name,
19 	vir_bytes addr)
20 {
21 	struct rs_start buf;
22 
23 	if (!put_open_struct(proc, name, 0, addr, &buf, sizeof(buf)))
24 		return;
25 
26 	if (verbose > 0)
27 		put_flags(proc, "rss_flags", rss_flags, COUNT(rss_flags),
28 		    "0x%x", buf.rss_flags);
29 	put_buf(proc, "rss_cmd", 0, (vir_bytes)buf.rss_cmd, buf.rss_cmdlen);
30 	put_buf(proc, "rss_label", 0, (vir_bytes)buf.rss_label.l_addr,
31 	    buf.rss_label.l_len);
32 	if (verbose > 0 || buf.rss_major != 0)
33 		put_value(proc, "rss_major", "%d", buf.rss_major);
34 	if (verbose > 0 || buf.devman_id != 0)
35 		put_value(proc, "devman_id", "%d", buf.devman_id);
36 	put_value(proc, "rss_uid", "%u", buf.rss_uid);
37 	if (verbose > 0) {
38 		put_endpoint(proc, "rss_sigmgr", buf.rss_sigmgr);
39 		put_endpoint(proc, "rss_scheduler", buf.rss_sigmgr);
40 	}
41 	if (verbose > 1) {
42 		put_value(proc, "rss_priority", "%d", buf.rss_priority);
43 		put_value(proc, "rss_quantum", "%d", buf.rss_quantum);
44 	}
45 	if (verbose > 0) {
46 		put_value(proc, "rss_period", "%ld", buf.rss_period);
47 		put_buf(proc, "rss_script", 0, (vir_bytes)buf.rss_script,
48 		    buf.rss_scriptlen);
49 	}
50 
51 	put_close_struct(proc, FALSE /*all*/); /* TODO: the remaining fields */
52 }
53 
54 /* This function is shared between rs_up and rs_edit. */
55 static int
56 rs_up_out(struct trace_proc * proc, const message * m_out)
57 {
58 
59 	put_struct_rs_start(proc, "addr", (vir_bytes)m_out->m_rs_req.addr);
60 
61 	return CT_DONE;
62 }
63 
64 /*
65  * This function is shared between rs_down, rs_refresh, rs_restart, and
66  * rs_clone.
67  */
68 static int
69 rs_label_out(struct trace_proc * proc, const message * m_out)
70 {
71 
72 	/*
73 	 * We are not using PF_STRING here, because unlike in most places
74 	 * (including rs_lookup), the string length does not include the
75 	 * terminating NULL character.
76 	 */
77 	put_buf(proc, "label", 0, (vir_bytes)m_out->m_rs_req.addr,
78 	    m_out->m_rs_req.len);
79 
80 	return CT_DONE;
81 }
82 
83 static int
84 rs_update_out(struct trace_proc * proc, const message * m_out)
85 {
86 
87 	/*
88 	 * FIXME: this is a value from the wrong message union, and that is
89 	 * actually a minix bug.
90 	 */
91 	put_struct_rs_start(proc, "addr", (vir_bytes)m_out->m_rs_req.addr);
92 
93 	/* TODO: interpret these fields */
94 	put_value(proc, "state", "%d", m_out->m_rs_update.state);
95 	put_value(proc, "maxtime", "%d", m_out->m_rs_update.prepare_maxtime);
96 
97 	return CT_DONE;
98 }
99 
100 static int
101 rs_lookup_out(struct trace_proc * proc, const message * m_out)
102 {
103 
104 	put_buf(proc, "label", PF_STRING, (vir_bytes)m_out->m_rs_req.name,
105 	    m_out->m_rs_req.name_len);
106 
107 	return CT_DONE;
108 }
109 
110 static void
111 rs_lookup_in(struct trace_proc * proc, const message * __unused m_out,
112 	const message * m_in, int failed)
113 {
114 
115 	if (!failed)
116 		put_endpoint(proc, NULL, m_in->m_rs_req.endpoint);
117 	else
118 		put_result(proc);
119 }
120 
121 #define RS_CALL(c) [((RS_ ## c) - RS_RQ_BASE)]
122 
123 static const struct call_handler rs_map[] = {
124 	RS_CALL(UP) = HANDLER("rs_up", rs_up_out, default_in),
125 	RS_CALL(DOWN) = HANDLER("rs_down", rs_label_out, default_in),
126 	RS_CALL(REFRESH) = HANDLER("rs_refresh", rs_label_out, default_in),
127 	RS_CALL(RESTART) = HANDLER("rs_restart", rs_label_out, default_in),
128 	RS_CALL(SHUTDOWN) = HANDLER("rs_shutdown", default_out, default_in),
129 	RS_CALL(CLONE) = HANDLER("rs_clone", rs_label_out, default_in),
130 	RS_CALL(UPDATE) = HANDLER("rs_update", rs_update_out, default_in),
131 	RS_CALL(EDIT) = HANDLER("rs_edit", rs_up_out, default_in),
132 	RS_CALL(LOOKUP) = HANDLER("rs_lookup", rs_lookup_out, rs_lookup_in),
133 };
134 
135 const struct calls rs_calls = {
136 	.endpt = RS_PROC_NR,
137 	.base = RS_RQ_BASE,
138 	.map = rs_map,
139 	.count = COUNT(rs_map)
140 };
141