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