diff options
| author | Al Viro <viro@zeniv.linux.org.uk> | 2012-12-25 19:18:40 -0500 | 
|---|---|---|
| committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-02-03 22:43:35 -0500 | 
| commit | a274bd498ce4b57294034d428b801b2bca3af774 (patch) | |
| tree | 18ec27dca96e7a38f0bc0db67012d8954ae487fc /arch | |
| parent | bdc40abf070eab82d27de99ef5ff62a1c5de238d (diff) | |
| download | linux-a274bd498ce4b57294034d428b801b2bca3af774.tar.bz2 | |
sparc: switch to use of generic old sigaction
note that due to historical accident we do *not* directly take
generic versions - need to check and invert the sign of signal
number first.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/sparc/Kconfig | 2 | ||||
| -rw-r--r-- | arch/sparc/include/uapi/asm/signal.h | 2 | ||||
| -rw-r--r-- | arch/sparc/kernel/sys32.S | 2 | ||||
| -rw-r--r-- | arch/sparc/kernel/sys_sparc32.c | 37 | ||||
| -rw-r--r-- | arch/sparc/kernel/sys_sparc_32.c | 37 | ||||
| -rw-r--r-- | arch/sparc/kernel/systbls_32.S | 2 | 
6 files changed, 13 insertions, 69 deletions
| diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index 9d2c395440df..1a8ef82b3475 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig @@ -53,6 +53,7 @@ config SPARC32  	select GENERIC_ATOMIC64  	select CLZ_TAB  	select HAVE_UID16 +	select OLD_SIGACTION  config SPARC64  	def_bool 64BIT @@ -549,6 +550,7 @@ config COMPAT  	select COMPAT_BINFMT_ELF  	select HAVE_UID16  	select ARCH_WANT_OLD_COMPAT_IPC +	select COMPAT_OLD_SIGACTION  config SYSVIPC_COMPAT  	bool diff --git a/arch/sparc/include/uapi/asm/signal.h b/arch/sparc/include/uapi/asm/signal.h index 284836f0b7dc..f387400fcfdf 100644 --- a/arch/sparc/include/uapi/asm/signal.h +++ b/arch/sparc/include/uapi/asm/signal.h @@ -160,7 +160,6 @@ struct __new_sigaction {  	__sigrestore_t		sa_restorer;  /* not used by Linux/SPARC yet */  	__new_sigset_t		sa_mask;  }; -#endif  struct __old_sigaction {  	__sighandler_t		sa_handler; @@ -168,6 +167,7 @@ struct __old_sigaction {  	unsigned long		sa_flags;  	void			(*sa_restorer)(void);  /* not used by Linux/SPARC yet */  }; +#endif  typedef struct sigaltstack {  	void			__user *ss_sp; diff --git a/arch/sparc/kernel/sys32.S b/arch/sparc/kernel/sys32.S index 8475a474273a..9d2e99658aff 100644 --- a/arch/sparc/kernel/sys32.S +++ b/arch/sparc/kernel/sys32.S @@ -60,7 +60,7 @@ SIGN1(sys32_setitimer, compat_sys_setitimer, %o0)  SIGN1(sys32_getitimer, compat_sys_getitimer, %o0)  SIGN1(sys32_sethostname, sys_sethostname, %o1)  SIGN1(sys32_swapon, sys_swapon, %o1) -SIGN1(sys32_sigaction, compat_sys_sigaction, %o0) +SIGN1(sys32_sigaction, compat_sys_sparc_sigaction, %o0)  SIGN1(sys32_rt_sigaction, compat_sys_rt_sigaction, %o0)  SIGN1(sys32_sigprocmask, compat_sys_sigprocmask, %o0)  SIGN1(sys32_rt_sigprocmask, compat_sys_rt_sigprocmask, %o0) diff --git a/arch/sparc/kernel/sys_sparc32.c b/arch/sparc/kernel/sys_sparc32.c index 4e96771a1b59..dcce0a6216cf 100644 --- a/arch/sparc/kernel/sys_sparc32.c +++ b/arch/sparc/kernel/sys_sparc32.c @@ -211,41 +211,12 @@ asmlinkage long compat_sys_sysfs(int option, u32 arg1, u32 arg2)  	return sys_sysfs(option, arg1, arg2);  } -asmlinkage long compat_sys_sigaction(int sig, struct old_sigaction32 __user *act, -				     struct old_sigaction32 __user *oact) +COMPAT_SYSCALL_DEFINE3(sparc_sigaction, int, sig, +			struct compat_old_sigaction __user *,act, +			struct compat_old_sigaction __user *,oact)  { -        struct k_sigaction new_ka, old_ka; -        int ret; -  	WARN_ON_ONCE(sig >= 0); -	sig = -sig; - -        if (act) { -		compat_old_sigset_t mask; -		u32 u_handler, u_restorer; -		 -		ret = get_user(u_handler, &act->sa_handler); -		new_ka.sa.sa_handler =  compat_ptr(u_handler); -		ret |= __get_user(u_restorer, &act->sa_restorer); -		new_ka.sa.sa_restorer = compat_ptr(u_restorer); -		ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags); -		ret |= __get_user(mask, &act->sa_mask); -		if (ret) -			return ret; -		new_ka.ka_restorer = NULL; -		siginitset(&new_ka.sa.sa_mask, mask); -        } - -        ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); - -	if (!ret && oact) { -		ret = put_user(ptr_to_compat(old_ka.sa.sa_handler), &oact->sa_handler); -		ret |= __put_user(ptr_to_compat(old_ka.sa.sa_restorer), &oact->sa_restorer); -		ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags); -		ret |= __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask); -        } - -	return ret; +	return compat_sys_sigaction(-sig, act, oact);  }  COMPAT_SYSCALL_DEFINE5(rt_sigaction, int, sig, diff --git a/arch/sparc/kernel/sys_sparc_32.c b/arch/sparc/kernel/sys_sparc_32.c index cdd2d7035930..3a8d1844402e 100644 --- a/arch/sparc/kernel/sys_sparc_32.c +++ b/arch/sparc/kernel/sys_sparc_32.c @@ -160,41 +160,12 @@ sparc_breakpoint (struct pt_regs *regs)  #endif  } -asmlinkage int -sparc_sigaction (int sig, const struct old_sigaction __user *act, -		 struct old_sigaction __user *oact) +SYSCALL_DEFINE3(sparc_sigaction, int, sig, +		struct old_sigaction __user *,act, +		struct old_sigaction __user *,oact)  { -	struct k_sigaction new_ka, old_ka; -	int ret; -  	WARN_ON_ONCE(sig >= 0); -	sig = -sig; - -	if (act) { -		unsigned long mask; - -		if (!access_ok(VERIFY_READ, act, sizeof(*act)) || -		    __get_user(new_ka.sa.sa_handler, &act->sa_handler) || -		    __get_user(new_ka.sa.sa_restorer, &act->sa_restorer) || -		    __get_user(new_ka.sa.sa_flags, &act->sa_flags) || -		    __get_user(mask, &act->sa_mask)) -			return -EFAULT; -		siginitset(&new_ka.sa.sa_mask, mask); -		new_ka.ka_restorer = NULL; -	} - -	ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); - -	if (!ret && oact) { -		if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || -		    __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || -		    __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) || -		    __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || -		    __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) -			return -EFAULT; -	} - -	return ret; +	return sys_sigaction(-sig, act, oact);  }  SYSCALL_DEFINE5(rt_sigaction, int, sig, diff --git a/arch/sparc/kernel/systbls_32.S b/arch/sparc/kernel/systbls_32.S index 6ac43c36bbbf..7b87171ecf1e 100644 --- a/arch/sparc/kernel/systbls_32.S +++ b/arch/sparc/kernel/systbls_32.S @@ -55,7 +55,7 @@ sys_call_table:  /*180*/	.long sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_sigpending, sys_ni_syscall  /*185*/	.long sys_setpgid, sys_fremovexattr, sys_tkill, sys_exit_group, sys_newuname  /*190*/	.long sys_init_module, sys_personality, sparc_remap_file_pages, sys_epoll_create, sys_epoll_ctl -/*195*/	.long sys_epoll_wait, sys_ioprio_set, sys_getppid, sparc_sigaction, sys_sgetmask +/*195*/	.long sys_epoll_wait, sys_ioprio_set, sys_getppid, sys_sparc_sigaction, sys_sgetmask  /*200*/	.long sys_ssetmask, sys_sigsuspend, sys_newlstat, sys_uselib, sys_old_readdir  /*205*/	.long sys_readahead, sys_socketcall, sys_syslog, sys_lookup_dcookie, sys_fadvise64  /*210*/	.long sys_fadvise64_64, sys_tgkill, sys_waitpid, sys_swapoff, sys_sysinfo |