#include extern char __initcall0_start[]; extern char __initcall1_start[]; extern char __initcall2_start[]; extern char __initcall3_start[]; extern char __initcall4_start[]; extern char __initcall5_start[]; extern char __initcall6_start[]; extern char __initcall7_start[]; extern char __initcall8_start[]; extern char __initcall_end[]; static initcall_t *m_init_func_levels[] = { (initcall_t *)__initcall0_start, (initcall_t *)__initcall1_start, (initcall_t *)__initcall2_start, (initcall_t *)__initcall3_start, (initcall_t *)__initcall4_start, (initcall_t *)__initcall5_start, (initcall_t *)__initcall6_start, (initcall_t *)__initcall7_start, (initcall_t *)__initcall8_start, (initcall_t *)__initcall_end, }; int start_initlevel(int level) { if (m_init_func_levels[level] == m_init_func_levels[level + 1]) { return 0; } for (initcall_t *fn = m_init_func_levels[level]; fn < m_init_func_levels[level + 1]; fn++) { int res = (*fn)(); if (res != 0) { return res; } } return 0; }