openrisc: restore all regs on rt_sigreturn
authorJonas Bonn <jonas@southpole.se>
Mon, 23 Sep 2013 10:04:20 +0000 (12:04 +0200)
committerStafford Horne <shorne@gmail.com>
Mon, 12 Dec 2016 14:09:16 +0000 (23:09 +0900)
commitc79902190f7e61fcae7c3f4b613c75062f385678
tree984b7b693fc73b5ff99a56de14a9d215603af0b8
parentf47706099bdb8c0e6300d6f5ba8e542861aa3ac5
openrisc: restore all regs on rt_sigreturn

Fix signal handling for when signals are handled as the result of timers
or exceptions, previous code assumed syscalls. This was noticeable with X
crashing where it uses SIGALRM.

This patch restores all regs before returning to userspace via
_resume_userspace instead of via syscall return path.

The rt_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.

Reported-by: Sebastian Macke <sebastian@macke.de>
Signed-off-by: Jonas Bonn <jonas@southpole.se>
Tested-by: Guenter Roeck <linux@roeck-us.net>
[shorne@gmail.com: Updated comment better reflect change and issue]
Signed-off-by: Stafford Horne <shorne@gmail.com>
arch/openrisc/kernel/entry.S