diff options
Diffstat (limited to 'arch/powerpc')
| -rw-r--r-- | arch/powerpc/Kconfig | 2 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/signal.h | 2 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/syscalls.h | 9 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/unistd.h | 4 | ||||
| -rw-r--r-- | arch/powerpc/kernel/entry_32.S | 5 | ||||
| -rw-r--r-- | arch/powerpc/kernel/entry_64.S | 8 | ||||
| -rw-r--r-- | arch/powerpc/kernel/process.c | 64 | 
7 files changed, 15 insertions, 79 deletions
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index a902a5c1c76..951a517a1a0 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -144,6 +144,8 @@ config PPC  	select GENERIC_KERNEL_THREAD  	select HAVE_MOD_ARCH_SPECIFIC  	select MODULES_USE_ELF_RELA +	select GENERIC_KERNEL_EXECVE +	select CLONE_BACKWARDS  config EARLY_PRINTK  	bool diff --git a/arch/powerpc/include/asm/signal.h b/arch/powerpc/include/asm/signal.h index 189998bb61c..a101637725a 100644 --- a/arch/powerpc/include/asm/signal.h +++ b/arch/powerpc/include/asm/signal.h @@ -3,6 +3,4 @@  #include <uapi/asm/signal.h> -struct pt_regs; -#define ptrace_signal_deliver(regs, cookie) do { } while (0)  #endif /* _ASM_POWERPC_SIGNAL_H */ diff --git a/arch/powerpc/include/asm/syscalls.h b/arch/powerpc/include/asm/syscalls.h index 329db4ec12c..b5308d3e6d3 100644 --- a/arch/powerpc/include/asm/syscalls.h +++ b/arch/powerpc/include/asm/syscalls.h @@ -17,15 +17,6 @@ asmlinkage unsigned long sys_mmap(unsigned long addr, size_t len,  asmlinkage unsigned long sys_mmap2(unsigned long addr, size_t len,  		unsigned long prot, unsigned long flags,  		unsigned long fd, unsigned long pgoff); -asmlinkage int sys_clone(unsigned long clone_flags, unsigned long usp, -		int __user *parent_tidp, void __user *child_threadptr, -		int __user *child_tidp, int p6, struct pt_regs *regs); -asmlinkage int sys_fork(unsigned long p1, unsigned long p2, -		unsigned long p3, unsigned long p4, unsigned long p5, -		unsigned long p6, struct pt_regs *regs); -asmlinkage int sys_vfork(unsigned long p1, unsigned long p2, -		unsigned long p3, unsigned long p4, unsigned long p5, -		unsigned long p6, struct pt_regs *regs);  asmlinkage long sys_pipe(int __user *fildes);  asmlinkage long sys_pipe2(int __user *fildes, int flags);  asmlinkage long sys_rt_sigaction(int sig, diff --git a/arch/powerpc/include/asm/unistd.h b/arch/powerpc/include/asm/unistd.h index 921dce6d844..76fe846ec40 100644 --- a/arch/powerpc/include/asm/unistd.h +++ b/arch/powerpc/include/asm/unistd.h @@ -56,7 +56,9 @@  #define __ARCH_WANT_COMPAT_SYS_SENDFILE  #endif  #define __ARCH_WANT_SYS_EXECVE -#define __ARCH_WANT_KERNEL_EXECVE +#define __ARCH_WANT_SYS_FORK +#define __ARCH_WANT_SYS_VFORK +#define __ARCH_WANT_SYS_CLONE  /*   * "Conditional" syscalls diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S index 9499385676e..d22e73e4618 100644 --- a/arch/powerpc/kernel/entry_32.S +++ b/arch/powerpc/kernel/entry_32.S @@ -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 */ diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index 56e0ff0878b..e9a906c2723 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S @@ -373,17 +373,11 @@ _GLOBAL(ret_from_fork)  _GLOBAL(ret_from_kernel_thread)  	bl	.schedule_tail  	REST_NVGPRS(r1) -	REST_GPR(2,r1) +	ld	r14, 0(r14)  	mtlr	r14  	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" diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index ba48233500f..81430674e71 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c @@ -733,8 +733,7 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)  extern unsigned long dscr_default; /* defined in arch/powerpc/kernel/sysfs.c */  int copy_thread(unsigned long clone_flags, unsigned long usp, -		unsigned long arg, struct task_struct *p, -		struct pt_regs *regs) +		unsigned long arg, struct task_struct *p)  {  	struct pt_regs *childregs, *kregs;  	extern void ret_from_fork(void); @@ -745,25 +744,25 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,  	/* Copy registers */  	sp -= sizeof(struct pt_regs);  	childregs = (struct pt_regs *) sp; -	if (!regs) { -		/* for kernel thread, set `current' and stackptr in new task */ +	if (unlikely(p->flags & PF_KTHREAD)) { +		struct thread_info *ti = (void *)task_stack_page(p);  		memset(childregs, 0, sizeof(struct pt_regs));  		childregs->gpr[1] = sp + sizeof(struct pt_regs); +		childregs->gpr[14] = usp;	/* function */  #ifdef CONFIG_PPC64 -		childregs->gpr[14] = *(unsigned long *)usp; -		childregs->gpr[2] = ((unsigned long *)usp)[1],  		clear_tsk_thread_flag(p, TIF_32BIT); -#else -		childregs->gpr[14] = usp;	/* function */ -		childregs->gpr[2] = (unsigned long) p; +		childregs->softe = 1;  #endif  		childregs->gpr[15] = arg;  		p->thread.regs = NULL;	/* no user register state */ +		ti->flags |= _TIF_RESTOREALL;  		f = ret_from_kernel_thread;  	} else { +		struct pt_regs *regs = current_pt_regs();  		CHECK_FULL_REGS(regs);  		*childregs = *regs; -		childregs->gpr[1] = usp; +		if (usp) +			childregs->gpr[1] = usp;  		p->thread.regs = childregs;  		childregs->gpr[3] = 0;  /* Result from fork() */  		if (clone_flags & CLONE_SETTLS) { @@ -1027,51 +1026,6 @@ int get_unalign_ctl(struct task_struct *tsk, unsigned long adr)  	return put_user(tsk->thread.align_ctl, (unsigned int __user *)adr);  } -#define TRUNC_PTR(x)	((typeof(x))(((unsigned long)(x)) & 0xffffffff)) - -int sys_clone(unsigned long clone_flags, unsigned long usp, -	      int __user *parent_tidp, void __user *child_threadptr, -	      int __user *child_tidp, int p6, -	      struct pt_regs *regs) -{ -	CHECK_FULL_REGS(regs); -	if (usp == 0) -		usp = regs->gpr[1];	/* stack pointer for child */ -#ifdef CONFIG_PPC64 -	if (is_32bit_task()) { -		parent_tidp = TRUNC_PTR(parent_tidp); -		child_tidp = TRUNC_PTR(child_tidp); -	} -#endif - 	return do_fork(clone_flags, usp, regs, 0, parent_tidp, child_tidp); -} - -int sys_fork(unsigned long p1, unsigned long p2, unsigned long p3, -	     unsigned long p4, unsigned long p5, unsigned long p6, -	     struct pt_regs *regs) -{ -	CHECK_FULL_REGS(regs); -	return do_fork(SIGCHLD, regs->gpr[1], regs, 0, NULL, NULL); -} - -int sys_vfork(unsigned long p1, unsigned long p2, unsigned long p3, -	      unsigned long p4, unsigned long p5, unsigned long p6, -	      struct pt_regs *regs) -{ -	CHECK_FULL_REGS(regs); -	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->gpr[1], -			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)  {  |