From: Al Viro Date: Fri, 1 Jun 2012 02:22:52 +0000 (-0400) Subject: alpha: introduce ret_from_kernel_execve(), switch to generic kernel_execve() X-Git-Tag: next-20120910~4^2~31 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=386e1c739c80490c756820e24414ed25621c8f6f;p=karo-tx-linux.git alpha: introduce ret_from_kernel_execve(), switch to generic kernel_execve() Signed-off-by: Al Viro --- diff --git a/arch/alpha/include/asm/unistd.h b/arch/alpha/include/asm/unistd.h index 7826e227e4d0..3cb6c1188984 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 61ff145cab6e..c89dff82375e 100644 --- a/arch/alpha/kernel/entry.S +++ b/arch/alpha/kernel/entry.S @@ -663,6 +663,31 @@ kernel_thread: br ret_to_kernel .end kernel_thread + .globl ret_from_kernel_execve + .align 4 + .ent ret_from_kernel_execve +ret_from_kernel_execve: + /* + * copy regs to normal position and off to userland we go... + * note that we are not guaranteed that we are deep enough + * in stack for current_pt_regs() not to overlap our stack + * frame; memcpy() would not be safe and we _must_ do + * everything starting from that memmove() in assembler. + * And we can't mangle $sp until after the call of memmove() + * either... + */ + lda $18, SIZEOF_PT_REGS + bsr $26, memmove !samegp + + /* Take that over as our new stack frame and visit userland! */ + mov $0, $sp + /* Avoid the HAE being gratuitously wrong, to avoid restoring it. */ + ldq $2, alpha_mv+HAE_CACHE + stq $2, 152($sp) /* HAE */ + 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 145473909199..948094543b8a 100644 --- a/arch/alpha/kernel/process.c +++ b/arch/alpha/kernel/process.c @@ -434,22 +434,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);