RISC-V: Add support for restartable sequence
authorVincent Chen <vincent.chen@sifive.com>
Tue, 8 Mar 2022 08:32:52 +0000 (16:32 +0800)
committerPalmer Dabbelt <palmer@rivosinc.com>
Tue, 22 Mar 2022 21:45:14 +0000 (14:45 -0700)
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>
arch/riscv/Kconfig
arch/riscv/kernel/entry.S
arch/riscv/kernel/signal.c

index 5adcbd9..67a671b 100644 (file)
@@ -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
index ed29e9c..56ada2a 100644 (file)
@@ -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
index c2d5ecb..16da3c3 100644 (file)
@@ -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);