Commit 138d1ce8 authored by Al Viro's avatar Al Viro
Browse files

powerpc: switch to saner kernel_execve() semantics



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent ddffeb8c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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
+0 −1
Original line number Diff line number Diff line
@@ -56,7 +56,6 @@
#define __ARCH_WANT_COMPAT_SYS_SENDFILE
#endif
#define __ARCH_WANT_SYS_EXECVE
#define __ARCH_WANT_KERNEL_EXECVE

/*
 * "Conditional" syscalls
+0 −5
Original line number Diff line number Diff line
@@ -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 */
+0 −6
Original line number Diff line number Diff line
@@ -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"
+3 −10
Original line number Diff line number Diff line
@@ -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)
{