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