Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

openrisc: Add support for restartable sequences

Implement support for restartable sequences on OpenRISC by doing:
- Select HAVE_RSEQ in Kconfig
- Call rseq_syscall() on return to userspace when CONFIG_DEBUG_RSEQ
is enabled.
- Call rseq_signal_deliver() to fixup the pre-signal stack frame when a
signal is delivered on top of a restartable sequence critical section

Cc: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Stafford Horne <shorne@gmail.com>

+7
+1
arch/openrisc/Kconfig
··· 28 28 select HAVE_UID16 29 29 select HAVE_PAGE_SIZE_8KB 30 30 select HAVE_REGS_AND_STACK_ACCESS_API 31 + select HAVE_RSEQ 31 32 select GENERIC_ATOMIC64 32 33 select GENERIC_CLOCKEVENTS_BROADCAST 33 34 select GENERIC_SMP_IDLE_THREAD
+4
arch/openrisc/kernel/entry.S
··· 714 714 * interrupts that set NEED_RESCHED or SIGNALPENDING... really true? */ 715 715 716 716 _syscall_check_work: 717 + #ifdef CONFIG_DEBUG_RSEQ 718 + l.jal rseq_syscall 719 + l.ori r3,r1,0 720 + #endif 717 721 /* Here we need to disable interrupts */ 718 722 DISABLE_INTERRUPTS(r27,r29) 719 723 TRACE_IRQS_OFF
+2
arch/openrisc/kernel/signal.c
··· 244 244 { 245 245 int ret; 246 246 247 + rseq_signal_deliver(ksig, regs); 248 + 247 249 ret = setup_rt_frame(ksig, sigmask_to_save(), regs); 248 250 249 251 signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLESTEP));