Path: blob/master/tools/testing/selftests/arm64/gcs/gcs-util.h
26292 views
/* SPDX-License-Identifier: GPL-2.0-only */1/*2* Copyright (C) 2023 ARM Limited.3*/45#ifndef GCS_UTIL_H6#define GCS_UTIL_H78#include <stdbool.h>910#ifndef __NR_map_shadow_stack11#define __NR_map_shadow_stack 45312#endif1314#ifndef __NR_prctl15#define __NR_prctl 16716#endif1718#ifndef NT_ARM_GCS19#define NT_ARM_GCS 0x4102021struct user_gcs {22__u64 features_enabled;23__u64 features_locked;24__u64 gcspr_el0;25};26#endif2728/* Shadow Stack/Guarded Control Stack interface */29#define PR_GET_SHADOW_STACK_STATUS 7430#define PR_SET_SHADOW_STACK_STATUS 7531#define PR_LOCK_SHADOW_STACK_STATUS 763233# define PR_SHADOW_STACK_ENABLE (1UL << 0)34# define PR_SHADOW_STACK_WRITE (1UL << 1)35# define PR_SHADOW_STACK_PUSH (1UL << 2)3637#define PR_SHADOW_STACK_ALL_MODES \38PR_SHADOW_STACK_ENABLE | PR_SHADOW_STACK_WRITE | PR_SHADOW_STACK_PUSH3940#define SHADOW_STACK_SET_TOKEN (1ULL << 0) /* Set up a restore token in the shadow stack */41#define SHADOW_STACK_SET_MARKER (1ULL << 1) /* Set up a top of stack merker in the shadow stack */4243#define GCS_CAP_ADDR_MASK (0xfffffffffffff000UL)44#define GCS_CAP_TOKEN_MASK (0x0000000000000fffUL)45#define GCS_CAP_VALID_TOKEN 146#define GCS_CAP_IN_PROGRESS_TOKEN 54748#define GCS_CAP(x) (((unsigned long)(x) & GCS_CAP_ADDR_MASK) | \49GCS_CAP_VALID_TOKEN)5051static inline unsigned long *get_gcspr(void)52{53unsigned long *gcspr;5455asm volatile(56"mrs %0, S3_3_C2_C5_1"57: "=r" (gcspr)58:59: "cc");6061return gcspr;62}6364static inline void __attribute__((always_inline)) gcsss1(unsigned long *Xt)65{66asm volatile (67"sys #3, C7, C7, #2, %0\n"68:69: "rZ" (Xt)70: "memory");71}7273static inline unsigned long __attribute__((always_inline)) *gcsss2(void)74{75unsigned long *Xt;7677asm volatile(78"SYSL %0, #3, C7, C7, #3\n"79: "=r" (Xt)80:81: "memory");8283return Xt;84}8586static inline bool chkfeat_gcs(void)87{88register long val __asm__ ("x16") = 1;8990/* CHKFEAT x16 */91asm volatile(92"hint #0x28\n"93: "=r" (val)94: "r" (val));9596return val != 1;97}9899#endif100101102