Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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 */