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