Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / minix / sef.h @ 14

History | View | Annotate | Download (15.3 KB)

1 13 up20180614
/* 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 __dead sef_exit(int status);
14
int sef_getrndseed (void);
15
int sef_munmap(void *addrstart, vir_bytes len, int type);
16
#define sef_receive(src, m_ptr) sef_receive_status(src, m_ptr, NULL)
17
18
/* SEF global definitions. */
19
#define SEF_STATE_TRANSFER_GID          0
20
21
/* SEF Debug. */
22
#include <stdio.h>
23
#define sef_dprint                      printf
24
#define sef_debug_begin()               (void)(NULL)
25
#define sef_debug_end()                 (void)(NULL)
26
27
/*===========================================================================*
28
 *                                  SEF Init                                     *
29
 *===========================================================================*/
30
/* What to intercept. */
31
#define INTERCEPT_SEF_INIT_REQUESTS 1
32
#define SEF_INIT_REQUEST_TYPE RS_INIT
33
#define IS_SEF_INIT_REQUEST(mp, status) ((mp)->m_type == RS_INIT \
34
     && (mp)->m_source == RS_PROC_NR)
35
36
#define SEF_COPY_OLD_TO_NEW     0x001
37
#define SEF_COPY_NEW_TO_NEW     0x002
38
#define SEF_COPY_DEST_OFFSET    0x004
39
#define SEF_COPY_SRC_OFFSET     0X008
40
41
/* Type definitions. */
42
typedef struct {
43
    int flags;
44
    cp_grant_id_t rproctab_gid;
45
    endpoint_t endpoint;
46
    endpoint_t old_endpoint;
47
    int restarts;
48
    void* init_buff_start;
49
    void* init_buff_cleanup_start;
50
    size_t init_buff_len;
51
    int copy_flags;
52
    int prepare_state;
53
} sef_init_info_t;
54
55
/* Callback type definitions. */
56
typedef int(*sef_cb_init_t)(int type, sef_init_info_t *info);
57
typedef int(*sef_cb_init_response_t)(message *m_ptr);
58
59
/* Callback registration helpers. */
60
void sef_setcb_init_fresh(sef_cb_init_t cb);
61
void sef_setcb_init_lu(sef_cb_init_t cb);
62
void sef_setcb_init_restart(sef_cb_init_t cb);
63
void sef_setcb_init_response(sef_cb_init_response_t cb);
64
65
/* Predefined callback implementations. */
66
int sef_cb_init_null(int type, sef_init_info_t *info);
67
int sef_cb_init_response_null(message *m_ptr);
68
69
int sef_cb_init_fail(int type, sef_init_info_t *info);
70
int sef_cb_init_reset(int type, sef_init_info_t *info);
71
int sef_cb_init_crash(int type, sef_init_info_t *info);
72
int sef_cb_init_timeout(int type, sef_init_info_t *info);
73
int sef_cb_init_restart_generic(int type, sef_init_info_t *info);
74
int sef_cb_init_identity_state_transfer(int type, sef_init_info_t *info);
75
int sef_cb_init_lu_identity_as_restart(int type, sef_init_info_t *info);
76
int sef_cb_init_lu_generic(int type, sef_init_info_t *info);
77
int sef_cb_init_response_rs_reply(message *m_ptr);
78
int sef_cb_init_response_rs_asyn_once(message *m_ptr);
79
80
/* Macros for predefined callback implementations. */
81
#define SEF_CB_INIT_FRESH_NULL          sef_cb_init_null
82
#define SEF_CB_INIT_LU_NULL             sef_cb_init_null
83
#define SEF_CB_INIT_RESTART_NULL        sef_cb_init_null
84
#define SEF_CB_INIT_RESPONSE_NULL       sef_cb_init_response_null
85
#define SEF_CB_INIT_RESTART_STATEFUL    sef_cb_init_restart_generic
86
87
#define SEF_CB_INIT_FRESH_DEFAULT       sef_cb_init_null
88
#define SEF_CB_INIT_LU_DEFAULT          sef_cb_init_lu_generic
89
#define SEF_CB_INIT_RESTART_DEFAULT     sef_cb_init_reset
90
#define SEF_CB_INIT_RESPONSE_DEFAULT    sef_cb_init_response_rs_reply
91
92
/* Init types. */
93
#define SEF_INIT_FRESH                  0    /* init fresh */
94
#define SEF_INIT_LU                     1    /* init after live update */
95
#define SEF_INIT_RESTART                2    /* init after restart */
96
97
/* Init flags (live update flags can be used as init flags as well). */
98
#define SEF_INIT_CRASH                       0x1
99
#define SEF_INIT_FAIL                      0x2
100
#define SEF_INIT_TIMEOUT              0x4
101
#define SEF_INIT_DEFCB                0x8
102
#define SEF_INIT_SCRIPT_RESTART             0x10
103
#define SEF_INIT_ST                  0x20    /* force state transfer init */
104
105
/* Debug. */
106
#define SEF_INIT_DEBUG_DEFAULT                 0
107
#define SEF_INIT_ALLOW_DEBUG_INIT_FLAGS 1
108
109
#ifndef SEF_INIT_DEBUG
110
#define SEF_INIT_DEBUG                  SEF_INIT_DEBUG_DEFAULT
111
#endif
112
113
#define sef_init_dprint                 sef_dprint
114
#define sef_init_debug_begin            sef_debug_begin
115
#define sef_init_debug_end              sef_debug_end
116
117
/*===========================================================================*
118
 *                                  SEF Ping                                     *
119
 *===========================================================================*/
120
/* What to intercept. */
121
#define INTERCEPT_SEF_PING_REQUESTS 1
122
#define SEF_PING_REQUEST_TYPE NOTIFY_MESSAGE
123
#define IS_SEF_PING_REQUEST(mp, status) (is_ipc_notify(status) \
124
    && (mp)->m_source == RS_PROC_NR)
125
126
/* Callback type definitions. */
127
typedef void(*sef_cb_ping_reply_t)(endpoint_t source);
128
129
/* Callback registration helpers. */
130
void sef_setcb_ping_reply(sef_cb_ping_reply_t cb);
131
132
/* Predefined callback implementations. */
133
void sef_cb_ping_reply_null(endpoint_t source);
134
135
void sef_cb_ping_reply_pong(endpoint_t source);
136
137
/* Macros for predefined callback implementations. */
138
#define SEF_CB_PING_REPLY_NULL          sef_cb_ping_reply_null
139
140
#define SEF_CB_PING_REPLY_DEFAULT       sef_cb_ping_reply_pong
141
142
/* Debug. */
143
#define SEF_PING_DEBUG_DEFAULT 0
144
145
#ifndef SEF_PING_DEBUG
146
#define SEF_PING_DEBUG                  SEF_PING_DEBUG_DEFAULT
147
#endif
148
149
#define sef_ping_dprint                 sef_dprint
150
#define sef_ping_debug_begin            sef_debug_begin
151
#define sef_ping_debug_end              sef_debug_end
152
153
/*===========================================================================*
154
 *                                SEF Live update                                     *
155
 *===========================================================================*/
156
/* What to intercept. */
157
#define INTERCEPT_SEF_LU_REQUESTS 1
158
#define SEF_LU_REQUEST_TYPE RS_LU_PREPARE
159
#define IS_SEF_LU_REQUEST(mp, status) ((mp)->m_type == RS_LU_PREPARE \
160
    && (mp)->m_source == RS_PROC_NR)
161
162
/* Callback type definitions. */
163
typedef  int(*sef_cb_lu_prepare_t)(int);
164
typedef  int(*sef_cb_lu_state_isvalid_t)(int, int);
165
typedef void(*sef_cb_lu_state_changed_t)(int, int);
166
typedef void(*sef_cb_lu_state_dump_t)(int);
167
typedef  int(*sef_cb_lu_state_save_t)(int, int);
168
typedef  int(*sef_cb_lu_response_t)(message *m_ptr);
169
170
/* Callback registration helpers. */
171
void sef_setcb_lu_prepare(sef_cb_lu_prepare_t cb);
172
void sef_setcb_lu_state_isvalid(sef_cb_lu_state_isvalid_t cb);
173
void sef_setcb_lu_state_changed(sef_cb_lu_state_changed_t cb);
174
void sef_setcb_lu_state_dump(sef_cb_lu_state_dump_t cb);
175
void sef_setcb_lu_state_save(sef_cb_lu_state_save_t cb);
176
void sef_setcb_lu_response(sef_cb_lu_response_t cb);
177
178
/* Predefined callback implementations. */
179
int sef_cb_lu_prepare_null(int state);
180
int sef_cb_lu_state_isvalid_null(int state, int flags);
181
void sef_cb_lu_state_changed_null(int old_state, int state);
182
void sef_cb_lu_state_dump_null(int state);
183
int sef_cb_lu_state_save_null(int state, int flags);
184
int sef_cb_lu_response_null(message *m_ptr);
185
186
int sef_cb_lu_prepare_always_ready(int state);
187
int sef_cb_lu_prepare_never_ready(int state);
188
int sef_cb_lu_prepare_crash(int state);
189
int sef_cb_lu_prepare_eval(int state);
190
int sef_cb_lu_state_isvalid_standard(int state, int flags);
191
int sef_cb_lu_state_isvalid_workfree(int state, int flags);
192
int sef_cb_lu_state_isvalid_workfree_self(int state, int flags);
193
int sef_cb_lu_state_isvalid_generic(int state, int flags);
194
void sef_cb_lu_state_dump_eval(int state);
195
int sef_cb_lu_response_rs_reply(message *m_ptr);
196
197
/* Macros for predefined callback implementations. */
198
#define SEF_CB_LU_PREPARE_NULL          sef_cb_lu_prepare_null
199
#define SEF_CB_LU_STATE_ISVALID_NULL    sef_cb_lu_state_isvalid_null
200
#define SEF_CB_LU_STATE_CHANGED_NULL    sef_cb_lu_state_changed_null
201
#define SEF_CB_LU_STATE_DUMP_NULL       sef_cb_lu_state_dump_null
202
#define SEF_CB_LU_STATE_SAVE_NULL       sef_cb_lu_state_save_null
203
#define SEF_CB_LU_RESPONSE_NULL         sef_cb_lu_response_null
204
205
#define SEF_CB_LU_PREPARE_DEFAULT       sef_cb_lu_prepare_null
206
#define SEF_CB_LU_STATE_ISVALID_DEFAULT sef_cb_lu_state_isvalid_generic
207
#define SEF_CB_LU_STATE_CHANGED_DEFAULT sef_cb_lu_state_changed_null
208
#define SEF_CB_LU_STATE_DUMP_DEFAULT    sef_cb_lu_state_dump_eval
209
#define SEF_CB_LU_STATE_SAVE_DEFAULT    sef_cb_lu_state_save_null
210
#define SEF_CB_LU_RESPONSE_DEFAULT      sef_cb_lu_response_rs_reply
211
212
/* Standard live update states. */
213
#define SEF_LU_STATE_NULL               0    /* null state */
214
#define SEF_LU_STATE_WORK_FREE          1    /* no work in progress */
215
#define SEF_LU_STATE_REQUEST_FREE       2    /* no request in progress */
216
#define SEF_LU_STATE_PROTOCOL_FREE      3    /* no protocol in progress */
217
#define SEF_LU_STATE_EVAL               4    /* evaluate expression */
218
219
#define SEF_LU_STATE_UNREACHABLE        5    /* unreachable state */
220
#define SEF_LU_STATE_PREPARE_CRASH      6    /* crash at prepare time */
221
222
#define SEF_LU_STATE_STD_BASE           (SEF_LU_STATE_WORK_FREE)
223
#define SEF_LU_STATE_DEBUG_BASE         (SEF_LU_STATE_UNREACHABLE)
224
#define SEF_LU_STATE_CUSTOM_BASE        (SEF_LU_STATE_PREPARE_CRASH+1)
225
226
#define SEF_LU_STATE_IS_STANDARD(s)     ((s) >= SEF_LU_STATE_STD_BASE \
227
    && (s) < SEF_LU_STATE_CUSTOM_BASE \
228
    && (SEF_LU_ALWAYS_ALLOW_DEBUG_STATES || !SEF_LU_STATE_IS_DEBUG(s)))
229
#define SEF_LU_STATE_IS_DEBUG(s)     ((s) >= SEF_LU_STATE_DEBUG_BASE \
230
    && (s) < SEF_LU_STATE_CUSTOM_BASE)
231
232
#define SEF_LU_STATE_EVAL_MAX_LEN          512
233
234
/* Live update flags (can be used as init flags as well). */
235
#define SEF_LU_SELF                        0x0100    /* this is a self update */
236
#define SEF_LU_ASR                         0x0200    /* this is an ASR update */
237
#define SEF_LU_MULTI                       0x0400    /* this is a multi-component update */
238
#define SEF_LU_INCLUDES_VM                   0x0800    /* the update includes VM */
239
#define SEF_LU_INCLUDES_RS                   0x1000    /* the update includes RS */
240
#define SEF_LU_PREPARE_ONLY           0x2000    /* prepare only, no actual update taking place */
241
#define SEF_LU_NOMMAP                            0x4000    /* update doesn't inherit mmapped regions */
242
#define SEF_LU_DETACHED                    0x8000    /* update detaches the old instance */
243
244
#define SEF_LU_IS_IDENTITY_UPDATE(F) (((F) & (SEF_LU_SELF|SEF_LU_NOMMAP|SEF_LU_ASR|SEF_INIT_ST)) == SEF_LU_SELF)
245
246
/* Debug. */
247
#define SEF_LU_DEBUG_DEFAULT             0
248
#define SEF_LU_ALWAYS_ALLOW_DEBUG_STATES 1
249
250
#ifndef SEF_LU_DEBUG
251
#define SEF_LU_DEBUG            SEF_LU_DEBUG_DEFAULT
252
#endif
253
254
#define sef_lu_dprint           sef_dprint
255
#define sef_lu_debug_begin      sef_debug_begin
256
#define sef_lu_debug_end        sef_debug_end
257
258
/*===========================================================================*
259
 *                                  SEF Signal                                     *
260
 *===========================================================================*/
261
/* What to intercept. */
262
#define INTERCEPT_SEF_SIGNAL_REQUESTS 1
263
#define SEF_SIGNAL_REQUEST_TYPE SIGS_SIGNAL_RECEIVED
264
#define IS_SEF_SIGNAL_REQUEST(mp, status) \
265
    (((mp)->m_type == SIGS_SIGNAL_RECEIVED && (mp)->m_source < INIT_PROC_NR) \
266
    || (is_ipc_notify(status) && (mp)->m_source == SYSTEM))
267
268
/* Callback type definitions. */
269
typedef void(*sef_cb_signal_handler_t)(int signo);
270
typedef  int(*sef_cb_signal_manager_t)(endpoint_t target, int signo);
271
272
/* Callback registration helpers. */
273
void sef_setcb_signal_handler(sef_cb_signal_handler_t cb);
274
void sef_setcb_signal_manager(sef_cb_signal_manager_t cb);
275
276
/* Predefined callback implementations. */
277
void sef_cb_signal_handler_null(int signo);
278
int sef_cb_signal_manager_null(endpoint_t target, int signo);
279
280
void sef_cb_signal_handler_term(int signo);
281
void sef_cb_signal_handler_posix_default(int signo);
282
283
/* Macros for predefined callback implementations. */
284
#define SEF_CB_SIGNAL_HANDLER_NULL      sef_cb_signal_handler_null
285
#define SEF_CB_SIGNAL_MANAGER_NULL      sef_cb_signal_manager_null
286
287
#define SEF_CB_SIGNAL_HANDLER_DEFAULT   sef_cb_signal_handler_null
288
#define SEF_CB_SIGNAL_MANAGER_DEFAULT   sef_cb_signal_manager_null
289
290
/* Debug. */
291
#define SEF_SIGNAL_DEBUG_DEFAULT 0
292
293
#ifndef SEF_SIGNAL_DEBUG
294
#define SEF_SIGNAL_DEBUG                SEF_SIGNAL_DEBUG_DEFAULT
295
#endif
296
297
#define sef_signal_dprint               sef_dprint
298
#define sef_signal_debug_begin          sef_debug_begin
299
#define sef_signal_debug_end            sef_debug_end
300
301
/*===========================================================================*
302
 *                                  SEF GCOV                                     *
303
 *===========================================================================*/
304
/* What to intercept. */
305
#define INTERCEPT_SEF_GCOV_REQUESTS 1
306
#define SEF_GCOV_REQUEST_TYPE COMMON_REQ_GCOV_DATA
307
#define IS_SEF_GCOV_REQUEST(mp, status) \
308
    ((mp)->m_type == COMMON_REQ_GCOV_DATA && (mp)->m_source == VFS_PROC_NR)
309
310
/* Callback type definitions. */
311
typedef  int(*sef_cb_gcov_t)(message *msg);
312
313
/* Callback registration helpers. */
314
void sef_setcb_gcov(sef_cb_gcov_t cb);
315
316
/* Macros for predefined callback implementations. */
317
#define SEF_CB_GCOV_FLUSH_DEFAULT        do_gcov_flush_impl
318
319
/*===========================================================================*
320
 *                             SEF Fault Injection                             *
321
 *===========================================================================*/
322
/* What to intercept. */
323
#define INTERCEPT_SEF_FI_REQUESTS 1
324
#define SEF_FI_REQUEST_TYPE COMMON_REQ_FI_CTL
325
#define IS_SEF_FI_REQUEST(mp, status) \
326
    (m_ptr->m_type == COMMON_REQ_FI_CTL)
327
328
/* Fault injection tool support. */
329
#define SEF_FI_ALLOW_EDFI               1
330
331
/*===========================================================================*
332
 *                          SEF State Transfer                               *
333
 *===========================================================================*/
334
#define SEF_LU_STATE_EVAL_MAX_LEN          512
335
336
/* State transfer helpers. */
337
int sef_copy_state_region_ctl(sef_init_info_t *info,
338
    vir_bytes *src_address, vir_bytes *dst_address);
339
int sef_copy_state_region(sef_init_info_t *info,
340
    vir_bytes address, size_t size, vir_bytes dst_address, int may_have_holes);
341
int sef_st_state_transfer(sef_init_info_t *info);
342
343
/* Callback prototypes to be passed to the State Transfer framwork. */
344
int sef_old_state_table_lookup(sef_init_info_t *info, void *addr);
345
int sef_old_state_table_lookup_opaque(void *info_opaque, void *addr);
346
int sef_copy_state_region_opaque(void *info_opaque, uint32_t address,
347
    size_t size, uint32_t dst_address);
348
349
/* Debug. */
350
#define SEF_ST_DEBUG_DEFAULT                 0
351
352
#ifndef SEF_ST_DEBUG
353
#define SEF_ST_DEBUG                    SEF_ST_DEBUG_DEFAULT
354
#endif
355
356
/*===========================================================================*
357
 *                               SEF LLVM                                    *
358
 *===========================================================================*/
359
/* LLVM helpers. */
360
int sef_llvm_magic_enabled(void);
361
int sef_llvm_real_brk(char *newbrk);
362
int sef_llvm_state_cleanup(void);
363
void sef_llvm_dump_eval(char *expr);
364
int sef_llvm_eval_bool(char *expr, char *result);
365
void *sef_llvm_state_table_addr(void);
366
size_t sef_llvm_state_table_size(void);
367
void sef_llvm_stack_refs_save(char *stack_buff);
368
void sef_llvm_stack_refs_restore(char *stack_buff);
369
int sef_llvm_state_transfer(sef_init_info_t *info);
370
int sef_llvm_add_special_mem_region(void *addr, size_t len, const char* name);
371
int sef_llvm_del_special_mem_region_by_addr(void *addr);
372
void sef_llvm_ds_st_init(void);
373
void *sef_llvm_ac_mmap(void *buf, size_t len, int prot, int flags, int fd,
374
        off_t offset);
375
int sef_llvm_ac_munmap(void *buf, size_t len);
376
377
int sef_llvm_ltckpt_enabled(void);
378
int sef_llvm_get_ltckpt_offset(void);
379
int sef_llvm_ltckpt_restart(int type, sef_init_info_t *info);
380
381
#if !defined(USE_LIVEUPDATE)
382
#undef INTERCEPT_SEF_LU_REQUESTS
383
#undef SEF_LU_DEBUG
384
#endif
385
386
#endif /* _SEF_H */