diff options
Diffstat (limited to 'arch/riscv/kernel/process.c')
| -rw-r--r-- | arch/riscv/kernel/process.c | 11 | 
1 files changed, 9 insertions, 2 deletions
diff --git a/arch/riscv/kernel/process.c b/arch/riscv/kernel/process.c index f23794bd1e90..fb3a082362eb 100644 --- a/arch/riscv/kernel/process.c +++ b/arch/riscv/kernel/process.c @@ -64,8 +64,14 @@ void start_thread(struct pt_regs *regs, unsigned long pc,  	unsigned long sp)  {  	regs->sstatus = SR_SPIE; -	if (has_fpu) +	if (has_fpu) {  		regs->sstatus |= SR_FS_INITIAL; +		/* +		 * Restore the initial value to the FP register +		 * before starting the user program. +		 */ +		fstate_restore(current, regs); +	}  	regs->sepc = pc;  	regs->sp = sp;  	set_fs(USER_DS); @@ -75,10 +81,11 @@ void flush_thread(void)  {  #ifdef CONFIG_FPU  	/* -	 * Reset FPU context +	 * Reset FPU state and context  	 *	frm: round to nearest, ties to even (IEEE default)  	 *	fflags: accrued exceptions cleared  	 */ +	fstate_off(current, task_pt_regs(current));  	memset(¤t->thread.fstate, 0, sizeof(current->thread.fstate));  #endif  }  |