diff options
author | Vineet Gupta <vgupta@synopsys.com> | 2013-01-18 15:12:19 +0530 |
---|---|---|
committer | Vineet Gupta <vgupta@synopsys.com> | 2013-02-15 23:03:30 +0530 |
commit | c3581039b6c51a778a70accec53a9bb7ad9a4d32 (patch) | |
tree | 6816e82f1a59fe3d4fbf8c291d3f52598531c50c /arch/arc/kernel/entry.S | |
parent | d8005e6b95268cbb50db3773d5f180c32a9434fe (diff) | |
download | linux-c3581039b6c51a778a70accec53a9bb7ad9a4d32.tar.gz linux-c3581039b6c51a778a70accec53a9bb7ad9a4d32.tar.bz2 linux-c3581039b6c51a778a70accec53a9bb7ad9a4d32.zip |
ARC: Signal handling
Includes following fixes courtesy review by Al-Viro
* Tracer poke to Callee-regs were lost
Before going off into do_signal( ) we save the user-mode callee regs
(as they are not saved by default as part of pt_regs). This is to make
sure that that a Tracer (if tracing related signal) is able to do likes
of PEEKUSR(callee-reg).
However in return path we were simply discarding the user-mode callee
regs, which would break a POKEUSR(callee-reg) from a tracer.
* Issue related to multiple syscall restarts are addressed in next patch
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
Cc: Al Viro <viro@ZenIV.linux.org.uk>
Acked-by: Jonas Bonn <jonas@southpole.se>
Diffstat (limited to 'arch/arc/kernel/entry.S')
-rw-r--r-- | arch/arc/kernel/entry.S | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/arch/arc/kernel/entry.S b/arch/arc/kernel/entry.S index ed08ac14fbc4..d625b77c14bd 100644 --- a/arch/arc/kernel/entry.S +++ b/arch/arc/kernel/entry.S @@ -470,7 +470,11 @@ resume_user_mode_begin: bbit0 r9, TIF_SIGPENDING, .Lchk_notify_resume - ; save CALLEE Regs. + ; Normal Trap/IRQ entry only saves Scratch (caller-saved) regs + ; in pt_reg since the "C" ABI (kernel code) will automatically + ; save/restore callee-saved regs. + ; + ; However, here we need to explicitly save callee regs because ; (i) If this signal causes coredump - full regfile needed ; (ii) If signal is SIGTRAP/SIGSTOP, task is being traced thus ; tracer might call PEEKUSR(CALLEE reg) @@ -484,8 +488,9 @@ resume_user_mode_begin: bl @do_signal - ; unwind SP for cheap discard of Callee saved Regs - DISCARD_CALLEE_SAVED_USER + ; Ideally we want to discard the Callee reg above, however if this was + ; a tracing signal, tracer could have done a POKEUSR(CALLEE reg) + RESTORE_CALLEE_SAVED_USER b resume_user_mode_begin ; loop back to start of U mode ret |