Skip to content

Commit e774d5f

Browse files
committed
Merge tag 'riscv-for-linus-v7.0-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux
Pull RISC-V updates from Paul Walmsley: "Before v7.0 is released, fix a few issues with the CFI patchset, merged earlier in v7.0-rc, that primarily affect interfaces to non-kernel code: - Improve the prctl() interface for per-task indirect branch landing pad control to expand abbreviations and to resemble the speculation control prctl() interface - Expand the "LP" and "SS" abbreviations in the ptrace uapi header file to "branch landing pad" and "shadow stack", to improve readability - Fix a typo in a CFI-related macro name in the ptrace uapi header file - Ensure that the indirect branch tracking state and shadow stack state are unlocked immediately after an exec() on the new task so that libc subsequently can control it - While working in this area, clean up the kernel-internal, cross-architecture prctl() function names by expanding the abbreviations mentioned above" * tag 'riscv-for-linus-v7.0-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux: prctl: cfi: change the branch landing pad prctl()s to be more descriptive riscv: ptrace: cfi: expand "SS" references to "shadow stack" in uapi headers prctl: rename branch landing pad implementation functions to be more explicit riscv: ptrace: expand "LP" references to "branch landing pads" in uapi headers riscv: cfi: clear CFI lock status in start_thread() riscv: ptrace: cfi: fix "PRACE" typo in uapi header
2 parents c43adb3 + 08ee155 commit e774d5f

11 files changed

Lines changed: 154 additions & 144 deletions

File tree

Documentation/arch/riscv/zicfilp.rst

Lines changed: 39 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -76,34 +76,49 @@ the program.
7676
4. prctl() enabling
7777
--------------------
7878

79-
:c:macro:`PR_SET_INDIR_BR_LP_STATUS` / :c:macro:`PR_GET_INDIR_BR_LP_STATUS` /
80-
:c:macro:`PR_LOCK_INDIR_BR_LP_STATUS` are three prctls added to manage indirect
81-
branch tracking. These prctls are architecture-agnostic and return -EINVAL if
82-
the underlying functionality is not supported.
79+
Per-task indirect branch tracking state can be monitored and
80+
controlled via the :c:macro:`PR_GET_CFI` and :c:macro:`PR_SET_CFI`
81+
``prctl()` arguments (respectively), by supplying
82+
:c:macro:`PR_CFI_BRANCH_LANDING_PADS` as the second argument. These
83+
are architecture-agnostic, and will return -EINVAL if the underlying
84+
functionality is not supported.
8385
84-
* prctl(PR_SET_INDIR_BR_LP_STATUS, unsigned long arg)
86+
* prctl(:c:macro:`PR_SET_CFI`, :c:macro:`PR_CFI_BRANCH_LANDING_PADS`, unsigned long arg)
8587
86-
If arg1 is :c:macro:`PR_INDIR_BR_LP_ENABLE` and if CPU supports
87-
``zicfilp`` then the kernel will enable indirect branch tracking for the
88-
task. The dynamic loader can issue this :c:macro:`prctl` once it has
89-
determined that all the objects loaded in the address space support
90-
indirect branch tracking. Additionally, if there is a `dlopen` to an
91-
object which wasn't compiled with ``zicfilp``, the dynamic loader can
92-
issue this prctl with arg1 set to 0 (i.e. :c:macro:`PR_INDIR_BR_LP_ENABLE`
93-
cleared).
94-
95-
* prctl(PR_GET_INDIR_BR_LP_STATUS, unsigned long * arg)
88+
arg is a bitmask.
9689
97-
Returns the current status of indirect branch tracking. If enabled
98-
it'll return :c:macro:`PR_INDIR_BR_LP_ENABLE`
99-
100-
* prctl(PR_LOCK_INDIR_BR_LP_STATUS, unsigned long arg)
90+
If :c:macro:`PR_CFI_ENABLE` is set in arg, and the CPU supports
91+
``zicfilp``, then the kernel will enable indirect branch tracking for
92+
the task. The dynamic loader can issue this ``prctl()`` once it has
93+
determined that all the objects loaded in the address space support
94+
indirect branch tracking.
95+
96+
Indirect branch tracking state can also be locked once enabled. This
97+
prevents the task from subsequently disabling it. This is done by
98+
setting the bit :c:macro:`PR_CFI_LOCK` in arg. Either indirect branch
99+
tracking must already be enabled for the task, or the bit
100+
:c:macro:`PR_CFI_ENABLE` must also be set in arg. This is intended
101+
for environments that wish to run with a strict security posture that
102+
do not wish to load objects without ``zicfilp`` support.
103+
104+
Indirect branch tracking can also be disabled for the task, assuming
105+
that it has not previously been enabled and locked. If there is a
106+
``dlopen()`` to an object which wasn't compiled with ``zicfilp``, the
107+
dynamic loader can issue this ``prctl()`` with arg set to
108+
:c:macro:`PR_CFI_DISABLE`. Disabling indirect branch tracking for the
109+
task is not possible if it has previously been enabled and locked.
110+
111+
112+
* prctl(:c:macro:`PR_GET_CFI`, :c:macro:`PR_CFI_BRANCH_LANDING_PADS`, unsigned long * arg)
113+
114+
Returns the current status of indirect branch tracking into a bitmask
115+
stored into the memory location pointed to by arg. The bitmask will
116+
have the :c:macro:`PR_CFI_ENABLE` bit set if indirect branch tracking
117+
is currently enabled for the task, and if it is locked, will
118+
additionally have the :c:macro:`PR_CFI_LOCK` bit set. If indirect
119+
branch tracking is currently disabled for the task, the
120+
:c:macro:`PR_CFI_DISABLE` bit will be set.
101121

102-
Locks the current status of indirect branch tracking on the task. User
103-
space may want to run with a strict security posture and wouldn't want
104-
loading of objects without ``zicfilp`` support in them, to disallow
105-
disabling of indirect branch tracking. In this case, user space can
106-
use this prctl to lock the current settings.
107122

108123
5. violations related to indirect branch tracking
109124
--------------------------------------------------

arch/riscv/include/asm/usercfi.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,15 @@ void set_active_shstk(struct task_struct *task, unsigned long shstk_addr);
3939
bool is_shstk_enabled(struct task_struct *task);
4040
bool is_shstk_locked(struct task_struct *task);
4141
bool is_shstk_allocated(struct task_struct *task);
42-
void set_shstk_lock(struct task_struct *task);
42+
void set_shstk_lock(struct task_struct *task, bool lock);
4343
void set_shstk_status(struct task_struct *task, bool enable);
4444
unsigned long get_active_shstk(struct task_struct *task);
4545
int restore_user_shstk(struct task_struct *tsk, unsigned long shstk_ptr);
4646
int save_user_shstk(struct task_struct *tsk, unsigned long *saved_shstk_ptr);
4747
bool is_indir_lp_enabled(struct task_struct *task);
4848
bool is_indir_lp_locked(struct task_struct *task);
4949
void set_indir_lp_status(struct task_struct *task, bool enable);
50-
void set_indir_lp_lock(struct task_struct *task);
50+
void set_indir_lp_lock(struct task_struct *task, bool lock);
5151

5252
#define PR_SHADOW_STACK_SUPPORTED_STATUS_MASK (PR_SHADOW_STACK_ENABLE)
5353

@@ -69,7 +69,7 @@ void set_indir_lp_lock(struct task_struct *task);
6969

7070
#define is_shstk_allocated(task) false
7171

72-
#define set_shstk_lock(task) do {} while (0)
72+
#define set_shstk_lock(task, lock) do {} while (0)
7373

7474
#define set_shstk_status(task, enable) do {} while (0)
7575

@@ -79,7 +79,7 @@ void set_indir_lp_lock(struct task_struct *task);
7979

8080
#define set_indir_lp_status(task, enable) do {} while (0)
8181

82-
#define set_indir_lp_lock(task) do {} while (0)
82+
#define set_indir_lp_lock(task, lock) do {} while (0)
8383

8484
#define restore_user_shstk(tsk, shstk_ptr) -EINVAL
8585

arch/riscv/include/uapi/asm/ptrace.h

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -132,26 +132,28 @@ struct __sc_riscv_cfi_state {
132132
unsigned long ss_ptr; /* shadow stack pointer */
133133
};
134134

135-
#define PTRACE_CFI_LP_EN_BIT 0
136-
#define PTRACE_CFI_LP_LOCK_BIT 1
137-
#define PTRACE_CFI_ELP_BIT 2
138-
#define PTRACE_CFI_SS_EN_BIT 3
139-
#define PTRACE_CFI_SS_LOCK_BIT 4
140-
#define PTRACE_CFI_SS_PTR_BIT 5
141-
142-
#define PTRACE_CFI_LP_EN_STATE _BITUL(PTRACE_CFI_LP_EN_BIT)
143-
#define PTRACE_CFI_LP_LOCK_STATE _BITUL(PTRACE_CFI_LP_LOCK_BIT)
144-
#define PTRACE_CFI_ELP_STATE _BITUL(PTRACE_CFI_ELP_BIT)
145-
#define PTRACE_CFI_SS_EN_STATE _BITUL(PTRACE_CFI_SS_EN_BIT)
146-
#define PTRACE_CFI_SS_LOCK_STATE _BITUL(PTRACE_CFI_SS_LOCK_BIT)
147-
#define PTRACE_CFI_SS_PTR_STATE _BITUL(PTRACE_CFI_SS_PTR_BIT)
148-
149-
#define PRACE_CFI_STATE_INVALID_MASK ~(PTRACE_CFI_LP_EN_STATE | \
150-
PTRACE_CFI_LP_LOCK_STATE | \
151-
PTRACE_CFI_ELP_STATE | \
152-
PTRACE_CFI_SS_EN_STATE | \
153-
PTRACE_CFI_SS_LOCK_STATE | \
154-
PTRACE_CFI_SS_PTR_STATE)
135+
#define PTRACE_CFI_BRANCH_LANDING_PAD_EN_BIT 0
136+
#define PTRACE_CFI_BRANCH_LANDING_PAD_LOCK_BIT 1
137+
#define PTRACE_CFI_BRANCH_EXPECTED_LANDING_PAD_BIT 2
138+
#define PTRACE_CFI_SHADOW_STACK_EN_BIT 3
139+
#define PTRACE_CFI_SHADOW_STACK_LOCK_BIT 4
140+
#define PTRACE_CFI_SHADOW_STACK_PTR_BIT 5
141+
142+
#define PTRACE_CFI_BRANCH_LANDING_PAD_EN_STATE _BITUL(PTRACE_CFI_BRANCH_LANDING_PAD_EN_BIT)
143+
#define PTRACE_CFI_BRANCH_LANDING_PAD_LOCK_STATE \
144+
_BITUL(PTRACE_CFI_BRANCH_LANDING_PAD_LOCK_BIT)
145+
#define PTRACE_CFI_BRANCH_EXPECTED_LANDING_PAD_STATE \
146+
_BITUL(PTRACE_CFI_BRANCH_EXPECTED_LANDING_PAD_BIT)
147+
#define PTRACE_CFI_SHADOW_STACK_EN_STATE _BITUL(PTRACE_CFI_SHADOW_STACK_EN_BIT)
148+
#define PTRACE_CFI_SHADOW_STACK_LOCK_STATE _BITUL(PTRACE_CFI_SHADOW_STACK_LOCK_BIT)
149+
#define PTRACE_CFI_SHADOW_STACK_PTR_STATE _BITUL(PTRACE_CFI_SHADOW_STACK_PTR_BIT)
150+
151+
#define PTRACE_CFI_STATE_INVALID_MASK ~(PTRACE_CFI_BRANCH_LANDING_PAD_EN_STATE | \
152+
PTRACE_CFI_BRANCH_LANDING_PAD_LOCK_STATE | \
153+
PTRACE_CFI_BRANCH_EXPECTED_LANDING_PAD_STATE | \
154+
PTRACE_CFI_SHADOW_STACK_EN_STATE | \
155+
PTRACE_CFI_SHADOW_STACK_LOCK_STATE | \
156+
PTRACE_CFI_SHADOW_STACK_PTR_STATE)
155157

156158
struct __cfi_status {
157159
__u64 cfi_state;

arch/riscv/kernel/process.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,13 +160,15 @@ void start_thread(struct pt_regs *regs, unsigned long pc,
160160
* clear shadow stack state on exec.
161161
* libc will set it later via prctl.
162162
*/
163+
set_shstk_lock(current, false);
163164
set_shstk_status(current, false);
164165
set_shstk_base(current, 0, 0);
165166
set_active_shstk(current, 0);
166167
/*
167168
* disable indirect branch tracking on exec.
168169
* libc will enable it later via prctl.
169170
*/
171+
set_indir_lp_lock(current, false);
170172
set_indir_lp_status(current, false);
171173

172174
#ifdef CONFIG_64BIT

arch/riscv/kernel/ptrace.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -303,18 +303,18 @@ static int riscv_cfi_get(struct task_struct *target,
303303
regs = task_pt_regs(target);
304304

305305
if (is_indir_lp_enabled(target)) {
306-
user_cfi.cfi_status.cfi_state |= PTRACE_CFI_LP_EN_STATE;
306+
user_cfi.cfi_status.cfi_state |= PTRACE_CFI_BRANCH_LANDING_PAD_EN_STATE;
307307
user_cfi.cfi_status.cfi_state |= is_indir_lp_locked(target) ?
308-
PTRACE_CFI_LP_LOCK_STATE : 0;
308+
PTRACE_CFI_BRANCH_LANDING_PAD_LOCK_STATE : 0;
309309
user_cfi.cfi_status.cfi_state |= (regs->status & SR_ELP) ?
310-
PTRACE_CFI_ELP_STATE : 0;
310+
PTRACE_CFI_BRANCH_EXPECTED_LANDING_PAD_STATE : 0;
311311
}
312312

313313
if (is_shstk_enabled(target)) {
314-
user_cfi.cfi_status.cfi_state |= (PTRACE_CFI_SS_EN_STATE |
315-
PTRACE_CFI_SS_PTR_STATE);
314+
user_cfi.cfi_status.cfi_state |= (PTRACE_CFI_SHADOW_STACK_EN_STATE |
315+
PTRACE_CFI_SHADOW_STACK_PTR_STATE);
316316
user_cfi.cfi_status.cfi_state |= is_shstk_locked(target) ?
317-
PTRACE_CFI_SS_LOCK_STATE : 0;
317+
PTRACE_CFI_SHADOW_STACK_LOCK_STATE : 0;
318318
user_cfi.shstk_ptr = get_active_shstk(target);
319319
}
320320

@@ -349,23 +349,23 @@ static int riscv_cfi_set(struct task_struct *target,
349349
* rsvd field should be set to zero so that if those fields are needed in future
350350
*/
351351
if ((user_cfi.cfi_status.cfi_state &
352-
(PTRACE_CFI_LP_EN_STATE | PTRACE_CFI_LP_LOCK_STATE |
353-
PTRACE_CFI_SS_EN_STATE | PTRACE_CFI_SS_LOCK_STATE)) ||
354-
(user_cfi.cfi_status.cfi_state & PRACE_CFI_STATE_INVALID_MASK))
352+
(PTRACE_CFI_BRANCH_LANDING_PAD_EN_STATE | PTRACE_CFI_BRANCH_LANDING_PAD_LOCK_STATE |
353+
PTRACE_CFI_SHADOW_STACK_EN_STATE | PTRACE_CFI_SHADOW_STACK_LOCK_STATE)) ||
354+
(user_cfi.cfi_status.cfi_state & PTRACE_CFI_STATE_INVALID_MASK))
355355
return -EINVAL;
356356

357357
/* If lpad is enabled on target and ptrace requests to set / clear elp, do that */
358358
if (is_indir_lp_enabled(target)) {
359359
if (user_cfi.cfi_status.cfi_state &
360-
PTRACE_CFI_ELP_STATE) /* set elp state */
360+
PTRACE_CFI_BRANCH_EXPECTED_LANDING_PAD_STATE) /* set elp state */
361361
regs->status |= SR_ELP;
362362
else
363363
regs->status &= ~SR_ELP; /* clear elp state */
364364
}
365365

366366
/* If shadow stack enabled on target, set new shadow stack pointer */
367367
if (is_shstk_enabled(target) &&
368-
(user_cfi.cfi_status.cfi_state & PTRACE_CFI_SS_PTR_STATE))
368+
(user_cfi.cfi_status.cfi_state & PTRACE_CFI_SHADOW_STACK_PTR_STATE))
369369
set_active_shstk(target, user_cfi.shstk_ptr);
370370

371371
return 0;

arch/riscv/kernel/usercfi.c

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,9 @@ void set_shstk_status(struct task_struct *task, bool enable)
7474
csr_write(CSR_ENVCFG, task->thread.envcfg);
7575
}
7676

77-
void set_shstk_lock(struct task_struct *task)
77+
void set_shstk_lock(struct task_struct *task, bool lock)
7878
{
79-
task->thread_info.user_cfi_state.ubcfi_locked = 1;
79+
task->thread_info.user_cfi_state.ubcfi_locked = lock;
8080
}
8181

8282
bool is_indir_lp_enabled(struct task_struct *task)
@@ -104,9 +104,9 @@ void set_indir_lp_status(struct task_struct *task, bool enable)
104104
csr_write(CSR_ENVCFG, task->thread.envcfg);
105105
}
106106

107-
void set_indir_lp_lock(struct task_struct *task)
107+
void set_indir_lp_lock(struct task_struct *task, bool lock)
108108
{
109-
task->thread_info.user_cfi_state.ufcfi_locked = 1;
109+
task->thread_info.user_cfi_state.ufcfi_locked = lock;
110110
}
111111
/*
112112
* If size is 0, then to be compatible with regular stack we want it to be as big as
@@ -452,57 +452,56 @@ int arch_lock_shadow_stack_status(struct task_struct *task,
452452
!is_shstk_enabled(task) || arg != 0)
453453
return -EINVAL;
454454

455-
set_shstk_lock(task);
455+
set_shstk_lock(task, true);
456456

457457
return 0;
458458
}
459459

460-
int arch_get_indir_br_lp_status(struct task_struct *t, unsigned long __user *status)
460+
int arch_prctl_get_branch_landing_pad_state(struct task_struct *t,
461+
unsigned long __user *state)
461462
{
462463
unsigned long fcfi_status = 0;
463464

464465
if (!is_user_lpad_enabled())
465466
return -EINVAL;
466467

467-
/* indirect branch tracking is enabled on the task or not */
468-
fcfi_status |= (is_indir_lp_enabled(t) ? PR_INDIR_BR_LP_ENABLE : 0);
468+
fcfi_status = (is_indir_lp_enabled(t) ? PR_CFI_ENABLE : PR_CFI_DISABLE);
469+
fcfi_status |= (is_indir_lp_locked(t) ? PR_CFI_LOCK : 0);
469470

470-
return copy_to_user(status, &fcfi_status, sizeof(fcfi_status)) ? -EFAULT : 0;
471+
return copy_to_user(state, &fcfi_status, sizeof(fcfi_status)) ? -EFAULT : 0;
471472
}
472473

473-
int arch_set_indir_br_lp_status(struct task_struct *t, unsigned long status)
474+
int arch_prctl_set_branch_landing_pad_state(struct task_struct *t, unsigned long state)
474475
{
475-
bool enable_indir_lp = false;
476-
477476
if (!is_user_lpad_enabled())
478477
return -EINVAL;
479478

480479
/* indirect branch tracking is locked and further can't be modified by user */
481480
if (is_indir_lp_locked(t))
482481
return -EINVAL;
483482

484-
/* Reject unknown flags */
485-
if (status & ~PR_INDIR_BR_LP_ENABLE)
483+
if (!(state & (PR_CFI_ENABLE | PR_CFI_DISABLE)))
484+
return -EINVAL;
485+
486+
if (state & PR_CFI_ENABLE && state & PR_CFI_DISABLE)
486487
return -EINVAL;
487488

488-
enable_indir_lp = (status & PR_INDIR_BR_LP_ENABLE);
489-
set_indir_lp_status(t, enable_indir_lp);
489+
set_indir_lp_status(t, !!(state & PR_CFI_ENABLE));
490490

491491
return 0;
492492
}
493493

494-
int arch_lock_indir_br_lp_status(struct task_struct *task,
495-
unsigned long arg)
494+
int arch_prctl_lock_branch_landing_pad_state(struct task_struct *task)
496495
{
497496
/*
498497
* If indirect branch tracking is not supported or not enabled on task,
499498
* nothing to lock here
500499
*/
501500
if (!is_user_lpad_enabled() ||
502-
!is_indir_lp_enabled(task) || arg != 0)
501+
!is_indir_lp_enabled(task))
503502
return -EINVAL;
504503

505-
set_indir_lp_lock(task);
504+
set_indir_lp_lock(task, true);
506505

507506
return 0;
508507
}

include/linux/cpu.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -229,8 +229,8 @@ static inline bool cpu_attack_vector_mitigated(enum cpu_attack_vectors v)
229229
#define smt_mitigations SMT_MITIGATIONS_OFF
230230
#endif
231231

232-
int arch_get_indir_br_lp_status(struct task_struct *t, unsigned long __user *status);
233-
int arch_set_indir_br_lp_status(struct task_struct *t, unsigned long status);
234-
int arch_lock_indir_br_lp_status(struct task_struct *t, unsigned long status);
232+
int arch_prctl_get_branch_landing_pad_state(struct task_struct *t, unsigned long __user *state);
233+
int arch_prctl_set_branch_landing_pad_state(struct task_struct *t, unsigned long state);
234+
int arch_prctl_lock_branch_landing_pad_state(struct task_struct *t);
235235

236236
#endif /* _LINUX_CPU_H_ */

include/uapi/linux/prctl.h

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -397,30 +397,23 @@ struct prctl_mm_map {
397397
# define PR_RSEQ_SLICE_EXT_ENABLE 0x01
398398

399399
/*
400-
* Get the current indirect branch tracking configuration for the current
401-
* thread, this will be the value configured via PR_SET_INDIR_BR_LP_STATUS.
400+
* Get or set the control flow integrity (CFI) configuration for the
401+
* current thread.
402+
*
403+
* Some per-thread control flow integrity settings are not yet
404+
* controlled through this prctl(); see for example
405+
* PR_{GET,SET,LOCK}_SHADOW_STACK_STATUS
402406
*/
403-
#define PR_GET_INDIR_BR_LP_STATUS 80
404-
407+
#define PR_GET_CFI 80
408+
#define PR_SET_CFI 81
405409
/*
406-
* Set the indirect branch tracking configuration. PR_INDIR_BR_LP_ENABLE will
407-
* enable cpu feature for user thread, to track all indirect branches and ensure
408-
* they land on arch defined landing pad instruction.
409-
* x86 - If enabled, an indirect branch must land on an ENDBRANCH instruction.
410-
* arch64 - If enabled, an indirect branch must land on a BTI instruction.
411-
* riscv - If enabled, an indirect branch must land on an lpad instruction.
412-
* PR_INDIR_BR_LP_DISABLE will disable feature for user thread and indirect
413-
* branches will no more be tracked by cpu to land on arch defined landing pad
414-
* instruction.
415-
*/
416-
#define PR_SET_INDIR_BR_LP_STATUS 81
417-
# define PR_INDIR_BR_LP_ENABLE (1UL << 0)
418-
419-
/*
420-
* Prevent further changes to the specified indirect branch tracking
421-
* configuration. All bits may be locked via this call, including
422-
* undefined bits.
410+
* Forward-edge CFI variants (excluding ARM64 BTI, which has its own
411+
* prctl()s).
423412
*/
424-
#define PR_LOCK_INDIR_BR_LP_STATUS 82
413+
#define PR_CFI_BRANCH_LANDING_PADS 0
414+
/* Return and control values for PR_{GET,SET}_CFI */
415+
# define PR_CFI_ENABLE _BITUL(0)
416+
# define PR_CFI_DISABLE _BITUL(1)
417+
# define PR_CFI_LOCK _BITUL(2)
425418

426419
#endif /* _LINUX_PRCTL_H */

0 commit comments

Comments
 (0)