aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/signal.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/kernel/signal.c')
-rw-r--r--arch/powerpc/kernel/signal.c41
1 files changed, 13 insertions, 28 deletions
diff --git a/arch/powerpc/kernel/signal.c b/arch/powerpc/kernel/signal.c
index 1c794cef2883..cf8c7e4e0b21 100644
--- a/arch/powerpc/kernel/signal.c
+++ b/arch/powerpc/kernel/signal.c
@@ -31,20 +31,14 @@ int show_unhandled_signals = 1;
31/* 31/*
32 * Allocate space for the signal frame 32 * Allocate space for the signal frame
33 */ 33 */
34void __user * get_sigframe(struct k_sigaction *ka, unsigned long sp, 34void __user *get_sigframe(struct ksignal *ksig, unsigned long sp,
35 size_t frame_size, int is_32) 35 size_t frame_size, int is_32)
36{ 36{
37 unsigned long oldsp, newsp; 37 unsigned long oldsp, newsp;
38 38
39 /* Default to using normal stack */ 39 /* Default to using normal stack */
40 oldsp = get_clean_sp(sp, is_32); 40 oldsp = get_clean_sp(sp, is_32);
41 41 oldsp = sigsp(oldsp, ksig);
42 /* Check for alt stack */
43 if ((ka->sa.sa_flags & SA_ONSTACK) &&
44 current->sas_ss_size && !on_sig_stack(oldsp))
45 oldsp = (current->sas_ss_sp + current->sas_ss_size);
46
47 /* Get aligned frame */
48 newsp = (oldsp - frame_size) & ~0xFUL; 42 newsp = (oldsp - frame_size) & ~0xFUL;
49 43
50 /* Check access */ 44 /* Check access */
@@ -105,25 +99,23 @@ static void check_syscall_restart(struct pt_regs *regs, struct k_sigaction *ka,
105 } 99 }
106} 100}
107 101
108static int do_signal(struct pt_regs *regs) 102static void do_signal(struct pt_regs *regs)
109{ 103{
110 sigset_t *oldset = sigmask_to_save(); 104 sigset_t *oldset = sigmask_to_save();
111 siginfo_t info; 105 struct ksignal ksig;
112 int signr;
113 struct k_sigaction ka;
114 int ret; 106 int ret;
115 int is32 = is_32bit_task(); 107 int is32 = is_32bit_task();
116 108
117 signr = get_signal_to_deliver(&info, &ka, regs, NULL); 109 get_signal(&ksig);
118 110
119 /* Is there any syscall restart business here ? */ 111 /* Is there any syscall restart business here ? */
120 check_syscall_restart(regs, &ka, signr > 0); 112 check_syscall_restart(regs, &ksig.ka, ksig.sig > 0);
121 113
122 if (signr <= 0) { 114 if (ksig.sig <= 0) {
123 /* No signal to deliver -- put the saved sigmask back */ 115 /* No signal to deliver -- put the saved sigmask back */
124 restore_saved_sigmask(); 116 restore_saved_sigmask();
125 regs->trap = 0; 117 regs->trap = 0;
126 return 0; /* no signals delivered */ 118 return; /* no signals delivered */
127 } 119 }
128 120
129#ifndef CONFIG_PPC_ADV_DEBUG_REGS 121#ifndef CONFIG_PPC_ADV_DEBUG_REGS
@@ -140,23 +132,16 @@ static int do_signal(struct pt_regs *regs)
140 thread_change_pc(current, regs); 132 thread_change_pc(current, regs);
141 133
142 if (is32) { 134 if (is32) {
143 if (ka.sa.sa_flags & SA_SIGINFO) 135 if (ksig.ka.sa.sa_flags & SA_SIGINFO)
144 ret = handle_rt_signal32(signr, &ka, &info, oldset, 136 ret = handle_rt_signal32(&ksig, oldset, regs);
145 regs);
146 else 137 else
147 ret = handle_signal32(signr, &ka, &info, oldset, 138 ret = handle_signal32(&ksig, oldset, regs);
148 regs);
149 } else { 139 } else {
150 ret = handle_rt_signal64(signr, &ka, &info, oldset, regs); 140 ret = handle_rt_signal64(&ksig, oldset, regs);
151 } 141 }
152 142
153 regs->trap = 0; 143 regs->trap = 0;
154 if (ret) { 144 signal_setup_done(ret, &ksig, test_thread_flag(TIF_SINGLESTEP));
155 signal_delivered(signr, &info, &ka, regs,
156 test_thread_flag(TIF_SINGLESTEP));
157 }
158
159 return ret;
160} 145}
161 146
162void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags) 147void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags)