blob: f94d19ffeba387dc8f0a6261574bc37a49a8ee7f [file] [log] [blame]
Andrew Geissler2daf84b2023-03-31 09:57:23 -05001From e74d8a02edd8c431c87786e22dbceee8e1e85bb8 Mon Sep 17 00:00:00 2001
Andrew Geissler517393d2023-01-13 08:55:19 -06002From: Emekcan Aras <emekcan.aras@arm.com>
3Date: Wed, 21 Dec 2022 10:55:58 +0000
Andrew Geissler2daf84b2023-03-31 09:57:23 -05004Subject: [PATCH] core: Define section attributes for clang
Andrew Geissler517393d2023-01-13 08:55:19 -06005
6Clang's attribute section is not same as gcc, here we need to add flags
7to sections so they can be eventually collected by linker into final
8output segments. Only way to do so with clang is to use
9
10pragma clang section ...
11
12The behavious is described here [1], this allows us to define names bss
13sections. This was not an issue until clang-15 where LLD linker starts
14to detect the section flags before merging them and throws the following
15errors
16
17| ld.lld: error: section type mismatch for .nozi.kdata_page
18| >>> /mnt/b/yoe/master/build/tmp/work/qemuarm64-yoe-linux/optee-os-tadevkit/3.17.0-r0/build/core/arch/arm/kernel/thread.o:(.nozi.kdata_page): SHT_PROGBITS
19| >>> output section .nozi: SHT_NOBITS
20|
21| ld.lld: error: section type mismatch for .nozi.mmu.l2
22| >>> /mnt/b/yoe/master/build/tmp/work/qemuarm64-yoe-linux/optee-os-tadevkit/3.17.0-r0/build/core/arch/arm/mm/core_mmu_lpae.o:(.nozi.mmu.l2): SHT_PROGBITS
23| >>> output section .nozi: SHT_NOBITS
24
25These sections should be carrying SHT_NOBITS but so far it was not
26possible to do so, this patch tries to use clangs pragma to get this
27going and match the functionality with gcc.
28
29[1] https://intel.github.io/llvm-docs/clang/LanguageExtensions.html#specifying-section-names-for-global-objects-pragma-clang-section
30
31Upstream-Status: Pending
32Signed-off-by: Khem Raj <raj.khem@gmail.com>
Andrew Geissler2daf84b2023-03-31 09:57:23 -050033
Andrew Geissler517393d2023-01-13 08:55:19 -060034---
35 core/arch/arm/kernel/thread.c | 19 +++++++++++++++--
36 core/arch/arm/mm/core_mmu_lpae.c | 35 +++++++++++++++++++++++++++----
37 core/arch/arm/mm/core_mmu_v7.c | 36 +++++++++++++++++++++++++++++---
38 core/arch/arm/mm/pgt_cache.c | 12 ++++++++++-
39 core/kernel/thread.c | 13 +++++++++++-
40 5 files changed, 104 insertions(+), 11 deletions(-)
41
42diff --git a/core/arch/arm/kernel/thread.c b/core/arch/arm/kernel/thread.c
Andrew Geissler2daf84b2023-03-31 09:57:23 -050043index 1cf76a0c..1e7f9f96 100644
Andrew Geissler517393d2023-01-13 08:55:19 -060044--- a/core/arch/arm/kernel/thread.c
45+++ b/core/arch/arm/kernel/thread.c
46@@ -44,15 +44,30 @@ static size_t thread_user_kcode_size __nex_bss;
47 #if defined(CFG_CORE_UNMAP_CORE_AT_EL0) && \
48 defined(CFG_CORE_WORKAROUND_SPECTRE_BP_SEC) && defined(ARM64)
49 long thread_user_kdata_sp_offset __nex_bss;
50+#ifdef __clang__
51+#ifndef CFG_VIRTUALIZATION
52+#pragma clang section bss=".nozi.kdata_page"
53+#else
54+#pragma clang section bss=".nex_nozi.kdata_page"
55+#endif
56+#endif
57 static uint8_t thread_user_kdata_page[
58 ROUNDUP(sizeof(struct thread_core_local) * CFG_TEE_CORE_NB_CORE,
59 SMALL_PAGE_SIZE)]
60 __aligned(SMALL_PAGE_SIZE)
61+#ifndef __clang__
62 #ifndef CFG_VIRTUALIZATION
63- __section(".nozi.kdata_page");
64+ __section(".nozi.kdata_page")
65 #else
66- __section(".nex_nozi.kdata_page");
67+ __section(".nex_nozi.kdata_page")
68 #endif
69+#endif
70+ ;
71+#endif
72+
73+/* reset BSS section to default ( .bss ) */
74+#ifdef __clang__
75+#pragma clang section bss=""
76 #endif
77
78 #ifdef ARM32
79diff --git a/core/arch/arm/mm/core_mmu_lpae.c b/core/arch/arm/mm/core_mmu_lpae.c
80index 3f08eec6..e6dc9261 100644
81--- a/core/arch/arm/mm/core_mmu_lpae.c
82+++ b/core/arch/arm/mm/core_mmu_lpae.c
83@@ -233,19 +233,46 @@ typedef uint16_t l1_idx_t;
84 typedef uint64_t base_xlat_tbls_t[CFG_TEE_CORE_NB_CORE][NUM_BASE_LEVEL_ENTRIES];
85 typedef uint64_t xlat_tbl_t[XLAT_TABLE_ENTRIES];
86
87+#ifdef __clang__
88+#pragma clang section bss=".nozi.mmu.base_table"
89+#endif
90 static base_xlat_tbls_t base_xlation_table[NUM_BASE_TABLES]
91 __aligned(NUM_BASE_LEVEL_ENTRIES * XLAT_ENTRY_SIZE)
92- __section(".nozi.mmu.base_table");
93+#ifndef __clang__
94+ __section(".nozi.mmu.base_table")
95+#endif
96+;
97+#ifdef __clang__
98+#pragma clang section bss=""
99+#endif
100
101+#ifdef __clang__
102+#pragma clang section bss=".nozi.mmu.l2"
103+#endif
104 static xlat_tbl_t xlat_tables[MAX_XLAT_TABLES]
105- __aligned(XLAT_TABLE_SIZE) __section(".nozi.mmu.l2");
106+ __aligned(XLAT_TABLE_SIZE)
107+#ifndef __clang__
108+ __section(".nozi.mmu.l2")
109+#endif
110+;
111+#ifdef __clang__
112+#pragma clang section bss=""
113+#endif
114
115 #define XLAT_TABLES_SIZE (sizeof(xlat_tbl_t) * MAX_XLAT_TABLES)
116
117+#ifdef __clang__
118+#pragma clang section bss=".nozi.mmu.l2"
119+#endif
120 /* MMU L2 table for TAs, one for each thread */
121 static xlat_tbl_t xlat_tables_ul1[CFG_NUM_THREADS]
122- __aligned(XLAT_TABLE_SIZE) __section(".nozi.mmu.l2");
123-
124+#ifndef __clang__
125+ __aligned(XLAT_TABLE_SIZE) __section(".nozi.mmu.l2")
126+#endif
127+;
128+#ifdef __clang__
129+#pragma clang section bss=""
130+#endif
131 /*
132 * TAs page table entry inside a level 1 page table.
133 *
134diff --git a/core/arch/arm/mm/core_mmu_v7.c b/core/arch/arm/mm/core_mmu_v7.c
135index cd85bd22..3e18f54f 100644
136--- a/core/arch/arm/mm/core_mmu_v7.c
137+++ b/core/arch/arm/mm/core_mmu_v7.c
138@@ -204,16 +204,46 @@ typedef uint32_t l1_xlat_tbl_t[NUM_L1_ENTRIES];
139 typedef uint32_t l2_xlat_tbl_t[NUM_L2_ENTRIES];
140 typedef uint32_t ul1_xlat_tbl_t[NUM_UL1_ENTRIES];
141
142+#ifdef __clang__
143+#pragma clang section bss=".nozi.mmu.l1"
144+#endif
145 static l1_xlat_tbl_t main_mmu_l1_ttb
146- __aligned(L1_ALIGNMENT) __section(".nozi.mmu.l1");
147+ __aligned(L1_ALIGNMENT)
148+#ifndef __clang__
149+ __section(".nozi.mmu.l1")
150+#endif
151+;
152+#ifdef __clang__
153+#pragma clang section bss=""
154+#endif
155
156 /* L2 MMU tables */
157+#ifdef __clang__
158+#pragma clang section bss=".nozi.mmu.l2"
159+#endif
160 static l2_xlat_tbl_t main_mmu_l2_ttb[MAX_XLAT_TABLES]
161- __aligned(L2_ALIGNMENT) __section(".nozi.mmu.l2");
162+ __aligned(L2_ALIGNMENT)
163+#ifndef __clang__
164+ __section(".nozi.mmu.l2")
165+#endif
166+;
167+#ifdef __clang__
168+#pragma clang section bss=""
169+#endif
170
171 /* MMU L1 table for TAs, one for each thread */
172+#ifdef __clang__
173+#pragma clang section bss=".nozi.mmu.ul1"
174+#endif
175 static ul1_xlat_tbl_t main_mmu_ul1_ttb[CFG_NUM_THREADS]
176- __aligned(UL1_ALIGNMENT) __section(".nozi.mmu.ul1");
177+ __aligned(UL1_ALIGNMENT)
178+#ifndef __clang__
179+ __section(".nozi.mmu.ul1")
180+#endif
181+;
182+#ifdef __clang__
183+#pragma clang section bss=""
184+#endif
185
186 struct mmu_partition {
187 l1_xlat_tbl_t *l1_table;
188diff --git a/core/arch/arm/mm/pgt_cache.c b/core/arch/arm/mm/pgt_cache.c
Andrew Geissler2daf84b2023-03-31 09:57:23 -0500189index 79553c6d..b9efdf42 100644
Andrew Geissler517393d2023-01-13 08:55:19 -0600190--- a/core/arch/arm/mm/pgt_cache.c
191+++ b/core/arch/arm/mm/pgt_cache.c
192@@ -410,8 +410,18 @@ void pgt_init(void)
193 * has a large alignment, while .bss has a small alignment. The current
194 * link script is optimized for small alignment in .bss
195 */
196+#ifdef __clang__
197+#pragma clang section bss=".nozi.mmu.l2"
198+#endif
199 static uint8_t pgt_tables[PGT_CACHE_SIZE][PGT_SIZE]
200- __aligned(PGT_SIZE) __section(".nozi.pgt_cache");
201+ __aligned(PGT_SIZE)
202+#ifndef __clang__
203+ __section(".nozi.pgt_cache")
204+#endif
205+ ;
206+#ifdef __clang__
207+#pragma clang section bss=""
208+#endif
209 size_t n;
210
211 for (n = 0; n < ARRAY_SIZE(pgt_tables); n++) {
212diff --git a/core/kernel/thread.c b/core/kernel/thread.c
213index d1f2f382..8de124ae 100644
214--- a/core/kernel/thread.c
215+++ b/core/kernel/thread.c
216@@ -38,13 +38,24 @@ struct thread_core_local thread_core_local[CFG_TEE_CORE_NB_CORE] __nex_bss;
217 name[stack_num][sizeof(name[stack_num]) / sizeof(uint32_t) - 1]
218 #endif
219
220+#define DO_PRAGMA(x) _Pragma (#x)
221+
222+#ifdef __clang__
223+#define DECLARE_STACK(name, num_stacks, stack_size, linkage) \
224+DO_PRAGMA (clang section bss=".nozi_stack." #name) \
225+linkage uint32_t name[num_stacks] \
226+ [ROUNDUP(stack_size + STACK_CANARY_SIZE + STACK_CHECK_EXTRA, \
227+ STACK_ALIGNMENT) / sizeof(uint32_t)] \
228+ __attribute__((aligned(STACK_ALIGNMENT))); \
229+DO_PRAGMA(clang section bss="")
230+#else
231 #define DECLARE_STACK(name, num_stacks, stack_size, linkage) \
232 linkage uint32_t name[num_stacks] \
233 [ROUNDUP(stack_size + STACK_CANARY_SIZE + STACK_CHECK_EXTRA, \
234 STACK_ALIGNMENT) / sizeof(uint32_t)] \
235 __attribute__((section(".nozi_stack." # name), \
236 aligned(STACK_ALIGNMENT)))
237-
238+#endif
239 #define GET_STACK(stack) ((vaddr_t)(stack) + STACK_SIZE(stack))
240
241 DECLARE_STACK(stack_tmp, CFG_TEE_CORE_NB_CORE, STACK_TMP_SIZE,