diff options
| -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); | ||
