X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fv850%2Fkernel%2Fsyscalls.c;h=d2b1fb19d24313d22896da6d72c710113ddaf9ef;hb=97bf2856c6014879bd04983a3e9dfcdac1e7fe85;hp=ff47395ac8ea0b8666ff2e1c313a21deafd915a5;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/arch/v850/kernel/syscalls.c b/arch/v850/kernel/syscalls.c index ff47395ac..d2b1fb19d 100644 --- a/arch/v850/kernel/syscalls.c +++ b/arch/v850/kernel/syscalls.c @@ -15,7 +15,6 @@ * and Paul Mackerras (paulus@cs.anu.edu.au). */ -#include #include #include #include @@ -34,6 +33,7 @@ #include #include #include +#include /* * sys_ipc() is the de-multiplexer for the SysV IPC calls.. @@ -62,7 +62,7 @@ sys_ipc (uint call, int first, int second, int third, void *ptr, long fifth) if (!ptr) break; - if ((ret = verify_area (VERIFY_READ, ptr, sizeof(long))) + if ((ret = access_ok(VERIFY_READ, ptr, sizeof(long)) ? 0 : -EFAULT) || (ret = get_user(fourth.__pad, (void **)ptr))) break; ret = sys_semctl (first, second, third, fourth); @@ -78,7 +78,7 @@ sys_ipc (uint call, int first, int second, int third, void *ptr, long fifth) if (!ptr) break; - if ((ret = verify_area (VERIFY_READ, ptr, sizeof(tmp))) + if ((ret = access_ok(VERIFY_READ, ptr, sizeof(tmp)) ? 0 : -EFAULT) || (ret = copy_from_user(&tmp, (struct ipc_kludge *) ptr, sizeof (tmp)))) @@ -104,8 +104,8 @@ sys_ipc (uint call, int first, int second, int third, void *ptr, long fifth) default: { ulong raddr; - if ((ret = verify_area(VERIFY_WRITE, (ulong*) third, - sizeof(ulong)))) + if ((ret = access_ok(VERIFY_WRITE, (ulong*) third, + sizeof(ulong)) ? 0 : -EFAULT)) break; ret = do_shmat (first, (char *) ptr, second, &raddr); if (ret) @@ -195,3 +195,22 @@ unsigned long sys_mmap (unsigned long addr, size_t len, out: return err; } + +/* + * 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 char *__a __asm__ ("r6") = filename; + register void *__b __asm__ ("r7") = argv; + register void *__c __asm__ ("r8") = envp; + register unsigned long __syscall __asm__ ("r12") = __NR_execve; + register unsigned long __ret __asm__ ("r10"); + __asm__ __volatile__ ("trap 0" + : "=r" (__ret), "=r" (__syscall) + : "1" (__syscall), "r" (__a), "r" (__b), "r" (__c) + : "r1", "r5", "r11", "r13", "r14", + "r15", "r16", "r17", "r18", "r19"); + return __ret; +}