diff options
Diffstat (limited to 'arch/s390/kernel/process.c')
-rw-r--r-- | arch/s390/kernel/process.c | 41 |
1 files changed, 15 insertions, 26 deletions
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c index 5a43f27eec13..5417eb57271a 100644 --- a/arch/s390/kernel/process.c +++ b/arch/s390/kernel/process.c | |||
@@ -27,11 +27,11 @@ | |||
27 | #include <linux/init.h> | 27 | #include <linux/init.h> |
28 | #include <linux/module.h> | 28 | #include <linux/module.h> |
29 | #include <linux/notifier.h> | 29 | #include <linux/notifier.h> |
30 | #include <linux/utsname.h> | ||
31 | #include <linux/tick.h> | 30 | #include <linux/tick.h> |
32 | #include <linux/elfcore.h> | 31 | #include <linux/elfcore.h> |
33 | #include <linux/kernel_stat.h> | 32 | #include <linux/kernel_stat.h> |
34 | #include <linux/syscalls.h> | 33 | #include <linux/syscalls.h> |
34 | #include <linux/compat.h> | ||
35 | #include <asm/compat.h> | 35 | #include <asm/compat.h> |
36 | #include <asm/uaccess.h> | 36 | #include <asm/uaccess.h> |
37 | #include <asm/pgtable.h> | 37 | #include <asm/pgtable.h> |
@@ -230,17 +230,11 @@ SYSCALL_DEFINE0(fork) | |||
230 | return do_fork(SIGCHLD, regs->gprs[15], regs, 0, NULL, NULL); | 230 | return do_fork(SIGCHLD, regs->gprs[15], regs, 0, NULL, NULL); |
231 | } | 231 | } |
232 | 232 | ||
233 | SYSCALL_DEFINE0(clone) | 233 | SYSCALL_DEFINE4(clone, unsigned long, newsp, unsigned long, clone_flags, |
234 | int __user *, parent_tidptr, int __user *, child_tidptr) | ||
234 | { | 235 | { |
235 | struct pt_regs *regs = task_pt_regs(current); | 236 | struct pt_regs *regs = task_pt_regs(current); |
236 | unsigned long clone_flags; | ||
237 | unsigned long newsp; | ||
238 | int __user *parent_tidptr, *child_tidptr; | ||
239 | 237 | ||
240 | clone_flags = regs->gprs[3]; | ||
241 | newsp = regs->orig_gpr2; | ||
242 | parent_tidptr = (int __user *) regs->gprs[4]; | ||
243 | child_tidptr = (int __user *) regs->gprs[5]; | ||
244 | if (!newsp) | 238 | if (!newsp) |
245 | newsp = regs->gprs[15]; | 239 | newsp = regs->gprs[15]; |
246 | return do_fork(clone_flags, newsp, regs, 0, | 240 | return do_fork(clone_flags, newsp, regs, 0, |
@@ -274,30 +268,25 @@ asmlinkage void execve_tail(void) | |||
274 | /* | 268 | /* |
275 | * sys_execve() executes a new program. | 269 | * sys_execve() executes a new program. |
276 | */ | 270 | */ |
277 | SYSCALL_DEFINE0(execve) | 271 | SYSCALL_DEFINE3(execve, char __user *, name, char __user * __user *, argv, |
272 | char __user * __user *, envp) | ||
278 | { | 273 | { |
279 | struct pt_regs *regs = task_pt_regs(current); | 274 | struct pt_regs *regs = task_pt_regs(current); |
280 | char *filename; | 275 | char *filename; |
281 | unsigned long result; | 276 | long rc; |
282 | int rc; | ||
283 | 277 | ||
284 | filename = getname((char __user *) regs->orig_gpr2); | 278 | filename = getname(name); |
285 | if (IS_ERR(filename)) { | 279 | rc = PTR_ERR(filename); |
286 | result = PTR_ERR(filename); | 280 | if (IS_ERR(filename)) |
281 | return rc; | ||
282 | rc = do_execve(filename, argv, envp, regs); | ||
283 | if (rc) | ||
287 | goto out; | 284 | goto out; |
288 | } | ||
289 | rc = do_execve(filename, (char __user * __user *) regs->gprs[3], | ||
290 | (char __user * __user *) regs->gprs[4], regs); | ||
291 | if (rc) { | ||
292 | result = rc; | ||
293 | goto out_putname; | ||
294 | } | ||
295 | execve_tail(); | 285 | execve_tail(); |
296 | result = regs->gprs[2]; | 286 | rc = regs->gprs[2]; |
297 | out_putname: | ||
298 | putname(filename); | ||
299 | out: | 287 | out: |
300 | return result; | 288 | putname(filename); |
289 | return rc; | ||
301 | } | 290 | } |
302 | 291 | ||
303 | /* | 292 | /* |