diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2012-12-25 18:45:43 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-02-03 22:42:00 -0500 |
commit | bdc40abf070eab82d27de99ef5ff62a1c5de238d (patch) | |
tree | 2ccb1ff05188dabf666ef3a318d484b94e5f0042 | |
parent | 8d65681dafe938e1aa332de5ef142ea2b076a9b4 (diff) |
sparc: switch sys_compat_rt_sigaction() to COMPAT_SYSCALL_DEFINE
note that while struct compat_sigaction is the generic one, syscall
itself *isn't* - different arguments. IOW, CONFIG_ODD_RT_SIGACTION
stays.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | arch/sparc/Kconfig | 1 | ||||
-rw-r--r-- | arch/sparc/kernel/sys_sparc32.c | 24 |
2 files changed, 8 insertions, 17 deletions
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index d190ff8d5310..9d2c395440df 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig | |||
@@ -46,6 +46,7 @@ config SPARC | |||
46 | select GENERIC_COMPAT_RT_SIGQUEUEINFO | 46 | select GENERIC_COMPAT_RT_SIGQUEUEINFO |
47 | select GENERIC_COMPAT_RT_SIGPROCMASK | 47 | select GENERIC_COMPAT_RT_SIGPROCMASK |
48 | select GENERIC_COMPAT_RT_SIGPENDING | 48 | select GENERIC_COMPAT_RT_SIGPENDING |
49 | select GENERIC_COMPAT_RT_SIGACTION | ||
49 | 50 | ||
50 | config SPARC32 | 51 | config SPARC32 |
51 | def_bool !64BIT | 52 | def_bool !64BIT |
diff --git a/arch/sparc/kernel/sys_sparc32.c b/arch/sparc/kernel/sys_sparc32.c index feb016316f90..4e96771a1b59 100644 --- a/arch/sparc/kernel/sys_sparc32.c +++ b/arch/sparc/kernel/sys_sparc32.c | |||
@@ -248,11 +248,11 @@ asmlinkage long compat_sys_sigaction(int sig, struct old_sigaction32 __user *act | |||
248 | return ret; | 248 | return ret; |
249 | } | 249 | } |
250 | 250 | ||
251 | asmlinkage long compat_sys_rt_sigaction(int sig, | 251 | COMPAT_SYSCALL_DEFINE5(rt_sigaction, int, sig, |
252 | struct sigaction32 __user *act, | 252 | struct compat_sigaction __user *,act, |
253 | struct sigaction32 __user *oact, | 253 | struct compat_sigaction __user *,oact, |
254 | void __user *restorer, | 254 | void __user *,restorer, |
255 | compat_size_t sigsetsize) | 255 | compat_size_t,sigsetsize) |
256 | { | 256 | { |
257 | struct k_sigaction new_ka, old_ka; | 257 | struct k_sigaction new_ka, old_ka; |
258 | int ret; | 258 | int ret; |
@@ -269,12 +269,7 @@ asmlinkage long compat_sys_rt_sigaction(int sig, | |||
269 | ret = get_user(u_handler, &act->sa_handler); | 269 | ret = get_user(u_handler, &act->sa_handler); |
270 | new_ka.sa.sa_handler = compat_ptr(u_handler); | 270 | new_ka.sa.sa_handler = compat_ptr(u_handler); |
271 | ret |= __copy_from_user(&set32, &act->sa_mask, sizeof(compat_sigset_t)); | 271 | ret |= __copy_from_user(&set32, &act->sa_mask, sizeof(compat_sigset_t)); |
272 | switch (_NSIG_WORDS) { | 272 | sigset_from_compat(&new_ka.sa.sa_mask, &set32); |
273 | case 4: new_ka.sa.sa_mask.sig[3] = set32.sig[6] | (((long)set32.sig[7]) << 32); | ||
274 | case 3: new_ka.sa.sa_mask.sig[2] = set32.sig[4] | (((long)set32.sig[5]) << 32); | ||
275 | case 2: new_ka.sa.sa_mask.sig[1] = set32.sig[2] | (((long)set32.sig[3]) << 32); | ||
276 | case 1: new_ka.sa.sa_mask.sig[0] = set32.sig[0] | (((long)set32.sig[1]) << 32); | ||
277 | } | ||
278 | ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags); | 273 | ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags); |
279 | ret |= __get_user(u_restorer, &act->sa_restorer); | 274 | ret |= __get_user(u_restorer, &act->sa_restorer); |
280 | new_ka.sa.sa_restorer = compat_ptr(u_restorer); | 275 | new_ka.sa.sa_restorer = compat_ptr(u_restorer); |
@@ -285,12 +280,7 @@ asmlinkage long compat_sys_rt_sigaction(int sig, | |||
285 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | 280 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); |
286 | 281 | ||
287 | if (!ret && oact) { | 282 | if (!ret && oact) { |
288 | switch (_NSIG_WORDS) { | 283 | sigset_to_compat(&set32, &old_ka.sa.sa_mask); |
289 | case 4: set32.sig[7] = (old_ka.sa.sa_mask.sig[3] >> 32); set32.sig[6] = old_ka.sa.sa_mask.sig[3]; | ||
290 | case 3: set32.sig[5] = (old_ka.sa.sa_mask.sig[2] >> 32); set32.sig[4] = old_ka.sa.sa_mask.sig[2]; | ||
291 | case 2: set32.sig[3] = (old_ka.sa.sa_mask.sig[1] >> 32); set32.sig[2] = old_ka.sa.sa_mask.sig[1]; | ||
292 | case 1: set32.sig[1] = (old_ka.sa.sa_mask.sig[0] >> 32); set32.sig[0] = old_ka.sa.sa_mask.sig[0]; | ||
293 | } | ||
294 | ret = put_user(ptr_to_compat(old_ka.sa.sa_handler), &oact->sa_handler); | 284 | ret = put_user(ptr_to_compat(old_ka.sa.sa_handler), &oact->sa_handler); |
295 | ret |= __copy_to_user(&oact->sa_mask, &set32, sizeof(compat_sigset_t)); | 285 | ret |= __copy_to_user(&oact->sa_mask, &set32, sizeof(compat_sigset_t)); |
296 | ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags); | 286 | ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags); |