xref: /aosp_15_r20/external/arm-optimized-routines/string/aarch64/asmdefs.h (revision 412f47f9e737e10ed5cc46ec6a8d7fa2264f8a14)
1*412f47f9SXin Li /*
2*412f47f9SXin Li  * Macros for asm code.  AArch64 version.
3*412f47f9SXin Li  *
4*412f47f9SXin Li  * Copyright (c) 2019-2023, Arm Limited.
5*412f47f9SXin Li  * SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception
6*412f47f9SXin Li  */
7*412f47f9SXin Li 
8*412f47f9SXin Li #ifndef _ASMDEFS_H
9*412f47f9SXin Li #define _ASMDEFS_H
10*412f47f9SXin Li 
11*412f47f9SXin Li /* Branch Target Identitication support.  */
12*412f47f9SXin Li #define BTI_C		hint	34
13*412f47f9SXin Li #define BTI_J		hint	36
14*412f47f9SXin Li /* Return address signing support (pac-ret).  */
15*412f47f9SXin Li #define PACIASP		hint	25; .cfi_window_save
16*412f47f9SXin Li #define AUTIASP		hint	29; .cfi_window_save
17*412f47f9SXin Li 
18*412f47f9SXin Li /* GNU_PROPERTY_AARCH64_* macros from elf.h.  */
19*412f47f9SXin Li #define FEATURE_1_AND 0xc0000000
20*412f47f9SXin Li #define FEATURE_1_BTI 1
21*412f47f9SXin Li #define FEATURE_1_PAC 2
22*412f47f9SXin Li 
23*412f47f9SXin Li /* Add a NT_GNU_PROPERTY_TYPE_0 note.  */
24*412f47f9SXin Li #ifdef __ILP32__
25*412f47f9SXin Li #define GNU_PROPERTY(type, value)	\
26*412f47f9SXin Li   .section .note.gnu.property, "a";	\
27*412f47f9SXin Li   .p2align 2;				\
28*412f47f9SXin Li   .word 4;				\
29*412f47f9SXin Li   .word 12;				\
30*412f47f9SXin Li   .word 5;				\
31*412f47f9SXin Li   .asciz "GNU";				\
32*412f47f9SXin Li   .word type;				\
33*412f47f9SXin Li   .word 4;				\
34*412f47f9SXin Li   .word value;				\
35*412f47f9SXin Li   .text
36*412f47f9SXin Li #else
37*412f47f9SXin Li #define GNU_PROPERTY(type, value)	\
38*412f47f9SXin Li   .section .note.gnu.property, "a";	\
39*412f47f9SXin Li   .p2align 3;				\
40*412f47f9SXin Li   .word 4;				\
41*412f47f9SXin Li   .word 16;				\
42*412f47f9SXin Li   .word 5;				\
43*412f47f9SXin Li   .asciz "GNU";				\
44*412f47f9SXin Li   .word type;				\
45*412f47f9SXin Li   .word 4;				\
46*412f47f9SXin Li   .word value;				\
47*412f47f9SXin Li   .word 0;				\
48*412f47f9SXin Li   .text
49*412f47f9SXin Li #endif
50*412f47f9SXin Li 
51*412f47f9SXin Li /* If set then the GNU Property Note section will be added to
52*412f47f9SXin Li    mark objects to support BTI and PAC-RET.  */
53*412f47f9SXin Li #ifndef WANT_GNU_PROPERTY
54*412f47f9SXin Li #define WANT_GNU_PROPERTY 1
55*412f47f9SXin Li #endif
56*412f47f9SXin Li 
57*412f47f9SXin Li #if WANT_GNU_PROPERTY
58*412f47f9SXin Li /* Add property note with supported features to all asm files.  */
59*412f47f9SXin Li GNU_PROPERTY (FEATURE_1_AND, FEATURE_1_BTI|FEATURE_1_PAC)
60*412f47f9SXin Li #endif
61*412f47f9SXin Li 
62*412f47f9SXin Li #define ENTRY_ALIGN(name, alignment)	\
63*412f47f9SXin Li   .global name;		\
64*412f47f9SXin Li   .type name,%function;	\
65*412f47f9SXin Li   .align alignment;		\
66*412f47f9SXin Li   name:			\
67*412f47f9SXin Li   .cfi_startproc;	\
68*412f47f9SXin Li   BTI_C;
69*412f47f9SXin Li 
70*412f47f9SXin Li #define ENTRY(name)	ENTRY_ALIGN(name, 6)
71*412f47f9SXin Li 
72*412f47f9SXin Li #define ENTRY_ALIAS(name)	\
73*412f47f9SXin Li   .global name;		\
74*412f47f9SXin Li   .type name,%function;	\
75*412f47f9SXin Li   name:
76*412f47f9SXin Li 
77*412f47f9SXin Li #define END(name)	\
78*412f47f9SXin Li   .cfi_endproc;		\
79*412f47f9SXin Li   .size name, .-name;
80*412f47f9SXin Li 
81*412f47f9SXin Li #define L(l) .L ## l
82*412f47f9SXin Li 
83*412f47f9SXin Li #ifdef __ILP32__
84*412f47f9SXin Li   /* Sanitize padding bits of pointer arguments as per aapcs64 */
85*412f47f9SXin Li #define PTR_ARG(n)  mov w##n, w##n
86*412f47f9SXin Li #else
87*412f47f9SXin Li #define PTR_ARG(n)
88*412f47f9SXin Li #endif
89*412f47f9SXin Li 
90*412f47f9SXin Li #ifdef __ILP32__
91*412f47f9SXin Li   /* Sanitize padding bits of size arguments as per aapcs64 */
92*412f47f9SXin Li #define SIZE_ARG(n)  mov w##n, w##n
93*412f47f9SXin Li #else
94*412f47f9SXin Li #define SIZE_ARG(n)
95*412f47f9SXin Li #endif
96*412f47f9SXin Li 
97*412f47f9SXin Li /* Compiler supports SVE instructions  */
98*412f47f9SXin Li #ifndef HAVE_SVE
99*412f47f9SXin Li # if __aarch64__ && (__GNUC__ >= 8 || __clang_major__ >= 5)
100*412f47f9SXin Li #   define HAVE_SVE 1
101*412f47f9SXin Li # else
102*412f47f9SXin Li #   define HAVE_SVE 0
103*412f47f9SXin Li # endif
104*412f47f9SXin Li #endif
105*412f47f9SXin Li 
106*412f47f9SXin Li #endif
107