diff options
Diffstat (limited to 'arch/sparc/kernel/process_64.c')
| -rw-r--r-- | arch/sparc/kernel/process_64.c | 106 | 
1 files changed, 3 insertions, 103 deletions
| diff --git a/arch/sparc/kernel/process_64.c b/arch/sparc/kernel/process_64.c index 54945eacd3b5..a75093b993f9 100644 --- a/arch/sparc/kernel/process_64.c +++ b/arch/sparc/kernel/process_64.c @@ -572,47 +572,13 @@ barf:  	force_sig(SIGSEGV);  } -asmlinkage long sparc_do_fork(unsigned long clone_flags, -			      unsigned long stack_start, -			      struct pt_regs *regs, -			      unsigned long stack_size) -{ -	int __user *parent_tid_ptr, *child_tid_ptr; -	unsigned long orig_i1 = regs->u_regs[UREG_I1]; -	long ret; - -#ifdef CONFIG_COMPAT -	if (test_thread_flag(TIF_32BIT)) { -		parent_tid_ptr = compat_ptr(regs->u_regs[UREG_I2]); -		child_tid_ptr = compat_ptr(regs->u_regs[UREG_I4]); -	} else -#endif -	{ -		parent_tid_ptr = (int __user *) regs->u_regs[UREG_I2]; -		child_tid_ptr = (int __user *) regs->u_regs[UREG_I4]; -	} - -	ret = do_fork(clone_flags, stack_start, stack_size, -		      parent_tid_ptr, child_tid_ptr); - -	/* If we get an error and potentially restart the system -	 * call, we're screwed because copy_thread() clobbered -	 * the parent's %o1.  So detect that case and restore it -	 * here. -	 */ -	if ((unsigned long)ret >= -ERESTART_RESTARTBLOCK) -		regs->u_regs[UREG_I1] = orig_i1; - -	return ret; -} -  /* Copy a Sparc thread.  The fork() return value conventions   * under SunOS are nothing short of bletcherous:   * Parent -->  %o0 == childs  pid, %o1 == 0   * Child  -->  %o0 == parents pid, %o1 == 1   */ -int copy_thread(unsigned long clone_flags, unsigned long sp, -		unsigned long arg, struct task_struct *p) +int copy_thread(unsigned long clone_flags, unsigned long sp, unsigned long arg, +		struct task_struct *p, unsigned long tls)  {  	struct thread_info *t = task_thread_info(p);  	struct pt_regs *regs = current_pt_regs(); @@ -670,7 +636,7 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,  	regs->u_regs[UREG_I1] = 0;  	if (clone_flags & CLONE_SETTLS) -		t->kregs->u_regs[UREG_G7] = regs->u_regs[UREG_I3]; +		t->kregs->u_regs[UREG_G7] = tls;  	return 0;  } @@ -700,72 +666,6 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)  	return 0;  } -typedef struct { -	union { -		unsigned int	pr_regs[32]; -		unsigned long	pr_dregs[16]; -	} pr_fr; -	unsigned int __unused; -	unsigned int	pr_fsr; -	unsigned char	pr_qcnt; -	unsigned char	pr_q_entrysize; -	unsigned char	pr_en; -	unsigned int	pr_q[64]; -} elf_fpregset_t32; - -/* - * fill in the fpu structure for a core dump. - */ -int dump_fpu (struct pt_regs * regs, elf_fpregset_t * fpregs) -{ -	unsigned long *kfpregs = current_thread_info()->fpregs; -	unsigned long fprs = current_thread_info()->fpsaved[0]; - -	if (test_thread_flag(TIF_32BIT)) { -		elf_fpregset_t32 *fpregs32 = (elf_fpregset_t32 *)fpregs; - -		if (fprs & FPRS_DL) -			memcpy(&fpregs32->pr_fr.pr_regs[0], kfpregs, -			       sizeof(unsigned int) * 32); -		else -			memset(&fpregs32->pr_fr.pr_regs[0], 0, -			       sizeof(unsigned int) * 32); -		fpregs32->pr_qcnt = 0; -		fpregs32->pr_q_entrysize = 8; -		memset(&fpregs32->pr_q[0], 0, -		       (sizeof(unsigned int) * 64)); -		if (fprs & FPRS_FEF) { -			fpregs32->pr_fsr = (unsigned int) current_thread_info()->xfsr[0]; -			fpregs32->pr_en = 1; -		} else { -			fpregs32->pr_fsr = 0; -			fpregs32->pr_en = 0; -		} -	} else { -		if(fprs & FPRS_DL) -			memcpy(&fpregs->pr_regs[0], kfpregs, -			       sizeof(unsigned int) * 32); -		else -			memset(&fpregs->pr_regs[0], 0, -			       sizeof(unsigned int) * 32); -		if(fprs & FPRS_DU) -			memcpy(&fpregs->pr_regs[16], kfpregs+16, -			       sizeof(unsigned int) * 32); -		else -			memset(&fpregs->pr_regs[16], 0, -			       sizeof(unsigned int) * 32); -		if(fprs & FPRS_FEF) { -			fpregs->pr_fsr = current_thread_info()->xfsr[0]; -			fpregs->pr_gsr = current_thread_info()->gsr[0]; -		} else { -			fpregs->pr_fsr = fpregs->pr_gsr = 0; -		} -		fpregs->pr_fprs = fprs; -	} -	return 1; -} -EXPORT_SYMBOL(dump_fpu); -  unsigned long get_wchan(struct task_struct *task)  {  	unsigned long pc, fp, bias = 0; |