]> Zhao Yanbai Git Server - minix.git/commitdiff
rs: Add support for RS_FI. 12/3112/1
authorCristiano Giuffrida <giuffrida@cs.vu.nl>
Sun, 21 Dec 2014 23:27:14 +0000 (00:27 +0100)
committerDavid van Moolenbroek <david@minix3.org>
Thu, 17 Sep 2015 13:29:47 +0000 (13:29 +0000)
Change-Id: Id8663859accfc4e3587db35dec7000059860fd49

minix/commands/service/service.c
minix/include/minix/com.h
minix/include/minix/ipc.h
minix/lib/libsys/sef_fi.c
minix/servers/rs/main.c
minix/servers/rs/proto.h
minix/servers/rs/request.c
minix/servers/rs/utility.c

index 78a2944997883a69925e2a0df14e5ab7b920c078..63448e311587d9ffc8dc1a537d79f3c3190c6f26 100644 (file)
@@ -51,6 +51,7 @@ static char *known_requests[] = {
   "unclone",
   "edit",
   "sysctl",
+  "fi",
   "catch for illegal requests"
 };
 static int known_request_types[] = {
@@ -64,6 +65,7 @@ static int known_request_types[] = {
   RS_UNCLONE,
   RS_EDIT,
   RS_SYSCTL,
+  RS_FI,
   0
 };
 #define ILLEGAL_REQUEST  sizeof(known_requests)/sizeof(char *)
@@ -189,6 +191,7 @@ static void print_usage(char *app_name, char *problem)
   fprintf(stderr, "    %s restart <label>\n", app_name);
   fprintf(stderr, "    %s clone <label>\n", app_name);
   fprintf(stderr, "    %s unclone <label>\n", app_name);
+  fprintf(stderr, "    %s fi <label>\n", app_name);
   fprintf(stderr, "    %s sysctl <srv_status|upd_start|upd_run|upd_stop|upd_status>\n", app_name);
   fprintf(stderr, "    %s shutdown\n", app_name);
   fprintf(stderr, "    Options:\n");
@@ -646,7 +649,7 @@ static int parse_arguments(int argc, char **argv, u32_t *rss_flags)
       }
   }
   else if (req_nr == RS_DOWN || req_nr == RS_REFRESH || req_nr == RS_RESTART
-      || req_nr == RS_CLONE || req_nr == RS_UNCLONE) {
+      || req_nr == RS_CLONE || req_nr == RS_UNCLONE || req_nr == RS_FI) {
 
       /* Verify argument count. */ 
       if (argc - 1 < optind+ARG_LABEL) {
@@ -800,6 +803,7 @@ int main(int argc, char **argv)
   case RS_RESTART:
   case RS_CLONE:
   case RS_UNCLONE:
+  case RS_FI:
       m.m_rs_req.addr = req_label;
       m.m_rs_req.len = strlen(req_label);
       break;
index 1fbcbceae568e4add442d57b917823a2b395006c..26415097f4288141746495be46d58bb1df2bb0dd 100644 (file)
 #define RS_LU_PREPARE  (RS_RQ_BASE + 21)       /* prepare to update message */
 #define RS_EDIT                (RS_RQ_BASE + 22)       /* edit system service */
 #define RS_SYSCTL      (RS_RQ_BASE + 23)       /* perform system ctl action */
+#define RS_FI          (RS_RQ_BASE + 24)       /* inject fault into service */
 
 /* Subfunctions for RS_SYSCTL. */
 #define RS_SYSCTL_SRV_STATUS    1
 #define RS_SYSCTL_UPD_STOP      4
 #define RS_SYSCTL_UPD_STATUS    5
 
+/* Subfunctions for RS_FI. */
+#define RS_FI_CRASH             1
+
 /*===========================================================================*
  *                Messages for the Data Store Server                        *
  *===========================================================================*/
index 6f444d3331912771aa0fc19da174b5e701f8329d..a40142334443adf603774bb5ea8c4cc7a75ff373 100644 (file)
@@ -931,8 +931,9 @@ _ASSERT_MSG_SIZE(mess_linputdriver_input_event);
 typedef struct {
         cp_grant_id_t gid;
        size_t size;
+       int subtype;
 
-        uint8_t padding[48];
+        uint8_t padding[44];
 } mess_lsys_fi_ctl;
 _ASSERT_MSG_SIZE(mess_lsys_fi_ctl);
 
index 9f5265969f12b5fb76e89c708da247617f76e179..3838fd8f83feb6c21a67ad0c7cc9ebe877ae7632 100644 (file)
@@ -12,6 +12,10 @@ EXTERN int do_sef_fi_request(message *m_ptr);
  *===========================================================================*/
 int do_sef_fi_request(message *m_ptr)
 {
+    /* See if we are simply asked to crash. */
+    if (m_ptr->m_lsys_fi_ctl.subtype == RS_FI_CRASH)
+        panic("Crash!");
+
 #if SEF_FI_ALLOW_EDFI
     /* Forward the request to the EDFI fault injector, if linked in. */
     if(edfi_ctl_process_request)
index 6fd432bf71b9bb75199c696563235e885bff06a4..2ef2ba6122cac10d835cc3b3e6844f61e505cec3 100644 (file)
@@ -112,6 +112,7 @@ int main(void)
          case RS_UNCLONE:      result = do_unclone(&m);        break;
           case RS_EDIT:        result = do_edit(&m);           break;
          case RS_SYSCTL:       result = do_sysctl(&m);         break;
+         case RS_FI:   result = do_fi(&m);             break;
           case RS_GETSYSINFO:  result = do_getsysinfo(&m);     break;
          case RS_LOOKUP:       result = do_lookup(&m);         break;
          /* Ready messages. */
index b88086d07fff76be33dae1b784924947fc714fc4..70bc4efc9756228bdb462acf4d16d06d2ca9e603 100644 (file)
@@ -28,6 +28,7 @@ void do_sigchld(void);
 int do_getsysinfo(message *m);
 int do_lookup(message *m);
 int do_sysctl(message *m);
+int do_fi(message *m);
 
 /* manager.c */
 int check_call_permission(endpoint_t caller, int call, struct rproc
@@ -123,6 +124,7 @@ void end_update_debug(char *file, int line,
 
 /* utility.c */
 int init_service(struct rproc *rp, int type, int flags);
+int fi_service(struct rproc *rp);
 void fill_send_mask(sys_map_t *send_mask, int set_bits);
 void fill_call_mask( int *calls, int tot_nr_calls,
        bitchunk_t *call_mask, int call_base, int is_init);
index 8d3f612cfcee2faab44609019df73b7c8602d503..88436d6c72c268b87060736ee6367ae000f12fbe 100644 (file)
@@ -1223,6 +1223,42 @@ int do_sysctl(message *m_ptr)
        return OK;
 }
 
+/*===========================================================================*
+ *                             do_fi                                *
+ *===========================================================================*/
+int do_fi(message *m_ptr)
+{
+  struct rproc *rp;
+  struct rprocpub *rpub;
+  int s, r;
+  char label[RS_MAX_LABEL_LEN];
+
+  /* Copy label. */
+  s = copy_label(m_ptr->m_source, m_ptr->m_rs_req.addr,
+      m_ptr->m_rs_req.len, label, sizeof(label));
+  if(s != OK) {
+      return s;
+  }
+
+  /* Lookup slot by label. */
+  rp = lookup_slot_by_label(label);
+  if(!rp) {
+      if(rs_verbose)
+          printf("RS: do_fi: service '%s' not found\n", label);
+      return(ESRCH);
+  }
+  rpub = rp->r_pub;
+
+  /* Check if the call can be allowed. */
+  if((r = check_call_permission(m_ptr->m_source, RS_FI, rp)) != OK)
+      return r;
+
+  /* Inject fault into the service as requested. */
+  s = fi_service(rp);
+
+  return s;
+}
+
 /*===========================================================================*
  *                                check_request                             *
  *===========================================================================*/
index 02a4ccbfde9485b13de8b07e089618ab18ede806..44dc9b07192f237caf4c995a4e95ce98e6dcf923 100644 (file)
@@ -60,6 +60,19 @@ int init_service(struct rproc *rp, int type, int flags)
   return r;
 }
 
+/*===========================================================================*
+ *                              fi_service                                  *
+ *===========================================================================*/
+int fi_service(struct rproc *rp)
+{
+  message m;
+
+  /* Send fault injection message. */
+  m.m_type = COMMON_REQ_FI_CTL;
+  m.m_lsys_fi_ctl.subtype = RS_FI_CRASH;
+  return rs_asynsend(rp, &m, 0);
+}
+
 /*===========================================================================*
  *                           fill_send_mask                                 *
  *===========================================================================*/