On Tue, Nov 07, 2017 at 07:09:20PM +0000, Maciej W. Rozycki wrote: > Fix a commit 7aeb753b5353 ("MIPS: Implement task_user_regset_view.") > regression, then activated by commit 6a9c001b7ec3 ("MIPS: Switch ELF > core dumper to use regsets.)", that caused n32 processes to dump o32 > core files by failing to set the EF_MIPS_ABI2 flag in the ELF core file > header's `e_flags' member: > > $ file tls-core > tls-core: ELF 32-bit MSB executable, MIPS, N32 MIPS64 rel2 version 1 (SYSV), [...] > $ ./tls-core > Aborted (core dumped) > $ file core > core: ELF 32-bit MSB core file MIPS, MIPS-I version 1 (SYSV), SVR4-style > $ > > Previously the flag was set as the result of a: > > #define ELF_CORE_EFLAGS EF_MIPS_ABI2 > > statement placed in arch/mips/kernel/binfmt_elfn32.c, however in the > regset case, i.e. when CORE_DUMP_USE_REGSET is set, ELF_CORE_EFLAGS is > no longer used by `fill_note_info' in fs/binfmt_elf.c, and instead the > `->e_flags' member of the regset view chosen is. We have the views > defined in arch/mips/kernel/ptrace.c, however only an o32 and an n64 > one, and the latter is used for n32 as well. Consequently an o32 core > file is incorrectly dumped from n32 processes (the ELF32 vs ELF64 class > is chosen elsewhere, and the 32-bit one is correctly selected for n32). > > Correct the issue then by defining an n32 regset view and using it as > appropriate. Issue discovered in GDB testing. > > Cc: stable@xxxxxxxxxxxxxxx # 3.13+ > Fixes: 7aeb753b5353 ("MIPS: Implement task_user_regset_view.") > Signed-off-by: Maciej W. Rozycki <macro@xxxxxxxx> Thanks, queued for 4.15. Cheers James > --- > arch/mips/kernel/ptrace.c | 17 +++++++++++++++++ > 1 file changed, 17 insertions(+) > > linux-mips-regset-view-n32-e-flags-abi2-init.diff > Index: linux-sfr/arch/mips/kernel/ptrace.c > =================================================================== > --- linux-sfr.orig/arch/mips/kernel/ptrace.c 2017-10-27 04:55:34.000000000 +0100 > +++ linux-sfr/arch/mips/kernel/ptrace.c 2017-10-27 20:07:14.933716000 +0100 > @@ -618,6 +618,19 @@ static const struct user_regset_view use > .n = ARRAY_SIZE(mips64_regsets), > }; > > +#ifdef CONFIG_MIPS32_N32 > + > +static const struct user_regset_view user_mipsn32_view = { > + .name = "mipsn32", > + .e_flags = EF_MIPS_ABI2, > + .e_machine = ELF_ARCH, > + .ei_osabi = ELF_OSABI, > + .regsets = mips64_regsets, > + .n = ARRAY_SIZE(mips64_regsets), > +}; > + > +#endif /* CONFIG_MIPS32_N32 */ > + > #endif /* CONFIG_64BIT */ > > const struct user_regset_view *task_user_regset_view(struct task_struct *task) > @@ -629,6 +642,10 @@ const struct user_regset_view *task_user > if (test_tsk_thread_flag(task, TIF_32BIT_REGS)) > return &user_mips_view; > #endif > +#ifdef CONFIG_MIPS32_N32 > + if (test_tsk_thread_flag(task, TIF_32BIT_ADDR)) > + return &user_mipsn32_view; > +#endif > return &user_mips64_view; > #endif > }
Attachment:
signature.asc
Description: Digital signature