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