diff --git a/top/include/lk/init.h b/top/include/lk/init.h index 0b4b6907..648e2037 100644 --- a/top/include/lk/init.h +++ b/top/include/lk/init.h @@ -21,19 +21,19 @@ typedef void (*lk_init_hook)(uint level); enum lk_init_level { LK_INIT_LEVEL_EARLIEST = 1, - LK_INIT_LEVEL_ARCH_EARLY = 0x10000, - LK_INIT_LEVEL_PLATFORM_EARLY = 0x20000, - LK_INIT_LEVEL_TARGET_EARLY = 0x30000, - LK_INIT_LEVEL_HEAP = 0x40000, - LK_INIT_LEVEL_VM = 0x50000, - LK_INIT_LEVEL_KERNEL = 0x60000, - LK_INIT_LEVEL_THREADING = 0x70000, - LK_INIT_LEVEL_ARCH = 0x80000, - LK_INIT_LEVEL_PLATFORM = 0x90000, - LK_INIT_LEVEL_TARGET = 0xa0000, - LK_INIT_LEVEL_APPS = 0xb0000, + LK_INIT_LEVEL_ARCH_EARLY = 0x1000, + LK_INIT_LEVEL_PLATFORM_EARLY = 0x2000, + LK_INIT_LEVEL_TARGET_EARLY = 0x3000, + LK_INIT_LEVEL_HEAP = 0x4000, + LK_INIT_LEVEL_VM = 0x5000, + LK_INIT_LEVEL_KERNEL = 0x6000, + LK_INIT_LEVEL_THREADING = 0x7000, + LK_INIT_LEVEL_ARCH = 0x8000, + LK_INIT_LEVEL_PLATFORM = 0x9000, + LK_INIT_LEVEL_TARGET = 0xa000, + LK_INIT_LEVEL_APPS = 0xb000, - LK_INIT_LEVEL_LAST = UINT_MAX, + LK_INIT_LEVEL_LAST = UINT16_MAX, }; enum lk_init_flags { @@ -44,9 +44,10 @@ enum lk_init_flags { LK_INIT_FLAG_CPU_RESUME = 0x8, }; -void lk_init_level(enum lk_init_flags flags, uint start_level, uint stop_level); +// Run init hooks between start_level (inclusive) and stop_level (exclusive) that match the required_flags. +void lk_init_level(enum lk_init_flags required_flags, uint16_t start_level, uint16_t stop_level); -static inline void lk_primary_cpu_init_level(uint start_level, uint stop_level) { +static inline void lk_primary_cpu_init_level(uint16_t start_level, uint16_t stop_level) { lk_init_level(LK_INIT_FLAG_PRIMARY_CPU, start_level, stop_level); } @@ -55,20 +56,22 @@ static inline void lk_init_level_all(enum lk_init_flags flags) { } struct lk_init_struct { - uint level; - uint flags; + uint16_t level; + uint16_t flags; lk_init_hook hook; const char *name; }; +// Define an init hook with specific flags, level, and name. #define LK_INIT_HOOK_FLAGS(_name, _hook, _level, _flags) \ - const struct lk_init_struct _init_struct_##_name __ALIGNED(sizeof(void *)) __SECTION("lk_init") = { \ - .level = _level, \ - .flags = _flags, \ - .hook = _hook, \ + static const struct lk_init_struct _init_struct_##_name __ALIGNED(sizeof(void *)) __SECTION("lk_init") = { \ + .level = (_level), \ + .flags = (_flags), \ + .hook = (_hook), \ .name = #_name, \ }; +// Shortcut for defining an init hook with primary CPU flag. #define LK_INIT_HOOK(_name, _hook, _level) \ LK_INIT_HOOK_FLAGS(_name, _hook, _level, LK_INIT_FLAG_PRIMARY_CPU) diff --git a/top/init.c b/top/init.c index 97f8862a..c75287f1 100644 --- a/top/init.c +++ b/top/init.c @@ -28,12 +28,12 @@ extern const struct lk_init_struct __start_lk_init __WEAK; extern const struct lk_init_struct __stop_lk_init __WEAK; -void lk_init_level(enum lk_init_flags required_flag, uint start_level, uint stop_level) { - LTRACEF("flags %#x, start_level %#x, stop_level %#x\n", +void lk_init_level(enum lk_init_flags required_flag, uint16_t start_level, uint16_t stop_level) { + LTRACEF("flags %#x, start_level %#hx, stop_level %#hx\n", required_flag, start_level, stop_level); ASSERT(start_level > 0); - uint last_called_level = start_level - 1; + uint16_t last_called_level = start_level - 1; const struct lk_init_struct *last = NULL; for (;;) { /* search for the lowest uncalled hook to call */ @@ -87,27 +87,3 @@ void lk_init_level(enum lk_init_flags required_flag, uint start_level, uint stop last = found; } } - -#if 0 -void test_hook(uint level) { - LTRACEF("level %#x\n", level); -} -void test_hook1(uint level) { - LTRACEF("level %#x\n", level); -} -void test_hook1a(uint level) { - LTRACEF("level %#x\n", level); -} -void test_hook1b(uint level) { - LTRACEF("level %#x\n", level); -} -void test_hook2(uint level) { - LTRACEF("level %#x\n", level); -} - -LK_INIT_HOOK(test, test_hook, 1); -LK_INIT_HOOK(test1, test_hook1, 1); -LK_INIT_HOOK(test2, test_hook2, 2); -LK_INIT_HOOK(test1a, test_hook1a, 1); -LK_INIT_HOOK(test1b, test_hook1b, 1); -#endif