diff options
| author | Ralf Baechle <ralf@linux-mips.org> | 2012-10-09 21:16:07 +0200 | 
|---|---|---|
| committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-10-14 19:31:30 -0400 | 
| commit | baf9ff74eda9f0efcc8a68e8a9c9d183be13a810 (patch) | |
| tree | 4edd32d85cae4ef850973214a922c376537991c3 /arch/mips/kernel | |
| parent | 8f54bcacbc39f883bde2210cf2754e5d198f55a4 (diff) | |
| download | olio-linux-3.10-baf9ff74eda9f0efcc8a68e8a9c9d183be13a810.tar.xz olio-linux-3.10-baf9ff74eda9f0efcc8a68e8a9c9d183be13a810.zip  | |
MIPS: Switch over to generic sys_execve and kernel_execve.
This version contains a few updates by David Daney, in particular it's
now using __builtin_frame_address() instead of asm() which depending
on personal taste, is slightly more appealing.
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/kernel')
| -rw-r--r-- | arch/mips/kernel/entry.S | 9 | ||||
| -rw-r--r-- | arch/mips/kernel/linux32.c | 21 | ||||
| -rw-r--r-- | arch/mips/kernel/scall64-n32.S | 2 | ||||
| -rw-r--r-- | arch/mips/kernel/scall64-o32.S | 2 | ||||
| -rw-r--r-- | arch/mips/kernel/syscall.c | 53 | 
5 files changed, 11 insertions, 76 deletions
diff --git a/arch/mips/kernel/entry.S b/arch/mips/kernel/entry.S index aab6997b8f4..5dcb5fbbbd5 100644 --- a/arch/mips/kernel/entry.S +++ b/arch/mips/kernel/entry.S @@ -192,6 +192,15 @@ syscall_exit_work:  	jal	syscall_trace_leave  	b	resume_userspace +LEAF(ret_from_kernel_execve) +	move	sp, a0 +	ori	$28,  sp, _THREAD_SIZE - 1 +	xori	$28, $28, _THREAD_SIZE - 1 +	li	v0, 0 +	li	a3, 0 +	j	syscall_exit_partial +	END(ret_from_kernel_execve) +  #if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_MIPS_MT)  /* diff --git a/arch/mips/kernel/linux32.c b/arch/mips/kernel/linux32.c index 3a21acedf88..8796dbc7e35 100644 --- a/arch/mips/kernel/linux32.c +++ b/arch/mips/kernel/linux32.c @@ -3,7 +3,6 @@   *   * Copyright (C) 2000 Silicon Graphics, Inc.   * Written by Ulf Carlsson (ulfc@engr.sgi.com) - * sys32_execve from ia64/ia32 code, Feb 2000, Kanoj Sarcar (kanoj@sgi.com)   */  #include <linux/compiler.h>  #include <linux/mm.h> @@ -77,26 +76,6 @@ out:  	return error;  } -/* - * sys_execve() executes a new program. - */ -asmlinkage int sys32_execve(nabi_no_regargs struct pt_regs regs) -{ -	int error; -	struct filename *filename; - -	filename = getname(compat_ptr(regs.regs[4])); -	error = PTR_ERR(filename); -	if (IS_ERR(filename)) -		goto out; -	error = compat_do_execve(filename->name, compat_ptr(regs.regs[5]), -				 compat_ptr(regs.regs[6]), ®s); -	putname(filename); - -out: -	return error; -} -  #define RLIM_INFINITY32	0x7fffffff  #define RESOURCE32(x) ((x > RLIM_INFINITY32) ? RLIM_INFINITY32 : x) diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S index f6ba8381ee0..d27ca340d46 100644 --- a/arch/mips/kernel/scall64-n32.S +++ b/arch/mips/kernel/scall64-n32.S @@ -167,7 +167,7 @@ EXPORT(sysn32_call_table)  	PTR	sys_getsockopt  	PTR	sys_clone			/* 6055 */  	PTR	sys_fork -	PTR	sys32_execve +	PTR	compat_sys_execve  	PTR	sys_exit  	PTR	compat_sys_wait4  	PTR	sys_kill			/* 6060 */ diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S index 53c2d724576..9601be6afa3 100644 --- a/arch/mips/kernel/scall64-o32.S +++ b/arch/mips/kernel/scall64-o32.S @@ -203,7 +203,7 @@ sys_call_table:  	PTR	sys_creat  	PTR	sys_link  	PTR	sys_unlink			/* 4010 */ -	PTR	sys32_execve +	PTR	compat_sys_execve  	PTR	sys_chdir  	PTR	compat_sys_time  	PTR	sys_mknod diff --git a/arch/mips/kernel/syscall.c b/arch/mips/kernel/syscall.c index 2bd561bc05a..c611e2df776 100644 --- a/arch/mips/kernel/syscall.c +++ b/arch/mips/kernel/syscall.c @@ -127,28 +127,6 @@ _sys_clone(nabi_no_regargs struct pt_regs regs)  	               parent_tidptr, child_tidptr);  } -/* - * sys_execve() executes a new program. - */ -asmlinkage int sys_execve(nabi_no_regargs struct pt_regs regs) -{ -	int error; -	struct filename *filename; - -	filename = getname((const char __user *) (long)regs.regs[4]); -	error = PTR_ERR(filename); -	if (IS_ERR(filename)) -		goto out; -	error = do_execve(filename->name, -			  (const char __user *const __user *) (long)regs.regs[5], -	                  (const char __user *const __user *) (long)regs.regs[6], -			  ®s); -	putname(filename); - -out: -	return error; -} -  SYSCALL_DEFINE1(set_thread_area, unsigned long, addr)  {  	struct thread_info *ti = task_thread_info(current); @@ -313,34 +291,3 @@ asmlinkage void bad_stack(void)  {  	do_exit(SIGSEGV);  } - -/* - * Do a system call from kernel instead of calling sys_execve so we - * end up with proper pt_regs. - */ -int kernel_execve(const char *filename, -		  const char *const argv[], -		  const char *const envp[]) -{ -	register unsigned long __a0 asm("$4") = (unsigned long) filename; -	register unsigned long __a1 asm("$5") = (unsigned long) argv; -	register unsigned long __a2 asm("$6") = (unsigned long) envp; -	register unsigned long __a3 asm("$7"); -	unsigned long __v0; - -	__asm__ volatile ("					\n" -	"	.set	noreorder				\n" -	"	li	$2, %5		# __NR_execve		\n" -	"	syscall						\n" -	"	move	%0, $2					\n" -	"	.set	reorder					\n" -	: "=&r" (__v0), "=r" (__a3) -	: "r" (__a0), "r" (__a1), "r" (__a2), "i" (__NR_execve) -	: "$2", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", -	  "memory"); - -	if (__a3 == 0) -		return __v0; - -	return -__v0; -}  |