| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- From 958fcb45b64535b87e3cfaef15a5cb41595e4187 Mon Sep 17 00:00:00 2001
- From: Andy Lutomirski <[email protected]>
- Date: Thu, 2 Nov 2017 00:59:01 -0700
- Subject: [PATCH 089/231] x86/entry/64: Simplify reg restore code in the
- standard IRET paths
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- CVE-2017-5754
- The old code restored all the registers with movq instead of pop.
- In theory, this was done because some CPUs have higher movq
- throughput, but any gain there would be tiny and is almost certainly
- outweighed by the higher text size.
- This saves 96 bytes of text.
- Signed-off-by: Andy Lutomirski <[email protected]>
- Cc: Borislav Petkov <[email protected]>
- Cc: Brian Gerst <[email protected]>
- Cc: Dave Hansen <[email protected]>
- Cc: Linus Torvalds <[email protected]>
- Cc: Peter Zijlstra <[email protected]>
- Cc: Thomas Gleixner <[email protected]>
- Link: http://lkml.kernel.org/r/ad82520a207ccd851b04ba613f4f752b33ac05f7.1509609304.git.luto@kernel.org
- Signed-off-by: Ingo Molnar <[email protected]>
- (cherry picked from commit e872045bfd9c465a8555bab4b8567d56a4d2d3bb)
- Signed-off-by: Andy Whitcroft <[email protected]>
- Signed-off-by: Kleber Sacilotto de Souza <[email protected]>
- (cherry picked from commit f926575cd370de4052e89477582b349af5664a56)
- Signed-off-by: Fabian Grünbichler <[email protected]>
- ---
- arch/x86/entry/calling.h | 21 +++++++++++++++++++++
- arch/x86/entry/entry_64.S | 12 ++++++------
- 2 files changed, 27 insertions(+), 6 deletions(-)
- diff --git a/arch/x86/entry/calling.h b/arch/x86/entry/calling.h
- index 640aafebdc00..0b9dd8123701 100644
- --- a/arch/x86/entry/calling.h
- +++ b/arch/x86/entry/calling.h
- @@ -151,6 +151,27 @@ For 32-bit we have the following conventions - kernel is built with
- UNWIND_HINT_REGS offset=\offset extra=0
- .endm
-
- + .macro POP_EXTRA_REGS
- + popq %r15
- + popq %r14
- + popq %r13
- + popq %r12
- + popq %rbp
- + popq %rbx
- + .endm
- +
- + .macro POP_C_REGS
- + popq %r11
- + popq %r10
- + popq %r9
- + popq %r8
- + popq %rax
- + popq %rcx
- + popq %rdx
- + popq %rsi
- + popq %rdi
- + .endm
- +
- .macro RESTORE_C_REGS_HELPER rstor_rax=1, rstor_rcx=1, rstor_r11=1, rstor_r8910=1, rstor_rdx=1
- .if \rstor_r11
- movq 6*8(%rsp), %r11
- diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S
- index 7c8258e3ad2d..a1a86e782a0e 100644
- --- a/arch/x86/entry/entry_64.S
- +++ b/arch/x86/entry/entry_64.S
- @@ -618,9 +618,9 @@ GLOBAL(swapgs_restore_regs_and_return_to_usermode)
- 1:
- #endif
- SWAPGS
- - RESTORE_EXTRA_REGS
- - RESTORE_C_REGS
- - REMOVE_PT_GPREGS_FROM_STACK 8
- + POP_EXTRA_REGS
- + POP_C_REGS
- + addq $8, %rsp /* skip regs->orig_ax */
- INTERRUPT_RETURN
-
-
- @@ -650,9 +650,9 @@ GLOBAL(restore_regs_and_return_to_kernel)
- ud2
- 1:
- #endif
- - RESTORE_EXTRA_REGS
- - RESTORE_C_REGS
- - REMOVE_PT_GPREGS_FROM_STACK 8
- + POP_EXTRA_REGS
- + POP_C_REGS
- + addq $8, %rsp /* skip regs->orig_ax */
- INTERRUPT_RETURN
-
- ENTRY(native_iret)
- --
- 2.14.2
|