1/* SPDX-License-Identifier: GPL-2.0 */ 2#ifndef __ASM_COMPILER_H 3#define __ASM_COMPILER_H 4 5#ifdef ARM64_ASM_ARCH 6#define ARM64_ASM_PREAMBLE ".arch " ARM64_ASM_ARCH "\n" 7#else 8#define ARM64_ASM_PREAMBLE 9#endif 10 11#define xpaclri(ptr) \ 12({ \ 13 register unsigned long __xpaclri_ptr asm("x30") = (ptr); \ 14 \ 15 asm( \ 16 ARM64_ASM_PREAMBLE \ 17 " hint #7\n" \ 18 : "+r" (__xpaclri_ptr)); \ 19 \ 20 __xpaclri_ptr; \ 21}) 22 23#ifdef CONFIG_ARM64_PTR_AUTH_KERNEL 24#define ptrauth_strip_kernel_insn_pac(ptr) xpaclri(ptr) 25#else 26#define ptrauth_strip_kernel_insn_pac(ptr) (ptr) 27#endif 28 29#ifdef CONFIG_ARM64_PTR_AUTH 30#define ptrauth_strip_user_insn_pac(ptr) xpaclri(ptr) 31#else 32#define ptrauth_strip_user_insn_pac(ptr) (ptr) 33#endif 34 35#if !defined(CONFIG_BUILTIN_RETURN_ADDRESS_STRIPS_PAC) 36#define __builtin_return_address(val) \ 37 (void *)(ptrauth_strip_kernel_insn_pac((unsigned long)__builtin_return_address(val))) 38#endif 39 40#endif /* __ASM_COMPILER_H */ 41