aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/alpha/include/asm/unistd.h1
-rw-r--r--arch/alpha/kernel/entry.S13
-rw-r--r--arch/alpha/kernel/process.c19
3 files changed, 14 insertions, 19 deletions
diff --git a/arch/alpha/include/asm/unistd.h b/arch/alpha/include/asm/unistd.h
index 7826e227e4d..3cb6c118898 100644
--- a/arch/alpha/include/asm/unistd.h
+++ b/arch/alpha/include/asm/unistd.h
@@ -482,6 +482,7 @@
482#define __ARCH_WANT_SYS_SIGPENDING 482#define __ARCH_WANT_SYS_SIGPENDING
483#define __ARCH_WANT_SYS_RT_SIGSUSPEND 483#define __ARCH_WANT_SYS_RT_SIGSUSPEND
484#define __ARCH_WANT_SYS_EXECVE 484#define __ARCH_WANT_SYS_EXECVE
485#define __ARCH_WANT_KERNEL_EXECVE
485 486
486/* "Conditional" syscalls. What we want is 487/* "Conditional" syscalls. What we want is
487 488
diff --git a/arch/alpha/kernel/entry.S b/arch/alpha/kernel/entry.S
index 421dccf273e..7e43e1156d1 100644
--- a/arch/alpha/kernel/entry.S
+++ b/arch/alpha/kernel/entry.S
@@ -626,6 +626,19 @@ ret_from_kernel_thread:
626 jmp $31, sys_exit 626 jmp $31, sys_exit
627.end ret_from_kernel_thread 627.end ret_from_kernel_thread
628 628
629 .globl ret_from_kernel_execve
630 .align 4
631 .ent ret_from_kernel_execve
632ret_from_kernel_execve:
633 mov $16, $sp
634 /* Avoid the HAE being gratuitously wrong, to avoid restoring it. */
635 ldq $2, alpha_mv+HAE_CACHE
636 stq $2, 152($sp) /* HAE */
637 mov $31, $19 /* to disable syscall restarts */
638 br $31, ret_to_user
639
640.end ret_from_kernel_execve
641
629 642
630/* 643/*
631 * Special system calls. Most of these are special in that they either 644 * 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 6b33ecdbc53..f47d764eaa1 100644
--- a/arch/alpha/kernel/process.c
+++ b/arch/alpha/kernel/process.c
@@ -435,22 +435,3 @@ get_wchan(struct task_struct *p)
435 } 435 }
436 return pc; 436 return pc;
437} 437}
438
439int kernel_execve(const char *path, const char *const argv[], const char *const envp[])
440{
441 /* Avoid the HAE being gratuitously wrong, which would cause us
442 to do the whole turn off interrupts thing and restore it. */
443 struct pt_regs regs = {.hae = alpha_mv.hae_cache};
444 int err = do_execve(path, argv, envp, &regs);
445 if (!err) {
446 struct pt_regs *p = current_pt_regs();
447 /* copy regs to normal position and off to userland we go... */
448 *p = regs;
449 __asm__ __volatile__ (
450 "mov %0, $sp;"
451 "br $31, ret_from_sys_call"
452 : : "r"(p));
453 }
454 return err;
455}
456EXPORT_SYMBOL(kernel_execve);