提交 138d1ce8 编写于 作者: A Al Viro

powerpc: switch to saner kernel_execve() semantics

Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
上级 ddffeb8c
...@@ -144,6 +144,7 @@ config PPC ...@@ -144,6 +144,7 @@ config PPC
select GENERIC_KERNEL_THREAD select GENERIC_KERNEL_THREAD
select HAVE_MOD_ARCH_SPECIFIC select HAVE_MOD_ARCH_SPECIFIC
select MODULES_USE_ELF_RELA select MODULES_USE_ELF_RELA
select GENERIC_KERNEL_EXECVE
config EARLY_PRINTK config EARLY_PRINTK
bool bool
......
...@@ -56,7 +56,6 @@ ...@@ -56,7 +56,6 @@
#define __ARCH_WANT_COMPAT_SYS_SENDFILE #define __ARCH_WANT_COMPAT_SYS_SENDFILE
#endif #endif
#define __ARCH_WANT_SYS_EXECVE #define __ARCH_WANT_SYS_EXECVE
#define __ARCH_WANT_KERNEL_EXECVE
/* /*
* "Conditional" syscalls * "Conditional" syscalls
......
...@@ -444,11 +444,6 @@ ret_from_kernel_thread: ...@@ -444,11 +444,6 @@ ret_from_kernel_thread:
PPC440EP_ERR42 PPC440EP_ERR42
blrl blrl
li r3,0 li r3,0
b do_exit # no return
.globl __ret_from_kernel_execve
__ret_from_kernel_execve:
addi r1,r3,-STACK_FRAME_OVERHEAD
b ret_from_syscall b ret_from_syscall
/* Traced system call support */ /* Traced system call support */
......
...@@ -378,12 +378,6 @@ _GLOBAL(ret_from_kernel_thread) ...@@ -378,12 +378,6 @@ _GLOBAL(ret_from_kernel_thread)
mr r3,r15 mr r3,r15
blrl blrl
li r3,0 li r3,0
b .do_exit # no return
_GLOBAL(__ret_from_kernel_execve)
addi r1,r3,-STACK_FRAME_OVERHEAD
li r10,1
std r10,SOFTE(r1)
b syscall_exit b syscall_exit
.section ".toc","aw" .section ".toc","aw"
......
...@@ -746,19 +746,21 @@ int copy_thread(unsigned long clone_flags, unsigned long usp, ...@@ -746,19 +746,21 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
sp -= sizeof(struct pt_regs); sp -= sizeof(struct pt_regs);
childregs = (struct pt_regs *) sp; childregs = (struct pt_regs *) sp;
if (!regs) { if (!regs) {
/* for kernel thread, set `current' and stackptr in new task */ struct thread_info *ti = (void *)task_stack_page(p);
memset(childregs, 0, sizeof(struct pt_regs)); memset(childregs, 0, sizeof(struct pt_regs));
childregs->gpr[1] = sp + sizeof(struct pt_regs); childregs->gpr[1] = sp + sizeof(struct pt_regs);
#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC64
childregs->gpr[14] = *(unsigned long *)usp; childregs->gpr[14] = *(unsigned long *)usp;
childregs->gpr[2] = ((unsigned long *)usp)[1], childregs->gpr[2] = ((unsigned long *)usp)[1],
clear_tsk_thread_flag(p, TIF_32BIT); clear_tsk_thread_flag(p, TIF_32BIT);
childregs->softe = 1;
#else #else
childregs->gpr[14] = usp; /* function */ childregs->gpr[14] = usp; /* function */
childregs->gpr[2] = (unsigned long) p; childregs->gpr[2] = (unsigned long) p;
#endif #endif
childregs->gpr[15] = arg; childregs->gpr[15] = arg;
p->thread.regs = NULL; /* no user register state */ p->thread.regs = NULL; /* no user register state */
ti->flags |= _TIF_RESTOREALL;
f = ret_from_kernel_thread; f = ret_from_kernel_thread;
} else { } else {
CHECK_FULL_REGS(regs); CHECK_FULL_REGS(regs);
...@@ -1063,15 +1065,6 @@ int sys_vfork(unsigned long p1, unsigned long p2, unsigned long p3, ...@@ -1063,15 +1065,6 @@ int sys_vfork(unsigned long p1, unsigned long p2, unsigned long p3,
regs, 0, NULL, NULL); regs, 0, NULL, NULL);
} }
void __ret_from_kernel_execve(struct pt_regs *normal)
__noreturn;
void ret_from_kernel_execve(struct pt_regs *normal)
{
set_thread_flag(TIF_RESTOREALL);
__ret_from_kernel_execve(normal);
}
static inline int valid_irq_stack(unsigned long sp, struct task_struct *p, static inline int valid_irq_stack(unsigned long sp, struct task_struct *p,
unsigned long nbytes) unsigned long nbytes)
{ {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册