diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2012-05-31 22:22:52 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-09-30 22:53:31 -0400 |
commit | 44f4b56b54d2ab5d06c1726f2cde8ca15c8fac47 (patch) | |
tree | 288101c8a9effe021e200e05f443a93f440de32f /arch/alpha | |
parent | cba1ec7e88a0257eb13e84d170a93cd52b702562 (diff) | |
download | kernel_goldelico_gta04-44f4b56b54d2ab5d06c1726f2cde8ca15c8fac47.zip kernel_goldelico_gta04-44f4b56b54d2ab5d06c1726f2cde8ca15c8fac47.tar.gz kernel_goldelico_gta04-44f4b56b54d2ab5d06c1726f2cde8ca15c8fac47.tar.bz2 |
alpha: introduce ret_from_kernel_execve(), switch to generic kernel_execve()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'arch/alpha')
-rw-r--r-- | arch/alpha/include/asm/unistd.h | 1 | ||||
-rw-r--r-- | arch/alpha/kernel/entry.S | 13 | ||||
-rw-r--r-- | arch/alpha/kernel/process.c | 19 |
3 files changed, 14 insertions, 19 deletions
diff --git a/arch/alpha/include/asm/unistd.h b/arch/alpha/include/asm/unistd.h index 7826e22..3cb6c11 100644 --- a/arch/alpha/include/asm/unistd.h +++ b/arch/alpha/include/asm/unistd.h @@ -482,6 +482,7 @@ #define __ARCH_WANT_SYS_SIGPENDING #define __ARCH_WANT_SYS_RT_SIGSUSPEND #define __ARCH_WANT_SYS_EXECVE +#define __ARCH_WANT_KERNEL_EXECVE /* "Conditional" syscalls. What we want is diff --git a/arch/alpha/kernel/entry.S b/arch/alpha/kernel/entry.S index 421dccf..7e43e11 100644 --- a/arch/alpha/kernel/entry.S +++ b/arch/alpha/kernel/entry.S @@ -626,6 +626,19 @@ ret_from_kernel_thread: jmp $31, sys_exit .end ret_from_kernel_thread + .globl ret_from_kernel_execve + .align 4 + .ent ret_from_kernel_execve +ret_from_kernel_execve: + mov $16, $sp + /* Avoid the HAE being gratuitously wrong, to avoid restoring it. */ + ldq $2, alpha_mv+HAE_CACHE + stq $2, 152($sp) /* HAE */ + mov $31, $19 /* to disable syscall restarts */ + br $31, ret_to_user + +.end ret_from_kernel_execve + /* * Special system calls. Most of these are special in that they either diff --git a/arch/alpha/kernel/process.c b/arch/alpha/kernel/process.c index 6b33ecd..f47d764 100644 --- a/arch/alpha/kernel/process.c +++ b/arch/alpha/kernel/process.c @@ -435,22 +435,3 @@ get_wchan(struct task_struct *p) } return pc; } - -int kernel_execve(const char *path, const char *const argv[], const char *const envp[]) -{ - /* Avoid the HAE being gratuitously wrong, which would cause us - to do the whole turn off interrupts thing and restore it. */ - struct pt_regs regs = {.hae = alpha_mv.hae_cache}; - int err = do_execve(path, argv, envp, ®s); - if (!err) { - struct pt_regs *p = current_pt_regs(); - /* copy regs to normal position and off to userland we go... */ - *p = regs; - __asm__ __volatile__ ( - "mov %0, $sp;" - "br $31, ret_from_sys_call" - : : "r"(p)); - } - return err; -} -EXPORT_SYMBOL(kernel_execve); |