| 1 | // SPDX-License-Identifier: GPL-3.0-or-later |
| 2 | |
| 3 | #pragma once |
| 4 | |
| 5 | #include <mos/string_view.hpp> |
| 6 | #include <mos/types.hpp> |
| 7 | |
| 8 | typedef enum |
| 9 | { |
| 10 | INIT_TARGET_POWER, // Power management subsystem |
| 11 | INIT_TARGET_PRE_VFS, // Pre-virtual file system |
| 12 | INIT_TARGET_VFS, // Virtual file system |
| 13 | INIT_TARGET_SYSFS, // sysfs filesystem |
| 14 | INIT_TARGET_KTHREAD, // Kernel threads |
| 15 | } init_target_t; |
| 16 | |
| 17 | typedef struct |
| 18 | { |
| 19 | const char *param; |
| 20 | bool (*hook)(mos::string_view arg); |
| 21 | } mos_cmdline_hook_t; |
| 22 | |
| 23 | typedef struct |
| 24 | { |
| 25 | init_target_t target; |
| 26 | void (*init_fn)(void); |
| 27 | } mos_init_t; |
| 28 | |
| 29 | #define MOS_EARLY_SETUP(_param, _fn) \ |
| 30 | static bool _fn(mos::string_view arg); \ |
| 31 | MOS_PUT_IN_SECTION(".mos.early_setup", mos_cmdline_hook_t, __setup_##_fn, { .param = _param, .hook = _fn }); \ |
| 32 | static bool _fn(mos::string_view arg) |
| 33 | |
| 34 | #define MOS_SETUP(_param, _fn) \ |
| 35 | static bool _fn(mos::string_view arg); \ |
| 36 | MOS_PUT_IN_SECTION(".mos.setup", mos_cmdline_hook_t, __setup_##_fn, { .param = _param, .hook = _fn }); \ |
| 37 | static bool _fn(mos::string_view arg) |
| 38 | |
| 39 | #define MOS_INIT(_comp, _fn) \ |
| 40 | static void _fn(void); \ |
| 41 | MOS_PUT_IN_SECTION(".mos.init", mos_init_t, __init_##_fn, { .target = INIT_TARGET_##_comp, .init_fn = _fn }); \ |
| 42 | static void _fn(void) |
| 43 | |
| 44 | void startup_invoke_cmdline_hooks(void); |
| 45 | void startup_invoke_early_cmdline_hooks(void); |
| 46 | void startup_invoke_autoinit(init_target_t target); |
| 47 | |