Files
mango/arch/user/initcall.c

97 lines
3.6 KiB
C

#include <socks/init.h>
#ifdef __APPLE__
extern char __start_initcall0[] __asm("section$start$__DATA$__initcall0.init");
extern char __stop_initcall0[] __asm("section$end$__DATA$__initcall0.init");
extern char __start_initcall1[] __asm("section$start$__DATA$__initcall1.init");
extern char __stop_initcall1[] __asm("section$end$__DATA$__initcall1.init");
extern char __start_initcall2[] __asm("section$start$__DATA$__initcall2.init");
extern char __stop_initcall2[] __asm("section$end$__DATA$__initcall2.init");
extern char __start_initcall3[] __asm("section$start$__DATA$__initcall3.init");
extern char __stop_initcall3[] __asm("section$end$__DATA$__initcall3.init");
extern char __start_initcall4[] __asm("section$start$__DATA$__initcall4.init");
extern char __stop_initcall4[] __asm("section$end$__DATA$__initcall4.init");
extern char __start_initcall5[] __asm("section$start$__DATA$__initcall5.init");
extern char __stop_initcall5[] __asm("section$end$__DATA$__initcall5.init");
extern char __start_initcall6[] __asm("section$start$__DATA$__initcall6.init");
extern char __stop_initcall6[] __asm("section$end$__DATA$__initcall6.init");
extern char __start_initcall7[] __asm("section$start$__DATA$__initcall7.init");
extern char __stop_initcall7[] __asm("section$end$__DATA$__initcall7.init");
extern char __start_initcall8[] __asm("section$start$__DATA$__initcall8.init");
extern char __stop_initcall8[] __asm("section$end$__DATA$__initcall8.init");
#else
extern char __start_initcall0_init[];
extern char __stop_initcall0_init[];
extern char __start_initcall1_init[];
extern char __stop_initcall1_init[];
extern char __start_initcall2_init[];
extern char __stop_initcall2_init[];
extern char __start_initcall3_init[];
extern char __stop_initcall3_init[];
extern char __start_initcall4_init[];
extern char __stop_initcall4_init[];
extern char __start_initcall5_init[];
extern char __stop_initcall5_init[];
extern char __start_initcall6_init[];
extern char __stop_initcall6_init[];
extern char __start_initcall7_init[];
extern char __stop_initcall7_init[];
extern char __start_initcall8_init[];
extern char __stop_initcall8_init[];
#endif
static initcall_t *initcall_start[] = {
(initcall_t *)__start_initcall0_init,
(initcall_t *)__start_initcall1_init,
(initcall_t *)__start_initcall2_init,
(initcall_t *)__start_initcall3_init,
(initcall_t *)__start_initcall4_init,
(initcall_t *)__start_initcall5_init,
(initcall_t *)__start_initcall6_init,
(initcall_t *)__start_initcall7_init,
(initcall_t *)__start_initcall8_init,
};
static initcall_t *initcall_end[] = {
(initcall_t *)__stop_initcall0_init,
(initcall_t *)__stop_initcall1_init,
(initcall_t *)__stop_initcall2_init,
(initcall_t *)__stop_initcall3_init,
(initcall_t *)__stop_initcall4_init,
(initcall_t *)__stop_initcall5_init,
(initcall_t *)__stop_initcall6_init,
(initcall_t *)__stop_initcall7_init,
(initcall_t *)__stop_initcall8_init,
};
int start_initlevel(int level)
{
if (initcall_start[level] == initcall_end[level]) {
return 0;
}
for (initcall_t *fn = initcall_start[level]; fn < initcall_end[level]; fn++) {
int res = (*fn)();
if (res != 0) {
return res;
}
}
return 0;
}
/* define a stub initcall for each initlevel to ensure
the corresponding exec section gets created */
static int stub_initcall(void) { return 0; }
__define_initcall(stub_initcall, 0);
__define_initcall(stub_initcall, 1);
__define_initcall(stub_initcall, 2);
__define_initcall(stub_initcall, 3);
__define_initcall(stub_initcall, 4);
__define_initcall(stub_initcall, 5);
__define_initcall(stub_initcall, 6);
__define_initcall(stub_initcall, 7);
__define_initcall(stub_initcall, 8);