From: Jonas Bonn <jo...@southpole.se>

Return to userspace via _resume_userspace instead of via syscall return
path for the rt_sigreturn syscall.

I'll rework this comment more later, but this patch needs testing.

Old comment from previous patch:

The sigreturn syscall is more like a context switch than a function call;
it entails a return from one context (the signal handler) to another
(the process in question).  For a context switch like this there are
effectively no call-saved regs that remain constant across the transition.

This patch restores the call-saved regs from pt_regs before returning from
the syscall, effectively restoring the context that the process had before
being interrupted by the signal handler.  Restoring the call-saved regs
in this way allows us to return to userspace via the usual syscall fast
path.

Reported-by: Sebastian Macke <sebast...@macke.de>
Signed-off-by: Jonas Bonn <jo...@southpole.se>
Signed-off-by: Stafford Horne <sho...@gmail.com>
---
 arch/openrisc/kernel/entry.S | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/arch/openrisc/kernel/entry.S b/arch/openrisc/kernel/entry.S
index fec8bf9..572d223 100644
--- a/arch/openrisc/kernel/entry.S
+++ b/arch/openrisc/kernel/entry.S
@@ -1101,8 +1101,16 @@ ENTRY(__sys_fork)
         l.addi r3,r1,0
 
 ENTRY(sys_rt_sigreturn)
-       l.j     _sys_rt_sigreturn
+       l.jal   _sys_rt_sigreturn
         l.addi r3,r1,0
+       l.sfne  r30,r0
+       l.bnf   _no_syscall_trace
+        l.nop
+       l.jal   do_syscall_trace_leave
+        l.addi r3,r1,0
+_no_syscall_trace:
+       l.j     _resume_userspace
+        l.nop
 
 /* This is a catch-all syscall for atomic instructions for the OpenRISC 1000.
  * The functions takes a variable number of parameters depending on which
-- 
2.7.4

Reply via email to