162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef __ASM_COMPILER_H 362306a36Sopenharmony_ci#define __ASM_COMPILER_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#ifdef ARM64_ASM_ARCH 662306a36Sopenharmony_ci#define ARM64_ASM_PREAMBLE ".arch " ARM64_ASM_ARCH "\n" 762306a36Sopenharmony_ci#else 862306a36Sopenharmony_ci#define ARM64_ASM_PREAMBLE 962306a36Sopenharmony_ci#endif 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#define xpaclri(ptr) \ 1262306a36Sopenharmony_ci({ \ 1362306a36Sopenharmony_ci register unsigned long __xpaclri_ptr asm("x30") = (ptr); \ 1462306a36Sopenharmony_ci \ 1562306a36Sopenharmony_ci asm( \ 1662306a36Sopenharmony_ci ARM64_ASM_PREAMBLE \ 1762306a36Sopenharmony_ci " hint #7\n" \ 1862306a36Sopenharmony_ci : "+r" (__xpaclri_ptr)); \ 1962306a36Sopenharmony_ci \ 2062306a36Sopenharmony_ci __xpaclri_ptr; \ 2162306a36Sopenharmony_ci}) 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#ifdef CONFIG_ARM64_PTR_AUTH_KERNEL 2462306a36Sopenharmony_ci#define ptrauth_strip_kernel_insn_pac(ptr) xpaclri(ptr) 2562306a36Sopenharmony_ci#else 2662306a36Sopenharmony_ci#define ptrauth_strip_kernel_insn_pac(ptr) (ptr) 2762306a36Sopenharmony_ci#endif 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#ifdef CONFIG_ARM64_PTR_AUTH 3062306a36Sopenharmony_ci#define ptrauth_strip_user_insn_pac(ptr) xpaclri(ptr) 3162306a36Sopenharmony_ci#else 3262306a36Sopenharmony_ci#define ptrauth_strip_user_insn_pac(ptr) (ptr) 3362306a36Sopenharmony_ci#endif 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci#if !defined(CONFIG_BUILTIN_RETURN_ADDRESS_STRIPS_PAC) 3662306a36Sopenharmony_ci#define __builtin_return_address(val) \ 3762306a36Sopenharmony_ci (void *)(ptrauth_strip_kernel_insn_pac((unsigned long)__builtin_return_address(val))) 3862306a36Sopenharmony_ci#endif 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci#endif /* __ASM_COMPILER_H */ 41