diff options
Diffstat (limited to 'arch/powerpc/kernel/process.c')
| -rw-r--r-- | arch/powerpc/kernel/process.c | 49 | 
1 files changed, 15 insertions, 34 deletions
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index 8fc4de0d22b4..639ceae7da9d 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c @@ -101,21 +101,8 @@ static void check_if_tm_restore_required(struct task_struct *tsk)  	}  } -static bool tm_active_with_fp(struct task_struct *tsk) -{ -	return MSR_TM_ACTIVE(tsk->thread.regs->msr) && -		(tsk->thread.ckpt_regs.msr & MSR_FP); -} - -static bool tm_active_with_altivec(struct task_struct *tsk) -{ -	return MSR_TM_ACTIVE(tsk->thread.regs->msr) && -		(tsk->thread.ckpt_regs.msr & MSR_VEC); -}  #else  static inline void check_if_tm_restore_required(struct task_struct *tsk) { } -static inline bool tm_active_with_fp(struct task_struct *tsk) { return false; } -static inline bool tm_active_with_altivec(struct task_struct *tsk) { return false; }  #endif /* CONFIG_PPC_TRANSACTIONAL_MEM */  bool strict_msr_control; @@ -252,7 +239,7 @@ EXPORT_SYMBOL(enable_kernel_fp);  static int restore_fp(struct task_struct *tsk)  { -	if (tsk->thread.load_fp || tm_active_with_fp(tsk)) { +	if (tsk->thread.load_fp) {  		load_fp_state(¤t->thread.fp_state);  		current->thread.load_fp++;  		return 1; @@ -334,8 +321,7 @@ EXPORT_SYMBOL_GPL(flush_altivec_to_thread);  static int restore_altivec(struct task_struct *tsk)  { -	if (cpu_has_feature(CPU_FTR_ALTIVEC) && -		(tsk->thread.load_vec || tm_active_with_altivec(tsk))) { +	if (cpu_has_feature(CPU_FTR_ALTIVEC) && (tsk->thread.load_vec)) {  		load_vr_state(&tsk->thread.vr_state);  		tsk->thread.used_vr = 1;  		tsk->thread.load_vec++; @@ -497,13 +483,14 @@ void giveup_all(struct task_struct *tsk)  	if (!tsk->thread.regs)  		return; +	check_if_tm_restore_required(tsk); +  	usermsr = tsk->thread.regs->msr;  	if ((usermsr & msr_all_available) == 0)  		return;  	msr_check_and_set(msr_all_available); -	check_if_tm_restore_required(tsk);  	WARN_ON((usermsr & MSR_VSX) && !((usermsr & MSR_FP) && (usermsr & MSR_VEC))); @@ -1600,8 +1587,9 @@ static void setup_ksp_vsid(struct task_struct *p, unsigned long sp)  /*   * Copy architecture-specific thread state   */ -int copy_thread(unsigned long clone_flags, unsigned long usp, -		unsigned long kthread_arg, struct task_struct *p) +int copy_thread_tls(unsigned long clone_flags, unsigned long usp, +		unsigned long kthread_arg, struct task_struct *p, +		unsigned long tls)  {  	struct pt_regs *childregs, *kregs;  	extern void ret_from_fork(void); @@ -1642,10 +1630,10 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,  		if (clone_flags & CLONE_SETTLS) {  #ifdef CONFIG_PPC64  			if (!is_32bit_task()) -				childregs->gpr[13] = childregs->gpr[6]; +				childregs->gpr[13] = tls;  			else  #endif -				childregs->gpr[2] = childregs->gpr[6]; +				childregs->gpr[2] = tls;  		}  		f = ret_from_fork; @@ -2046,10 +2034,8 @@ void show_stack(struct task_struct *tsk, unsigned long *stack)  	int count = 0;  	int firstframe = 1;  #ifdef CONFIG_FUNCTION_GRAPH_TRACER -	struct ftrace_ret_stack *ret_stack; -	extern void return_to_handler(void); -	unsigned long rth = (unsigned long)return_to_handler; -	int curr_frame = 0; +	unsigned long ret_addr; +	int ftrace_idx = 0;  #endif  	if (tsk == NULL) @@ -2078,15 +2064,10 @@ void show_stack(struct task_struct *tsk, unsigned long *stack)  		if (!firstframe || ip != lr) {  			printk("["REG"] ["REG"] %pS", sp, ip, (void *)ip);  #ifdef CONFIG_FUNCTION_GRAPH_TRACER -			if ((ip == rth) && curr_frame >= 0) { -				ret_stack = ftrace_graph_get_ret_stack(current, -								  curr_frame++); -				if (ret_stack) -					pr_cont(" (%pS)", -						(void *)ret_stack->ret); -				else -					curr_frame = -1; -			} +			ret_addr = ftrace_graph_ret_addr(current, +						&ftrace_idx, ip, stack); +			if (ret_addr != ip) +				pr_cont(" (%pS)", (void *)ret_addr);  #endif  			if (firstframe)  				pr_cont(" (unreliable)");  |