1 /* Prototypes for System Event Framework (SEF) functions. */ 2 3 #ifndef _SEF_H 4 #define _SEF_H 5 6 #include <minix/ipc.h> 7 8 /* SEF entry points for system processes. */ 9 void sef_startup(void); 10 int sef_receive_status(endpoint_t src, message *m_ptr, int *status_ptr); 11 endpoint_t sef_self(void); 12 void sef_cancel(void); 13 void sef_exit(int status); 14 #define sef_receive(src, m_ptr) sef_receive_status(src, m_ptr, NULL) 15 16 /* SEF Debug. */ 17 #include <stdio.h> 18 #define sef_dprint printf 19 #define sef_debug_begin() (void)(NULL) 20 #define sef_debug_end() (void)(NULL) 21 22 /*===========================================================================* 23 * SEF Init * 24 *===========================================================================*/ 25 /* What to intercept. */ 26 #define INTERCEPT_SEF_INIT_REQUESTS 1 27 #define IS_SEF_INIT_REQUEST(mp) ((mp)->m_type == RS_INIT \ 28 && (mp)->m_source == RS_PROC_NR) 29 30 /* Type definitions. */ 31 typedef struct { 32 cp_grant_id_t rproctab_gid; 33 endpoint_t endpoint; 34 endpoint_t old_endpoint; 35 } sef_init_info_t; 36 37 /* Callback type definitions. */ 38 typedef int(*sef_cb_init_t)(int type, sef_init_info_t *info); 39 typedef int(*sef_cb_init_response_t)(message *m_ptr); 40 41 /* Callback registration helpers. */ 42 void sef_setcb_init_fresh(sef_cb_init_t cb); 43 void sef_setcb_init_lu(sef_cb_init_t cb); 44 void sef_setcb_init_restart(sef_cb_init_t cb); 45 void sef_setcb_init_response(sef_cb_init_response_t cb); 46 47 /* Predefined callback implementations. */ 48 int sef_cb_init_null(int type, sef_init_info_t *info); 49 int sef_cb_init_response_null(message *m_ptr); 50 51 int sef_cb_init_fail(int type, sef_init_info_t *info); 52 int sef_cb_init_reset(int type, sef_init_info_t *info); 53 int sef_cb_init_crash(int type, sef_init_info_t *info); 54 int sef_cb_init_response_rs_reply(message *m_ptr); 55 56 /* Macros for predefined callback implementations. */ 57 #define SEF_CB_INIT_FRESH_NULL sef_cb_init_null 58 #define SEF_CB_INIT_LU_NULL sef_cb_init_null 59 #define SEF_CB_INIT_RESTART_NULL sef_cb_init_null 60 #define SEF_CB_INIT_RESPONSE_NULL sef_cb_init_response_null 61 62 #define SEF_CB_INIT_FRESH_DEFAULT sef_cb_init_null 63 #define SEF_CB_INIT_LU_DEFAULT sef_cb_init_null 64 #define SEF_CB_INIT_RESTART_DEFAULT sef_cb_init_reset 65 #define SEF_CB_INIT_RESPONSE_DEFAULT sef_cb_init_response_rs_reply 66 67 /* Init types. */ 68 #define SEF_INIT_FRESH 0 /* init fresh */ 69 #define SEF_INIT_LU 1 /* init after live update */ 70 #define SEF_INIT_RESTART 2 /* init after restart */ 71 72 /* Debug. */ 73 #define SEF_INIT_DEBUG_DEFAULT 0 74 75 #ifndef SEF_INIT_DEBUG 76 #define SEF_INIT_DEBUG SEF_INIT_DEBUG_DEFAULT 77 #endif 78 79 #define sef_init_dprint sef_dprint 80 #define sef_init_debug_begin sef_debug_begin 81 #define sef_init_debug_end sef_debug_end 82 83 /*===========================================================================* 84 * SEF Ping * 85 *===========================================================================*/ 86 /* What to intercept. */ 87 #define INTERCEPT_SEF_PING_REQUESTS 1 88 #define IS_SEF_PING_REQUEST(mp, status) (is_ipc_notify(status) \ 89 && (mp)->m_source == RS_PROC_NR) 90 91 /* Callback type definitions. */ 92 typedef void(*sef_cb_ping_reply_t)(endpoint_t source); 93 94 /* Callback registration helpers. */ 95 void sef_setcb_ping_reply(sef_cb_ping_reply_t cb); 96 97 /* Predefined callback implementations. */ 98 void sef_cb_ping_reply_null(endpoint_t source); 99 100 void sef_cb_ping_reply_pong(endpoint_t source); 101 102 /* Macros for predefined callback implementations. */ 103 #define SEF_CB_PING_REPLY_NULL sef_cb_ping_reply_null 104 105 #define SEF_CB_PING_REPLY_DEFAULT sef_cb_ping_reply_pong 106 107 /* Debug. */ 108 #define SEF_PING_DEBUG_DEFAULT 0 109 110 #ifndef SEF_PING_DEBUG 111 #define SEF_PING_DEBUG SEF_PING_DEBUG_DEFAULT 112 #endif 113 114 #define sef_ping_dprint sef_dprint 115 #define sef_ping_debug_begin sef_debug_begin 116 #define sef_ping_debug_end sef_debug_end 117 118 /*===========================================================================* 119 * SEF Live update * 120 *===========================================================================*/ 121 /* What to intercept. */ 122 #define INTERCEPT_SEF_LU_REQUESTS 1 123 #define IS_SEF_LU_REQUEST(mp, status) ((mp)->m_type == RS_LU_PREPARE \ 124 && (mp)->m_source == RS_PROC_NR) 125 126 /* Callback type definitions. */ 127 typedef int(*sef_cb_lu_prepare_t)(int); 128 typedef int(*sef_cb_lu_state_isvalid_t)(int); 129 typedef void(*sef_cb_lu_state_changed_t)(int, int); 130 typedef void(*sef_cb_lu_state_dump_t)(int); 131 typedef int(*sef_cb_lu_state_save_t)(int); 132 typedef int(*sef_cb_lu_response_t)(message *m_ptr); 133 134 /* Callback registration helpers. */ 135 void sef_setcb_lu_prepare(sef_cb_lu_prepare_t cb); 136 void sef_setcb_lu_state_isvalid(sef_cb_lu_state_isvalid_t cb); 137 void sef_setcb_lu_state_changed(sef_cb_lu_state_changed_t cb); 138 void sef_setcb_lu_state_dump(sef_cb_lu_state_dump_t cb); 139 void sef_setcb_lu_state_save(sef_cb_lu_state_save_t cb); 140 void sef_setcb_lu_response(sef_cb_lu_response_t cb); 141 142 /* Predefined callback implementations. */ 143 int sef_cb_lu_prepare_null(int state); 144 int sef_cb_lu_state_isvalid_null(int state); 145 void sef_cb_lu_state_changed_null(int old_state, int state); 146 void sef_cb_lu_state_dump_null(int state); 147 int sef_cb_lu_state_save_null(int state); 148 int sef_cb_lu_response_null(message *m_ptr); 149 150 int sef_cb_lu_prepare_always_ready(int state); 151 int sef_cb_lu_prepare_never_ready(int state); 152 int sef_cb_lu_prepare_crash(int state); 153 int sef_cb_lu_state_isvalid_standard(int state); 154 int sef_cb_lu_state_isvalid_workfree(int state); 155 int sef_cb_lu_response_rs_reply(message *m_ptr); 156 157 /* Macros for predefined callback implementations. */ 158 #define SEF_CB_LU_PREPARE_NULL sef_cb_lu_prepare_null 159 #define SEF_CB_LU_STATE_ISVALID_NULL sef_cb_lu_state_isvalid_null 160 #define SEF_CB_LU_STATE_CHANGED_NULL sef_cb_lu_state_changed_null 161 #define SEF_CB_LU_STATE_DUMP_NULL sef_cb_lu_state_dump_null 162 #define SEF_CB_LU_STATE_SAVE_NULL sef_cb_lu_state_save_null 163 #define SEF_CB_LU_RESPONSE_NULL sef_cb_lu_response_null 164 165 #define SEF_CB_LU_PREPARE_DEFAULT sef_cb_lu_prepare_null 166 #define SEF_CB_LU_STATE_ISVALID_DEFAULT sef_cb_lu_state_isvalid_null 167 #define SEF_CB_LU_STATE_CHANGED_DEFAULT sef_cb_lu_state_changed_null 168 #define SEF_CB_LU_STATE_DUMP_DEFAULT sef_cb_lu_state_dump_null 169 #define SEF_CB_LU_STATE_SAVE_DEFAULT sef_cb_lu_state_save_null 170 #define SEF_CB_LU_RESPONSE_DEFAULT sef_cb_lu_response_rs_reply 171 172 /* Standard live update states. */ 173 #define SEF_LU_STATE_NULL 0 /* null state */ 174 #define SEF_LU_STATE_WORK_FREE 1 /* no work in progress */ 175 #define SEF_LU_STATE_REQUEST_FREE 2 /* no request in progress */ 176 #define SEF_LU_STATE_PROTOCOL_FREE 3 /* no protocol in progress */ 177 #define SEF_LU_STATE_CUSTOM_BASE (SEF_LU_STATE_PROTOCOL_FREE+1) 178 #define SEF_LU_STATE_IS_STANDARD(s) ((s) > SEF_LU_STATE_NULL \ 179 && (s) < SEF_LU_STATE_CUSTOM_BASE) 180 181 /* Debug. */ 182 #define SEF_LU_DEBUG_DEFAULT 1 183 184 #ifndef SEF_LU_DEBUG 185 #define SEF_LU_DEBUG SEF_LU_DEBUG_DEFAULT 186 #endif 187 188 #define sef_lu_dprint sef_dprint 189 #define sef_lu_debug_begin sef_debug_begin 190 #define sef_lu_debug_end sef_debug_end 191 192 /*===========================================================================* 193 * SEF Signal * 194 *===========================================================================*/ 195 /* What to intercept. */ 196 #define INTERCEPT_SEF_SIGNAL_REQUESTS 1 197 #define IS_SEF_SIGNAL_REQUEST(mp, status) \ 198 (((mp)->m_type == SIGS_SIGNAL_RECEIVED && (mp)->m_source < INIT_PROC_NR) \ 199 || (is_ipc_notify(status) && (mp)->m_source == SYSTEM)) 200 201 /* Callback type definitions. */ 202 typedef void(*sef_cb_signal_handler_t)(int signo); 203 typedef int(*sef_cb_signal_manager_t)(endpoint_t target, int signo); 204 typedef int(*sef_cb_gcov_t)(message *msg); 205 206 /* Callback registration helpers. */ 207 void sef_setcb_signal_handler(sef_cb_signal_handler_t cb); 208 void sef_setcb_signal_manager(sef_cb_signal_manager_t cb); 209 void sef_setcb_gcov(sef_cb_gcov_t cb); 210 211 /* Predefined callback implementations. */ 212 void sef_cb_signal_handler_null(int signo); 213 int sef_cb_signal_manager_null(endpoint_t target, int signo); 214 215 void sef_cb_signal_handler_term(int signo); 216 void sef_cb_signal_handler_posix_default(int signo); 217 218 /* Macros for predefined callback implementations. */ 219 #define SEF_CB_SIGNAL_HANDLER_NULL sef_cb_signal_handler_null 220 #define SEF_CB_SIGNAL_MANAGER_NULL sef_cb_signal_manager_null 221 222 #define SEF_CB_SIGNAL_HANDLER_DEFAULT sef_cb_signal_handler_null 223 #define SEF_CB_SIGNAL_MANAGER_DEFAULT sef_cb_signal_manager_null 224 225 /* Debug. */ 226 #define SEF_SIGNAL_DEBUG_DEFAULT 0 227 228 #ifndef SEF_SIGNAL_DEBUG 229 #define SEF_SIGNAL_DEBUG SEF_SIGNAL_DEBUG_DEFAULT 230 #endif 231 232 #define sef_signal_dprint sef_dprint 233 #define sef_signal_debug_begin sef_debug_begin 234 #define sef_signal_debug_end sef_debug_end 235 236 /*===========================================================================* 237 * SEF Fault Injection * 238 *===========================================================================*/ 239 /* What to intercept. */ 240 #define INTERCEPT_SEF_FI_REQUESTS 1 241 #define IS_SEF_FI_REQUEST(mp, status) \ 242 (m_ptr->m_type == COMMON_REQ_FI_CTL) 243 244 /* Fault injection tool support. */ 245 #define SEF_FI_ALLOW_EDFI 1 246 247 #if !defined(USE_LIVEUPDATE) 248 #undef INTERCEPT_SEF_LU_REQUESTS 249 #undef SEF_LU_DEBUG 250 #endif 251 252 #endif /* _SEF_H */ 253 254