RISC-V: Add support for restartable sequence
Add calls to rseq_signal_deliver() and rseq_syscall() to introduce RSEQ support. 1. Call the rseq_signal_deliver() function to fixup on the pre-signal frame when a signal is delivered on top of a restartable sequence critical section. 2. Check that system calls are not invoked from within rseq critical sections by invoking rseq_signal() from ret_from_syscall(). With CONFIG_DEBUG_RSEQ, such behavior results in termination of the process with SIGSEGV. Signed-off-by: Vincent Chen <vincent.chen@sifive.com> Reviewed-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
This commit is contained in:
parent
e783362eb5
commit
93917ad509
@ -101,6 +101,7 @@ config RISCV
|
|||||||
select HAVE_FUNCTION_ARG_ACCESS_API
|
select HAVE_FUNCTION_ARG_ACCESS_API
|
||||||
select HAVE_STACKPROTECTOR
|
select HAVE_STACKPROTECTOR
|
||||||
select HAVE_SYSCALL_TRACEPOINTS
|
select HAVE_SYSCALL_TRACEPOINTS
|
||||||
|
select HAVE_RSEQ
|
||||||
select IRQ_DOMAIN
|
select IRQ_DOMAIN
|
||||||
select IRQ_FORCED_THREADING
|
select IRQ_FORCED_THREADING
|
||||||
select MODULES_USE_ELF_RELA if MODULES
|
select MODULES_USE_ELF_RELA if MODULES
|
||||||
|
@ -225,6 +225,10 @@ ret_from_syscall:
|
|||||||
* (If it was configured with SECCOMP_RET_ERRNO/TRACE)
|
* (If it was configured with SECCOMP_RET_ERRNO/TRACE)
|
||||||
*/
|
*/
|
||||||
ret_from_syscall_rejected:
|
ret_from_syscall_rejected:
|
||||||
|
#ifdef CONFIG_DEBUG_RSEQ
|
||||||
|
move a0, sp
|
||||||
|
call rseq_syscall
|
||||||
|
#endif
|
||||||
/* Trace syscalls, but only if requested by the user. */
|
/* Trace syscalls, but only if requested by the user. */
|
||||||
REG_L t0, TASK_TI_FLAGS(tp)
|
REG_L t0, TASK_TI_FLAGS(tp)
|
||||||
andi t0, t0, _TIF_SYSCALL_WORK
|
andi t0, t0, _TIF_SYSCALL_WORK
|
||||||
|
@ -258,6 +258,8 @@ static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rseq_signal_deliver(ksig, regs);
|
||||||
|
|
||||||
/* Set up the stack frame */
|
/* Set up the stack frame */
|
||||||
ret = setup_rt_frame(ksig, oldset, regs);
|
ret = setup_rt_frame(ksig, oldset, regs);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user