diff options
author | Huacai Chen <chenhuacai@loongson.cn> | 2023-08-26 22:21:57 +0800 |
---|---|---|
committer | Huacai Chen <chenhuacai@loongson.cn> | 2023-08-26 22:21:57 +0800 |
commit | 656f9aec07dba7c61d469727494a5d1b18d0bef4 (patch) | |
tree | eb7b6532106a1984a66ca59d5c3b5a7f7030e87a /arch/loongarch/kernel/ptrace.c | |
parent | c337c849ab528241897ddfb6f334912ead0bfd66 (diff) | |
download | linux-stable-656f9aec07dba7c61d469727494a5d1b18d0bef4.tar.gz linux-stable-656f9aec07dba7c61d469727494a5d1b18d0bef4.tar.bz2 linux-stable-656f9aec07dba7c61d469727494a5d1b18d0bef4.zip |
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@vger.kernel.org
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
Diffstat (limited to 'arch/loongarch/kernel/ptrace.c')
-rw-r--r-- | arch/loongarch/kernel/ptrace.c | 4 |
1 files changed, 4 insertions, 0 deletions
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); |