| 1 |
|
| 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
|