2626
2727 . align 5
2828DECLARE_FUNC(aarch64_atomic_fetch_add_8_default_impl):
29+ hint # 0x22 // bti c
2930#ifdef __ARM_FEATURE_ATOMICS
3031 ldaddal x1 , x2 , [ x0 ]
3132#else
@@ -41,6 +42,7 @@ DECLARE_FUNC(aarch64_atomic_fetch_add_8_default_impl):
4142
4243 . align 5
4344DECLARE_FUNC(aarch64_atomic_fetch_add_4_default_impl):
45+ hint # 0x22 // bti c
4446#ifdef __ARM_FEATURE_ATOMICS
4547 ldaddal w1 , w2 , [ x0 ]
4648#else
@@ -56,8 +58,9 @@ DECLARE_FUNC(aarch64_atomic_fetch_add_4_default_impl):
5658
5759 . align 5
5860DECLARE_FUNC(aarch64_atomic_fetch_add_8_relaxed_default_impl):
61+ hint # 0x22 // bti c
5962#ifdef __ARM_FEATURE_ATOMICS
60- ldadd x1 , x2 , [ x0 ]
63+ ldadd x1 , x2 , [ x0 ]
6164#else
6265 prfm pstl1strm , [ x0 ]
63660 : ldxr x2 , [ x0 ]
@@ -70,8 +73,9 @@ DECLARE_FUNC(aarch64_atomic_fetch_add_8_relaxed_default_impl):
7073
7174 . align 5
7275DECLARE_FUNC(aarch64_atomic_fetch_add_4_relaxed_default_impl):
76+ hint # 0x22 // bti c
7377#ifdef __ARM_FEATURE_ATOMICS
74- ldadd w1 , w2 , [ x0 ]
78+ ldadd w1 , w2 , [ x0 ]
7579#else
7680 prfm pstl1strm , [ x0 ]
77810 : ldxr w2 , [ x0 ]
@@ -84,6 +88,7 @@ DECLARE_FUNC(aarch64_atomic_fetch_add_4_relaxed_default_impl):
8488
8589 . align 5
8690DECLARE_FUNC(aarch64_atomic_xchg_4_default_impl):
91+ hint # 0x22 // bti c
8792#ifdef __ARM_FEATURE_ATOMICS
8893 swpal w1 , w2 , [ x0 ]
8994#else
@@ -98,6 +103,7 @@ DECLARE_FUNC(aarch64_atomic_xchg_4_default_impl):
98103
99104 . align 5
100105DECLARE_FUNC(aarch64_atomic_xchg_8_default_impl):
106+ hint # 0x22 // bti c
101107#ifdef __ARM_FEATURE_ATOMICS
102108 swpal x1 , x2 , [ x0 ]
103109#else
@@ -112,6 +118,7 @@ DECLARE_FUNC(aarch64_atomic_xchg_8_default_impl):
112118
113119 . align 5
114120DECLARE_FUNC(aarch64_atomic_cmpxchg_1_default_impl):
121+ hint # 0x22 // bti c
115122#ifdef __ARM_FEATURE_ATOMICS
116123 mov x3 , x1
117124 casalb w3 , w2 , [ x0 ]
@@ -131,6 +138,7 @@ DECLARE_FUNC(aarch64_atomic_cmpxchg_1_default_impl):
131138
132139 . align 5
133140DECLARE_FUNC(aarch64_atomic_cmpxchg_4_default_impl):
141+ hint # 0x22 // bti c
134142#ifdef __ARM_FEATURE_ATOMICS
135143 mov x3 , x1
136144 casal w3 , w2 , [ x0 ]
@@ -149,6 +157,7 @@ DECLARE_FUNC(aarch64_atomic_cmpxchg_4_default_impl):
149157
150158 . align 5
151159DECLARE_FUNC(aarch64_atomic_cmpxchg_8_default_impl):
160+ hint # 0x22 // bti c
152161#ifdef __ARM_FEATURE_ATOMICS
153162 mov x3 , x1
154163 casal x3 , x2 , [ x0 ]
@@ -167,6 +176,7 @@ DECLARE_FUNC(aarch64_atomic_cmpxchg_8_default_impl):
167176
168177 . align 5
169178DECLARE_FUNC(aarch64_atomic_cmpxchg_4_release_default_impl):
179+ hint # 0x22 // bti c
170180#ifdef __ARM_FEATURE_ATOMICS
171181 mov x3 , x1
172182 casl w3 , w2 , [ x0 ]
@@ -183,6 +193,7 @@ DECLARE_FUNC(aarch64_atomic_cmpxchg_4_release_default_impl):
183193
184194 . align 5
185195DECLARE_FUNC(aarch64_atomic_cmpxchg_8_release_default_impl):
196+ hint # 0x22 // bti c
186197#ifdef __ARM_FEATURE_ATOMICS
187198 mov x3 , x1
188199 casl x3 , x2 , [ x0 ]
@@ -199,6 +210,7 @@ DECLARE_FUNC(aarch64_atomic_cmpxchg_8_release_default_impl):
199210
200211 . align 5
201212DECLARE_FUNC(aarch64_atomic_cmpxchg_4_seq_cst_default_impl):
213+ hint # 0x22 // bti c
202214#ifdef __ARM_FEATURE_ATOMICS
203215 mov x3 , x1
204216 casal w3 , w2 , [ x0 ]
@@ -215,6 +227,7 @@ DECLARE_FUNC(aarch64_atomic_cmpxchg_4_seq_cst_default_impl):
215227
216228 . align 5
217229DECLARE_FUNC(aarch64_atomic_cmpxchg_8_seq_cst_default_impl):
230+ hint # 0x22 // bti c
218231#ifdef __ARM_FEATURE_ATOMICS
219232 mov x3 , x1
220233 casal x3 , x2 , [ x0 ]
@@ -231,6 +244,7 @@ DECLARE_FUNC(aarch64_atomic_cmpxchg_8_seq_cst_default_impl):
231244
232245 . align 5
233246DECLARE_FUNC(aarch64_atomic_cmpxchg_1_relaxed_default_impl):
247+ hint # 0x22 // bti c
234248#ifdef __ARM_FEATURE_ATOMICS
235249 mov x3 , x1
236250 casb w3 , w2 , [ x0 ]
@@ -248,6 +262,7 @@ DECLARE_FUNC(aarch64_atomic_cmpxchg_1_relaxed_default_impl):
248262
249263 . align 5
250264DECLARE_FUNC(aarch64_atomic_cmpxchg_4_relaxed_default_impl):
265+ hint # 0x22 // bti c
251266#ifdef __ARM_FEATURE_ATOMICS
252267 mov x3 , x1
253268 cas w3 , w2 , [ x0 ]
@@ -264,6 +279,7 @@ DECLARE_FUNC(aarch64_atomic_cmpxchg_4_relaxed_default_impl):
264279
265280 . align 5
266281DECLARE_FUNC(aarch64_atomic_cmpxchg_8_relaxed_default_impl):
282+ hint # 0x22 // bti c
267283#ifdef __ARM_FEATURE_ATOMICS
268284 mov x3 , x1
269285 cas x3 , x2 , [ x0 ]
@@ -277,3 +293,35 @@ DECLARE_FUNC(aarch64_atomic_cmpxchg_8_relaxed_default_impl):
277293#endif
2782941 : mov x0 , x3
279295 ret
296+
297+ / * Emit .note.gnu.property section in case of PAC or BTI being enabled.
298+ * For more details see "ELF for the Arm® 64-bit Architecture (AArch64)" .
299+ * https://github.com/ARM - software/abi - aa/blob/main/aaelf64/aaelf64.rst
300+ * /
301+ #ifdef __ARM_FEATURE_BTI_DEFAULT
302+ #ifdef __ARM_FEATURE_PAC_DEFAULT
303+ #define GNU_PROPERTY_AARCH64_FEATURE 3
304+ #else
305+ #define GNU_PROPERTY_AARCH64_FEATURE 1
306+ #endif
307+ #else
308+ #ifdef __ARM_FEATURE_PAC_DEFAULT
309+ #define GNU_PROPERTY_AARCH64_FEATURE 2
310+ #else
311+ #define GNU_PROPERTY_AARCH64_FEATURE 0
312+ #endif
313+ #endif
314+
315+ #if (GNU_PROPERTY_AARCH64_FEATURE != 0 )
316+ .pushsection .note.gnu.property , "a"
317+ . align 3
318+ .long 4 / * name length * /
319+ .long 0x10 / * data length * /
320+ .long 5 / * note type: NT_GNU_PROPERTY_TYPE_0 * /
321+ .string "GNU" / * vendor name * /
322+ .long 0xc0000000 / * GNU_PROPERTY_AARCH64_FEATURE_1_AND * /
323+ .long 4 / * pr_datasze * /
324+ .long GNU_PROPERTY_AARCH64_FEATURE
325+ .long 0
326+ .popsection
327+ #endif
0 commit comments