aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2012-12-25 19:26:12 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2013-02-03 18:16:14 -0500
commit7eddd99c289a443d76391d740c7c62d542174f27 (patch)
treefbfa057ba7fcd71070e0505a27b306c0929ef055
parentf036b943441ac8e79b779e3500ae4820c243b4f2 (diff)
s390: switch to generic old sigaction()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--arch/s390/Kconfig2
-rw-r--r--arch/s390/include/asm/signal.h7
-rw-r--r--arch/s390/kernel/compat_linux.h11
-rw-r--r--arch/s390/kernel/compat_signal.c37
-rw-r--r--arch/s390/kernel/compat_wrapper.S2
-rw-r--r--arch/s390/kernel/entry.h2
-rw-r--r--arch/s390/kernel/signal.c31
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
150config SCHED_OMIT_FRAME_POINTER 151config 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
24struct 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
20struct 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 */
28typedef union 21typedef union
29{ 22{
@@ -81,8 +74,6 @@ struct ucontext32 {
81struct stat64_emu31; 74struct stat64_emu31;
82struct mmap_arg_struct_emu31; 75struct mmap_arg_struct_emu31;
83struct fadvise64_64_args; 76struct fadvise64_64_args;
84struct old_sigaction32;
85struct old_sigaction32;
86 77
87long sys32_chown16(const char __user * filename, u16 user, u16 group); 78long sys32_chown16(const char __user * filename, u16 user, u16 group);
88long sys32_lchown16(const char __user * filename, u16 user, u16 group); 79long 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);
131long sys32_write(unsigned int fd, const char __user * buf, size_t count); 122long sys32_write(unsigned int fd, const char __user * buf, size_t count);
132long sys32_fadvise64(int fd, loff_t offset, size_t len, int advise); 123long sys32_fadvise64(int fd, loff_t offset, size_t len, int advise);
133long sys32_fadvise64_64(struct fadvise64_64_args __user *args); 124long sys32_fadvise64_64(struct fadvise64_64_args __user *args);
134long 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
160asmlinkage long
161sys32_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
197static int save_sigregs32(struct pt_regs *regs, _sigregs32 __user *sregs) 160static 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
235ENTRY(sys32_setreuid16_wrapper) 235ENTRY(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,
73long sys_s390_fadvise64_64(struct fadvise64_64_args __user *args); 73long sys_s390_fadvise64_64(struct fadvise64_64_args __user *args);
74long sys_s390_fallocate(int fd, int mode, loff_t offset, u32 len_high, 74long sys_s390_fallocate(int fd, int mode, loff_t offset, u32 len_high,
75 u32 len_low); 75 u32 len_low);
76long sys_sigaction(int sig, const struct old_sigaction __user *act,
77 struct old_sigaction __user *oact);
78long sys_sigreturn(void); 76long sys_sigreturn(void);
79long sys_rt_sigreturn(void); 77long sys_rt_sigreturn(void);
80long sys32_sigreturn(void); 78long 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
51SYSCALL_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. */
83static int save_sigregs(struct pt_regs *regs, _sigregs __user *sregs) 52static int save_sigregs(struct pt_regs *regs, _sigregs __user *sregs)
84{ 53{