Zephyr API Documentation  3.0.0
A Scalable Open Source RTOS
3.0.0
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
linker-defs.h
Go to the documentation of this file.
1/*
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 <toolchain.h>
23#include <toolchain/common.h>
24#include <linker/sections.h>
25#include <sys/util.h>
26#include <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.
32 */
33#ifdef ZTEST_UNITTEST
34#define DT_NODE_HAS_STATUS(node, status) 0
35#else
37#include <devicetree.h>
38#endif
39
40#ifdef _LINKER
41
47#define Z_LINK_ITERABLE(struct_type) \
48 _CONCAT(_##struct_type, _list_start) = .; \
49 KEEP(*(SORT_BY_NAME(._##struct_type.static.*))); \
50 _CONCAT(_##struct_type, _list_end) = .
51
52#define Z_LINK_ITERABLE_ALIGNED(struct_type, align) \
53 . = ALIGN(align); \
54 Z_LINK_ITERABLE(struct_type);
55
56#define Z_LINK_ITERABLE_GC_ALLOWED(struct_type) \
57 _CONCAT(_##struct_type, _list_start) = .; \
58 *(SORT_BY_NAME(._##struct_type.static.*)); \
59 _CONCAT(_##struct_type, _list_end) = .
60
75#define ITERABLE_SECTION_ROM(struct_type, subalign) \
76 SECTION_PROLOGUE(struct_type##_area,,SUBALIGN(subalign)) \
77 { \
78 Z_LINK_ITERABLE(struct_type); \
79 } GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
80
81#define Z_ITERABLE_SECTION_ROM(struct_type, subalign) \
82 ITERABLE_SECTION_ROM(struct_type, subalign)
83
96#define ITERABLE_SECTION_ROM_GC_ALLOWED(struct_type, subalign) \
97 SECTION_PROLOGUE(struct_type##_area,,SUBALIGN(subalign)) \
98 { \
99 Z_LINK_ITERABLE_GC_ALLOWED(struct_type); \
100 } GROUP_LINK_IN(ROMABLE_REGION)
101
102#define Z_ITERABLE_SECTION_ROM_GC_ALLOWED(struct_type, subalign) \
103 ITERABLE_SECTION_ROM_GC_ALLOWED(struct_type, subalign)
104
119#define ITERABLE_SECTION_RAM(struct_type, subalign) \
120 SECTION_DATA_PROLOGUE(struct_type##_area,,SUBALIGN(subalign)) \
121 { \
122 Z_LINK_ITERABLE(struct_type); \
123 } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
124
125#define Z_ITERABLE_SECTION_RAM(struct_type, subalign) \
126 ITERABLE_SECTION_RAM(struct_type, subalign)
127
140#define ITERABLE_SECTION_RAM_GC_ALLOWED(struct_type, subalign) \
141 SECTION_DATA_PROLOGUE(struct_type##_area,,SUBALIGN(subalign)) \
142 { \
143 Z_LINK_ITERABLE_GC_ALLOWED(struct_type); \
144 } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
145
146#define Z_ITERABLE_SECTION_RAM_GC_ALLOWED(struct_type, subalign) \
147 ITERABLE_SECTION_RAM_GC_ALLOWED(struct_type, subalign)
148 /* end of struct_section_apis */
152
153/*
154 * generate a symbol to mark the start of the objects array for
155 * the specified object and level, then link all of those objects
156 * (sorted by priority). Ensure the objects aren't discarded if there is
157 * no direct reference to them
158 */
159#define CREATE_OBJ_LEVEL(object, level) \
160 __##object##_##level##_start = .; \
161 KEEP(*(SORT(.z_##object##_##level[0-9]_*))); \
162 KEEP(*(SORT(.z_##object##_##level[1-9][0-9]_*)));
163
164/*
165 * link in shell initialization objects for all modules that use shell and
166 * their shell commands are automatically initialized by the kernel.
167 */
168
169#elif defined(_ASMLANGUAGE)
170
171/* Assembly FILES: declaration defined by the linker script */
172GDATA(__bss_start)
173GDATA(__bss_num_words)
174#ifdef CONFIG_XIP
175GDATA(__data_region_load_start)
176GDATA(__data_region_start)
177GDATA(__data_region_num_words)
178#endif
179
180#else /* ! _ASMLANGUAGE */
181
182#include <zephyr/types.h>
183/*
184 * Memory owned by the kernel, to be used as shared memory between
185 * application threads.
186 *
187 * The following are extern symbols from the linker. This enables
188 * the dynamic k_mem_domain and k_mem_partition creation and alignment
189 * to the section produced in the linker.
190
191 * The policy for this memory will be to initially configure all of it as
192 * kernel / supervisor thread accessible.
193 */
194extern char _app_smem_start[];
195extern char _app_smem_end[];
196extern char _app_smem_size[];
197extern char _app_smem_rom_start[];
198extern char _app_smem_num_words[];
199
200#ifdef CONFIG_LINKER_USE_PINNED_SECTION
201extern char _app_smem_pinned_start[];
202extern char _app_smem_pinned_end[];
203extern char _app_smem_pinned_size[];
204extern char _app_smem_pinned_num_words[];
205#endif
206
207/* Memory owned by the kernel. Start and end will be aligned for memory
208 * management/protection hardware for the target architecture.
209 *
210 * Consists of all kernel-side globals, all kernel objects, all thread stacks,
211 * and all currently unused RAM.
212 *
213 * Except for the stack of the currently executing thread, none of this memory
214 * is normally accessible to user threads unless specifically granted at
215 * runtime.
216 */
217extern char __kernel_ram_start[];
218extern char __kernel_ram_end[];
219extern char __kernel_ram_size[];
220
221/* Used by z_bss_zero or arch-specific implementation */
222extern char __bss_start[];
223extern char __bss_end[];
224
225/* Used by z_data_copy() or arch-specific implementation */
226#ifdef CONFIG_XIP
227extern char __data_region_load_start[];
228extern char __data_region_start[];
229extern char __data_region_end[];
230#endif /* CONFIG_XIP */
231
232#ifdef CONFIG_MMU
233/* Virtual addresses of page-aligned kernel image mapped into RAM at boot */
234extern char z_mapped_start[];
235extern char z_mapped_end[];
236#endif /* CONFIG_MMU */
237
238/* Includes text and rodata */
239extern char __rom_region_start[];
240extern char __rom_region_end[];
241extern char __rom_region_size[];
242
243/* Includes all ROMable data, i.e. the size of the output image file. */
244extern char _flash_used[];
245
246/* datas, bss, noinit */
247extern char _image_ram_start[];
248extern char _image_ram_end[];
249
250extern char __text_region_start[];
251extern char __text_region_end[];
252extern char __text_region_size[];
253
254extern char __rodata_region_start[];
255extern char __rodata_region_end[];
256extern char __rodata_region_size[];
257
258extern char _vector_start[];
259extern char _vector_end[];
260
261#if DT_NODE_HAS_STATUS(_NODE_RESERVED, okay)
263#endif
264
265#ifdef CONFIG_SW_VECTOR_RELAY
266extern char __vector_relay_table[];
267#endif
268
269#ifdef CONFIG_COVERAGE_GCOV
270extern char __gcov_bss_start[];
271extern char __gcov_bss_end[];
272extern char __gcov_bss_size[];
273#endif /* CONFIG_COVERAGE_GCOV */
274
275/* end address of image, used by newlib for the heap */
276extern char _end[];
277
278#if DT_NODE_HAS_STATUS(DT_CHOSEN(zephyr_ccm), okay)
279extern char __ccm_data_rom_start[];
280extern char __ccm_start[];
281extern char __ccm_data_start[];
282extern char __ccm_data_end[];
283extern char __ccm_bss_start[];
284extern char __ccm_bss_end[];
285extern char __ccm_noinit_start[];
286extern char __ccm_noinit_end[];
287extern char __ccm_end[];
288#endif
289
290#if DT_NODE_HAS_STATUS(DT_CHOSEN(zephyr_itcm), okay)
291extern char __itcm_start[];
292extern char __itcm_end[];
293extern char __itcm_size[];
294extern char __itcm_load_start[];
295#endif
296
297#if DT_NODE_HAS_STATUS(DT_CHOSEN(zephyr_dtcm), okay)
298extern char __dtcm_data_start[];
299extern char __dtcm_data_end[];
300extern char __dtcm_bss_start[];
301extern char __dtcm_bss_end[];
302extern char __dtcm_noinit_start[];
303extern char __dtcm_noinit_end[];
304extern char __dtcm_data_load_start[];
305extern char __dtcm_start[];
306extern char __dtcm_end[];
307#endif
308
309#if DT_NODE_HAS_STATUS(DT_CHOSEN(zephyr_ocm), okay)
310extern char __ocm_start[];
311extern char __ocm_end[];
312extern char __ocm_size[];
313#endif
314
315/* Used by the Security Attribution Unit to configure the
316 * Non-Secure Callable region.
317 */
318#ifdef CONFIG_ARM_FIRMWARE_HAS_SECURE_ENTRY_FUNCS
319extern char __sg_start[];
320extern char __sg_end[];
321extern char __sg_size[];
322#endif /* CONFIG_ARM_FIRMWARE_HAS_SECURE_ENTRY_FUNCS */
323
324/*
325 * Non-cached kernel memory region, currently only available on ARM Cortex-M7
326 * with a MPU. Start and end will be aligned for memory management/protection
327 * hardware for the target architecture.
328 *
329 * All the functions with '__nocache' keyword will be placed into this
330 * section.
331 */
332#ifdef CONFIG_NOCACHE_MEMORY
333extern char _nocache_ram_start[];
334extern char _nocache_ram_end[];
335extern char _nocache_ram_size[];
336#endif /* CONFIG_NOCACHE_MEMORY */
337
338/* Memory owned by the kernel. Start and end will be aligned for memory
339 * management/protection hardware for the target architecture.
340 *
341 * All the functions with '__ramfunc' keyword will be placed into this
342 * section, stored in RAM instead of FLASH.
343 */
344#ifdef CONFIG_ARCH_HAS_RAMFUNC_SUPPORT
345extern char __ramfunc_start[];
346extern char __ramfunc_end[];
347extern char __ramfunc_size[];
348extern char __ramfunc_load_start[];
349#endif /* CONFIG_ARCH_HAS_RAMFUNC_SUPPORT */
350
351/* Memory owned by the kernel. Memory region for thread privilege stack buffers,
352 * currently only applicable on ARM Cortex-M architecture when building with
353 * support for User Mode.
354 *
355 * All thread privilege stack buffers will be placed into this section.
356 */
357#ifdef CONFIG_USERSPACE
358extern char z_priv_stacks_ram_start[];
359extern char z_priv_stacks_ram_end[];
360extern char z_user_stacks_start[];
361extern char z_user_stacks_end[];
362extern char z_kobject_data_begin[];
363#endif /* CONFIG_USERSPACE */
364
365#ifdef CONFIG_THREAD_LOCAL_STORAGE
366extern char __tdata_start[];
367extern char __tdata_end[];
368extern char __tdata_size[];
369extern char __tdata_align[];
370extern char __tbss_start[];
371extern char __tbss_end[];
372extern char __tbss_size[];
373extern char __tbss_align[];
374extern char __tls_start[];
375extern char __tls_end[];
376extern char __tls_size[];
377#endif /* CONFIG_THREAD_LOCAL_STORAGE */
378
379#ifdef CONFIG_LINKER_USE_BOOT_SECTION
380/* lnkr_boot_start[] and lnkr_boot_end[]
381 * must encapsulate all the boot sections.
382 */
383extern char lnkr_boot_start[];
384extern char lnkr_boot_end[];
385
386extern char lnkr_boot_text_start[];
387extern char lnkr_boot_text_end[];
388extern char lnkr_boot_text_size[];
389extern char lnkr_boot_data_start[];
390extern char lnkr_boot_data_end[];
391extern char lnkr_boot_data_size[];
392extern char lnkr_boot_rodata_start[];
393extern char lnkr_boot_rodata_end[];
394extern char lnkr_boot_rodata_size[];
395extern char lnkr_boot_bss_start[];
396extern char lnkr_boot_bss_end[];
397extern char lnkr_boot_bss_size[];
398extern char lnkr_boot_noinit_start[];
399extern char lnkr_boot_noinit_end[];
400extern char lnkr_boot_noinit_size[];
401#endif /* CONFIG_LINKER_USE_BOOT_SECTION */
402
403#ifdef CONFIG_LINKER_USE_PINNED_SECTION
404/* lnkr_pinned_start[] and lnkr_pinned_end[] must encapsulate
405 * all the pinned sections as these are used by
406 * the MMU code to mark the physical page frames with
407 * Z_PAGE_FRAME_PINNED.
408 */
409extern char lnkr_pinned_start[];
410extern char lnkr_pinned_end[];
411
412extern char lnkr_pinned_text_start[];
413extern char lnkr_pinned_text_end[];
414extern char lnkr_pinned_text_size[];
415extern char lnkr_pinned_data_start[];
416extern char lnkr_pinned_data_end[];
417extern char lnkr_pinned_data_size[];
418extern char lnkr_pinned_rodata_start[];
419extern char lnkr_pinned_rodata_end[];
420extern char lnkr_pinned_rodata_size[];
421extern char lnkr_pinned_bss_start[];
422extern char lnkr_pinned_bss_end[];
423extern char lnkr_pinned_bss_size[];
424extern char lnkr_pinned_noinit_start[];
425extern char lnkr_pinned_noinit_end[];
426extern char lnkr_pinned_noinit_size[];
427
428__pinned_func
429static inline bool lnkr_is_pinned(uint8_t *addr)
430{
431 if ((addr >= (uint8_t *)lnkr_pinned_start) &&
432 (addr < (uint8_t *)lnkr_pinned_end)) {
433 return true;
434 } else {
435 return false;
436 }
437}
438
439__pinned_func
440static inline bool lnkr_is_region_pinned(uint8_t *addr, size_t sz)
441{
442 if ((addr >= (uint8_t *)lnkr_pinned_start) &&
443 ((addr + sz) < (uint8_t *)lnkr_pinned_end)) {
444 return true;
445 } else {
446 return false;
447 }
448}
449
450#endif /* CONFIG_LINKER_USE_PINNED_SECTION */
451
452#endif /* ! _ASMLANGUAGE */
453
454#endif /* ZEPHYR_INCLUDE_LINKER_LINKER_DEFS_H_ */
Common toolchain abstraction.
Devicetree main header.
#define LINKER_DT_RESERVED_MEM_SYMBOLS()
Generate linker script symbols for all the reserved memory regions.
Definition: devicetree_reserved.h:59
Definitions of various linker Sections.
__UINT8_TYPE__ uint8_t
Definition: stdint.h:58
Macros to abstract toolchain specific capabilities.
Misc utilities.