4 #include <minix/sysutil.h>
7 /* SEF Init callbacks. */
8 static struct sef_cbs
{
9 sef_cb_init_t sef_cb_init_fresh
;
10 sef_cb_init_t sef_cb_init_lu
;
11 sef_cb_init_t sef_cb_init_restart
;
12 sef_cb_init_response_t sef_cb_init_response
;
14 SEF_CB_INIT_FRESH_DEFAULT
,
15 SEF_CB_INIT_LU_DEFAULT
,
16 SEF_CB_INIT_RESTART_DEFAULT
,
17 SEF_CB_INIT_RESPONSE_DEFAULT
20 /* SEF Init prototypes for sef_startup(). */
21 int do_sef_rs_init(endpoint_t old_endpoint
);
22 int do_sef_init_request(message
*m_ptr
);
25 EXTERN
char* sef_debug_header(void);
27 /* Information about SELF. */
28 EXTERN endpoint_t sef_self_endpoint
;
29 EXTERN endpoint_t sef_self_priv_flags
;
31 /*===========================================================================*
33 *===========================================================================*/
34 static int process_init(int type
, sef_init_info_t
*info
)
36 /* Process initialization. */
42 sef_init_debug_begin();
43 sef_init_dprint("%s. Got a SEF Init request of type: %d. About to init.\n",
44 sef_debug_header(), type
);
48 /* Let the callback code handle the specific initialization type. */
51 result
= sef_cbs
.sef_cb_init_fresh(type
, info
);
54 result
= sef_cbs
.sef_cb_init_lu(type
, info
);
56 case SEF_INIT_RESTART
:
57 result
= sef_cbs
.sef_cb_init_restart(type
, info
);
61 /* Not a valid SEF init type. */
66 memset(&m
, 0, sizeof(m
));
67 m
.m_source
= sef_self_endpoint
;
69 m
.RS_INIT_RESULT
= result
;
70 r
= sef_cbs
.sef_cb_init_response(&m
);
75 /*===========================================================================*
77 *===========================================================================*/
78 int do_sef_rs_init(endpoint_t old_endpoint
)
80 /* Special SEF Init for RS. */
85 /* Get init parameters from SEF. */
86 type
= SEF_INIT_FRESH
;
87 if(sef_self_priv_flags
& LU_SYS_PROC
) {
90 else if(sef_self_priv_flags
& RST_SYS_PROC
) {
91 type
= SEF_INIT_RESTART
;
93 info
.rproctab_gid
= -1;
94 info
.endpoint
= sef_self_endpoint
;
95 info
.old_endpoint
= old_endpoint
;
97 /* Peform initialization. */
98 r
= process_init(type
, &info
);
103 /*===========================================================================*
104 * do_sef_init_request *
105 *===========================================================================*/
106 int do_sef_init_request(message
*m_ptr
)
108 /* Handle a SEF Init request. */
111 sef_init_info_t info
;
113 /* Get init parameters from message. */
114 type
= m_ptr
->RS_INIT_TYPE
;
115 info
.rproctab_gid
= m_ptr
->RS_INIT_RPROCTAB_GID
;
116 info
.endpoint
= sef_self_endpoint
;
117 info
.old_endpoint
= m_ptr
->RS_INIT_OLD_ENDPOINT
;
119 /* Peform initialization. */
120 r
= process_init(type
, &info
);
125 /*===========================================================================*
126 * sef_setcb_init_fresh *
127 *===========================================================================*/
128 void sef_setcb_init_fresh(sef_cb_init_t cb
)
131 sef_cbs
.sef_cb_init_fresh
= cb
;
134 /*===========================================================================*
135 * sef_setcb_init_lu *
136 *===========================================================================*/
137 void sef_setcb_init_lu(sef_cb_init_t cb
)
140 sef_cbs
.sef_cb_init_lu
= cb
;
143 /*===========================================================================*
144 * sef_setcb_init_restart *
145 *===========================================================================*/
146 void sef_setcb_init_restart(sef_cb_init_t cb
)
149 sef_cbs
.sef_cb_init_restart
= cb
;
152 /*===========================================================================*
153 * sef_setcb_init_response *
154 *===========================================================================*/
155 void sef_setcb_init_response(sef_cb_init_response_t cb
)
158 sef_cbs
.sef_cb_init_response
= cb
;
161 /*===========================================================================*
163 *===========================================================================*/
164 int sef_cb_init_null(int UNUSED(type
),
165 sef_init_info_t
*UNUSED(info
))
170 /*===========================================================================*
171 * sef_cb_init_response_null *
172 *===========================================================================*/
173 int sef_cb_init_response_null(message
* UNUSED(m_ptr
))
178 /*===========================================================================*
180 *===========================================================================*/
181 int sef_cb_init_fail(int UNUSED(type
), sef_init_info_t
*UNUSED(info
))
186 /*===========================================================================*
187 * sef_cb_init_reset *
188 *===========================================================================*/
189 int sef_cb_init_reset(int UNUSED(type
), sef_init_info_t
*UNUSED(info
))
191 /* Tell RS to reincarnate us, with no old resources, and a new endpoint. */
195 /*===========================================================================*
196 * sef_cb_init_crash *
197 *===========================================================================*/
198 int sef_cb_init_crash(int UNUSED(type
), sef_init_info_t
*UNUSED(info
))
200 panic("Simulating a crash at initialization time...");
205 /*===========================================================================*
206 * sef_cb_init_response_rs_reply *
207 *===========================================================================*/
208 int sef_cb_init_response_rs_reply(message
*m_ptr
)
212 /* Inform RS that we completed initialization with the given result. */
213 r
= ipc_sendrec(RS_PROC_NR
, m_ptr
);