lk/include/lk/init.h
typedef void (*lk_init_hook)(uint level);
struct lk_init_struct { uint level; uint flags; lk_init_hook hook; const char *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, \ .name = #_name, \ };
#define LK_INIT_HOOK(_name, _hook, _level) \ LK_INIT_HOOK_FLAGS(_name, _hook, _level, LK_INIT_FLAG_PRIMARY_CPU)
示例:
/* secondary cpu initialize the timer just before the kernel starts with interrupts enabled */ LK_INIT_HOOK_FLAGS(arm_cortex_a9_timer_init_percpu, arm_cortex_a9_timer_init_percpu, LK_INIT_LEVEL_THREADING - 1, LK_INIT_FLAG_SECONDARY_CPUS);
/* secondary cpu initialize the timer just before the kernel starts with interrupts enabled */ LK_INIT_HOOK_FLAGS(arm_generic_timer_init_secondary_cpu, arm_generic_timer_init_secondary_cpu, LK_INIT_LEVEL_THREADING - 1, LK_INIT_FLAG_SECONDARY_CPUS);
LK_INIT_HOOK_FLAGS(arm_generic_timer_resume_cpu, arm_generic_timer_resume_cpu, LK_INIT_LEVEL_PLATFORM, LK_INIT_FLAG_CPU_RESUME);
LK_INIT_HOOK_FLAGS(arm_gic_init_percpu, arm_gic_init_percpu, LK_INIT_LEVEL_PLATFORM_EARLY, LK_INIT_FLAG_SECONDARY_CPUS);
LK_INIT_HOOK_FLAGS(arm_gic_suspend_cpu, arm_gic_suspend_cpu, LK_INIT_LEVEL_PLATFORM, LK_INIT_FLAG_CPU_SUSPEND);
LK_INIT_HOOK_FLAGS(arm_gic_resume_cpu, arm_gic_resume_cpu, LK_INIT_LEVEL_PLATFORM, LK_INIT_FLAG_CPU_RESUME);
LK_INIT_HOOK(bootargs, bootargs_init_hook, LK_INIT_LEVEL_THREADING);
LK_INIT_HOOK(console, console_init_hook, LK_INIT_LEVEL_PLATFORM_EARLY - 1); LK_INIT_HOOK(pktbuf, pktbuf_init, LK_INIT_LEVEL_THREADING); LK_INIT_HOOK(ptable, &ptable_init, LK_INIT_LEVEL_THREADING); LK_INIT_HOOK(sysparam, &sysparam_init, LK_INIT_LEVEL_THREADING); LK_INIT_HOOK(usb, usb_init, LK_INIT_LEVEL_THREADING);
LK_INIT_HOOK(vm_preheap, &vm_init_preheap, LK_INIT_LEVEL_HEAP - 1); LK_INIT_HOOK(vm, &vm_init_postheap, LK_INIT_LEVEL_VM);