Commit 8eae10e8 authored by Al Viro's avatar Al Viro
Browse files

m32r: switch to generic sys_execve()



... and get rid of the horrors in fork()/vfork()/clone() prototypes.
It's fscking faster to calculate pt_regs in question than to fetch
the pointer from stack...

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent ea4a1da9
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -139,6 +139,8 @@ extern void withdraw_debug_trap(struct pt_regs *regs);


#define task_pt_regs(task) \
#define task_pt_regs(task) \
        ((struct pt_regs *)(task_stack_page(task) + THREAD_SIZE) - 1)
        ((struct pt_regs *)(task_stack_page(task) + THREAD_SIZE) - 1)
#define current_pt_regs() ((struct pt_regs *) \
	((unsigned long)current_thread_info() + THREAD_SIZE) - 1)


#endif /* __KERNEL */
#endif /* __KERNEL */


+1 −0
Original line number Original line Diff line number Diff line
@@ -352,6 +352,7 @@
#define __ARCH_WANT_SYS_OLDUMOUNT
#define __ARCH_WANT_SYS_OLDUMOUNT
#define __ARCH_WANT_SYS_RT_SIGACTION
#define __ARCH_WANT_SYS_RT_SIGACTION
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
#define __ARCH_WANT_SYS_EXECVE


#define __IGNORE_lchown
#define __IGNORE_lchown
#define __IGNORE_setuid
#define __IGNORE_setuid
+10 −36
Original line number Original line Diff line number Diff line
@@ -216,12 +216,11 @@ int copy_thread(unsigned long clone_flags, unsigned long spu,
	return 0;
	return 0;
}
}


asmlinkage int sys_fork(unsigned long r0, unsigned long r1, unsigned long r2,
asmlinkage int sys_fork(void)
	unsigned long r3, unsigned long r4, unsigned long r5, unsigned long r6,
	struct pt_regs regs)
{
{
#ifdef CONFIG_MMU
#ifdef CONFIG_MMU
	return do_fork(SIGCHLD, regs.spu, &regs, 0, NULL, NULL);
	struct pt_regs *regs = current_pt_regs();
	return do_fork(SIGCHLD, regs->spu, regs, 0, NULL, NULL);
#else
#else
	return -EINVAL;
	return -EINVAL;
#endif /* CONFIG_MMU */
#endif /* CONFIG_MMU */
@@ -229,14 +228,13 @@ asmlinkage int sys_fork(unsigned long r0, unsigned long r1, unsigned long r2,


asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp,
asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp,
			 unsigned long parent_tidptr,
			 unsigned long parent_tidptr,
			 unsigned long child_tidptr,
			 unsigned long child_tidptr)
			 unsigned long r4, unsigned long r5, unsigned long r6,
			 struct pt_regs regs)
{
{
	struct pt_regs *regs = current_pt_regs();
	if (!newsp)
	if (!newsp)
		newsp = regs.spu;
		newsp = regs->spu;


	return do_fork(clone_flags, newsp, &regs, 0,
	return do_fork(clone_flags, newsp, regs, 0,
		       (int __user *)parent_tidptr, (int __user *)child_tidptr);
		       (int __user *)parent_tidptr, (int __user *)child_tidptr);
}
}


@@ -250,37 +248,13 @@ asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp,
 * do not have enough call-clobbered registers to hold all
 * do not have enough call-clobbered registers to hold all
 * the information you need.
 * the information you need.
 */
 */
asmlinkage int sys_vfork(unsigned long r0, unsigned long r1, unsigned long r2,
asmlinkage int sys_vfork(void)
	unsigned long r3, unsigned long r4, unsigned long r5, unsigned long r6,
	struct pt_regs regs)
{
{
	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs.spu, &regs, 0,
	struct pt_regs *regs = current_pt_regs();
	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->spu, regs, 0,
			NULL, NULL);
			NULL, NULL);
}
}


/*
 * sys_execve() executes a new program.
 */
asmlinkage int sys_execve(const char __user *ufilename,
			  const char __user *const __user *uargv,
			  const char __user *const __user *uenvp,
			  unsigned long r3, unsigned long r4, unsigned long r5,
			  unsigned long r6, struct pt_regs regs)
{
	int error;
	struct filename *filename;

	filename = getname(ufilename);
	error = PTR_ERR(filename);
	if (IS_ERR(filename))
		goto out;

	error = do_execve(filename->name, uargv, uenvp, &regs);
	putname(filename);
out:
	return error;
}

/*
/*
 * These bracket the sleeping functions..
 * These bracket the sleeping functions..
 */
 */