1689eae42SAmit Daniel Kachhap /* SPDX-License-Identifier: GPL-2.0 */ 2689eae42SAmit Daniel Kachhap #ifndef __ASM_COMPILER_H 3689eae42SAmit Daniel Kachhap #define __ASM_COMPILER_H 4689eae42SAmit Daniel Kachhap 51764c3edSSami Tolvanen #ifdef ARM64_ASM_ARCH 61764c3edSSami Tolvanen #define ARM64_ASM_PREAMBLE ".arch " ARM64_ASM_ARCH "\n" 71764c3edSSami Tolvanen #else 81764c3edSSami Tolvanen #define ARM64_ASM_PREAMBLE 91764c3edSSami Tolvanen #endif 101764c3edSSami Tolvanen 11*ca708599SMark Rutland #define xpaclri(ptr) \ 12*ca708599SMark Rutland ({ \ 13*ca708599SMark Rutland register unsigned long __xpaclri_ptr asm("x30") = (ptr); \ 14*ca708599SMark Rutland \ 15*ca708599SMark Rutland asm( \ 16*ca708599SMark Rutland ARM64_ASM_PREAMBLE \ 17*ca708599SMark Rutland " hint #7\n" \ 18*ca708599SMark Rutland : "+r" (__xpaclri_ptr)); \ 19*ca708599SMark Rutland \ 20*ca708599SMark Rutland __xpaclri_ptr; \ 21*ca708599SMark Rutland }) 22689eae42SAmit Daniel Kachhap 23*ca708599SMark Rutland #ifdef CONFIG_ARM64_PTR_AUTH_KERNEL 24*ca708599SMark Rutland #define ptrauth_strip_kernel_insn_pac(ptr) xpaclri(ptr) 25*ca708599SMark Rutland #else 26*ca708599SMark Rutland #define ptrauth_strip_kernel_insn_pac(ptr) (ptr) 27*ca708599SMark Rutland #endif 28*ca708599SMark Rutland 29*ca708599SMark Rutland #ifdef CONFIG_ARM64_PTR_AUTH 30*ca708599SMark Rutland #define ptrauth_strip_user_insn_pac(ptr) xpaclri(ptr) 31*ca708599SMark Rutland #else 32*ca708599SMark Rutland #define ptrauth_strip_user_insn_pac(ptr) (ptr) 33*ca708599SMark Rutland #endif 34*ca708599SMark Rutland 35*ca708599SMark Rutland #if !defined(CONFIG_BUILTIN_RETURN_ADDRESS_STRIPS_PAC) 36689eae42SAmit Daniel Kachhap #define __builtin_return_address(val) \ 37*ca708599SMark Rutland (void *)(ptrauth_strip_kernel_insn_pac((unsigned long)__builtin_return_address(val))) 389df3f508SMark Rutland #endif 39689eae42SAmit Daniel Kachhap 40689eae42SAmit Daniel Kachhap #endif /* __ASM_COMPILER_H */ 41