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