diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2012-12-25 19:26:12 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-02-03 18:16:14 -0500 |
commit | 7eddd99c289a443d76391d740c7c62d542174f27 (patch) | |
tree | fbfa057ba7fcd71070e0505a27b306c0929ef055 | |
parent | f036b943441ac8e79b779e3500ae4820c243b4f2 (diff) |
s390: switch to generic old sigaction()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | arch/s390/Kconfig | 2 | ||||
-rw-r--r-- | arch/s390/include/asm/signal.h | 7 | ||||
-rw-r--r-- | arch/s390/kernel/compat_linux.h | 11 | ||||
-rw-r--r-- | arch/s390/kernel/compat_signal.c | 37 | ||||
-rw-r--r-- | arch/s390/kernel/compat_wrapper.S | 2 | ||||
-rw-r--r-- | arch/s390/kernel/entry.h | 2 | ||||
-rw-r--r-- | arch/s390/kernel/signal.c | 31 |
7 files changed, 3 insertions, 89 deletions
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index e3ab2d6fdca6..bcdcf31fa672 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig | |||
@@ -146,6 +146,7 @@ config S390 | |||
146 | select GENERIC_COMPAT_RT_SIGPROCMASK | 146 | select GENERIC_COMPAT_RT_SIGPROCMASK |
147 | select GENERIC_COMPAT_RT_SIGPENDING | 147 | select GENERIC_COMPAT_RT_SIGPENDING |
148 | select OLD_SIGSUSPEND3 | 148 | select OLD_SIGSUSPEND3 |
149 | select OLD_SIGACTION | ||
149 | 150 | ||
150 | config SCHED_OMIT_FRAME_POINTER | 151 | config SCHED_OMIT_FRAME_POINTER |
151 | def_bool y | 152 | def_bool y |
@@ -255,6 +256,7 @@ config COMPAT | |||
255 | depends on 64BIT | 256 | depends on 64BIT |
256 | select COMPAT_BINFMT_ELF if BINFMT_ELF | 257 | select COMPAT_BINFMT_ELF if BINFMT_ELF |
257 | select ARCH_WANT_OLD_COMPAT_IPC | 258 | select ARCH_WANT_OLD_COMPAT_IPC |
259 | select COMPAT_OLD_SIGACTION | ||
258 | help | 260 | help |
259 | Select this option if you want to enable your system kernel to | 261 | Select this option if you want to enable your system kernel to |
260 | handle system-calls from ELF binaries for 31 bit ESA. This option | 262 | handle system-calls from ELF binaries for 31 bit ESA. This option |
diff --git a/arch/s390/include/asm/signal.h b/arch/s390/include/asm/signal.h index d26e30e31656..abf9e5735943 100644 --- a/arch/s390/include/asm/signal.h +++ b/arch/s390/include/asm/signal.h | |||
@@ -21,12 +21,5 @@ typedef struct { | |||
21 | unsigned long sig[_NSIG_WORDS]; | 21 | unsigned long sig[_NSIG_WORDS]; |
22 | } sigset_t; | 22 | } sigset_t; |
23 | 23 | ||
24 | struct old_sigaction { | ||
25 | __sighandler_t sa_handler; | ||
26 | old_sigset_t sa_mask; | ||
27 | unsigned long sa_flags; | ||
28 | void (*sa_restorer)(void); | ||
29 | }; | ||
30 | |||
31 | #define __ARCH_HAS_SA_RESTORER | 24 | #define __ARCH_HAS_SA_RESTORER |
32 | #endif | 25 | #endif |
diff --git a/arch/s390/kernel/compat_linux.h b/arch/s390/kernel/compat_linux.h index 47e9f07e3675..00d92a5a6f6c 100644 --- a/arch/s390/kernel/compat_linux.h +++ b/arch/s390/kernel/compat_linux.h | |||
@@ -17,13 +17,6 @@ struct ipc_kludge_32 { | |||
17 | __s32 msgtyp; | 17 | __s32 msgtyp; |
18 | }; | 18 | }; |
19 | 19 | ||
20 | struct old_sigaction32 { | ||
21 | __u32 sa_handler; /* Really a pointer, but need to deal with 32 bits */ | ||
22 | compat_old_sigset_t sa_mask; /* A 32 bit mask */ | ||
23 | __u32 sa_flags; | ||
24 | __u32 sa_restorer; /* Another 32 bit pointer */ | ||
25 | }; | ||
26 | |||
27 | /* asm/sigcontext.h */ | 20 | /* asm/sigcontext.h */ |
28 | typedef union | 21 | typedef union |
29 | { | 22 | { |
@@ -81,8 +74,6 @@ struct ucontext32 { | |||
81 | struct stat64_emu31; | 74 | struct stat64_emu31; |
82 | struct mmap_arg_struct_emu31; | 75 | struct mmap_arg_struct_emu31; |
83 | struct fadvise64_64_args; | 76 | struct fadvise64_64_args; |
84 | struct old_sigaction32; | ||
85 | struct old_sigaction32; | ||
86 | 77 | ||
87 | long sys32_chown16(const char __user * filename, u16 user, u16 group); | 78 | long sys32_chown16(const char __user * filename, u16 user, u16 group); |
88 | long sys32_lchown16(const char __user * filename, u16 user, u16 group); | 79 | long sys32_lchown16(const char __user * filename, u16 user, u16 group); |
@@ -131,6 +122,4 @@ long sys32_read(unsigned int fd, char __user * buf, size_t count); | |||
131 | long sys32_write(unsigned int fd, const char __user * buf, size_t count); | 122 | long sys32_write(unsigned int fd, const char __user * buf, size_t count); |
132 | long sys32_fadvise64(int fd, loff_t offset, size_t len, int advise); | 123 | long sys32_fadvise64(int fd, loff_t offset, size_t len, int advise); |
133 | long sys32_fadvise64_64(struct fadvise64_64_args __user *args); | 124 | long sys32_fadvise64_64(struct fadvise64_64_args __user *args); |
134 | long sys32_sigaction(int sig, const struct old_sigaction32 __user *act, | ||
135 | struct old_sigaction32 __user *oact); | ||
136 | #endif /* _ASM_S390X_S390_H */ | 125 | #endif /* _ASM_S390X_S390_H */ |
diff --git a/arch/s390/kernel/compat_signal.c b/arch/s390/kernel/compat_signal.c index 141bfe190d52..3e71194c1902 100644 --- a/arch/s390/kernel/compat_signal.c +++ b/arch/s390/kernel/compat_signal.c | |||
@@ -157,43 +157,6 @@ int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from) | |||
157 | return err; | 157 | return err; |
158 | } | 158 | } |
159 | 159 | ||
160 | asmlinkage long | ||
161 | sys32_sigaction(int sig, const struct old_sigaction32 __user *act, | ||
162 | struct old_sigaction32 __user *oact) | ||
163 | { | ||
164 | struct k_sigaction new_ka, old_ka; | ||
165 | unsigned long sa_handler, sa_restorer; | ||
166 | int ret; | ||
167 | |||
168 | if (act) { | ||
169 | compat_old_sigset_t mask; | ||
170 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | ||
171 | __get_user(sa_handler, &act->sa_handler) || | ||
172 | __get_user(sa_restorer, &act->sa_restorer) || | ||
173 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
174 | __get_user(mask, &act->sa_mask)) | ||
175 | return -EFAULT; | ||
176 | new_ka.sa.sa_handler = (__sighandler_t) sa_handler; | ||
177 | new_ka.sa.sa_restorer = (void (*)(void)) sa_restorer; | ||
178 | siginitset(&new_ka.sa.sa_mask, mask); | ||
179 | } | ||
180 | |||
181 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | ||
182 | |||
183 | if (!ret && oact) { | ||
184 | sa_handler = (unsigned long) old_ka.sa.sa_handler; | ||
185 | sa_restorer = (unsigned long) old_ka.sa.sa_restorer; | ||
186 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | ||
187 | __put_user(sa_handler, &oact->sa_handler) || | ||
188 | __put_user(sa_restorer, &oact->sa_restorer) || | ||
189 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
190 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
191 | return -EFAULT; | ||
192 | } | ||
193 | |||
194 | return ret; | ||
195 | } | ||
196 | |||
197 | static int save_sigregs32(struct pt_regs *regs, _sigregs32 __user *sregs) | 160 | static int save_sigregs32(struct pt_regs *regs, _sigregs32 __user *sregs) |
198 | { | 161 | { |
199 | _s390_regs_common32 regs32; | 162 | _s390_regs_common32 regs32; |
diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S index 1f8af0017c65..559e04fe4071 100644 --- a/arch/s390/kernel/compat_wrapper.S +++ b/arch/s390/kernel/compat_wrapper.S | |||
@@ -230,7 +230,7 @@ ENTRY(sys32_sigaction_wrapper) | |||
230 | lgfr %r2,%r2 # int | 230 | lgfr %r2,%r2 # int |
231 | llgtr %r3,%r3 # const struct old_sigaction * | 231 | llgtr %r3,%r3 # const struct old_sigaction * |
232 | llgtr %r4,%r4 # struct old_sigaction32 * | 232 | llgtr %r4,%r4 # struct old_sigaction32 * |
233 | jg sys32_sigaction # branch to system call | 233 | jg compat_sys_sigaction # branch to system call |
234 | 234 | ||
235 | ENTRY(sys32_setreuid16_wrapper) | 235 | ENTRY(sys32_setreuid16_wrapper) |
236 | llgfr %r2,%r2 # __kernel_old_uid_emu31_t | 236 | llgfr %r2,%r2 # __kernel_old_uid_emu31_t |
diff --git a/arch/s390/kernel/entry.h b/arch/s390/kernel/entry.h index ee1a8b3d0db4..c3a736a3ed44 100644 --- a/arch/s390/kernel/entry.h +++ b/arch/s390/kernel/entry.h | |||
@@ -73,8 +73,6 @@ long sys_s390_fadvise64(int fd, u32 offset_high, u32 offset_low, | |||
73 | long sys_s390_fadvise64_64(struct fadvise64_64_args __user *args); | 73 | long sys_s390_fadvise64_64(struct fadvise64_64_args __user *args); |
74 | long sys_s390_fallocate(int fd, int mode, loff_t offset, u32 len_high, | 74 | long sys_s390_fallocate(int fd, int mode, loff_t offset, u32 len_high, |
75 | u32 len_low); | 75 | u32 len_low); |
76 | long sys_sigaction(int sig, const struct old_sigaction __user *act, | ||
77 | struct old_sigaction __user *oact); | ||
78 | long sys_sigreturn(void); | 76 | long sys_sigreturn(void); |
79 | long sys_rt_sigreturn(void); | 77 | long sys_rt_sigreturn(void); |
80 | long sys32_sigreturn(void); | 78 | long sys32_sigreturn(void); |
diff --git a/arch/s390/kernel/signal.c b/arch/s390/kernel/signal.c index 0bc5c9d1ab99..9c6e747a5e1e 100644 --- a/arch/s390/kernel/signal.c +++ b/arch/s390/kernel/signal.c | |||
@@ -48,37 +48,6 @@ typedef struct | |||
48 | struct ucontext uc; | 48 | struct ucontext uc; |
49 | } rt_sigframe; | 49 | } rt_sigframe; |
50 | 50 | ||
51 | SYSCALL_DEFINE3(sigaction, int, sig, const struct old_sigaction __user *, act, | ||
52 | struct old_sigaction __user *, oact) | ||
53 | { | ||
54 | struct k_sigaction new_ka, old_ka; | ||
55 | int ret; | ||
56 | |||
57 | if (act) { | ||
58 | old_sigset_t mask; | ||
59 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | ||
60 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || | ||
61 | __get_user(new_ka.sa.sa_restorer, &act->sa_restorer) || | ||
62 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
63 | __get_user(mask, &act->sa_mask)) | ||
64 | return -EFAULT; | ||
65 | siginitset(&new_ka.sa.sa_mask, mask); | ||
66 | } | ||
67 | |||
68 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | ||
69 | |||
70 | if (!ret && oact) { | ||
71 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | ||
72 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || | ||
73 | __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) || | ||
74 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
75 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
76 | return -EFAULT; | ||
77 | } | ||
78 | |||
79 | return ret; | ||
80 | } | ||
81 | |||
82 | /* Returns non-zero on fault. */ | 51 | /* Returns non-zero on fault. */ |
83 | static int save_sigregs(struct pt_regs *regs, _sigregs __user *sregs) | 52 | static int save_sigregs(struct pt_regs *regs, _sigregs __user *sregs) |
84 | { | 53 | { |