#include "syslib.h" #include #include /* SEF Init callbacks. */ PRIVATE struct sef_cbs { sef_cb_init_t sef_cb_init_fresh; sef_cb_init_t sef_cb_init_lu; sef_cb_init_t sef_cb_init_restart; } sef_cbs = { SEF_CB_INIT_FRESH_DEFAULT, SEF_CB_INIT_LU_DEFAULT, SEF_CB_INIT_RESTART_DEFAULT }; /* SEF Init prototypes for sef_startup(). */ PUBLIC _PROTOTYPE( int do_sef_rs_init, (void) ); PUBLIC _PROTOTYPE( int do_sef_init_request, (message *m_ptr) ); /* Debug. */ EXTERN _PROTOTYPE( char* sef_debug_header, (void) ); /*===========================================================================* * do_sef_rs_init * *===========================================================================*/ PUBLIC int do_sef_rs_init() { /* Special SEF Init for RS. */ return sef_cbs.sef_cb_init_fresh(SEF_INIT_FRESH, NULL); } /*===========================================================================* * do_sef_init_request * *===========================================================================*/ PUBLIC int do_sef_init_request(message *m_ptr) { /* Handle a SEF Init request. */ int r; int type; sef_init_info_t info; /* Debug. */ /*XXX*/vmmcall(0x12345607, 0, 14); #if SEF_INIT_DEBUG sef_init_debug_begin(); sef_init_dprint("%s. Got a SEF Init request of type: %d. About to init.\n", sef_debug_header(), m_ptr->RS_INIT_TYPE); sef_init_debug_end(); #endif /* Let the callback code handle the request. */ /*XXX*/vmmcall(0x12345607, 0, 15); type = m_ptr->RS_INIT_TYPE; /*XXX*/vmmcall(0x12345607, type, 16); info.rproctab_gid = m_ptr->RS_INIT_RPROCTAB_GID; info.old_endpoint = m_ptr->RS_INIT_OLD_ENDPOINT; switch(type) { case SEF_INIT_FRESH: /*XXX*/vmmcall(0x12345607, 0, 17); r = sef_cbs.sef_cb_init_fresh(type, &info); /*XXX*/vmmcall(0x12345607, r, 18); break; case SEF_INIT_LU: /*XXX*/vmmcall(0x12345607, 0, 19); r = sef_cbs.sef_cb_init_lu(type, &info); /*XXX*/vmmcall(0x12345607, r, 20); break; case SEF_INIT_RESTART: /*XXX*/vmmcall(0x12345607, 0, 21); r = sef_cbs.sef_cb_init_restart(type, &info); /*XXX*/vmmcall(0x12345607, r, 22); break; default: /* Not a valid SEF init type. */ /*XXX*/vmmcall(0x12345607, 0, 23); r = EINVAL; break; } /* Report back to RS. */ m_ptr->RS_INIT_RESULT = r; /*XXX*/vmmcall(0x12345607, 0, 24); r = sendrec(RS_PROC_NR, m_ptr); /*XXX*/vmmcall(0x12345607, 0, 25); return r; } /*===========================================================================* * sef_setcb_init_fresh * *===========================================================================*/ PUBLIC void sef_setcb_init_fresh(sef_cb_init_t cb) { assert(cb != NULL); /*XXX*/vmmcall(0x12345607, (unsigned) cb, 26); sef_cbs.sef_cb_init_fresh = cb; /*XXX*/vmmcall(0x12345607, 0, 27); } /*===========================================================================* * sef_setcb_init_lu * *===========================================================================*/ PUBLIC void sef_setcb_init_lu(sef_cb_init_t cb) { assert(cb != NULL); sef_cbs.sef_cb_init_lu = cb; } /*===========================================================================* * sef_setcb_init_restart * *===========================================================================*/ PUBLIC void sef_setcb_init_restart(sef_cb_init_t cb) { assert(cb != NULL); sef_cbs.sef_cb_init_restart = cb; } /*===========================================================================* * sef_cb_init_null * *===========================================================================*/ PUBLIC int sef_cb_init_null(int UNUSED(type), sef_init_info_t *UNUSED(info)) { return OK; } /*===========================================================================* * sef_cb_init_fail * *===========================================================================*/ PUBLIC int sef_cb_init_fail(int UNUSED(type), sef_init_info_t *UNUSED(info)) { return ENOSYS; } /*===========================================================================* * sef_cb_init_crash * *===========================================================================*/ PUBLIC int sef_cb_init_crash(int UNUSED(type), sef_init_info_t *UNUSED(info)) { panic("Simulating a crash at initialization time..."); return OK; }