Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at master 97 lines 3.1 kB view raw
1/* SPDX-License-Identifier: GPL-2.0 2 * Copyright (C) 2024 Rivos, Inc. 3 * Deepak Gupta <debug@rivosinc.com> 4 */ 5#ifndef _ASM_RISCV_USERCFI_H 6#define _ASM_RISCV_USERCFI_H 7 8#define CMDLINE_DISABLE_RISCV_USERCFI_FCFI 1 9#define CMDLINE_DISABLE_RISCV_USERCFI_BCFI 2 10#define CMDLINE_DISABLE_RISCV_USERCFI 3 11 12#ifndef __ASSEMBLER__ 13#include <linux/types.h> 14#include <linux/prctl.h> 15#include <linux/errno.h> 16 17struct task_struct; 18struct kernel_clone_args; 19 20extern unsigned long riscv_nousercfi; 21 22#ifdef CONFIG_RISCV_USER_CFI 23struct cfi_state { 24 unsigned long ubcfi_en : 1; /* Enable for backward cfi. */ 25 unsigned long ubcfi_locked : 1; 26 unsigned long ufcfi_en : 1; /* Enable for forward cfi. Note that ELP goes in sstatus */ 27 unsigned long ufcfi_locked : 1; 28 unsigned long user_shdw_stk; /* Current user shadow stack pointer */ 29 unsigned long shdw_stk_base; /* Base address of shadow stack */ 30 unsigned long shdw_stk_size; /* size of shadow stack */ 31}; 32 33unsigned long shstk_alloc_thread_stack(struct task_struct *tsk, 34 const struct kernel_clone_args *args); 35void shstk_release(struct task_struct *tsk); 36void set_shstk_base(struct task_struct *task, unsigned long shstk_addr, unsigned long size); 37unsigned long get_shstk_base(struct task_struct *task, unsigned long *size); 38void set_active_shstk(struct task_struct *task, unsigned long shstk_addr); 39bool is_shstk_enabled(struct task_struct *task); 40bool is_shstk_locked(struct task_struct *task); 41bool is_shstk_allocated(struct task_struct *task); 42void set_shstk_lock(struct task_struct *task); 43void set_shstk_status(struct task_struct *task, bool enable); 44unsigned long get_active_shstk(struct task_struct *task); 45int restore_user_shstk(struct task_struct *tsk, unsigned long shstk_ptr); 46int save_user_shstk(struct task_struct *tsk, unsigned long *saved_shstk_ptr); 47bool is_indir_lp_enabled(struct task_struct *task); 48bool is_indir_lp_locked(struct task_struct *task); 49void set_indir_lp_status(struct task_struct *task, bool enable); 50void set_indir_lp_lock(struct task_struct *task); 51 52#define PR_SHADOW_STACK_SUPPORTED_STATUS_MASK (PR_SHADOW_STACK_ENABLE) 53 54#else 55 56#define shstk_alloc_thread_stack(tsk, args) 0 57 58#define shstk_release(tsk) 59 60#define get_shstk_base(task, size) 0UL 61 62#define set_shstk_base(task, shstk_addr, size) do {} while (0) 63 64#define set_active_shstk(task, shstk_addr) do {} while (0) 65 66#define is_shstk_enabled(task) false 67 68#define is_shstk_locked(task) false 69 70#define is_shstk_allocated(task) false 71 72#define set_shstk_lock(task) do {} while (0) 73 74#define set_shstk_status(task, enable) do {} while (0) 75 76#define is_indir_lp_enabled(task) false 77 78#define is_indir_lp_locked(task) false 79 80#define set_indir_lp_status(task, enable) do {} while (0) 81 82#define set_indir_lp_lock(task) do {} while (0) 83 84#define restore_user_shstk(tsk, shstk_ptr) -EINVAL 85 86#define save_user_shstk(tsk, saved_shstk_ptr) -EINVAL 87 88#define get_active_shstk(task) 0UL 89 90#endif /* CONFIG_RISCV_USER_CFI */ 91 92bool is_user_shstk_enabled(void); 93bool is_user_lpad_enabled(void); 94 95#endif /* __ASSEMBLER__ */ 96 97#endif /* _ASM_RISCV_USERCFI_H */