aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kernel/process.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/s390/kernel/process.c')
-rw-r--r--arch/s390/kernel/process.c41
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
233SYSCALL_DEFINE0(clone) 233SYSCALL_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 */
277SYSCALL_DEFINE0(execve) 271SYSCALL_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];
297out_putname:
298 putname(filename);
299out: 287out:
300 return result; 288 putname(filename);
289 return rc;
301} 290}
302 291
303/* 292/*