mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-10-23 07:23:12 +02:00
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>
This commit is contained in:
parent
7ce8716e27
commit
ca46ebffc2
|
@ -28,6 +28,7 @@ config OPENRISC
|
||||||
select HAVE_UID16
|
select HAVE_UID16
|
||||||
select HAVE_PAGE_SIZE_8KB
|
select HAVE_PAGE_SIZE_8KB
|
||||||
select HAVE_REGS_AND_STACK_ACCESS_API
|
select HAVE_REGS_AND_STACK_ACCESS_API
|
||||||
|
select HAVE_RSEQ
|
||||||
select GENERIC_ATOMIC64
|
select GENERIC_ATOMIC64
|
||||||
select GENERIC_CLOCKEVENTS_BROADCAST
|
select GENERIC_CLOCKEVENTS_BROADCAST
|
||||||
select GENERIC_SMP_IDLE_THREAD
|
select GENERIC_SMP_IDLE_THREAD
|
||||||
|
|
|
@ -714,6 +714,10 @@ _syscall_check_trace_leave:
|
||||||
* interrupts that set NEED_RESCHED or SIGNALPENDING... really true? */
|
* interrupts that set NEED_RESCHED or SIGNALPENDING... really true? */
|
||||||
|
|
||||||
_syscall_check_work:
|
_syscall_check_work:
|
||||||
|
#ifdef CONFIG_DEBUG_RSEQ
|
||||||
|
l.jal rseq_syscall
|
||||||
|
l.ori r3,r1,0
|
||||||
|
#endif
|
||||||
/* Here we need to disable interrupts */
|
/* Here we need to disable interrupts */
|
||||||
DISABLE_INTERRUPTS(r27,r29)
|
DISABLE_INTERRUPTS(r27,r29)
|
||||||
TRACE_IRQS_OFF
|
TRACE_IRQS_OFF
|
||||||
|
|
|
@ -244,6 +244,8 @@ handle_signal(struct ksignal *ksig, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
rseq_signal_deliver(ksig, regs);
|
||||||
|
|
||||||
ret = setup_rt_frame(ksig, sigmask_to_save(), regs);
|
ret = setup_rt_frame(ksig, sigmask_to_save(), regs);
|
||||||
|
|
||||||
signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLESTEP));
|
signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLESTEP));
|
||||||
|
|
Loading…
Reference in New Issue
Block a user