mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 06:44:00 -04:00
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
This commit is contained in:
@@ -397,30 +397,24 @@ struct prctl_mm_map {
|
||||
# define PR_RSEQ_SLICE_EXT_ENABLE 0x01
|
||||
|
||||
/*
|
||||
* Get the current indirect branch tracking configuration for the current
|
||||
* thread, this will be the value configured via PR_SET_INDIR_BR_LP_STATUS.
|
||||
* Get or set the control flow integrity (CFI) configuration for the
|
||||
* current thread.
|
||||
*
|
||||
* Some per-thread control flow integrity settings are not yet
|
||||
* controlled through this prctl(); see for example
|
||||
* PR_{GET,SET,LOCK}_SHADOW_STACK_STATUS
|
||||
*/
|
||||
#define PR_GET_INDIR_BR_LP_STATUS 80
|
||||
|
||||
#define PR_GET_CFI 80
|
||||
#define PR_SET_CFI 81
|
||||
/*
|
||||
* Set the indirect branch tracking configuration. PR_INDIR_BR_LP_ENABLE will
|
||||
* enable cpu feature for user thread, to track all indirect branches and ensure
|
||||
* they land on arch defined landing pad instruction.
|
||||
* x86 - If enabled, an indirect branch must land on an ENDBRANCH instruction.
|
||||
* arch64 - If enabled, an indirect branch must land on a BTI instruction.
|
||||
* riscv - If enabled, an indirect branch must land on an lpad instruction.
|
||||
* PR_INDIR_BR_LP_DISABLE will disable feature for user thread and indirect
|
||||
* branches will no more be tracked by cpu to land on arch defined landing pad
|
||||
* instruction.
|
||||
* Forward-edge CFI variants (excluding ARM64 BTI, which has its own
|
||||
* prctl()s).
|
||||
*/
|
||||
#define PR_SET_INDIR_BR_LP_STATUS 81
|
||||
# define PR_INDIR_BR_LP_ENABLE (1UL << 0)
|
||||
#define PR_CFI_BRANCH_LANDING_PADS 0
|
||||
/* Return and control values for PR_{GET,SET}_CFI */
|
||||
# define PR_CFI_ENABLE _BITUL(0)
|
||||
# define PR_CFI_DISABLE _BITUL(1)
|
||||
# define PR_CFI_LOCK _BITUL(2)
|
||||
|
||||
/*
|
||||
* Prevent further changes to the specified indirect branch tracking
|
||||
* configuration. All bits may be locked via this call, including
|
||||
* undefined bits.
|
||||
*/
|
||||
#define PR_LOCK_INDIR_BR_LP_STATUS 82
|
||||
|
||||
#endif /* _LINUX_PRCTL_H */
|
||||
|
||||
@@ -94,9 +94,9 @@ bool cfi_ptrace_test(void)
|
||||
}
|
||||
|
||||
switch (ptrace_test_num) {
|
||||
#define CFI_ENABLE_MASK (PTRACE_CFI_LP_EN_STATE | \
|
||||
PTRACE_CFI_SS_EN_STATE | \
|
||||
PTRACE_CFI_SS_PTR_STATE)
|
||||
#define CFI_ENABLE_MASK (PTRACE_CFI_BRANCH_LANDING_PAD_EN_STATE | \
|
||||
PTRACE_CFI_SHADOW_STACK_EN_STATE | \
|
||||
PTRACE_CFI_SHADOW_STACK_PTR_STATE)
|
||||
case 0:
|
||||
if ((cfi_reg.cfi_status.cfi_state & CFI_ENABLE_MASK) != CFI_ENABLE_MASK)
|
||||
ksft_exit_fail_msg("%s: ptrace_getregset failed, %llu\n", __func__,
|
||||
@@ -106,7 +106,8 @@ bool cfi_ptrace_test(void)
|
||||
__func__);
|
||||
break;
|
||||
case 1:
|
||||
if (!(cfi_reg.cfi_status.cfi_state & PTRACE_CFI_ELP_STATE))
|
||||
if (!(cfi_reg.cfi_status.cfi_state &
|
||||
PTRACE_CFI_BRANCH_EXPECTED_LANDING_PAD_STATE))
|
||||
ksft_exit_fail_msg("%s: elp must have been set\n", __func__);
|
||||
/* clear elp state. not interested in anything else */
|
||||
cfi_reg.cfi_status.cfi_state = 0;
|
||||
@@ -145,11 +146,11 @@ int main(int argc, char *argv[])
|
||||
* pads for user mode except lighting up a bit in senvcfg via a prctl.
|
||||
* Enable landing pad support throughout the execution of the test binary.
|
||||
*/
|
||||
ret = my_syscall5(__NR_prctl, PR_GET_INDIR_BR_LP_STATUS, &lpad_status, 0, 0, 0);
|
||||
ret = my_syscall5(__NR_prctl, PR_GET_CFI, PR_CFI_BRANCH_LANDING_PADS, &lpad_status, 0, 0);
|
||||
if (ret)
|
||||
ksft_exit_fail_msg("Get landing pad status failed with %d\n", ret);
|
||||
|
||||
if (!(lpad_status & PR_INDIR_BR_LP_ENABLE))
|
||||
if (!(lpad_status & PR_CFI_ENABLE))
|
||||
ksft_exit_fail_msg("Landing pad is not enabled, should be enabled via glibc\n");
|
||||
|
||||
ret = my_syscall5(__NR_prctl, PR_GET_SHADOW_STACK_STATUS, &ss_status, 0, 0, 0);
|
||||
|
||||
Reference in New Issue
Block a user