|
9 | 9 | #ifndef SANITIZER_PTRAUTH_H
|
10 | 10 | #define SANITIZER_PTRAUTH_H
|
11 | 11 |
|
12 |
| -#if __has_feature(ptrauth_calls) |
13 |
| -#include <ptrauth.h> |
| 12 | +#if __has_feature(ptrauth_intrinsics) |
| 13 | +# include <ptrauth.h> |
14 | 14 | #elif defined(__ARM_FEATURE_PAC_DEFAULT) && !defined(__APPLE__)
|
15 |
| -inline unsigned long ptrauth_strip(void* __value, unsigned int __key) { |
16 |
| - // On the stack the link register is protected with Pointer |
17 |
| - // Authentication Code when compiled with -mbranch-protection. |
18 |
| - // Let's stripping the PAC unconditionally because xpaclri is in |
19 |
| - // the NOP space so will do nothing when it is not enabled or not available. |
20 |
| - unsigned long ret; |
21 |
| - asm volatile( |
22 |
| - "mov x30, %1\n\t" |
23 |
| - "hint #7\n\t" // xpaclri |
24 |
| - "mov %0, x30\n\t" |
25 |
| - : "=r"(ret) |
26 |
| - : "r"(__value) |
27 |
| - : "x30"); |
28 |
| - return ret; |
29 |
| -} |
30 |
| -#define ptrauth_auth_data(__value, __old_key, __old_data) __value |
31 |
| -#define ptrauth_string_discriminator(__string) ((int)0) |
| 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 | + unsigned long 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) |
32 | 34 | #else
|
33 | 35 | // Copied from <ptrauth.h>
|
34 |
| -#define ptrauth_strip(__value, __key) __value |
35 |
| -#define ptrauth_auth_data(__value, __old_key, __old_data) __value |
36 |
| -#define ptrauth_string_discriminator(__string) ((int)0) |
| 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) |
37 | 39 | #endif
|
38 | 40 |
|
39 | 41 | #define STRIP_PAC_PC(pc) ((uptr)ptrauth_strip(pc, 0))
|
|
0 commit comments