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
19typedef void (*lk_init_hook)(uint level);
20
21enum 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
40enum 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
48void lk_init_level(enum lk_init_flags flags, uint start_level, uint stop_level);
49
50static 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
55static 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
60struct 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