| From 9584d98bed7a7a904d0702ad06bbcc94703cb5b4 Mon Sep 17 00:00:00 2001 |
| From: Andy Lutomirski <luto@kernel.org> |
| Date: Tue, 1 Aug 2017 07:11:35 -0700 |
| Subject: x86/fsgsbase/64: Report FSBASE and GSBASE correctly in core dumps |
| |
| From: Andy Lutomirski <luto@kernel.org> |
| |
| commit 9584d98bed7a7a904d0702ad06bbcc94703cb5b4 upstream. |
| |
| In ELF_COPY_CORE_REGS, we're copying from the current task, so |
| accessing thread.fsbase and thread.gsbase makes no sense. Just read |
| the values from the CPU registers. |
| |
| In practice, the old code would have been correct most of the time |
| simply because thread.fsbase and thread.gsbase usually matched the |
| CPU registers. |
| |
| Signed-off-by: Andy Lutomirski <luto@kernel.org> |
| Cc: Borislav Petkov <bp@alien8.de> |
| Cc: Borislav Petkov <bpetkov@suse.de> |
| Cc: Brian Gerst <brgerst@gmail.com> |
| Cc: Chang Seok <chang.seok.bae@intel.com> |
| Cc: Denys Vlasenko <dvlasenk@redhat.com> |
| Cc: H. Peter Anvin <hpa@zytor.com> |
| Cc: Josh Poimboeuf <jpoimboe@redhat.com> |
| Cc: Linus Torvalds <torvalds@linux-foundation.org> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Signed-off-by: Ingo Molnar <mingo@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/include/asm/elf.h | 5 +++-- |
| 1 file changed, 3 insertions(+), 2 deletions(-) |
| |
| --- a/arch/x86/include/asm/elf.h |
| +++ b/arch/x86/include/asm/elf.h |
| @@ -204,6 +204,7 @@ void set_personality_ia32(bool); |
| |
| #define ELF_CORE_COPY_REGS(pr_reg, regs) \ |
| do { \ |
| + unsigned long base; \ |
| unsigned v; \ |
| (pr_reg)[0] = (regs)->r15; \ |
| (pr_reg)[1] = (regs)->r14; \ |
| @@ -226,8 +227,8 @@ do { \ |
| (pr_reg)[18] = (regs)->flags; \ |
| (pr_reg)[19] = (regs)->sp; \ |
| (pr_reg)[20] = (regs)->ss; \ |
| - (pr_reg)[21] = current->thread.fsbase; \ |
| - (pr_reg)[22] = current->thread.gsbase; \ |
| + rdmsrl(MSR_FS_BASE, base); (pr_reg)[21] = base; \ |
| + rdmsrl(MSR_KERNEL_GS_BASE, base); (pr_reg)[22] = base; \ |
| asm("movl %%ds,%0" : "=r" (v)); (pr_reg)[23] = v; \ |
| asm("movl %%es,%0" : "=r" (v)); (pr_reg)[24] = v; \ |
| asm("movl %%fs,%0" : "=r" (v)); (pr_reg)[25] = v; \ |