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