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. */ 59 GNU_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