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) |
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 7826e227e4d0..3cb6c1188984 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 421dccf273eb..7e43e1156d10 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 | ||
632 | ret_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 6b33ecdbc534..f47d764eaa11 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 | |||
439 | int 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, ®s); | ||
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 | } | ||
456 | EXPORT_SYMBOL(kernel_execve); | ||