/* * Macros for asm code. AArch64 version. * * Copyright (c) 2019-2023, Arm Limited. * SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception */ #ifndef _ASMDEFS_H #define _ASMDEFS_H /* Branch Target Identitication support. */ #define BTI_C hint 34 #define BTI_J hint 36 /* Return address signing support (pac-ret). */ #define PACIASP hint 25; .cfi_window_save #define AUTIASP hint 29; .cfi_window_save /* GNU_PROPERTY_AARCH64_* macros from elf.h. */ #define FEATURE_1_AND 0xc0000000 #define FEATURE_1_BTI 1 #define FEATURE_1_PAC 2 /* Add a NT_GNU_PROPERTY_TYPE_0 note. */ #ifdef __ILP32__ #define GNU_PROPERTY(type, value) \ .section .note.gnu.property, "a"; \ .p2align 2; \ .word 4; \ .word 12; \ .word 5; \ .asciz "GNU"; \ .word type; \ .word 4; \ .word value; \ .text #else #define GNU_PROPERTY(type, value) \ .section .note.gnu.property, "a"; \ .p2align 3; \ .word 4; \ .word 16; \ .word 5; \ .asciz "GNU"; \ .word type; \ .word 4; \ .word value; \ .word 0; \ .text #endif /* If set then the GNU Property Note section will be added to mark objects to support BTI and PAC-RET. */ #ifndef WANT_GNU_PROPERTY #define WANT_GNU_PROPERTY 1 #endif #if WANT_GNU_PROPERTY /* Add property note with supported features to all asm files. */ GNU_PROPERTY (FEATURE_1_AND, FEATURE_1_BTI|FEATURE_1_PAC) #endif #define ENTRY_ALIGN(name, alignment) \ .global name; \ .type name,%function; \ .align alignment; \ name: \ .cfi_startproc; \ BTI_C; #define ENTRY(name) ENTRY_ALIGN(name, 6) #define ENTRY_ALIAS(name) \ .global name; \ .type name,%function; \ name: #define END(name) \ .cfi_endproc; \ .size name, .-name; #define L(l) .L ## l #ifdef __ILP32__ /* Sanitize padding bits of pointer arguments as per aapcs64 */ #define PTR_ARG(n) mov w##n, w##n #else #define PTR_ARG(n) #endif #ifdef __ILP32__ /* Sanitize padding bits of size arguments as per aapcs64 */ #define SIZE_ARG(n) mov w##n, w##n #else #define SIZE_ARG(n) #endif /* Compiler supports SVE instructions */ #ifndef HAVE_SVE # if __aarch64__ && (__GNUC__ >= 8 || __clang_major__ >= 5) # define HAVE_SVE 1 # else # define HAVE_SVE 0 # endif #endif #endif