diff options
Diffstat (limited to 'arch/loongarch/kernel/process.c')
| -rw-r--r-- | arch/loongarch/kernel/process.c | 15 | 
1 files changed, 12 insertions, 3 deletions
diff --git a/arch/loongarch/kernel/process.c b/arch/loongarch/kernel/process.c index ba457e43f5be..3cb082e0c992 100644 --- a/arch/loongarch/kernel/process.c +++ b/arch/loongarch/kernel/process.c @@ -38,6 +38,7 @@  #include <asm/cpu.h>  #include <asm/elf.h>  #include <asm/fpu.h> +#include <asm/lbt.h>  #include <asm/io.h>  #include <asm/irq.h>  #include <asm/irq_regs.h> @@ -82,9 +83,11 @@ void start_thread(struct pt_regs *regs, unsigned long pc, unsigned long sp)  	euen = regs->csr_euen & ~(CSR_EUEN_FPEN);  	regs->csr_euen = euen;  	lose_fpu(0); +	lose_lbt(0);  	clear_thread_flag(TIF_LSX_CTX_LIVE);  	clear_thread_flag(TIF_LASX_CTX_LIVE); +	clear_thread_flag(TIF_LBT_CTX_LIVE);  	clear_used_math();  	regs->csr_era = pc;  	regs->regs[3] = sp; @@ -121,10 +124,14 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)  	preempt_enable(); -	if (used_math()) -		memcpy(dst, src, sizeof(struct task_struct)); -	else +	if (!used_math())  		memcpy(dst, src, offsetof(struct task_struct, thread.fpu.fpr)); +	else +		memcpy(dst, src, offsetof(struct task_struct, thread.lbt.scr0)); + +#ifdef CONFIG_CPU_HAS_LBT +	memcpy(&dst->thread.lbt, &src->thread.lbt, sizeof(struct loongarch_lbt)); +#endif  	return 0;  } @@ -189,8 +196,10 @@ out:  	ptrace_hw_copy_thread(p);  	clear_tsk_thread_flag(p, TIF_USEDFPU);  	clear_tsk_thread_flag(p, TIF_USEDSIMD); +	clear_tsk_thread_flag(p, TIF_USEDLBT);  	clear_tsk_thread_flag(p, TIF_LSX_CTX_LIVE);  	clear_tsk_thread_flag(p, TIF_LASX_CTX_LIVE); +	clear_tsk_thread_flag(p, TIF_LBT_CTX_LIVE);  	return 0;  }  |