powerpc: switch to saner kernel_execve() semantics
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Родитель
ddffeb8c4d
Коммит
138d1ce80e
|
@ -144,6 +144,7 @@ config PPC
|
|||
select GENERIC_KERNEL_THREAD
|
||||
select HAVE_MOD_ARCH_SPECIFIC
|
||||
select MODULES_USE_ELF_RELA
|
||||
select GENERIC_KERNEL_EXECVE
|
||||
|
||||
config EARLY_PRINTK
|
||||
bool
|
||||
|
|
|
@ -56,7 +56,6 @@
|
|||
#define __ARCH_WANT_COMPAT_SYS_SENDFILE
|
||||
#endif
|
||||
#define __ARCH_WANT_SYS_EXECVE
|
||||
#define __ARCH_WANT_KERNEL_EXECVE
|
||||
|
||||
/*
|
||||
* "Conditional" syscalls
|
||||
|
|
|
@ -444,11 +444,6 @@ ret_from_kernel_thread:
|
|||
PPC440EP_ERR42
|
||||
blrl
|
||||
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
|
||||
|
||||
/* Traced system call support */
|
||||
|
|
|
@ -378,12 +378,6 @@ _GLOBAL(ret_from_kernel_thread)
|
|||
mr r3,r15
|
||||
blrl
|
||||
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
|
||||
|
||||
.section ".toc","aw"
|
||||
|
|
|
@ -746,19 +746,21 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
|
|||
sp -= sizeof(struct pt_regs);
|
||||
childregs = (struct pt_regs *) sp;
|
||||
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));
|
||||
childregs->gpr[1] = sp + sizeof(struct pt_regs);
|
||||
#ifdef CONFIG_PPC64
|
||||
childregs->gpr[14] = *(unsigned long *)usp;
|
||||
childregs->gpr[2] = ((unsigned long *)usp)[1],
|
||||
clear_tsk_thread_flag(p, TIF_32BIT);
|
||||
childregs->softe = 1;
|
||||
#else
|
||||
childregs->gpr[14] = usp; /* function */
|
||||
childregs->gpr[2] = (unsigned long) p;
|
||||
#endif
|
||||
childregs->gpr[15] = arg;
|
||||
p->thread.regs = NULL; /* no user register state */
|
||||
ti->flags |= _TIF_RESTOREALL;
|
||||
f = ret_from_kernel_thread;
|
||||
} else {
|
||||
CHECK_FULL_REGS(regs);
|
||||
|
@ -1063,15 +1065,6 @@ int sys_vfork(unsigned long p1, unsigned long p2, unsigned long p3,
|
|||
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,
|
||||
unsigned long nbytes)
|
||||
{
|
||||
|
|
Загрузка…
Ссылка в новой задаче