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