diff options
Diffstat (limited to 'arch/sh/kernel/sys_sh.c')
| -rw-r--r-- | arch/sh/kernel/sys_sh.c | 17 | 
1 files changed, 17 insertions, 0 deletions
diff --git a/arch/sh/kernel/sys_sh.c b/arch/sh/kernel/sys_sh.c index 11c2acde6ea..8fde95001c3 100644 --- a/arch/sh/kernel/sys_sh.c +++ b/arch/sh/kernel/sys_sh.c @@ -25,6 +25,7 @@  #include <asm/cacheflush.h>  #include <asm/uaccess.h>  #include <asm/ipc.h> +#include <asm/unistd.h>  /*   * sys_pipe() is the normal C calling standard for creating @@ -309,3 +310,19 @@ asmlinkage int sys_fadvise64_64_wrapper(int fd, u32 offset0, u32 offset1,  				(u64)len0 << 32 | len1,	advice);  #endif  } + +/* + * 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, char *const argv[], char *const envp[]) +{ +	register long __sc0 __asm__ ("r3") = __NR_execve; +	register long __sc4 __asm__ ("r4") = (long) filename; +	register long __sc5 __asm__ ("r5") = (long) argv; +	register long __sc6 __asm__ ("r6") = (long) envp; +	__asm__ __volatile__ ("trapa	#0x13" : "=z" (__sc0) +			: "0" (__sc0), "r" (__sc4), "r" (__sc5), "r" (__sc6) +			: "memory"); +	return __sc0; +}  |