[PATCH 4.4 13/66] x86/fsgsbase/64: Report FSBASE and GSBASE correctly in core dumps

2017-09-24 Thread Greg Kroah-Hartman
4.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Andy Lutomirski 

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 
Cc: Borislav Petkov 
Cc: Borislav Petkov 
Cc: Brian Gerst 
Cc: Chang Seok 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Josh Poimboeuf 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Signed-off-by: Ingo Molnar 
Signed-off-by: Greg Kroah-Hartman 

---
 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.fs;  \
-   (pr_reg)[22] = current->thread.gs;  \
+   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;   \




[PATCH 4.4 13/66] x86/fsgsbase/64: Report FSBASE and GSBASE correctly in core dumps

2017-09-24 Thread Greg Kroah-Hartman
4.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Andy Lutomirski 

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 
Cc: Borislav Petkov 
Cc: Borislav Petkov 
Cc: Brian Gerst 
Cc: Chang Seok 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Josh Poimboeuf 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Signed-off-by: Ingo Molnar 
Signed-off-by: Greg Kroah-Hartman 

---
 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.fs;  \
-   (pr_reg)[22] = current->thread.gs;  \
+   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;   \