]> Zhao Yanbai Git Server - minix.git/commitdiff
sef: Add fault injection (and EDFI) support.
authorCristiano Giuffrida <giuffrida@cs.vu.nl>
Thu, 12 Jun 2014 15:08:31 +0000 (17:08 +0200)
committerLionel Sambuc <lionel@minix3.org>
Mon, 28 Jul 2014 15:06:06 +0000 (17:06 +0200)
etc/system.conf
include/minix/com.h
include/minix/ipc.h
include/minix/sef.h
lib/libsys/Makefile
lib/libsys/sef.c
lib/libsys/sef_fi.c [new file with mode: 0644]

index d47fd9a59140e9c871714e2397c4a09d16a6c4c2..bc1962dd9d12ee68499e0bfa68b343e61cf58d51 100644 (file)
@@ -717,3 +717,8 @@ service pty
                SYSTEM vfs rs vm
        ;
 };
+
+service edfictl
+{
+        ipc ALL;
+};
index 324f82117c173861382822c20f7f7b70341bf604..82fc9daf1b7fac7b396c7a69395ee15ee94b92cc 100644 (file)
 #      define GCOV_BUFF_P  m1_p1
 #      define GCOV_BUFF_SZ m1_i1
 
+/* Common fault injection ctl request to all processes. */
+#define COMMON_REQ_FI_CTL (COMMON_RQ_BASE+2)
+
 /*===========================================================================*
  *                Messages for VM server                                    *
  *===========================================================================*/
index 59f19c4bb2ba29ee91a0a5d1f4886cda061f8e4f..7962f7476f664e87040dacabc3726738d6920dd2 100644 (file)
@@ -691,6 +691,21 @@ typedef struct {
 } mess_linputdriver_input_event;
 _ASSERT_MSG_SIZE(mess_linputdriver_input_event);
 
+typedef struct {
+        cp_grant_id_t gid;
+       size_t size;
+
+        uint8_t padding[48];
+} mess_lsys_fi_ctl;
+_ASSERT_MSG_SIZE(mess_lsys_fi_ctl);
+
+typedef struct {
+        int status;
+
+        uint8_t padding[52];
+} mess_lsys_fi_reply;
+_ASSERT_MSG_SIZE(mess_lsys_fi_reply);
+
 typedef struct {
        int what;
        vir_bytes where;
@@ -1795,6 +1810,8 @@ typedef struct {
                mess_linputdriver_input_event m_linputdriver_input_event;
 
                mess_lsys_getsysinfo    m_lsys_getsysinfo;
+               mess_lsys_fi_ctl        m_lsys_fi_ctl;
+               mess_lsys_fi_reply      m_lsys_fi_reply;
 
                mess_lsys_krn_schedctl  m_lsys_krn_schedctl;
                mess_lsys_krn_schedule  m_lsys_krn_schedule;
index 1a6809101c18c1aee20c1f2cd5d1d102dd104327..25434410deddff20c1f1e73877a48ed3fddba728 100644 (file)
@@ -233,6 +233,17 @@ void sef_cb_signal_handler_posix_default(int signo);
 #define sef_signal_debug_begin          sef_debug_begin
 #define sef_signal_debug_end            sef_debug_end
 
+/*===========================================================================*
+ *                          SEF Fault Injection                             *
+ *===========================================================================*/
+/* What to intercept. */
+#define INTERCEPT_SEF_FI_REQUESTS 1
+#define IS_SEF_FI_REQUEST(mp, status) \
+    (m_ptr->m_type == COMMON_REQ_FI_CTL)
+
+/* Fault injection tool support. */
+#define SEF_FI_ALLOW_EDFI               1
+
 #if !defined(USE_LIVEUPDATE)
 #undef INTERCEPT_SEF_LU_REQUESTS
 #undef SEF_LU_DEBUG
index 4d09fa4b985335d61bb21090f47c624f64941b2a..c95a0b90ad228d4b44fd153ef2ef11bd1394a974 100644 (file)
@@ -40,6 +40,7 @@ SRCS+=  \
        sched_start.c \
        sched_stop.c \
        sef.c \
+       sef_fi.c \
        sef_init.c \
        sef_liveupdate.c \
        sef_ping.c \
index 46817934cca89726a15d28a723f32817462f8938..389118719a7924b48aa9ddf15e7f3fd805cca4fa 100644 (file)
@@ -27,9 +27,6 @@ char* sef_debug_header(void);
 #endif
 
 /* SEF Init prototypes. */
-#ifdef USE_COVERAGE
-EXTERN int do_sef_gcov_request(message *m_ptr);
-#endif
 EXTERN int do_sef_rs_init(endpoint_t old_endpoint);
 EXTERN int do_sef_init_request(message *m_ptr);
 
@@ -43,6 +40,14 @@ EXTERN int do_sef_lu_request(message *m_ptr);
 /* SEF Signal prototypes. */
 EXTERN int do_sef_signal_request(message *m_ptr);
 
+/* SEF GCOV prototypes. */
+#ifdef USE_COVERAGE
+EXTERN int do_sef_gcov_request(message *m_ptr);
+#endif
+
+/* SEF Fault Injection prototypes. */
+EXTERN int do_sef_fi_request(message *m_ptr);
+
 /*===========================================================================*
  *                             sef_startup                                  *
  *===========================================================================*/
@@ -181,6 +186,15 @@ int sef_receive_status(endpoint_t src, message *m_ptr, int *status_ptr)
       }
 #endif
 
+#ifdef INTERCEPT_SEF_FI_REQUESTS
+      /* Intercept Fault injection requests. */
+      if(IS_SEF_FI_REQUEST(m_ptr, status)) {
+          if(do_sef_fi_request(m_ptr) == OK) {
+              continue;
+          }
+      }
+#endif
+
       /* If we get this far, this is not a valid SEF request, return and
        * let the caller deal with that.
        */
diff --git a/lib/libsys/sef_fi.c b/lib/libsys/sef_fi.c
new file mode 100644 (file)
index 0000000..36ae8d6
--- /dev/null
@@ -0,0 +1,21 @@
+
+#include "syslib.h"
+#include <assert.h>
+#include <minix/sysutil.h>
+
+EXTERN __attribute__((weak)) int edfi_ctl_process_request(void *ctl_request);
+
+/*===========================================================================*
+ *                            do_sef_fi_request                             *
+ *===========================================================================*/
+int do_sef_fi_request(message *m_ptr)
+{
+#if SEF_FI_ALLOW_EDFI
+    /* Forward the request to the EDFI fault injector, if linked in. */
+    if(edfi_ctl_process_request)
+        return edfi_ctl_process_request(m_ptr);
+#endif
+
+    return ENOSYS;
+}
+