master
h 38 lines 1000 Bytes
Raw
1 /*
2 * AArch64 gcs functions for linux-user
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 #ifndef AARCH64_GCS_INTERNAL_H
7 #define AARCH64_GCS_INTERNAL_H
8
9 #ifndef PR_SHADOW_STACK_ENABLE
10 # define PR_SHADOW_STACK_ENABLE (1U << 0)
11 # define PR_SHADOW_STACK_WRITE (1U << 1)
12 # define PR_SHADOW_STACK_PUSH (1U << 2)
13 #endif
14
15 static inline uint64_t gcs_get_el0_mode(CPUArchState *env)
16 {
17 uint64_t cr = env->cp15.gcscr_el[0];
18 abi_ulong flags = 0;
19
20 flags |= cr & GCSCR_PCRSEL ? PR_SHADOW_STACK_ENABLE : 0;
21 flags |= cr & GCSCR_STREN ? PR_SHADOW_STACK_WRITE : 0;
22 flags |= cr & GCSCR_PUSHMEN ? PR_SHADOW_STACK_PUSH : 0;
23
24 return flags;
25 }
26
27 static inline void gcs_set_el0_mode(CPUArchState *env, uint64_t flags)
28 {
29 uint64_t cr = GCSCRE0_NTR;
30
31 cr |= flags & PR_SHADOW_STACK_ENABLE ? GCSCR_RVCHKEN | GCSCR_PCRSEL : 0;
32 cr |= flags & PR_SHADOW_STACK_WRITE ? GCSCR_STREN : 0;
33 cr |= flags & PR_SHADOW_STACK_PUSH ? GCSCR_PUSHMEN : 0;
34
35 env->cp15.gcscr_el[0] = cr;
36 }
37
38 #endif