diff options
Diffstat (limited to 'arch/powerpc/kernel/signal.c')
-rw-r--r-- | arch/powerpc/kernel/signal.c | 41 |
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 | */ |
34 | void __user * get_sigframe(struct k_sigaction *ka, unsigned long sp, | 34 | void __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 | ||
108 | static int do_signal(struct pt_regs *regs) | 102 | static 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 | ||
162 | void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags) | 147 | void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags) |