Commit 3e86a8c6 authored by Heiko Carstens's avatar Heiko Carstens Committed by Martin Schwidefsky
Browse files

[S390] Convert sys_execve to function with parameters.



Use function parameters instead of accessing the pt_regs structure
to get the parameters.

Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 2d70ca23
Loading
Loading
Loading
Loading
+14 −19
Original line number Diff line number Diff line
@@ -443,31 +443,26 @@ sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo)
 * sys32_execve() executes a new program after the asm stub has set
 * things up for us.  This should basically do what I want it to.
 */
asmlinkage long sys32_execve(void)
asmlinkage long sys32_execve(char __user *name, compat_uptr_t __user *argv,
			     compat_uptr_t __user *envp)
{
	struct pt_regs *regs = task_pt_regs(current);
	char *filename;
	unsigned long result;
	int rc;

	filename = getname(compat_ptr(regs->orig_gpr2));
	if (IS_ERR(filename)) {
		result = PTR_ERR(filename);
	long rc;

	filename = getname(name);
	rc = PTR_ERR(filename);
	if (IS_ERR(filename))
		return rc;
	rc = compat_do_execve(filename, argv, envp, regs);
	if (rc)
		goto out;
	}
	rc = compat_do_execve(filename, compat_ptr(regs->gprs[3]),
			      compat_ptr(regs->gprs[4]), regs);
	if (rc) {
		result = rc;
		goto out_putname;
	}
	current->thread.fp_regs.fpc=0;
	asm volatile("sfpc %0,0" : : "d" (0));
	result = regs->gprs[2];
out_putname:
        putname(filename);
	rc = regs->gprs[2];
out:
	return result;
	putname(filename);
	return rc;
}


+2 −1
Original line number Diff line number Diff line
@@ -198,7 +198,8 @@ long sys32_rt_sigprocmask(int how, compat_sigset_t __user *set,
			  compat_sigset_t __user *oset, size_t sigsetsize);
long sys32_rt_sigpending(compat_sigset_t __user *set, size_t sigsetsize);
long sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo);
long sys32_execve(void);
long sys32_execve(char __user *name, compat_uptr_t __user *argv,
		  compat_uptr_t __user *envp);
long sys32_init_module(void __user *umod, unsigned long len,
		       const char __user *uargs);
long sys32_delete_module(const char __user *name_user, unsigned int flags);
+7 −0
Original line number Diff line number Diff line
@@ -1848,3 +1848,10 @@ sys_clone_wrapper:
	llgtr	%r4,%r4			# int *
	llgtr	%r5,%r5			# int *
	jg	sys_clone		# branch to system call

	.globl	sys32_execve_wrapper
sys32_execve_wrapper:
	llgtr	%r2,%r2			# char *
	llgtr	%r3,%r3			# compat_uptr_t *
	llgtr	%r4,%r4			# compat_uptr_t *
	jg	sys32_execve		# branch to system call
+2 −1
Original line number Diff line number Diff line
@@ -46,7 +46,8 @@ long sys_clone(unsigned long newsp, unsigned long clone_flags,
	       int __user *parent_tidptr, int __user *child_tidptr);
long sys_vfork(void);
void execve_tail(void);
long sys_execve(void);
long sys_execve(char __user *name, char __user * __user *argv,
		char __user * __user *envp);
long sys_sigsuspend(int history0, int history1, old_sigset_t mask);
long sys_sigaction(int sig, const struct old_sigaction __user *act,
		   struct old_sigaction __user *oact);
+13 −17
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@
#include <linux/elfcore.h>
#include <linux/kernel_stat.h>
#include <linux/syscalls.h>
#include <linux/compat.h>
#include <asm/compat.h>
#include <asm/uaccess.h>
#include <asm/pgtable.h>
@@ -268,30 +269,25 @@ asmlinkage void execve_tail(void)
/*
 * sys_execve() executes a new program.
 */
SYSCALL_DEFINE0(execve)
SYSCALL_DEFINE3(execve, char __user *, name, char __user * __user *, argv,
		char __user * __user *, envp)
{
	struct pt_regs *regs = task_pt_regs(current);
	char *filename;
	unsigned long result;
	int rc;
	long rc;

	filename = getname((char __user *) regs->orig_gpr2);
	if (IS_ERR(filename)) {
		result = PTR_ERR(filename);
	filename = getname(name);
	rc = PTR_ERR(filename);
	if (IS_ERR(filename))
		return rc;
	rc = do_execve(filename, argv, envp, regs);
	if (rc)
		goto out;
	}
	rc = do_execve(filename, (char __user * __user *) regs->gprs[3],
		       (char __user * __user *) regs->gprs[4], regs);
	if (rc) {
		result = rc;
		goto out_putname;
	}
	execve_tail();
	result = regs->gprs[2];
out_putname:
	putname(filename);
	rc = regs->gprs[2];
out:
	return result;
	putname(filename);
	return rc;
}

/*
Loading