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