Commit 99b06feb0f7c99f171cb962d0e6a17f81625abd3
1 parent
0aa0203fb4
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
sparc: switch to generic sigaltstack
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Showing 8 changed files with 11 additions and 84 deletions Side-by-side Diff
arch/sparc/Kconfig
arch/sparc/include/asm/compat_signal.h
... | ... | @@ -18,12 +18,6 @@ |
18 | 18 | unsigned int sa_flags; |
19 | 19 | unsigned sa_restorer; /* not used by Linux/SPARC yet */ |
20 | 20 | }; |
21 | - | |
22 | -typedef struct sigaltstack32 { | |
23 | - u32 ss_sp; | |
24 | - int ss_flags; | |
25 | - compat_size_t ss_size; | |
26 | -} stack_t32; | |
27 | 21 | #endif |
28 | 22 | |
29 | 23 | #endif /* !(_COMPAT_SIGNAL_H) */ |
arch/sparc/kernel/entry.S
... | ... | @@ -820,14 +820,6 @@ |
820 | 820 | mov %l5, %o7 |
821 | 821 | |
822 | 822 | .align 4 |
823 | - .globl sys_sigaltstack | |
824 | -sys_sigaltstack: | |
825 | - mov %o7, %l5 | |
826 | - mov %fp, %o2 | |
827 | - call do_sigaltstack | |
828 | - mov %l5, %o7 | |
829 | - | |
830 | - .align 4 | |
831 | 823 | .globl sys_sigstack |
832 | 824 | sys_sigstack: |
833 | 825 | mov %o7, %l5 |
arch/sparc/kernel/signal32.c
... | ... | @@ -61,7 +61,7 @@ |
61 | 61 | compat_sigset_t mask; |
62 | 62 | /* __siginfo_fpu_t * */ u32 fpu_save; |
63 | 63 | unsigned int insns[2]; |
64 | - stack_t32 stack; | |
64 | + compat_stack_t stack; | |
65 | 65 | unsigned int extra_size; /* Should be sizeof(siginfo_extra_v8plus_t) */ |
66 | 66 | /* Only valid if (regs.psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS */ |
67 | 67 | siginfo_extra_v8plus_t v8plus; |
68 | 68 | |
69 | 69 | |
... | ... | @@ -230,13 +230,11 @@ |
230 | 230 | asmlinkage void do_rt_sigreturn32(struct pt_regs *regs) |
231 | 231 | { |
232 | 232 | struct rt_signal_frame32 __user *sf; |
233 | - unsigned int psr, pc, npc, u_ss_sp; | |
233 | + unsigned int psr, pc, npc; | |
234 | 234 | compat_uptr_t fpu_save; |
235 | 235 | compat_uptr_t rwin_save; |
236 | - mm_segment_t old_fs; | |
237 | 236 | sigset_t set; |
238 | 237 | compat_sigset_t seta; |
239 | - stack_t st; | |
240 | 238 | int err, i; |
241 | 239 | |
242 | 240 | /* Always make any pending restarted system calls return -EINTR */ |
243 | 241 | |
... | ... | @@ -295,20 +293,10 @@ |
295 | 293 | if (!err && fpu_save) |
296 | 294 | err |= restore_fpu_state(regs, compat_ptr(fpu_save)); |
297 | 295 | err |= copy_from_user(&seta, &sf->mask, sizeof(compat_sigset_t)); |
298 | - err |= __get_user(u_ss_sp, &sf->stack.ss_sp); | |
299 | - st.ss_sp = compat_ptr(u_ss_sp); | |
300 | - err |= __get_user(st.ss_flags, &sf->stack.ss_flags); | |
301 | - err |= __get_user(st.ss_size, &sf->stack.ss_size); | |
296 | + err |= compat_restore_altstack(&sf->stack); | |
302 | 297 | if (err) |
303 | 298 | goto segv; |
304 | 299 | |
305 | - /* It is more difficult to avoid calling this function than to | |
306 | - call it and ignore errors. */ | |
307 | - old_fs = get_fs(); | |
308 | - set_fs(KERNEL_DS); | |
309 | - do_sigaltstack((stack_t __user *) &st, NULL, (unsigned long)sf); | |
310 | - set_fs(old_fs); | |
311 | - | |
312 | 300 | err |= __get_user(rwin_save, &sf->rwin_save); |
313 | 301 | if (!err && rwin_save) { |
314 | 302 | if (restore_rwin_state(compat_ptr(rwin_save))) |
... | ... | @@ -642,9 +630,7 @@ |
642 | 630 | err |= copy_siginfo_to_user32(&sf->info, info); |
643 | 631 | |
644 | 632 | /* Setup sigaltstack */ |
645 | - err |= __put_user(current->sas_ss_sp, &sf->stack.ss_sp); | |
646 | - err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &sf->stack.ss_flags); | |
647 | - err |= __put_user(current->sas_ss_size, &sf->stack.ss_size); | |
633 | + err |= __compat_save_altstack(&sf->stack, regs->u_regs[UREG_FP]); | |
648 | 634 | |
649 | 635 | switch (_NSIG_WORDS) { |
650 | 636 | case 4: seta.sig[7] = (oldset->sig[3] >> 32); |
... | ... | @@ -854,32 +840,6 @@ |
854 | 840 | |
855 | 841 | ret = 0; |
856 | 842 | out: |
857 | - return ret; | |
858 | -} | |
859 | - | |
860 | -asmlinkage long do_sys32_sigaltstack(u32 ussa, u32 uossa, unsigned long sp) | |
861 | -{ | |
862 | - stack_t uss, uoss; | |
863 | - u32 u_ss_sp = 0; | |
864 | - int ret; | |
865 | - mm_segment_t old_fs; | |
866 | - stack_t32 __user *uss32 = compat_ptr(ussa); | |
867 | - stack_t32 __user *uoss32 = compat_ptr(uossa); | |
868 | - | |
869 | - if (ussa && (get_user(u_ss_sp, &uss32->ss_sp) || | |
870 | - __get_user(uss.ss_flags, &uss32->ss_flags) || | |
871 | - __get_user(uss.ss_size, &uss32->ss_size))) | |
872 | - return -EFAULT; | |
873 | - uss.ss_sp = compat_ptr(u_ss_sp); | |
874 | - old_fs = get_fs(); | |
875 | - set_fs(KERNEL_DS); | |
876 | - ret = do_sigaltstack(ussa ? (stack_t __user *) &uss : NULL, | |
877 | - uossa ? (stack_t __user *) &uoss : NULL, sp); | |
878 | - set_fs(old_fs); | |
879 | - if (!ret && uossa && (put_user(ptr_to_compat(uoss.ss_sp), &uoss32->ss_sp) || | |
880 | - __put_user(uoss.ss_flags, &uoss32->ss_flags) || | |
881 | - __put_user(uoss.ss_size, &uoss32->ss_size))) | |
882 | - return -EFAULT; | |
883 | 843 | return ret; |
884 | 844 | } |
arch/sparc/kernel/signal_32.c
... | ... | @@ -141,9 +141,7 @@ |
141 | 141 | unsigned int psr, pc, npc; |
142 | 142 | __siginfo_fpu_t __user *fpu_save; |
143 | 143 | __siginfo_rwin_t __user *rwin_save; |
144 | - mm_segment_t old_fs; | |
145 | 144 | sigset_t set; |
146 | - stack_t st; | |
147 | 145 | int err; |
148 | 146 | |
149 | 147 | synchronize_user_stack(); |
150 | 148 | |
151 | 149 | |
... | ... | @@ -171,23 +169,14 @@ |
171 | 169 | if (!err && fpu_save) |
172 | 170 | err |= restore_fpu_state(regs, fpu_save); |
173 | 171 | err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t)); |
172 | + err |= restore_altstack(&sf->stack); | |
174 | 173 | |
175 | - err |= __copy_from_user(&st, &sf->stack, sizeof(stack_t)); | |
176 | - | |
177 | 174 | if (err) |
178 | 175 | goto segv; |
179 | 176 | |
180 | 177 | regs->pc = pc; |
181 | 178 | regs->npc = npc; |
182 | 179 | |
183 | - /* It is more difficult to avoid calling this function than to | |
184 | - * call it and ignore errors. | |
185 | - */ | |
186 | - old_fs = get_fs(); | |
187 | - set_fs(KERNEL_DS); | |
188 | - do_sigaltstack((const stack_t __user *) &st, NULL, (unsigned long)sf); | |
189 | - set_fs(old_fs); | |
190 | - | |
191 | 180 | err |= __get_user(rwin_save, &sf->rwin_save); |
192 | 181 | if (!err && rwin_save) { |
193 | 182 | if (restore_rwin_state(rwin_save)) |
... | ... | @@ -391,9 +380,7 @@ |
391 | 380 | err |= __copy_to_user(&sf->mask, &oldset->sig[0], sizeof(sigset_t)); |
392 | 381 | |
393 | 382 | /* Setup sigaltstack */ |
394 | - err |= __put_user(current->sas_ss_sp, &sf->stack.ss_sp); | |
395 | - err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &sf->stack.ss_flags); | |
396 | - err |= __put_user(current->sas_ss_size, &sf->stack.ss_size); | |
383 | + err |= __save_altstack(&sf->stack, regs->u_regs[UREG_FP]); | |
397 | 384 | |
398 | 385 | if (!wsaved) { |
399 | 386 | err |= __copy_to_user(sf, (char *) regs->u_regs[UREG_FP], |
arch/sparc/kernel/signal_64.c
... | ... | @@ -295,7 +295,8 @@ |
295 | 295 | err |= restore_fpu_state(regs, fpu_save); |
296 | 296 | |
297 | 297 | err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t)); |
298 | - if (err || do_sigaltstack(&sf->stack, NULL, (unsigned long)sf) == -EFAULT) | |
298 | + err |= restore_altstack(&sf->stack); | |
299 | + if (err) | |
299 | 300 | goto segv; |
300 | 301 | |
301 | 302 | err |= __get_user(rwin_save, &sf->rwin_save); |
... | ... | @@ -403,9 +404,7 @@ |
403 | 404 | } |
404 | 405 | |
405 | 406 | /* Setup sigaltstack */ |
406 | - err |= __put_user(current->sas_ss_sp, &sf->stack.ss_sp); | |
407 | - err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &sf->stack.ss_flags); | |
408 | - err |= __put_user(current->sas_ss_size, &sf->stack.ss_size); | |
407 | + err |= __save_altstack(&sf->stack, regs->u_regs[UREG_FP]); | |
409 | 408 | |
410 | 409 | err |= copy_to_user(&sf->mask, oldset, sizeof(sigset_t)); |
411 | 410 |
arch/sparc/kernel/syscalls.S
... | ... | @@ -25,15 +25,9 @@ |
25 | 25 | sys_memory_ordering: |
26 | 26 | ba,pt %xcc, sparc_memory_ordering |
27 | 27 | add %sp, PTREGS_OFF, %o1 |
28 | -sys_sigaltstack: | |
29 | - ba,pt %xcc, do_sigaltstack | |
30 | - add %i6, STACK_BIAS, %o2 | |
31 | 28 | #ifdef CONFIG_COMPAT |
32 | 29 | sys32_sigstack: |
33 | 30 | ba,pt %xcc, do_sys32_sigstack |
34 | - mov %i6, %o2 | |
35 | -sys32_sigaltstack: | |
36 | - ba,pt %xcc, do_sys32_sigaltstack | |
37 | 31 | mov %i6, %o2 |
38 | 32 | #endif |
39 | 33 | .align 32 |
arch/sparc/kernel/systbls_64.S
... | ... | @@ -23,7 +23,7 @@ |
23 | 23 | /*10*/ .word sys_unlink, sunos_execv, sys_chdir, sys_chown16, sys32_mknod |
24 | 24 | /*15*/ .word sys_chmod, sys_lchown16, sys_brk, sys_nis_syscall, sys32_lseek |
25 | 25 | /*20*/ .word sys_getpid, sys_capget, sys_capset, sys_setuid16, sys_getuid16 |
26 | -/*25*/ .word sys32_vmsplice, compat_sys_ptrace, sys_alarm, sys32_sigaltstack, sys_pause | |
26 | +/*25*/ .word sys32_vmsplice, compat_sys_ptrace, sys_alarm, compat_sys_sigaltstack, sys_pause | |
27 | 27 | /*30*/ .word compat_sys_utime, sys_lchown, sys_fchown, sys32_access, sys32_nice |
28 | 28 | .word sys_chown, sys_sync, sys32_kill, compat_sys_newstat, sys32_sendfile |
29 | 29 | /*40*/ .word compat_sys_newlstat, sys_dup, sys_sparc_pipe, compat_sys_times, sys_getuid |