Commit-ID:  778843f934e362ed4ed734520f60a44a78a074b4
Gitweb:     http://git.kernel.org/tip/778843f934e362ed4ed734520f60a44a78a074b4
Author:     Denys Vlasenko <[email protected]>
AuthorDate: Mon, 2 May 2016 16:56:50 +0200
Committer:  Ingo Molnar <[email protected]>
CommitDate: Tue, 3 May 2016 08:19:40 +0200

x86/asm/entry/32: Simplify pushes of zeroed pt_regs->REGs

Use of a temporary R8 register here seems to be unnecessary.

"push %r8" is a two-byte insn (it needs REX prefix to specify R8),
"push $0" is two-byte too. It seems just using the latter would be
no worse.

Thus, code had an unnecessary "xorq %r8,%r8" insn.
It probably costs nothing in execution time here since we are probably
limited by store bandwidth at this point, but still.

Run-tested under QEMU: 32-bit calls still work:

 / # ./test_syscall_vdso32
 [RUN]  Executing 6-argument 32-bit syscall via VDSO
 [OK]   Arguments are preserved across syscall
 [NOTE] R11 has changed:0000000000200ed7 - assuming clobbered by SYSRET insn
 [OK]   R8..R15 did not leak kernel data
 [RUN]  Executing 6-argument 32-bit syscall via INT 80
 [OK]   Arguments are preserved across syscall
 [OK]   R8..R15 did not leak kernel data
 [RUN]  Running tests under ptrace
 [RUN]  Executing 6-argument 32-bit syscall via VDSO
 [OK]   Arguments are preserved across syscall
 [NOTE] R11 has changed:0000000000200ed7 - assuming clobbered by SYSRET insn
 [OK]   R8..R15 did not leak kernel data
 [RUN]  Executing 6-argument 32-bit syscall via INT 80
 [OK]   Arguments are preserved across syscall
 [OK]   R8..R15 did not leak kernel data

Signed-off-by: Denys Vlasenko <[email protected]>
Acked-by: Andy Lutomirski <[email protected]>
Cc: Andy Lutomirski <[email protected]>
Cc: Borislav Petkov <[email protected]>
Cc: Brian Gerst <[email protected]>
Cc: Frederic Weisbecker <[email protected]>
Cc: H. Peter Anvin <[email protected]>
Cc: Kees Cook <[email protected]>
Cc: Linus Torvalds <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Steven Rostedt <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: Will Drewry <[email protected]>
Cc: [email protected]
Link: 
http://lkml.kernel.org/r/[email protected]
Signed-off-by: Ingo Molnar <[email protected]>
---
 arch/x86/entry/entry_64_compat.S | 45 +++++++++++++++++++---------------------
 1 file changed, 21 insertions(+), 24 deletions(-)

diff --git a/arch/x86/entry/entry_64_compat.S b/arch/x86/entry/entry_64_compat.S
index 847f2f0..e1721da 100644
--- a/arch/x86/entry/entry_64_compat.S
+++ b/arch/x86/entry/entry_64_compat.S
@@ -72,24 +72,23 @@ ENTRY(entry_SYSENTER_compat)
        pushfq                          /* pt_regs->flags (except IF = 0) */
        orl     $X86_EFLAGS_IF, (%rsp)  /* Fix saved flags */
        pushq   $__USER32_CS            /* pt_regs->cs */
-       xorq    %r8,%r8
-       pushq   %r8                     /* pt_regs->ip = 0 (placeholder) */
+       pushq   $0                      /* pt_regs->ip = 0 (placeholder) */
        pushq   %rax                    /* pt_regs->orig_ax */
        pushq   %rdi                    /* pt_regs->di */
        pushq   %rsi                    /* pt_regs->si */
        pushq   %rdx                    /* pt_regs->dx */
        pushq   %rcx                    /* pt_regs->cx */
        pushq   $-ENOSYS                /* pt_regs->ax */
-       pushq   %r8                     /* pt_regs->r8  = 0 */
-       pushq   %r8                     /* pt_regs->r9  = 0 */
-       pushq   %r8                     /* pt_regs->r10 = 0 */
-       pushq   %r8                     /* pt_regs->r11 = 0 */
+       pushq   $0                      /* pt_regs->r8  = 0 */
+       pushq   $0                      /* pt_regs->r9  = 0 */
+       pushq   $0                      /* pt_regs->r10 = 0 */
+       pushq   $0                      /* pt_regs->r11 = 0 */
        pushq   %rbx                    /* pt_regs->rbx */
        pushq   %rbp                    /* pt_regs->rbp (will be overwritten) */
-       pushq   %r8                     /* pt_regs->r12 = 0 */
-       pushq   %r8                     /* pt_regs->r13 = 0 */
-       pushq   %r8                     /* pt_regs->r14 = 0 */
-       pushq   %r8                     /* pt_regs->r15 = 0 */
+       pushq   $0                      /* pt_regs->r12 = 0 */
+       pushq   $0                      /* pt_regs->r13 = 0 */
+       pushq   $0                      /* pt_regs->r14 = 0 */
+       pushq   $0                      /* pt_regs->r15 = 0 */
        cld
 
        /*
@@ -205,17 +204,16 @@ ENTRY(entry_SYSCALL_compat)
        pushq   %rdx                    /* pt_regs->dx */
        pushq   %rbp                    /* pt_regs->cx (stashed in bp) */
        pushq   $-ENOSYS                /* pt_regs->ax */
-       xorq    %r8,%r8
-       pushq   %r8                     /* pt_regs->r8  = 0 */
-       pushq   %r8                     /* pt_regs->r9  = 0 */
-       pushq   %r8                     /* pt_regs->r10 = 0 */
-       pushq   %r8                     /* pt_regs->r11 = 0 */
+       pushq   $0                      /* pt_regs->r8  = 0 */
+       pushq   $0                      /* pt_regs->r9  = 0 */
+       pushq   $0                      /* pt_regs->r10 = 0 */
+       pushq   $0                      /* pt_regs->r11 = 0 */
        pushq   %rbx                    /* pt_regs->rbx */
        pushq   %rbp                    /* pt_regs->rbp (will be overwritten) */
-       pushq   %r8                     /* pt_regs->r12 = 0 */
-       pushq   %r8                     /* pt_regs->r13 = 0 */
-       pushq   %r8                     /* pt_regs->r14 = 0 */
-       pushq   %r8                     /* pt_regs->r15 = 0 */
+       pushq   $0                      /* pt_regs->r12 = 0 */
+       pushq   $0                      /* pt_regs->r13 = 0 */
+       pushq   $0                      /* pt_regs->r14 = 0 */
+       pushq   $0                      /* pt_regs->r15 = 0 */
 
        /*
         * User mode is traced as though IRQs are on, and SYSENTER
@@ -316,11 +314,10 @@ ENTRY(entry_INT80_compat)
        pushq   %rdx                    /* pt_regs->dx */
        pushq   %rcx                    /* pt_regs->cx */
        pushq   $-ENOSYS                /* pt_regs->ax */
-       xorq    %r8,%r8
-       pushq   %r8                     /* pt_regs->r8  = 0 */
-       pushq   %r8                     /* pt_regs->r9  = 0 */
-       pushq   %r8                     /* pt_regs->r10 = 0 */
-       pushq   %r8                     /* pt_regs->r11 = 0 */
+       pushq   $0                      /* pt_regs->r8  = 0 */
+       pushq   $0                      /* pt_regs->r9  = 0 */
+       pushq   $0                      /* pt_regs->r10 = 0 */
+       pushq   $0                      /* pt_regs->r11 = 0 */
        pushq   %rbx                    /* pt_regs->rbx */
        pushq   %rbp                    /* pt_regs->rbp */
        pushq   %r12                    /* pt_regs->r12 */

Reply via email to