| /* | |
| * AArch64 gcs functions for linux-user | |
| * | |
| * SPDX-License-Identifier: GPL-2.0-or-later | |
| */ | |
| #ifndef AARCH64_GCS_INTERNAL_H | |
| #define AARCH64_GCS_INTERNAL_H | |
| #ifndef PR_SHADOW_STACK_ENABLE | |
| # define PR_SHADOW_STACK_ENABLE (1U << 0) | |
| # define PR_SHADOW_STACK_WRITE (1U << 1) | |
| # define PR_SHADOW_STACK_PUSH (1U << 2) | |
| #endif | |
| static inline uint64_t gcs_get_el0_mode(CPUArchState *env) | |
| { | |
| uint64_t cr = env->cp15.gcscr_el[0]; | |
| abi_ulong flags = 0; | |
| flags |= cr & GCSCR_PCRSEL ? PR_SHADOW_STACK_ENABLE : 0; | |
| flags |= cr & GCSCR_STREN ? PR_SHADOW_STACK_WRITE : 0; | |
| flags |= cr & GCSCR_PUSHMEN ? PR_SHADOW_STACK_PUSH : 0; | |
| return flags; | |
| } | |
| static inline void gcs_set_el0_mode(CPUArchState *env, uint64_t flags) | |
| { | |
| uint64_t cr = GCSCRE0_NTR; | |
| cr |= flags & PR_SHADOW_STACK_ENABLE ? GCSCR_RVCHKEN | GCSCR_PCRSEL : 0; | |
| cr |= flags & PR_SHADOW_STACK_WRITE ? GCSCR_STREN : 0; | |
| cr |= flags & PR_SHADOW_STACK_PUSH ? GCSCR_PUSHMEN : 0; | |
| env->cp15.gcscr_el[0] = cr; | |
| } | |
| #endif |