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