Line data Source code
1 0 : /* 2 : * Copyright (c) 2013-2014, Wind River Systems, Inc. 3 : * 4 : * SPDX-License-Identifier: Apache-2.0 5 : */ 6 : 7 : /* 8 : * DESCRIPTION 9 : * Platform independent, commonly used macros and defines related to linker 10 : * script. 11 : * 12 : * This file may be included by: 13 : * - Linker script files: for linker section declarations 14 : * - C files: for external declaration of address or size of linker section 15 : * - Assembly files: for external declaration of address or size of linker 16 : * section 17 : */ 18 : 19 : #ifndef ZEPHYR_INCLUDE_LINKER_LINKER_DEFS_H_ 20 : #define ZEPHYR_INCLUDE_LINKER_LINKER_DEFS_H_ 21 : 22 : #include <zephyr/toolchain.h> 23 : #include <zephyr/toolchain/common.h> 24 : #include <zephyr/linker/sections.h> 25 : #include <zephyr/sys/util.h> 26 : #include <zephyr/offsets.h> 27 : 28 : /* We need to dummy out DT_NODE_HAS_STATUS when building the unittests. 29 : * Including devicetree.h would require generating dummy header files 30 : * to match what gen_defines creates, so it's easier to just dummy out 31 : * DT_NODE_HAS_STATUS. These are undefined at the end of the file. 32 : */ 33 : #ifdef ZTEST_UNITTEST 34 : #define DT_NODE_HAS_STATUS(node, status) 0 35 : #define DT_NODE_HAS_STATUS_OKAY(node) 0 36 : #else 37 : #include <zephyr/devicetree.h> 38 : #endif 39 : 40 : #ifdef _LINKER 41 : /* 42 : * generate a symbol to mark the start of the objects array for 43 : * the specified object and level, then link all of those objects 44 : * (sorted by priority). Ensure the objects aren't discarded if there is 45 : * no direct reference to them 46 : */ 47 0 : #define CREATE_OBJ_LEVEL(object, level) \ 48 : __##object##_##level##_start = .; \ 49 : KEEP(*(SORT(.z_##object##_##level?_*))); \ 50 : KEEP(*(SORT(.z_##object##_##level??_*))); 51 : 52 : /* 53 : * link in shell initialization objects for all modules that use shell and 54 : * their shell commands are automatically initialized by the kernel. 55 : */ 56 : 57 : #elif defined(_ASMLANGUAGE) 58 : 59 : /* Assembly FILES: declaration defined by the linker script */ 60 : GDATA(__bss_start) 61 : GDATA(__bss_num_words) 62 : #ifdef CONFIG_XIP 63 : GDATA(__data_region_load_start) 64 : GDATA(__data_region_start) 65 : GDATA(__data_region_num_words) 66 : #endif 67 : 68 : #else /* ! _ASMLANGUAGE */ 69 : 70 : #include <zephyr/types.h> 71 : /* 72 : * Memory owned by the kernel, to be used as shared memory between 73 : * application threads. 74 : * 75 : * The following are extern symbols from the linker. This enables 76 : * the dynamic k_mem_domain and k_mem_partition creation and alignment 77 : * to the section produced in the linker. 78 : 79 : * The policy for this memory will be to initially configure all of it as 80 : * kernel / supervisor thread accessible. 81 : */ 82 : extern char _app_smem_start[]; 83 : extern char _app_smem_end[]; 84 : extern char _app_smem_size[]; 85 : extern char _app_smem_rom_start[]; 86 : extern char _app_smem_num_words[]; 87 : 88 : #ifdef CONFIG_LINKER_USE_PINNED_SECTION 89 : extern char _app_smem_pinned_start[]; 90 : extern char _app_smem_pinned_end[]; 91 : extern char _app_smem_pinned_size[]; 92 : extern char _app_smem_pinned_num_words[]; 93 : #endif 94 : 95 : /* Memory owned by the kernel. Start and end will be aligned for memory 96 : * management/protection hardware for the target architecture. 97 : * 98 : * Consists of all kernel-side globals, all kernel objects, all thread stacks, 99 : * and all currently unused RAM. 100 : * 101 : * Except for the stack of the currently executing thread, none of this memory 102 : * is normally accessible to user threads unless specifically granted at 103 : * runtime. 104 : */ 105 : extern char __kernel_ram_start[]; 106 : extern char __kernel_ram_end[]; 107 : extern char __kernel_ram_size[]; 108 : 109 : /* Used by z_bss_zero or arch-specific implementation */ 110 : extern char __bss_start[]; 111 : extern char __bss_end[]; 112 : 113 : /* Used by z_data_copy() or arch-specific implementation */ 114 : #ifdef CONFIG_XIP 115 : extern char __data_region_load_start[]; 116 : extern char __data_region_start[]; 117 : extern char __data_region_end[]; 118 : #endif /* CONFIG_XIP */ 119 : 120 : #ifdef CONFIG_MMU 121 : /* Virtual addresses of page-aligned kernel image mapped into RAM at boot */ 122 : extern char z_mapped_start[]; 123 : extern char z_mapped_end[]; 124 : #endif /* CONFIG_MMU */ 125 : 126 : /* Includes text and rodata */ 127 : extern char __rom_region_start[]; 128 : extern char __rom_region_end[]; 129 : extern char __rom_region_size[]; 130 : 131 : /* Includes all ROMable data, i.e. the size of the output image file. */ 132 : extern char _flash_used[]; 133 : 134 : /* datas, bss, noinit */ 135 : extern char _image_ram_start[]; 136 : extern char _image_ram_end[]; 137 : extern char _image_ram_size[]; 138 : 139 : extern char __text_region_start[]; 140 : extern char __text_region_end[]; 141 : extern char __text_region_size[]; 142 : 143 : extern char __rodata_region_start[]; 144 : extern char __rodata_region_end[]; 145 : extern char __rodata_region_size[]; 146 : 147 : extern char _vector_start[]; 148 : extern char _vector_end[]; 149 : 150 : #ifdef CONFIG_SW_VECTOR_RELAY 151 : extern char __vector_relay_table[]; 152 : #endif 153 : 154 : #ifdef CONFIG_COVERAGE_GCOV 155 : extern char __gcov_bss_start[]; 156 : extern char __gcov_bss_end[]; 157 : extern char __gcov_bss_size[]; 158 : #endif /* CONFIG_COVERAGE_GCOV */ 159 : 160 : /* end address of image, used by newlib for the heap */ 161 : extern char _end[]; 162 : 163 : #if (DT_NODE_HAS_STATUS_OKAY(DT_CHOSEN(zephyr_ccm))) 164 : extern char __ccm_data_rom_start[]; 165 : extern char __ccm_start[]; 166 : extern char __ccm_data_start[]; 167 : extern char __ccm_data_end[]; 168 : extern char __ccm_bss_start[]; 169 : extern char __ccm_bss_end[]; 170 : extern char __ccm_noinit_start[]; 171 : extern char __ccm_noinit_end[]; 172 : extern char __ccm_end[]; 173 : #endif 174 : 175 : #if (DT_NODE_HAS_STATUS_OKAY(DT_CHOSEN(zephyr_itcm))) 176 : extern char __itcm_start[]; 177 : extern char __itcm_end[]; 178 : extern char __itcm_size[]; 179 : extern char __itcm_load_start[]; 180 : #endif 181 : 182 : #if (DT_NODE_HAS_STATUS_OKAY(DT_CHOSEN(zephyr_dtcm))) 183 : extern char __dtcm_data_start[]; 184 : extern char __dtcm_data_end[]; 185 : extern char __dtcm_bss_start[]; 186 : extern char __dtcm_bss_end[]; 187 : extern char __dtcm_noinit_start[]; 188 : extern char __dtcm_noinit_end[]; 189 : extern char __dtcm_data_load_start[]; 190 : extern char __dtcm_start[]; 191 : extern char __dtcm_end[]; 192 : #endif 193 : 194 : #if (DT_NODE_HAS_STATUS_OKAY(DT_CHOSEN(zephyr_ocm))) 195 : extern char __ocm_data_start[]; 196 : extern char __ocm_data_end[]; 197 : extern char __ocm_bss_start[]; 198 : extern char __ocm_bss_end[]; 199 : extern char __ocm_start[]; 200 : extern char __ocm_end[]; 201 : extern char __ocm_size[]; 202 : #endif 203 : 204 : /* Used by the Security Attribution Unit to configure the 205 : * Non-Secure Callable region. 206 : */ 207 : #ifdef CONFIG_ARM_FIRMWARE_HAS_SECURE_ENTRY_FUNCS 208 : extern char __sg_start[]; 209 : extern char __sg_end[]; 210 : extern char __sg_size[]; 211 : #endif /* CONFIG_ARM_FIRMWARE_HAS_SECURE_ENTRY_FUNCS */ 212 : 213 : /* 214 : * Non-cached kernel memory region, currently only available on ARM Cortex-M7 215 : * with a MPU. Start and end will be aligned for memory management/protection 216 : * hardware for the target architecture. 217 : * 218 : * All the functions with '__nocache' keyword will be placed into this 219 : * section. 220 : */ 221 : #ifdef CONFIG_NOCACHE_MEMORY 222 : extern char _nocache_ram_start[]; 223 : extern char _nocache_ram_end[]; 224 : extern char _nocache_ram_size[]; 225 : #endif /* CONFIG_NOCACHE_MEMORY */ 226 : 227 : /* Memory owned by the kernel. Start and end will be aligned for memory 228 : * management/protection hardware for the target architecture. 229 : * 230 : * All the functions with '__ramfunc' keyword will be placed into this 231 : * section, stored in RAM instead of FLASH. 232 : */ 233 : #ifdef CONFIG_ARCH_HAS_RAMFUNC_SUPPORT 234 : extern char __ramfunc_region_start[]; 235 : extern char __ramfunc_start[]; 236 : extern char __ramfunc_end[]; 237 : extern char __ramfunc_size[]; 238 : extern char __ramfunc_load_start[]; 239 : #endif /* CONFIG_ARCH_HAS_RAMFUNC_SUPPORT */ 240 : 241 : /* Memory owned by the kernel. Memory region for thread privilege stack buffers, 242 : * currently only applicable on ARM Cortex-M architecture when building with 243 : * support for User Mode. 244 : * 245 : * All thread privilege stack buffers will be placed into this section. 246 : */ 247 : #ifdef CONFIG_USERSPACE 248 : extern char z_priv_stacks_ram_start[]; 249 : extern char z_priv_stacks_ram_end[]; 250 : extern char z_user_stacks_start[]; 251 : extern char z_user_stacks_end[]; 252 : extern char z_kobject_data_begin[]; 253 : #endif /* CONFIG_USERSPACE */ 254 : 255 : #ifdef CONFIG_THREAD_LOCAL_STORAGE 256 : extern char __tdata_start[]; 257 : extern char __tdata_end[]; 258 : extern char __tdata_size[]; 259 : extern char __tdata_align[]; 260 : extern char __tbss_start[]; 261 : extern char __tbss_end[]; 262 : extern char __tbss_size[]; 263 : extern char __tbss_align[]; 264 : extern char __tls_start[]; 265 : extern char __tls_end[]; 266 : extern char __tls_size[]; 267 : #endif /* CONFIG_THREAD_LOCAL_STORAGE */ 268 : 269 : #ifdef CONFIG_LINKER_USE_BOOT_SECTION 270 : /* lnkr_boot_start[] and lnkr_boot_end[] 271 : * must encapsulate all the boot sections. 272 : */ 273 : extern char lnkr_boot_start[]; 274 : extern char lnkr_boot_end[]; 275 : 276 : extern char lnkr_boot_text_start[]; 277 : extern char lnkr_boot_text_end[]; 278 : extern char lnkr_boot_text_size[]; 279 : extern char lnkr_boot_data_start[]; 280 : extern char lnkr_boot_data_end[]; 281 : extern char lnkr_boot_data_size[]; 282 : extern char lnkr_boot_rodata_start[]; 283 : extern char lnkr_boot_rodata_end[]; 284 : extern char lnkr_boot_rodata_size[]; 285 : extern char lnkr_boot_bss_start[]; 286 : extern char lnkr_boot_bss_end[]; 287 : extern char lnkr_boot_bss_size[]; 288 : extern char lnkr_boot_noinit_start[]; 289 : extern char lnkr_boot_noinit_end[]; 290 : extern char lnkr_boot_noinit_size[]; 291 : #endif /* CONFIG_LINKER_USE_BOOT_SECTION */ 292 : 293 : #ifdef CONFIG_LINKER_USE_PINNED_SECTION 294 : /* lnkr_pinned_start[] and lnkr_pinned_end[] must encapsulate 295 : * all the pinned sections as these are used by 296 : * the MMU code to mark the physical page frames with 297 : * K_MEM_PAGE_FRAME_PINNED. 298 : */ 299 : extern char lnkr_pinned_start[]; 300 : extern char lnkr_pinned_end[]; 301 : 302 : extern char lnkr_pinned_text_start[]; 303 : extern char lnkr_pinned_text_end[]; 304 : extern char lnkr_pinned_text_size[]; 305 : extern char lnkr_pinned_data_start[]; 306 : extern char lnkr_pinned_data_end[]; 307 : extern char lnkr_pinned_data_size[]; 308 : extern char lnkr_pinned_rodata_start[]; 309 : extern char lnkr_pinned_rodata_end[]; 310 : extern char lnkr_pinned_rodata_size[]; 311 : extern char lnkr_pinned_bss_start[]; 312 : extern char lnkr_pinned_bss_end[]; 313 : extern char lnkr_pinned_bss_size[]; 314 : extern char lnkr_pinned_noinit_start[]; 315 : extern char lnkr_pinned_noinit_end[]; 316 : extern char lnkr_pinned_noinit_size[]; 317 : 318 : __pinned_func 319 : static inline bool lnkr_is_pinned(uint8_t *addr) 320 : { 321 : if ((addr >= (uint8_t *)lnkr_pinned_start) && 322 : (addr < (uint8_t *)lnkr_pinned_end)) { 323 : return true; 324 : } else { 325 : return false; 326 : } 327 : } 328 : 329 : __pinned_func 330 : static inline bool lnkr_is_region_pinned(uint8_t *addr, size_t sz) 331 : { 332 : if ((addr >= (uint8_t *)lnkr_pinned_start) && 333 : ((addr + sz) < (uint8_t *)lnkr_pinned_end)) { 334 : return true; 335 : } else { 336 : return false; 337 : } 338 : } 339 : 340 : #endif /* CONFIG_LINKER_USE_PINNED_SECTION */ 341 : 342 : #ifdef CONFIG_LINKER_USE_ONDEMAND_SECTION 343 : /* lnkr_ondemand_start[] and lnkr_ondemand_end[] must encapsulate 344 : * all the on-demand sections as these are used by 345 : * the MMU code to mark the virtual pages with the appropriate backing store 346 : * location token to have them be paged in on demand. 347 : */ 348 : extern char lnkr_ondemand_start[]; 349 : extern char lnkr_ondemand_end[]; 350 : extern char lnkr_ondemand_load_start[]; 351 : 352 : extern char lnkr_ondemand_text_start[]; 353 : extern char lnkr_ondemand_text_end[]; 354 : extern char lnkr_ondemand_text_size[]; 355 : extern char lnkr_ondemand_rodata_start[]; 356 : extern char lnkr_ondemand_rodata_end[]; 357 : extern char lnkr_ondemand_rodata_size[]; 358 : 359 : #endif /* CONFIG_LINKER_USE_ONDEMAND_SECTION */ 360 : #endif /* ! _ASMLANGUAGE */ 361 : 362 : #ifdef ZTEST_UNITTEST 363 : #undef DT_NODE_HAS_STATUS 364 : #undef DT_NODE_HAS_STATUS_OKAY 365 : #endif 366 : 367 : #endif /* ZEPHYR_INCLUDE_LINKER_LINKER_DEFS_H_ */