diff options
| -rw-r--r-- | arch/arm64/Kconfig | 1 | ||||
| -rw-r--r-- | arch/arm64/include/asm/syscalls.h | 2 | ||||
| -rw-r--r-- | arch/arm64/include/asm/unistd32.h | 2 | ||||
| -rw-r--r-- | arch/arm64/kernel/entry.S | 5 | ||||
| -rw-r--r-- | arch/arm64/kernel/signal.c | 17 | ||||
| -rw-r--r-- | arch/arm64/kernel/signal32.c | 53 | ||||
| -rw-r--r-- | arch/arm64/kernel/sys.c | 1 | ||||
| -rw-r--r-- | arch/arm64/kernel/sys32.S | 5 | 
8 files changed, 6 insertions, 80 deletions
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index f8f362aafee..d9c901dd3fd 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -10,6 +10,7 @@ config ARM64  	select GENERIC_IOMAP  	select GENERIC_IRQ_PROBE  	select GENERIC_IRQ_SHOW +	select GENERIC_SIGALTSTACK  	select GENERIC_SMP_IDLE_THREAD  	select GENERIC_TIME_VSYSCALL  	select HARDIRQS_SW_RESEND diff --git a/arch/arm64/include/asm/syscalls.h b/arch/arm64/include/asm/syscalls.h index 20d63b29066..48fe7c600e9 100644 --- a/arch/arm64/include/asm/syscalls.h +++ b/arch/arm64/include/asm/syscalls.h @@ -24,8 +24,6 @@   * System call wrappers implemented in kernel/entry.S.   */  asmlinkage long sys_rt_sigreturn_wrapper(void); -asmlinkage long sys_sigaltstack_wrapper(const stack_t __user *uss, -					stack_t __user *uoss);  #include <asm-generic/syscalls.h> diff --git a/arch/arm64/include/asm/unistd32.h b/arch/arm64/include/asm/unistd32.h index 5ef47ba3ed4..008406aff09 100644 --- a/arch/arm64/include/asm/unistd32.h +++ b/arch/arm64/include/asm/unistd32.h @@ -207,7 +207,7 @@ __SYSCALL(182, sys_chown16)  __SYSCALL(183, sys_getcwd)  __SYSCALL(184, sys_capget)  __SYSCALL(185, sys_capset) -__SYSCALL(186, compat_sys_sigaltstack_wrapper) +__SYSCALL(186, compat_sys_sigaltstack)  __SYSCALL(187, compat_sys_sendfile)  __SYSCALL(188, sys_ni_syscall)			/* 188 reserved */  __SYSCALL(189, sys_ni_syscall)			/* 189 reserved */ diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index 9c94f404ded..514d6098dbe 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -677,10 +677,5 @@ ENTRY(sys_rt_sigreturn_wrapper)  	b	sys_rt_sigreturn  ENDPROC(sys_rt_sigreturn_wrapper) -ENTRY(sys_sigaltstack_wrapper) -	ldr	x2, [sp, #S_SP] -	b	sys_sigaltstack -ENDPROC(sys_sigaltstack_wrapper) -  ENTRY(handle_arch_irq)  	.quad	0 diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c index abd756315cb..890a591f75d 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -149,8 +149,7 @@ asmlinkage long sys_rt_sigreturn(struct pt_regs *regs)  	if (restore_sigframe(regs, frame))  		goto badframe; -	if (do_sigaltstack(&frame->uc.uc_stack, -			   NULL, regs->sp) == -EFAULT) +	if (restore_altstack(&frame->uc.uc_stack))  		goto badframe;  	return regs->regs[0]; @@ -164,12 +163,6 @@ badframe:  	return 0;  } -asmlinkage long sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, -				unsigned long sp) -{ -	return do_sigaltstack(uss, uoss, sp); -} -  static int setup_sigframe(struct rt_sigframe __user *sf,  			  struct pt_regs *regs, sigset_t *set)  { @@ -250,7 +243,6 @@ static int setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,  			  sigset_t *set, struct pt_regs *regs)  {  	struct rt_sigframe __user *frame; -	stack_t stack;  	int err = 0;  	frame = get_sigframe(ka, regs); @@ -260,12 +252,7 @@ static int setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,  	__put_user_error(0, &frame->uc.uc_flags, err);  	__put_user_error(NULL, &frame->uc.uc_link, err); -	memset(&stack, 0, sizeof(stack)); -	stack.ss_sp = (void __user *)current->sas_ss_sp; -	stack.ss_flags = sas_ss_flags(regs->sp); -	stack.ss_size = current->sas_ss_size; -	err |= __copy_to_user(&frame->uc.uc_stack, &stack, sizeof(stack)); - +	err |= __save_altstack(&frame->uc.uc_stack, regs->sp);  	err |= setup_sigframe(frame, regs, set);  	if (err == 0) {  		setup_return(regs, ka, frame, usig); diff --git a/arch/arm64/kernel/signal32.c b/arch/arm64/kernel/signal32.c index a4db3d22aac..54920c5342b 100644 --- a/arch/arm64/kernel/signal32.c +++ b/arch/arm64/kernel/signal32.c @@ -42,12 +42,6 @@ struct compat_old_sigaction {  	compat_uptr_t			sa_restorer;  }; -typedef struct compat_sigaltstack { -	compat_uptr_t			ss_sp; -	int				ss_flags; -	compat_size_t			ss_size; -} compat_stack_t; -  struct compat_sigcontext {  	/* We always set these two fields to 0 */  	compat_ulong_t			trap_no; @@ -423,43 +417,6 @@ asmlinkage int compat_sys_rt_sigaction(int sig,  	return ret;  } -int compat_do_sigaltstack(compat_uptr_t compat_uss, compat_uptr_t compat_uoss, -			  compat_ulong_t sp) -{ -	compat_stack_t __user *newstack = compat_ptr(compat_uss); -	compat_stack_t __user *oldstack = compat_ptr(compat_uoss); -	compat_uptr_t ss_sp; -	int ret; -	mm_segment_t old_fs; -	stack_t uss, uoss; - -	/* Marshall the compat new stack into a stack_t */ -	if (newstack) { -		if (get_user(ss_sp, &newstack->ss_sp) || -		    __get_user(uss.ss_flags, &newstack->ss_flags) || -		    __get_user(uss.ss_size, &newstack->ss_size)) -			return -EFAULT; -		uss.ss_sp = compat_ptr(ss_sp); -	} - -	old_fs = get_fs(); -	set_fs(KERNEL_DS); -	/* The __user pointer casts are valid because of the set_fs() */ -	ret = do_sigaltstack( -		newstack ? (stack_t __user *) &uss : NULL, -		oldstack ? (stack_t __user *) &uoss : NULL, -		(unsigned long)sp); -	set_fs(old_fs); - -	/* Convert the old stack_t into a compat stack. */ -	if (!ret && oldstack && -		(put_user(ptr_to_compat(uoss.ss_sp), &oldstack->ss_sp) || -		 __put_user(uoss.ss_flags, &oldstack->ss_flags) || -		 __put_user(uoss.ss_size, &oldstack->ss_size))) -		return -EFAULT; -	return ret; -} -  static int compat_restore_sigframe(struct pt_regs *regs,  				   struct compat_sigframe __user *sf)  { @@ -562,9 +519,7 @@ asmlinkage int compat_sys_rt_sigreturn(struct pt_regs *regs)  	if (compat_restore_sigframe(regs, &frame->sig))  		goto badframe; -	if (compat_do_sigaltstack(ptr_to_compat(&frame->sig.uc.uc_stack), -				 ptr_to_compat((void __user *)NULL), -				 regs->compat_sp) == -EFAULT) +	if (compat_restore_altstack(&frame->sig.uc.uc_stack))  		goto badframe;  	return regs->regs[0]; @@ -705,11 +660,7 @@ int compat_setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,  	__put_user_error(0, &frame->sig.uc.uc_flags, err);  	__put_user_error(NULL, &frame->sig.uc.uc_link, err); -	memset(&stack, 0, sizeof(stack)); -	stack.ss_sp = (compat_uptr_t)current->sas_ss_sp; -	stack.ss_flags = sas_ss_flags(regs->compat_sp); -	stack.ss_size = current->sas_ss_size; -	err |= __copy_to_user(&frame->sig.uc.uc_stack, &stack, sizeof(stack)); +	err |= __compat_save_altstack(&frame->sig.uc.uc_stack, regs->compat_sp);  	err |= compat_setup_sigframe(&frame->sig, regs, set); diff --git a/arch/arm64/kernel/sys.c b/arch/arm64/kernel/sys.c index 8292a9b090f..3fa98ff14f0 100644 --- a/arch/arm64/kernel/sys.c +++ b/arch/arm64/kernel/sys.c @@ -40,7 +40,6 @@ asmlinkage long sys_mmap(unsigned long addr, unsigned long len,   * Wrappers to pass the pt_regs argument.   */  #define sys_rt_sigreturn	sys_rt_sigreturn_wrapper -#define sys_sigaltstack		sys_sigaltstack_wrapper  #include <asm/syscalls.h> diff --git a/arch/arm64/kernel/sys32.S b/arch/arm64/kernel/sys32.S index 7ef59e9245e..6abb0572161 100644 --- a/arch/arm64/kernel/sys32.S +++ b/arch/arm64/kernel/sys32.S @@ -39,11 +39,6 @@ compat_sys_rt_sigreturn_wrapper:  	b	compat_sys_rt_sigreturn  ENDPROC(compat_sys_rt_sigreturn_wrapper) -compat_sys_sigaltstack_wrapper: -	ldr	x2, [sp, #S_COMPAT_SP] -	b	compat_do_sigaltstack -ENDPROC(compat_sys_sigaltstack_wrapper) -  compat_sys_statfs64_wrapper:  	mov	w3, #84  	cmp	w1, #88  |