Line data Source code
1 0 : /*
2 : * Copyright (c) 2019 Intel Corporation
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 : #ifndef ZEPHYR_INCLUDE_APP_MEMORY_APP_MEMDOMAIN_H_
7 : #define ZEPHYR_INCLUDE_APP_MEMORY_APP_MEMDOMAIN_H_
8 :
9 : #include <zephyr/linker/linker-defs.h>
10 : #include <zephyr/sys/dlist.h>
11 : #include <zephyr/kernel.h>
12 :
13 : /**
14 : * @brief Application memory domain APIs
15 : * @defgroup mem_domain_apis_app Application memory domain APIs
16 : * @ingroup mem_domain_apis
17 : * @{
18 : */
19 :
20 : #ifdef CONFIG_USERSPACE
21 :
22 : /**
23 : * @brief Name of the data section for a particular partition
24 : *
25 : * Useful for defining memory pools, or any other macro that takes a
26 : * section name as a parameter.
27 : *
28 : * @param id Partition name
29 : */
30 1 : #define K_APP_DMEM_SECTION(id) data_smem_##id##_data
31 :
32 : /**
33 : * @brief Name of the bss section for a particular partition
34 : *
35 : * Useful for defining memory pools, or any other macro that takes a
36 : * section name as a parameter.
37 : *
38 : * @param id Partition name
39 : */
40 1 : #define K_APP_BMEM_SECTION(id) data_smem_##id##_bss
41 :
42 : /**
43 : * @brief Place data in a partition's data section
44 : *
45 : * Globals tagged with this will end up in the data section for the
46 : * specified memory partition. This data should be initialized to some
47 : * desired value.
48 : *
49 : * @param id Name of the memory partition to associate this data
50 : */
51 1 : #define K_APP_DMEM(id) Z_GENERIC_SECTION(K_APP_DMEM_SECTION(id))
52 :
53 : /**
54 : * @brief Place data in a partition's bss section
55 : *
56 : * Globals tagged with this will end up in the bss section for the
57 : * specified memory partition. This data will be zeroed at boot.
58 : *
59 : * @param id Name of the memory partition to associate this data
60 : */
61 1 : #define K_APP_BMEM(id) Z_GENERIC_SECTION(K_APP_BMEM_SECTION(id))
62 :
63 : struct z_app_region {
64 : void *bss_start;
65 : size_t bss_size;
66 : };
67 :
68 : #define Z_APP_START(id) z_data_smem_##id##_part_start
69 : #define Z_APP_SIZE(id) z_data_smem_##id##_part_size
70 : #define Z_APP_BSS_START(id) z_data_smem_##id##_bss_start
71 : #define Z_APP_BSS_SIZE(id) z_data_smem_##id##_bss_size
72 :
73 : /* If a partition is declared with K_APPMEM_PARTITION, but never has any
74 : * data assigned to its contents, then no symbols with its prefix will end
75 : * up in the symbol table. This prevents gen_app_partitions.py from detecting
76 : * that the partition exists, and the linker symbols which specify partition
77 : * bounds will not be generated, resulting in build errors.
78 : *
79 : * What this inline assembly code does is define a symbol with no data.
80 : * This should work for all arches that produce ELF binaries, see
81 : * https://sourceware.org/binutils/docs/as/Section.html
82 : *
83 : * We don't know what active flags/type of the pushed section were, so we are
84 : * specific: "aw" indicates section is allocatable and writable,
85 : * and "@progbits" indicates the section has data.
86 : */
87 : #if defined(CONFIG_ARM) || defined(CONFIG_ARM64)
88 : /* ARM has a quirk in that '@' denotes a comment, so we have to send
89 : * %progbits to the assembler instead.
90 : */
91 : #define Z_PROGBITS_SYM "%"
92 : #else
93 : #define Z_PROGBITS_SYM "@"
94 : #endif
95 :
96 : #if defined(CONFIG_ARC) && defined(__CCAC__)
97 : /* ARC MWDT assembler has slightly different pushsection/popsection directives
98 : * names.
99 : */
100 : #define Z_PUSHSECTION_DIRECTIV ".pushsect"
101 : #define Z_POPSECTION_DIRECTIVE ".popsect"
102 : #else
103 : #define Z_PUSHSECTION_DIRECTIV ".pushsection"
104 : #define Z_POPSECTION_DIRECTIVE ".popsection"
105 : #endif
106 :
107 : #define Z_APPMEM_PLACEHOLDER(name) \
108 : __asm__ ( \
109 : Z_PUSHSECTION_DIRECTIV " " STRINGIFY(K_APP_DMEM_SECTION(name)) \
110 : ",\"aw\"," Z_PROGBITS_SYM "progbits\n\t" \
111 : ".global " STRINGIFY(name) "_placeholder\n\t" \
112 : STRINGIFY(name) "_placeholder:\n\t" \
113 : Z_POPSECTION_DIRECTIVE "\n\t")
114 :
115 : /**
116 : * @brief Define an application memory partition with linker support
117 : *
118 : * Defines a k_mem_paritition with the provided name.
119 : * This name may be used with the K_APP_DMEM and K_APP_BMEM macros to
120 : * place globals automatically in this partition.
121 : *
122 : * NOTE: placeholder char variable is defined here to prevent build errors
123 : * if a partition is defined but nothing ever placed in it.
124 : *
125 : * @param name Name of the k_mem_partition to declare
126 : */
127 1 : #define K_APPMEM_PARTITION_DEFINE(name) \
128 : extern char Z_APP_START(name)[]; \
129 : extern char Z_APP_SIZE(name)[]; \
130 : struct k_mem_partition name = { \
131 : .start = (uintptr_t) &Z_APP_START(name)[0], \
132 : .size = (size_t) &Z_APP_SIZE(name)[0], \
133 : .attr = K_MEM_PARTITION_P_RW_U_RW \
134 : }; \
135 : extern char Z_APP_BSS_START(name)[]; \
136 : extern char Z_APP_BSS_SIZE(name)[]; \
137 : Z_GENERIC_SECTION(.app_regions.name) \
138 : const struct z_app_region name##_region = { \
139 : .bss_start = &Z_APP_BSS_START(name)[0], \
140 : .bss_size = (size_t) &Z_APP_BSS_SIZE(name)[0] \
141 : }; \
142 : Z_APPMEM_PLACEHOLDER(name)
143 : #else
144 :
145 : #define K_APP_BMEM(ptn)
146 : #define K_APP_DMEM(ptn)
147 : #define K_APP_DMEM_SECTION(ptn) .data
148 : #define K_APP_BMEM_SECTION(ptn) .bss
149 : #define K_APPMEM_PARTITION_DEFINE(name)
150 :
151 : #endif /* CONFIG_USERSPACE */
152 :
153 : /**
154 : * @}
155 : */
156 :
157 : #endif /* ZEPHYR_INCLUDE_APP_MEMORY_APP_MEMDOMAIN_H_ */
|