Commit 112ca94f authored by Huacai Chen's avatar Huacai Chen
Browse files

LoongArch: Save LBT before FPU in setup_sigcontext()



Now if preemption happens between protected_save_fpu_context() and
protected_save_lbt_context(), FTOP context is lost. Because FTOP is
saved by protected_save_lbt_context() but protected_save_fpu_context()
disables TM before that. So save LBT before FPU in setup_sigcontext()
to avoid this potential risk.

Signed-off-by: default avatarHanlu Li <lihanlu@loongson.cn>
Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
parent 63dbd8fb
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -677,6 +677,11 @@ static int setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc,
	for (i = 1; i < 32; i++)
		err |= __put_user(regs->regs[i], &sc->sc_regs[i]);

#ifdef CONFIG_CPU_HAS_LBT
	if (extctx->lbt.addr)
		err |= protected_save_lbt_context(extctx);
#endif

	if (extctx->lasx.addr)
		err |= protected_save_lasx_context(extctx);
	else if (extctx->lsx.addr)
@@ -684,11 +689,6 @@ static int setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc,
	else if (extctx->fpu.addr)
		err |= protected_save_fpu_context(extctx);

#ifdef CONFIG_CPU_HAS_LBT
	if (extctx->lbt.addr)
		err |= protected_save_lbt_context(extctx);
#endif

	/* Set the "end" magic */
	info = (struct sctx_info *)extctx->end.addr;
	err |= __put_user(0, &info->magic);