Commit 99b06feb0f7c99f171cb962d0e6a17f81625abd3

Authored by Al Viro
1 parent 0aa0203fb4

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

... ... @@ -42,6 +42,7 @@
42 42 select GENERIC_STRNLEN_USER
43 43 select MODULES_USE_ELF_RELA
44 44 select ODD_RT_SIGACTION
  45 + select GENERIC_SIGALTSTACK
45 46  
46 47 config SPARC32
47 48 def_bool !64BIT
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