On Sun, Aug 27, 2023 at 2:45 PM <gregkh@xxxxxxxxxxxxxxxxxxx> wrote: > > > The patch below does not apply to the 6.4-stable tree. > If someone wants it applied there, or to any other stable or longterm > tree, then please email the backport, including the original git commit > id to <stable@xxxxxxxxxxxxxxx>. > > To reproduce the conflict and resubmit, you may use the following commands: > > git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.4.y > git checkout FETCH_HEAD > git cherry-pick -x 656f9aec07dba7c61d469727494a5d1b18d0bef4 > # <resolve conflicts, build, test, etc.> > git commit -s > git send-email --to '<stable@xxxxxxxxxxxxxxx>' --in-reply-to '2023082705-predator-enjoyable-15fb@gregkh' --subject-prefix 'PATCH 6.4.y' HEAD^.. > > Possible dependencies: I'm sorry, this is my mistake. 6.4 also need to cut the simd_get() part, because simd is only supported since 6.5 Huacai > > > > thanks, > > greg k-h > > ------------------ original commit in Linus's tree ------------------ > > From 656f9aec07dba7c61d469727494a5d1b18d0bef4 Mon Sep 17 00:00:00 2001 > From: Huacai Chen <chenhuacai@xxxxxxxxxx> > Date: Sat, 26 Aug 2023 22:21:57 +0800 > Subject: [PATCH] LoongArch: Ensure FP/SIMD registers in the core dump file is > up to date > > This is a port of commit 379eb01c21795edb4c ("riscv: Ensure the value > of FP registers in the core dump file is up to date"). > > The values of FP/SIMD registers in the core dump file come from the > thread.fpu. However, kernel saves the FP/SIMD registers only before > scheduling out the process. If no process switch happens during the > exception handling, kernel will not have a chance to save the latest > values of FP/SIMD registers. So it may cause their values in the core > dump file incorrect. To solve this problem, force fpr_get()/simd_get() > to save the FP/SIMD registers into the thread.fpu if the target task > equals the current task. > > Cc: stable@xxxxxxxxxxxxxxx > Signed-off-by: Huacai Chen <chenhuacai@xxxxxxxxxxx> > > diff --git a/arch/loongarch/include/asm/fpu.h b/arch/loongarch/include/asm/fpu.h > index b541f6248837..c2d8962fda00 100644 > --- a/arch/loongarch/include/asm/fpu.h > +++ b/arch/loongarch/include/asm/fpu.h > @@ -173,16 +173,30 @@ static inline void restore_fp(struct task_struct *tsk) > _restore_fp(&tsk->thread.fpu); > } > > -static inline union fpureg *get_fpu_regs(struct task_struct *tsk) > +static inline void save_fpu_regs(struct task_struct *tsk) > { > + unsigned int euen; > + > if (tsk == current) { > preempt_disable(); > - if (is_fpu_owner()) > + > + euen = csr_read32(LOONGARCH_CSR_EUEN); > + > +#ifdef CONFIG_CPU_HAS_LASX > + if (euen & CSR_EUEN_LASXEN) > + _save_lasx(¤t->thread.fpu); > + else > +#endif > +#ifdef CONFIG_CPU_HAS_LSX > + if (euen & CSR_EUEN_LSXEN) > + _save_lsx(¤t->thread.fpu); > + else > +#endif > + if (euen & CSR_EUEN_FPEN) > _save_fp(¤t->thread.fpu); > + > preempt_enable(); > } > - > - return tsk->thread.fpu.fpr; > } > > static inline int is_simd_owner(void) > diff --git a/arch/loongarch/kernel/ptrace.c b/arch/loongarch/kernel/ptrace.c > index a0767c3a0f0a..f72adbf530c6 100644 > --- a/arch/loongarch/kernel/ptrace.c > +++ b/arch/loongarch/kernel/ptrace.c > @@ -147,6 +147,8 @@ static int fpr_get(struct task_struct *target, > { > int r; > > + save_fpu_regs(target); > + > if (sizeof(target->thread.fpu.fpr[0]) == sizeof(elf_fpreg_t)) > r = gfpr_get(target, &to); > else > @@ -278,6 +280,8 @@ static int simd_get(struct task_struct *target, > { > const unsigned int wr_size = NUM_FPU_REGS * regset->size; > > + save_fpu_regs(target); > + > if (!tsk_used_math(target)) { > /* The task hasn't used FP or LSX, fill with 0xff */ > copy_pad_fprs(target, regset, &to, 0); >