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