4 #include <minix/sysutil.h>
6 /* SEF Init callbacks. */
7 static struct sef_cbs
{
8 sef_cb_init_t sef_cb_init_fresh
;
9 sef_cb_init_t sef_cb_init_lu
;
10 sef_cb_init_t sef_cb_init_restart
;
11 sef_cb_init_response_t sef_cb_init_response
;
13 SEF_CB_INIT_FRESH_DEFAULT
,
14 SEF_CB_INIT_LU_DEFAULT
,
15 SEF_CB_INIT_RESTART_DEFAULT
,
16 SEF_CB_INIT_RESPONSE_DEFAULT
19 /* SEF Init prototypes for sef_startup(). */
20 int do_sef_rs_init(endpoint_t old_endpoint
);
21 int do_sef_init_request(message
*m_ptr
);
24 EXTERN
char* sef_debug_header(void);
26 /* Information about SELF. */
27 EXTERN endpoint_t sef_self_endpoint
;
28 EXTERN endpoint_t sef_self_priv_flags
;
30 /*===========================================================================*
32 *===========================================================================*/
33 static int process_init(int type
, sef_init_info_t
*info
)
35 /* Process initialization. */
41 sef_init_debug_begin();
42 sef_init_dprint("%s. Got a SEF Init request of type: %d. About to init.\n",
43 sef_debug_header(), type
);
47 /* Let the callback code handle the specific initialization type. */
50 result
= sef_cbs
.sef_cb_init_fresh(type
, info
);
53 result
= sef_cbs
.sef_cb_init_lu(type
, info
);
55 case SEF_INIT_RESTART
:
56 result
= sef_cbs
.sef_cb_init_restart(type
, info
);
60 /* Not a valid SEF init type. */
65 m
.m_source
= sef_self_endpoint
;
67 m
.RS_INIT_RESULT
= result
;
68 r
= sef_cbs
.sef_cb_init_response(&m
);
73 /*===========================================================================*
75 *===========================================================================*/
76 int do_sef_rs_init(endpoint_t old_endpoint
)
78 /* Special SEF Init for RS. */
83 /* Get init parameters from SEF. */
84 type
= SEF_INIT_FRESH
;
85 if(sef_self_priv_flags
& LU_SYS_PROC
) {
88 else if(sef_self_priv_flags
& RST_SYS_PROC
) {
89 type
= SEF_INIT_RESTART
;
91 info
.rproctab_gid
= -1;
92 info
.endpoint
= sef_self_endpoint
;
93 info
.old_endpoint
= old_endpoint
;
95 /* Peform initialization. */
96 r
= process_init(type
, &info
);
101 /*===========================================================================*
102 * do_sef_init_request *
103 *===========================================================================*/
104 int do_sef_init_request(message
*m_ptr
)
106 /* Handle a SEF Init request. */
109 sef_init_info_t info
;
111 /* Get init parameters from message. */
112 type
= m_ptr
->RS_INIT_TYPE
;
113 info
.rproctab_gid
= m_ptr
->RS_INIT_RPROCTAB_GID
;
114 info
.endpoint
= sef_self_endpoint
;
115 info
.old_endpoint
= m_ptr
->RS_INIT_OLD_ENDPOINT
;
117 /* Peform initialization. */
118 r
= process_init(type
, &info
);
123 /*===========================================================================*
124 * sef_setcb_init_fresh *
125 *===========================================================================*/
126 void sef_setcb_init_fresh(sef_cb_init_t cb
)
129 sef_cbs
.sef_cb_init_fresh
= cb
;
132 /*===========================================================================*
133 * sef_setcb_init_lu *
134 *===========================================================================*/
135 void sef_setcb_init_lu(sef_cb_init_t cb
)
138 sef_cbs
.sef_cb_init_lu
= cb
;
141 /*===========================================================================*
142 * sef_setcb_init_restart *
143 *===========================================================================*/
144 void sef_setcb_init_restart(sef_cb_init_t cb
)
147 sef_cbs
.sef_cb_init_restart
= cb
;
150 /*===========================================================================*
151 * sef_setcb_init_response *
152 *===========================================================================*/
153 void sef_setcb_init_response(sef_cb_init_response_t cb
)
156 sef_cbs
.sef_cb_init_response
= cb
;
159 /*===========================================================================*
161 *===========================================================================*/
162 int sef_cb_init_null(int UNUSED(type
),
163 sef_init_info_t
*UNUSED(info
))
168 /*===========================================================================*
169 * sef_cb_init_response_null *
170 *===========================================================================*/
171 int sef_cb_init_response_null(message
* UNUSED(m_ptr
))
176 /*===========================================================================*
178 *===========================================================================*/
179 int sef_cb_init_fail(int UNUSED(type
), sef_init_info_t
*UNUSED(info
))
184 /*===========================================================================*
185 * sef_cb_init_reset *
186 *===========================================================================*/
187 int sef_cb_init_reset(int UNUSED(type
), sef_init_info_t
*UNUSED(info
))
189 /* Tell RS to reincarnate us, with no old resources, and a new endpoint. */
193 /*===========================================================================*
194 * sef_cb_init_crash *
195 *===========================================================================*/
196 int sef_cb_init_crash(int UNUSED(type
), sef_init_info_t
*UNUSED(info
))
198 panic("Simulating a crash at initialization time...");
203 /*===========================================================================*
204 * sef_cb_init_response_rs_reply *
205 *===========================================================================*/
206 int sef_cb_init_response_rs_reply(message
*m_ptr
)
210 /* Inform RS that we completed initialization with the given result. */
211 r
= sendrec(RS_PROC_NR
, m_ptr
);