99 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
| /* SPDX-License-Identifier: MIT */
 | |
| /*
 | |
|  * Macros for asm code.
 | |
|  *
 | |
|  * Copyright (c) 2019, Arm Limited.
 | |
|  */
 | |
| 
 | |
| #ifndef _ASMDEFS_H
 | |
| #define _ASMDEFS_H
 | |
| 
 | |
| #if defined(__aarch64__)
 | |
| 
 | |
| /* 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.  */
 | |
| #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
 | |
| 
 | |
| /* 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;
 | |
| 
 | |
| #else
 | |
| 
 | |
| #define END_FILE
 | |
| 
 | |
| #define ENTRY_ALIGN(name, alignment)	\
 | |
|   .global name;		\
 | |
|   .type name,%function;	\
 | |
|   .align alignment;		\
 | |
|   name:			\
 | |
|   .cfi_startproc;
 | |
| 
 | |
| #endif
 | |
| 
 | |
| #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
 | |
| 
 | |
| #endif
 |