diff options
Diffstat (limited to 'arch/mips/kernel/process.c')
| -rw-r--r-- | arch/mips/kernel/process.c | 36 | 
1 files changed, 21 insertions, 15 deletions
diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c index ddc76103e78..0a1ec0f3bef 100644 --- a/arch/mips/kernel/process.c +++ b/arch/mips/kernel/process.c @@ -32,6 +32,7 @@  #include <asm/cpu.h>  #include <asm/dsp.h>  #include <asm/fpu.h> +#include <asm/msa.h>  #include <asm/pgtable.h>  #include <asm/mipsregs.h>  #include <asm/processor.h> @@ -60,15 +61,13 @@ void start_thread(struct pt_regs * regs, unsigned long pc, unsigned long sp)  	/* New thread loses kernel privileges. */  	status = regs->cp0_status & ~(ST0_CU0|ST0_CU1|ST0_FR|KU_MASK); -#ifdef CONFIG_64BIT -	status |= test_thread_flag(TIF_32BIT_REGS) ? 0 : ST0_FR; -#endif  	status |= KU_USER;  	regs->cp0_status = status;  	clear_used_math();  	clear_fpu_owner(); -	if (cpu_has_dsp) -		__init_dsp(); +	init_dsp(); +	clear_thread_flag(TIF_MSA_CTX_LIVE); +	disable_msa();  	regs->cp0_epc = pc;  	regs->regs[29] = sp;  } @@ -93,7 +92,9 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,  	preempt_disable(); -	if (is_fpu_owner()) +	if (is_msa_enabled()) +		save_msa(p); +	else if (is_fpu_owner())  		save_fp(p);  	if (cpu_has_dsp) @@ -139,13 +140,6 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,  	 */  	childregs->cp0_status &= ~(ST0_CU2|ST0_CU1); -#ifdef CONFIG_MIPS_MT_SMTC -	/* -	 * SMTC restores TCStatus after Status, and the CU bits -	 * are aliased there. -	 */ -	childregs->cp0_tcstatus &= ~(ST0_CU2|ST0_CU1); -#endif  	clear_tsk_thread_flag(p, TIF_USEDFPU);  #ifdef CONFIG_MIPS_MT_FPAFF @@ -161,7 +155,13 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,  /* Fill in the fpu structure for a core dump.. */  int dump_fpu(struct pt_regs *regs, elf_fpregset_t *r)  { -	memcpy(r, ¤t->thread.fpu, sizeof(current->thread.fpu)); +	int i; + +	for (i = 0; i < NUM_FPU_REGS; i++) +		memcpy(&r[i], ¤t->thread.fpu.fpr[i], sizeof(*r)); + +	memcpy(&r[NUM_FPU_REGS], ¤t->thread.fpu.fcr31, +	       sizeof(current->thread.fpu.fcr31));  	return 1;  } @@ -196,7 +196,13 @@ int dump_task_regs(struct task_struct *tsk, elf_gregset_t *regs)  int dump_task_fpu(struct task_struct *t, elf_fpregset_t *fpr)  { -	memcpy(fpr, &t->thread.fpu, sizeof(current->thread.fpu)); +	int i; + +	for (i = 0; i < NUM_FPU_REGS; i++) +		memcpy(&fpr[i], &t->thread.fpu.fpr[i], sizeof(*fpr)); + +	memcpy(&fpr[NUM_FPU_REGS], &t->thread.fpu.fcr31, +	       sizeof(t->thread.fpu.fcr31));  	return 1;  }  | 
