summaryrefslogtreecommitdiffstats
path: root/arch/arc/kernel/entry.S
diff options
context:
space:
mode:
authorVineet Gupta <vgupta@synopsys.com>2013-01-18 15:12:19 +0530
committerVineet Gupta <vgupta@synopsys.com>2013-02-15 23:03:30 +0530
commitc3581039b6c51a778a70accec53a9bb7ad9a4d32 (patch)
tree6816e82f1a59fe3d4fbf8c291d3f52598531c50c /arch/arc/kernel/entry.S
parentd8005e6b95268cbb50db3773d5f180c32a9434fe (diff)
downloadlinux-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.S11
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