root/arch/arm64/include/asm/compiler.h
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __ASM_COMPILER_H
#define __ASM_COMPILER_H

#ifdef ARM64_ASM_ARCH
#define ARM64_ASM_PREAMBLE ".arch " ARM64_ASM_ARCH "\n"
#else
#define ARM64_ASM_PREAMBLE
#endif

#define xpaclri(ptr)                                                    \
({                                                                      \
        register unsigned long __xpaclri_ptr asm("x30") = (ptr);        \
                                                                        \
        asm(                                                            \
        ARM64_ASM_PREAMBLE                                              \
        "       hint    #7\n"                                           \
        : "+r" (__xpaclri_ptr));                                        \
                                                                        \
        __xpaclri_ptr;                                                  \
})

#ifdef CONFIG_ARM64_PTR_AUTH_KERNEL
#define ptrauth_strip_kernel_insn_pac(ptr)      xpaclri(ptr)
#else
#define ptrauth_strip_kernel_insn_pac(ptr)      (ptr)
#endif

#ifdef CONFIG_ARM64_PTR_AUTH
#define ptrauth_strip_user_insn_pac(ptr)        xpaclri(ptr)
#else
#define ptrauth_strip_user_insn_pac(ptr)        (ptr)
#endif

#if !defined(CONFIG_BUILTIN_RETURN_ADDRESS_STRIPS_PAC)
#define __builtin_return_address(val)                                   \
        (void *)(ptrauth_strip_kernel_insn_pac((unsigned long)__builtin_return_address(val)))
#endif

#endif /* __ASM_COMPILER_H */