xref: /optee_os/core/include/kernel/boot.h (revision 72d6673ebbc99f5177af3d60d6b1dde969ef44e8)
1 /* SPDX-License-Identifier: BSD-2-Clause */
2 /*
3  * Copyright (c) 2015-2025, Linaro Limited
4  * Copyright (c) 2021-2023, Arm Limited
5  */
6 #ifndef __KERNEL_BOOT_H
7 #define __KERNEL_BOOT_H
8 
9 #include <initcall.h>
10 #include <kernel/dt.h>
11 #include <types_ext.h>
12 
13 /*
14  * struct boot_embdata - Embedded boot data
15  * @total_len: Total length of the embedded boot data
16  * @num_blobs: Number of blobs in the embedded boot data, always 2 even if
17  *	       one blob is empty
18  * @hashes_offset: Offset of hashes from start of this struct
19  * @hashes_len: Length of hashes
20  * @reloc_offset: Offset of reloc from start of this struct
21  * @reloc_len: Length of reloc
22  *
23  * This struct is initialized by scripts/gen_tee_bin.py and must be kept
24  * in sync with that script. The struct and the following data is loaded
25  * at different addresses at boot depending on CFG_WITH_PAGER.
26  *
27  * If configured with CFG_WITH_PAGER=y the struct with data is following
28  * init part, this is together with the init part moved by the primary CPU
29  * so it ends up at __init_end. Whatever need to be saved for later need to
30  * be copied to a safe location in init_runtime().
31  *
32  * If configured with CFG_WITH_PAGER=n following the struct with data is
33  * __data_end, this is moved by the primary CPU so it ends up at __end.
34  */
35 struct boot_embdata {
36 	uint32_t total_len;
37 	uint32_t num_blobs;
38 	uint32_t hashes_offset;
39 	uint32_t hashes_len;
40 	uint32_t reloc_offset;
41 	uint32_t reloc_len;
42 };
43 
44 extern unsigned long boot_arg_nsec_entry;
45 
46 extern const struct core_mmu_config boot_mmu_config;
47 
48 void boot_init_primary_early(void);
49 void boot_init_primary_late(unsigned long fdt, unsigned long manifest);
50 void boot_init_primary_runtime(void);
51 void boot_init_primary_final(void);
52 void boot_init_memtag(void);
53 void boot_clear_memtag(void);
54 void boot_save_args(unsigned long a0, unsigned long a1, unsigned long a2,
55 		    unsigned long a3, unsigned long a4);
56 
57 void __panic_at_smc_return(void) __noreturn;
58 
59 #if defined(CFG_WITH_ARM_TRUSTED_FW)
60 unsigned long cpu_on_handler(unsigned long a0, unsigned long a1);
61 unsigned long boot_cpu_on_handler(unsigned long a0, unsigned long a1);
62 #else
63 void boot_init_secondary(unsigned long nsec_entry);
64 #endif
65 
66 void boot_primary_init_intc(void);
67 void boot_primary_init_core_ids(void);
68 void boot_secondary_init_intc(void);
69 
70 void init_sec_mon(unsigned long nsec_entry);
71 void init_tee_runtime(void);
72 
73 /* weak routines eventually overridden by platform */
74 void plat_cpu_reset_early(void);
75 void plat_primary_init_early(void);
76 unsigned long plat_get_aslr_seed(void);
77 unsigned long plat_get_freq(void);
78 #if defined(_CFG_CORE_STACK_PROTECTOR) || defined(CFG_WITH_STACK_CANARIES)
79 /*
80  * plat_get_random_stack_canaries() - Get random values for stack canaries.
81  * @buf:	Pointer to the buffer where to store canaries
82  * @ncan:	The number of canaries to generate.
83  * @size:	The size (in bytes) of each canary.
84  *
85  * This function has a __weak default implementation.
86  */
87 void plat_get_random_stack_canaries(void *buf, size_t ncan, size_t size);
88 #endif
89 void arm_cl2_config(vaddr_t pl310);
90 void arm_cl2_enable(vaddr_t pl310);
91 
92 #if defined(CFG_BOOT_SECONDARY_REQUEST)
93 void boot_set_core_ns_entry(size_t core_idx, uintptr_t entry,
94 			    uintptr_t context_id);
95 
96 int boot_core_release(size_t core_idx, paddr_t entry);
97 struct ns_entry_context *boot_core_hpen(void);
98 #endif
99 
100 /*
101  * get_aslr_seed() - return a random seed for core ASLR
102  *
103  * This function has a __weak default implementation.
104  */
105 unsigned long get_aslr_seed(void);
106 
107 /* Identify non-secure memory regions for dynamic shared memory */
108 void discover_nsec_memory(void);
109 /* Add reserved memory for static shared memory in the device-tree */
110 int mark_static_shm_as_reserved(struct dt_descriptor *dt);
111 
112 /*
113  * Stack-like memory allocations during boot before a heap has been
114  * configured. boot_mem_relocate() performs relocation of the boot memory
115  * and address cells registered with boot_mem_add_reloc() during virtual
116  * memory initialization. Unused memory is unmapped and released to pool of
117  * free physical memory once MMU is initialized.
118  */
119 void boot_mem_init(vaddr_t start, vaddr_t end, vaddr_t orig_end);
120 void boot_mem_init_asan(void);
121 void boot_mem_foreach_padding(bool (*func)(vaddr_t va, size_t len, void *ptr),
122 			      void *ptr);
123 void boot_mem_add_reloc(void *ptr);
124 void boot_mem_relocate(size_t offs);
125 void *boot_mem_alloc(size_t len, size_t align);
126 void *boot_mem_alloc_tmp(size_t len, size_t align);
127 vaddr_t boot_mem_release_unused(void);
128 void boot_mem_release_tmp_alloc(void);
129 
130 #endif /* __KERNEL_BOOT_H */
131