1 // Copyright 2016 The Fuchsia Authors
2 // Copyright (c) 2013-2015 Travis Geiselbrecht
3 //
4 // Use of this source code is governed by a MIT-style
5 // license that can be found in the LICENSE file or at
6 // https://opensource.org/licenses/MIT
7
8 #pragma once
9
10 #include <zircon/compiler.h>
11 #include <sys/types.h>
12
13 __BEGIN_CDECLS
14
15 /*
16 * LK's init system
17 */
18
19 typedef void (*lk_init_hook)(uint level);
20
21 enum lk_init_level {
22 LK_INIT_LEVEL_EARLIEST = 1,
23
24 LK_INIT_LEVEL_ARCH_EARLY = 0x10000,
25 LK_INIT_LEVEL_PLATFORM_EARLY = 0x20000,
26 LK_INIT_LEVEL_TARGET_EARLY = 0x30000,
27 LK_INIT_LEVEL_VM_PREHEAP = 0x40000,
28 LK_INIT_LEVEL_HEAP = 0x50000,
29 LK_INIT_LEVEL_VM = 0x60000,
30 LK_INIT_LEVEL_KERNEL = 0x70000,
31 LK_INIT_LEVEL_THREADING = 0x80000,
32 LK_INIT_LEVEL_ARCH = 0x90000,
33 LK_INIT_LEVEL_PLATFORM = 0xa0000,
34 LK_INIT_LEVEL_TARGET = 0xb0000,
35 LK_INIT_LEVEL_USER = 0xc0000,
36
37 LK_INIT_LEVEL_LAST = UINT_MAX,
38 };
39
40 enum lk_init_flags {
41 LK_INIT_FLAG_PRIMARY_CPU = 0x1,
42 LK_INIT_FLAG_SECONDARY_CPUS = 0x2,
43 LK_INIT_FLAG_ALL_CPUS = LK_INIT_FLAG_PRIMARY_CPU | LK_INIT_FLAG_SECONDARY_CPUS,
44 LK_INIT_FLAG_CPU_SUSPEND = 0x4,
45 LK_INIT_FLAG_CPU_RESUME = 0x8,
46 };
47
48 void lk_init_level(enum lk_init_flags flags, uint start_level, uint stop_level);
49
lk_primary_cpu_init_level(uint start_level,uint stop_level)50 static inline void lk_primary_cpu_init_level(uint start_level, uint stop_level)
51 {
52 lk_init_level(LK_INIT_FLAG_PRIMARY_CPU, start_level, stop_level);
53 }
54
lk_init_level_all(enum lk_init_flags flags)55 static inline void lk_init_level_all(enum lk_init_flags flags)
56 {
57 lk_init_level(flags, LK_INIT_LEVEL_EARLIEST, LK_INIT_LEVEL_LAST);
58 }
59
60 struct lk_init_struct {
61 uint level;
62 uint flags;
63 lk_init_hook hook;
64 const char *name;
65 };
66
67 #define LK_INIT_HOOK_FLAGS(_name, _hook, _level, _flags) \
68 __ALIGNED(sizeof(void *)) __USED __SECTION(".data.rel.ro.lk_init") \
69 static const struct lk_init_struct _init_struct_##_name = { \
70 .level = _level, \
71 .flags = _flags, \
72 .hook = _hook, \
73 .name = #_name, \
74 };
75
76 #define LK_INIT_HOOK(_name, _hook, _level) \
77 LK_INIT_HOOK_FLAGS(_name, _hook, _level, LK_INIT_FLAG_PRIMARY_CPU)
78
79 __END_CDECLS
80