Unverified Commit 93917ad5 authored by Vincent Chen's avatar Vincent Chen Committed by Palmer Dabbelt
Browse files

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: default avatarVincent Chen <vincent.chen@sifive.com>
Reviewed-by: default avatarMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
parent e783362e
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -101,6 +101,7 @@ config RISCV
	select HAVE_FUNCTION_ARG_ACCESS_API
	select HAVE_STACKPROTECTOR
	select HAVE_SYSCALL_TRACEPOINTS
	select HAVE_RSEQ
	select IRQ_DOMAIN
	select IRQ_FORCED_THREADING
	select MODULES_USE_ELF_RELA if MODULES
+4 −0
Original line number Diff line number Diff line
@@ -225,6 +225,10 @@ ret_from_syscall:
	 * (If it was configured with SECCOMP_RET_ERRNO/TRACE)
	 */
ret_from_syscall_rejected:
#ifdef CONFIG_DEBUG_RSEQ
	move a0, sp
	call rseq_syscall
#endif
	/* Trace syscalls, but only if requested by the user. */
	REG_L t0, TASK_TI_FLAGS(tp)
	andi t0, t0, _TIF_SYSCALL_WORK
+2 −0
Original line number Diff line number Diff line
@@ -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 */
	ret = setup_rt_frame(ksig, oldset, regs);