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