1 /* SPDX-License-Identifier: GPL-2.0-only */
3 * Copyright (C) 2023 ARM Limited.
11 #ifndef __NR_map_shadow_stack
12 #define __NR_map_shadow_stack 453
16 #define __NR_prctl 167
20 #define NT_ARM_GCS 0x410
23 __u64 features_enabled
;
24 __u64 features_locked
;
29 /* Shadow Stack/Guarded Control Stack interface */
30 #define PR_GET_SHADOW_STACK_STATUS 74
31 #define PR_SET_SHADOW_STACK_STATUS 75
32 #define PR_LOCK_SHADOW_STACK_STATUS 76
34 # define PR_SHADOW_STACK_ENABLE (1UL << 0)
35 # define PR_SHADOW_STACK_WRITE (1UL << 1)
36 # define PR_SHADOW_STACK_PUSH (1UL << 2)
38 #define PR_SHADOW_STACK_ALL_MODES \
39 PR_SHADOW_STACK_ENABLE | PR_SHADOW_STACK_WRITE | PR_SHADOW_STACK_PUSH
41 #define SHADOW_STACK_SET_TOKEN (1ULL << 0) /* Set up a restore token in the shadow stack */
42 #define SHADOW_STACK_SET_MARKER (1ULL << 1) /* Set up a top of stack merker in the shadow stack */
44 #define GCS_CAP_ADDR_MASK (0xfffffffffffff000UL)
45 #define GCS_CAP_TOKEN_MASK (0x0000000000000fffUL)
46 #define GCS_CAP_VALID_TOKEN 1
47 #define GCS_CAP_IN_PROGRESS_TOKEN 5
49 #define GCS_CAP(x) (((unsigned long)(x) & GCS_CAP_ADDR_MASK) | \
52 static inline unsigned long *get_gcspr(void)
57 "mrs %0, S3_3_C2_C5_1"
65 static inline void __attribute__((always_inline
)) gcsss1(unsigned long *Xt
)
68 "sys #3, C7, C7, #2, %0\n"
74 static inline unsigned long __attribute__((always_inline
)) *gcsss2(void)
79 "SYSL %0, #3, C7, C7, #3\n"
87 static inline bool chkfeat_gcs(void)
89 register long val
__asm__ ("x16") = 1;