| 1 | //===-- sanitizer_ptrauth.h -------------------------------------*- C++ -*-===// |
| 2 | // |
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | |
| 9 | #ifndef SANITIZER_PTRAUTH_H |
| 10 | #define SANITIZER_PTRAUTH_H |
| 11 | |
| 12 | #if __has_feature(ptrauth_intrinsics) |
| 13 | # include <ptrauth.h> |
| 14 | #elif defined(__ARM_FEATURE_PAC_DEFAULT) && !defined(__APPLE__) |
| 15 | // On the stack the link register is protected with Pointer |
| 16 | // Authentication Code when compiled with -mbranch-protection. |
| 17 | // Let's stripping the PAC unconditionally because xpaclri is in |
| 18 | // the NOP space so will do nothing when it is not enabled or not available. |
| 19 | # define ptrauth_strip(__value, __key) \ |
| 20 | ({ \ |
| 21 | __typeof(__value) ret; \ |
| 22 | asm volatile( \ |
| 23 | "mov x30, %1\n\t" \ |
| 24 | "hint #7\n\t" \ |
| 25 | "mov %0, x30\n\t" \ |
| 26 | "mov x30, xzr\n\t" \ |
| 27 | : "=r"(ret) \ |
| 28 | : "r"(__value) \ |
| 29 | : "x30"); \ |
| 30 | ret; \ |
| 31 | }) |
| 32 | # define ptrauth_auth_data(__value, __old_key, __old_data) __value |
| 33 | # define ptrauth_string_discriminator(__string) ((int)0) |
| 34 | #else |
| 35 | // Copied from <ptrauth.h> |
| 36 | # define ptrauth_strip(__value, __key) __value |
| 37 | # define ptrauth_auth_data(__value, __old_key, __old_data) __value |
| 38 | # define ptrauth_string_discriminator(__string) ((int)0) |
| 39 | #endif |
| 40 | |
| 41 | #define STRIP_PAC_PC(pc) ((uptr)ptrauth_strip(pc, 0)) |
| 42 | |
| 43 | #endif // SANITIZER_PTRAUTH_H |
| 44 | |