Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

arm64: switch to generic sigaltstack

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

Al Viro 207bdae4 0aa0203f

+6 -80
+1
arch/arm64/Kconfig
··· 10 10 select GENERIC_IOMAP 11 11 select GENERIC_IRQ_PROBE 12 12 select GENERIC_IRQ_SHOW 13 + select GENERIC_SIGALTSTACK 13 14 select GENERIC_SMP_IDLE_THREAD 14 15 select GENERIC_TIME_VSYSCALL 15 16 select HARDIRQS_SW_RESEND
-2
arch/arm64/include/asm/syscalls.h
··· 24 24 * System call wrappers implemented in kernel/entry.S. 25 25 */ 26 26 asmlinkage long sys_rt_sigreturn_wrapper(void); 27 - asmlinkage long sys_sigaltstack_wrapper(const stack_t __user *uss, 28 - stack_t __user *uoss); 29 27 30 28 #include <asm-generic/syscalls.h> 31 29
+1 -1
arch/arm64/include/asm/unistd32.h
··· 207 207 __SYSCALL(183, sys_getcwd) 208 208 __SYSCALL(184, sys_capget) 209 209 __SYSCALL(185, sys_capset) 210 - __SYSCALL(186, compat_sys_sigaltstack_wrapper) 210 + __SYSCALL(186, compat_sys_sigaltstack) 211 211 __SYSCALL(187, compat_sys_sendfile) 212 212 __SYSCALL(188, sys_ni_syscall) /* 188 reserved */ 213 213 __SYSCALL(189, sys_ni_syscall) /* 189 reserved */
-5
arch/arm64/kernel/entry.S
··· 677 677 b sys_rt_sigreturn 678 678 ENDPROC(sys_rt_sigreturn_wrapper) 679 679 680 - ENTRY(sys_sigaltstack_wrapper) 681 - ldr x2, [sp, #S_SP] 682 - b sys_sigaltstack 683 - ENDPROC(sys_sigaltstack_wrapper) 684 - 685 680 ENTRY(handle_arch_irq) 686 681 .quad 0
+2 -15
arch/arm64/kernel/signal.c
··· 149 149 if (restore_sigframe(regs, frame)) 150 150 goto badframe; 151 151 152 - if (do_sigaltstack(&frame->uc.uc_stack, 153 - NULL, regs->sp) == -EFAULT) 152 + if (restore_altstack(&frame->uc.uc_stack)) 154 153 goto badframe; 155 154 156 155 return regs->regs[0]; ··· 161 162 regs->pc, regs->sp); 162 163 force_sig(SIGSEGV, current); 163 164 return 0; 164 - } 165 - 166 - asmlinkage long sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, 167 - unsigned long sp) 168 - { 169 - return do_sigaltstack(uss, uoss, sp); 170 165 } 171 166 172 167 static int setup_sigframe(struct rt_sigframe __user *sf, ··· 243 250 sigset_t *set, struct pt_regs *regs) 244 251 { 245 252 struct rt_sigframe __user *frame; 246 - stack_t stack; 247 253 int err = 0; 248 254 249 255 frame = get_sigframe(ka, regs); ··· 252 260 __put_user_error(0, &frame->uc.uc_flags, err); 253 261 __put_user_error(NULL, &frame->uc.uc_link, err); 254 262 255 - memset(&stack, 0, sizeof(stack)); 256 - stack.ss_sp = (void __user *)current->sas_ss_sp; 257 - stack.ss_flags = sas_ss_flags(regs->sp); 258 - stack.ss_size = current->sas_ss_size; 259 - err |= __copy_to_user(&frame->uc.uc_stack, &stack, sizeof(stack)); 260 - 263 + err |= __save_altstack(&frame->uc.uc_stack, regs->sp); 261 264 err |= setup_sigframe(frame, regs, set); 262 265 if (err == 0) { 263 266 setup_return(regs, ka, frame, usig);
+2 -51
arch/arm64/kernel/signal32.c
··· 42 42 compat_uptr_t sa_restorer; 43 43 }; 44 44 45 - typedef struct compat_sigaltstack { 46 - compat_uptr_t ss_sp; 47 - int ss_flags; 48 - compat_size_t ss_size; 49 - } compat_stack_t; 50 - 51 45 struct compat_sigcontext { 52 46 /* We always set these two fields to 0 */ 53 47 compat_ulong_t trap_no; ··· 417 423 return ret; 418 424 } 419 425 420 - int compat_do_sigaltstack(compat_uptr_t compat_uss, compat_uptr_t compat_uoss, 421 - compat_ulong_t sp) 422 - { 423 - compat_stack_t __user *newstack = compat_ptr(compat_uss); 424 - compat_stack_t __user *oldstack = compat_ptr(compat_uoss); 425 - compat_uptr_t ss_sp; 426 - int ret; 427 - mm_segment_t old_fs; 428 - stack_t uss, uoss; 429 - 430 - /* Marshall the compat new stack into a stack_t */ 431 - if (newstack) { 432 - if (get_user(ss_sp, &newstack->ss_sp) || 433 - __get_user(uss.ss_flags, &newstack->ss_flags) || 434 - __get_user(uss.ss_size, &newstack->ss_size)) 435 - return -EFAULT; 436 - uss.ss_sp = compat_ptr(ss_sp); 437 - } 438 - 439 - old_fs = get_fs(); 440 - set_fs(KERNEL_DS); 441 - /* The __user pointer casts are valid because of the set_fs() */ 442 - ret = do_sigaltstack( 443 - newstack ? (stack_t __user *) &uss : NULL, 444 - oldstack ? (stack_t __user *) &uoss : NULL, 445 - (unsigned long)sp); 446 - set_fs(old_fs); 447 - 448 - /* Convert the old stack_t into a compat stack. */ 449 - if (!ret && oldstack && 450 - (put_user(ptr_to_compat(uoss.ss_sp), &oldstack->ss_sp) || 451 - __put_user(uoss.ss_flags, &oldstack->ss_flags) || 452 - __put_user(uoss.ss_size, &oldstack->ss_size))) 453 - return -EFAULT; 454 - return ret; 455 - } 456 - 457 426 static int compat_restore_sigframe(struct pt_regs *regs, 458 427 struct compat_sigframe __user *sf) 459 428 { ··· 519 562 if (compat_restore_sigframe(regs, &frame->sig)) 520 563 goto badframe; 521 564 522 - if (compat_do_sigaltstack(ptr_to_compat(&frame->sig.uc.uc_stack), 523 - ptr_to_compat((void __user *)NULL), 524 - regs->compat_sp) == -EFAULT) 565 + if (compat_restore_altstack(&frame->sig.uc.uc_stack)) 525 566 goto badframe; 526 567 527 568 return regs->regs[0]; ··· 660 705 __put_user_error(0, &frame->sig.uc.uc_flags, err); 661 706 __put_user_error(NULL, &frame->sig.uc.uc_link, err); 662 707 663 - memset(&stack, 0, sizeof(stack)); 664 - stack.ss_sp = (compat_uptr_t)current->sas_ss_sp; 665 - stack.ss_flags = sas_ss_flags(regs->compat_sp); 666 - stack.ss_size = current->sas_ss_size; 667 - err |= __copy_to_user(&frame->sig.uc.uc_stack, &stack, sizeof(stack)); 708 + err |= __compat_save_altstack(&frame->sig.uc.uc_stack, regs->compat_sp); 668 709 669 710 err |= compat_setup_sigframe(&frame->sig, regs, set); 670 711
-1
arch/arm64/kernel/sys.c
··· 40 40 * Wrappers to pass the pt_regs argument. 41 41 */ 42 42 #define sys_rt_sigreturn sys_rt_sigreturn_wrapper 43 - #define sys_sigaltstack sys_sigaltstack_wrapper 44 43 45 44 #include <asm/syscalls.h> 46 45
-5
arch/arm64/kernel/sys32.S
··· 39 39 b compat_sys_rt_sigreturn 40 40 ENDPROC(compat_sys_rt_sigreturn_wrapper) 41 41 42 - compat_sys_sigaltstack_wrapper: 43 - ldr x2, [sp, #S_COMPAT_SP] 44 - b compat_do_sigaltstack 45 - ENDPROC(compat_sys_sigaltstack_wrapper) 46 - 47 42 compat_sys_statfs64_wrapper: 48 43 mov w3, #84 49 44 cmp w1, #88