Messages in this thread | | | Subject | Re: [PATCH 3/7] openrisc: restore call-saved regs on sigreturn | From | Jonas Bonn <> | Date | Mon, 19 Sep 2016 16:28:30 +0200 |
| |
On 09/16/2016 04:43 PM, Stafford Horne wrote: > From: Jonas Bonn <jonas@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.
This whole patch was reworked later... what happened to that work? I recall it being posted for testing without feedback...
In any case, the patch comment needs cleaning up.
/Jonas
> > 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 <sebastian@macke.de> > Signed-off-by: Jonas Bonn <jonas@southpole.se> > Signed-off-by: Stafford Horne <shorne@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
| |