Merge branch 'x86-asm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 13 Aug 2018 20:35:26 +0000 (13:35 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 13 Aug 2018 20:35:26 +0000 (13:35 -0700)
Pull x86 asm updates from Thomas Gleixner:
 "The lowlevel and ASM code updates for x86:

   - Make stack trace unwinding more reliable

   - ASM instruction updates for better code generation

   - Various cleanups"

* 'x86-asm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86/entry/64: Add two more instruction suffixes
  x86/asm/64: Use 32-bit XOR to zero registers
  x86/build/vdso: Simplify 'cmd_vdso2c'
  x86/build/vdso: Remove unused vdso-syms.lds
  x86/stacktrace: Enable HAVE_RELIABLE_STACKTRACE for the ORC unwinder
  x86/unwind/orc: Detect the end of the stack
  x86/stacktrace: Do not fail for ORC with regs on stack
  x86/stacktrace: Clarify the reliable success paths
  x86/stacktrace: Remove STACKTRACE_DUMP_ONCE
  x86/stacktrace: Do not unwind after user regs
  x86/asm: Use CC_SET/CC_OUT in percpu_cmpxchg8b_double() to micro-optimize code generation

1  2 
arch/x86/Kconfig
arch/x86/crypto/aegis128-aesni-asm.S
arch/x86/crypto/aegis128l-aesni-asm.S
arch/x86/crypto/aegis256-aesni-asm.S
arch/x86/crypto/morus1280-avx2-asm.S
arch/x86/crypto/morus1280-sse2-asm.S
arch/x86/crypto/morus640-sse2-asm.S
arch/x86/entry/entry_64.S
tools/objtool/check.c

diff --combined arch/x86/Kconfig
index 887d3a7bb64633dd0df064ef23b037c281d0ec29,c4d64b19acff62387be7dd2d5b54aeb23e4c7e4f..6d4774f203d00f7e127e9f5a95b9db42122aa5da
@@@ -63,7 -63,7 +63,7 @@@ config X8
        select ARCH_HAS_PTE_SPECIAL
        select ARCH_HAS_REFCOUNT
        select ARCH_HAS_UACCESS_FLUSHCACHE      if X86_64
 -      select ARCH_HAS_UACCESS_MCSAFE          if X86_64
 +      select ARCH_HAS_UACCESS_MCSAFE          if X86_64 && X86_MCE
        select ARCH_HAS_SET_MEMORY
        select ARCH_HAS_SG_CHAIN
        select ARCH_HAS_STRICT_KERNEL_RWX
        select HAVE_PERF_USER_STACK_DUMP
        select HAVE_RCU_TABLE_FREE
        select HAVE_REGS_AND_STACK_ACCESS_API
-       select HAVE_RELIABLE_STACKTRACE         if X86_64 && UNWINDER_FRAME_POINTER && STACK_VALIDATION
+       select HAVE_RELIABLE_STACKTRACE         if X86_64 && (UNWINDER_FRAME_POINTER || UNWINDER_ORC) && STACK_VALIDATION
        select HAVE_STACKPROTECTOR              if CC_HAS_SANE_STACKPROTECTOR
        select HAVE_STACK_VALIDATION            if X86_64
        select HAVE_RSEQ
index 717bf07764210f065315d7e3afa09774d9a87efe,d5c5e2082ae7ee933145cdb6db415bdda4371080..5f7e43d4f64a0c08dd32e3ba767e1726b357452d
@@@ -75,7 -75,7 +75,7 @@@
   *   %r9
   */
  __load_partial:
-       xor %r9, %r9
+       xor %r9d, %r9d
        pxor MSG, MSG
  
        mov LEN, %r8
@@@ -535,7 -535,6 +535,7 @@@ ENTRY(crypto_aegis128_aesni_enc_tail
        movdqu STATE3, 0x40(STATEP)
  
        FRAME_END
 +      ret
  ENDPROC(crypto_aegis128_aesni_enc_tail)
  
  .macro decrypt_block a s0 s1 s2 s3 s4 i
index 4eda2b8db9e1b08d4af85e37c6cf19039bc9220b,0fbdf5f00bda5ca64897132c5ef5bca00ff7f11b..491dd61c845ce4402ae38c988b585a56057f66f4
@@@ -66,7 -66,7 +66,7 @@@
   *   %r9
   */
  __load_partial:
-       xor %r9, %r9
+       xor %r9d, %r9d
        pxor MSG0, MSG0
        pxor MSG1, MSG1
  
@@@ -645,7 -645,6 +645,7 @@@ ENTRY(crypto_aegis128l_aesni_enc_tail
        state_store0
  
        FRAME_END
 +      ret
  ENDPROC(crypto_aegis128l_aesni_enc_tail)
  
  /*
index 32aae83972680731a4f36f92b608344d15339d9f,a49f58e2a5ddc491e29131d288d6f4157f9d1fb4..8870c7c5d9a4df035b84ac3d66074d802b3498ee
@@@ -59,7 -59,7 +59,7 @@@
   *   %r9
   */
  __load_partial:
-       xor %r9, %r9
+       xor %r9d, %r9d
        pxor MSG, MSG
  
        mov LEN, %r8
@@@ -543,7 -543,6 +543,7 @@@ ENTRY(crypto_aegis256_aesni_enc_tail
        state_store0
  
        FRAME_END
 +      ret
  ENDPROC(crypto_aegis256_aesni_enc_tail)
  
  /*
index 07653d4582a66b45370fa764747e5fa1056ef748,c3f74913476c4a54bfcc54b679288c29146c9793..de182c460f82a2fc585bcc51f4b2b1669c3aead4
@@@ -113,7 -113,7 +113,7 @@@ ENDPROC(__morus1280_update_zero
   *   %r9
   */
  __load_partial:
-       xor %r9, %r9
+       xor %r9d, %r9d
        vpxor MSG, MSG, MSG
  
        mov %rcx, %r8
@@@ -453,7 -453,6 +453,7 @@@ ENTRY(crypto_morus1280_avx2_enc_tail
        vmovdqu STATE4, (4 * 32)(%rdi)
  
        FRAME_END
 +      ret
  ENDPROC(crypto_morus1280_avx2_enc_tail)
  
  /*
index bd1aa1b608698fd50c967a250dc257a89b5fa3b4,b3f4d103ba06afa2f12d41944cf17558d6e2cba1..da5d2905db6024c7aa2ceb1a2c5e9714522a80fa
@@@ -235,7 -235,7 +235,7 @@@ ENDPROC(__morus1280_update_zero
   *   %r9
   */
  __load_partial:
-       xor %r9, %r9
+       xor %r9d, %r9d
        pxor MSG_LO, MSG_LO
        pxor MSG_HI, MSG_HI
  
@@@ -652,7 -652,6 +652,7 @@@ ENTRY(crypto_morus1280_sse2_enc_tail
        movdqu STATE4_HI, (9 * 16)(%rdi)
  
        FRAME_END
 +      ret
  ENDPROC(crypto_morus1280_sse2_enc_tail)
  
  /*
index efa02816d921c246b02a40a5b85e1396068c9beb,d2958a47fccc9b53b5033fb09506ffddd573c3d3..414db480250e1bbc1a45e619b6acb40c9f8a1f4b
@@@ -113,7 -113,7 +113,7 @@@ ENDPROC(__morus640_update_zero
   *   %r9
   */
  __load_partial:
-       xor %r9, %r9
+       xor %r9d, %r9d
        pxor MSG, MSG
  
        mov %rcx, %r8
@@@ -437,7 -437,6 +437,7 @@@ ENTRY(crypto_morus640_sse2_enc_tail
        movdqu STATE4, (4 * 16)(%rdi)
  
        FRAME_END
 +      ret
  ENDPROC(crypto_morus640_sse2_enc_tail)
  
  /*
index 8ae7ffda8f98e871a6d12b36f3c4fb223ebebc87,65aa16d845f602518a9581304dd2d0edccfc49a8..957dfb693eccd5152700ec87ab3811b8cfb93e56
@@@ -92,7 -92,7 +92,7 @@@ END(native_usergs_sysret64
  .endm
  
  .macro TRACE_IRQS_IRETQ_DEBUG
-       bt      $9, EFLAGS(%rsp)                /* interrupts off? */
+       btl     $9, EFLAGS(%rsp)                /* interrupts off? */
        jnc     1f
        TRACE_IRQS_ON_DEBUG
  1:
@@@ -408,6 -408,7 +408,7 @@@ ENTRY(ret_from_fork
  
  1:
        /* kernel thread */
+       UNWIND_HINT_EMPTY
        movq    %r12, %rdi
        CALL_NOSPEC %rbx
        /*
@@@ -701,7 -702,7 +702,7 @@@ retint_kernel
  #ifdef CONFIG_PREEMPT
        /* Interrupts are off */
        /* Check if we need preemption */
-       bt      $9, EFLAGS(%rsp)                /* were interrupts off? */
+       btl     $9, EFLAGS(%rsp)                /* were interrupts off? */
        jnc     1f
  0:    cmpl    $0, PER_CPU_VAR(__preempt_count)
        jnz     1f
@@@ -981,7 -982,7 +982,7 @@@ ENTRY(\sym
  
        call    \do_sym
  
 -      jmp     error_exit                      /* %ebx: no swapgs flag */
 +      jmp     error_exit
        .endif
  END(\sym)
  .endm
@@@ -1222,6 -1223,7 +1223,6 @@@ END(paranoid_exit
  
  /*
   * Save all registers in pt_regs, and switch GS if needed.
 - * Return: EBX=0: came from user mode; EBX=1: otherwise
   */
  ENTRY(error_entry)
        UNWIND_HINT_FUNC
         * for these here too.
         */
  .Lerror_kernelspace:
 -      incl    %ebx
        leaq    native_irq_return_iret(%rip), %rcx
        cmpq    %rcx, RIP+8(%rsp)
        je      .Lerror_bad_iret
  
        /*
         * Pretend that the exception came from user mode: set up pt_regs
 -       * as if we faulted immediately after IRET and clear EBX so that
 -       * error_exit knows that we will be returning to user mode.
 +       * as if we faulted immediately after IRET.
         */
        mov     %rsp, %rdi
        call    fixup_bad_iret
        mov     %rax, %rsp
 -      decl    %ebx
        jmp     .Lerror_entry_from_usermode_after_swapgs
  END(error_entry)
  
 -
 -/*
 - * On entry, EBX is a "return to kernel mode" flag:
 - *   1: already in kernel mode, don't need SWAPGS
 - *   0: user gsbase is loaded, we need SWAPGS and standard preparation for return to usermode
 - */
  ENTRY(error_exit)
        UNWIND_HINT_REGS
        DISABLE_INTERRUPTS(CLBR_ANY)
        TRACE_IRQS_OFF
 -      testl   %ebx, %ebx
 -      jnz     retint_kernel
 +      testb   $3, CS(%rsp)
 +      j     retint_kernel
        jmp     retint_user
  END(error_exit)
  
diff --combined tools/objtool/check.c
index f4a25bd1871fb856a8295b77c825323cd3f7fc25,8491beb1a636116af40b4b1c31ff5c0548552159..2928939b98ec208fee9069cfc3ddf4aea91f01f3
@@@ -164,7 -164,6 +164,7 @@@ static int __dead_end_function(struct o
                "lbug_with_loc",
                "fortify_panic",
                "usercopy_abort",
 +              "machine_real_restart",
        };
  
        if (func->bind == STB_WEAK)
@@@ -1157,6 -1156,7 +1157,7 @@@ static int read_unwind_hints(struct obj
  
                cfa->offset = hint->sp_offset;
                insn->state.type = hint->type;
+               insn->state.end = hint->end;
        }
  
        return 0;