aboutsummaryrefslogtreecommitdiffstats
path: root/arch/v850
diff options
context:
space:
mode:
Diffstat (limited to 'arch/v850')
-rw-r--r--arch/v850/kernel/syscalls.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/arch/v850/kernel/syscalls.c b/arch/v850/kernel/syscalls.c
index 2ec0700fc46b..d2b1fb19d243 100644
--- a/arch/v850/kernel/syscalls.c
+++ b/arch/v850/kernel/syscalls.c
@@ -33,6 +33,7 @@
33#include <asm/uaccess.h> 33#include <asm/uaccess.h>
34#include <asm/ipc.h> 34#include <asm/ipc.h>
35#include <asm/semaphore.h> 35#include <asm/semaphore.h>
36#include <asm/unistd.h>
36 37
37/* 38/*
38 * sys_ipc() is the de-multiplexer for the SysV IPC calls.. 39 * sys_ipc() is the de-multiplexer for the SysV IPC calls..
@@ -194,3 +195,22 @@ unsigned long sys_mmap (unsigned long addr, size_t len,
194out: 195out:
195 return err; 196 return err;
196} 197}
198
199/*
200 * Do a system call from kernel instead of calling sys_execve so we
201 * end up with proper pt_regs.
202 */
203int kernel_execve(const char *filename, char *const argv[], char *const envp[])
204{
205 register char *__a __asm__ ("r6") = filename;
206 register void *__b __asm__ ("r7") = argv;
207 register void *__c __asm__ ("r8") = envp;
208 register unsigned long __syscall __asm__ ("r12") = __NR_execve;
209 register unsigned long __ret __asm__ ("r10");
210 __asm__ __volatile__ ("trap 0"
211 : "=r" (__ret), "=r" (__syscall)
212 : "1" (__syscall), "r" (__a), "r" (__b), "r" (__c)
213 : "r1", "r5", "r11", "r13", "r14",
214 "r15", "r16", "r17", "r18", "r19");
215 return __ret;
216}