Fix unwind info for some trivial functions
authorBernd Edlinger <bernd.edlinger@hotmail.de>
Tue, 17 Dec 2019 08:05:32 +0000 (09:05 +0100)
committerBernd Edlinger <bernd.edlinger@hotmail.de>
Wed, 18 Dec 2019 13:26:50 +0000 (14:26 +0100)
While stack unwinding works with gdb here, the
function _Unwind_Backtrace gives up when something outside
.cfi_startproc/.cfi_endproc is found in the call stack, like
OPENSSL_cleanse, OPENSSL_atomic_add, OPENSSL_rdtsc, CRYPTO_memcmp
and other trivial functions which don't save anything in the stack.

Reviewed-by: Richard Levitte <levitte@openssl.org>
Reviewed-by: Kurt Roeckx <kurt@roeckx.be>
(Merged from https://github.com/openssl/openssl/pull/10635)

crypto/x86_64cpuid.pl

index 43e53d6..c9d6364 100644 (file)
@@ -41,6 +41,7 @@ print<<___;
 .type  OPENSSL_atomic_add,\@abi-omnipotent
 .align 16
 OPENSSL_atomic_add:
+.cfi_startproc
        movl    ($arg1),%eax
 .Lspin:        leaq    ($arg2,%rax),%r8
        .byte   0xf0            # lock
@@ -49,16 +50,19 @@ OPENSSL_atomic_add:
        movl    %r8d,%eax
        .byte   0x48,0x98       # cltq/cdqe
        ret
+.cfi_endproc
 .size  OPENSSL_atomic_add,.-OPENSSL_atomic_add
 
 .globl OPENSSL_rdtsc
 .type  OPENSSL_rdtsc,\@abi-omnipotent
 .align 16
 OPENSSL_rdtsc:
+.cfi_startproc
        rdtsc
        shl     \$32,%rdx
        or      %rdx,%rax
        ret
+.cfi_endproc
 .size  OPENSSL_rdtsc,.-OPENSSL_rdtsc
 
 .globl OPENSSL_ia32_cpuid
@@ -234,6 +238,7 @@ OPENSSL_ia32_cpuid:
 .type   OPENSSL_cleanse,\@abi-omnipotent
 .align  16
 OPENSSL_cleanse:
+.cfi_startproc
        xor     %rax,%rax
        cmp     \$15,$arg2
        jae     .Lot
@@ -263,12 +268,14 @@ OPENSSL_cleanse:
        cmp     \$0,$arg2
        jne     .Little
        ret
+.cfi_endproc
 .size  OPENSSL_cleanse,.-OPENSSL_cleanse
 
 .globl  CRYPTO_memcmp
 .type   CRYPTO_memcmp,\@abi-omnipotent
 .align  16
 CRYPTO_memcmp:
+.cfi_startproc
        xor     %rax,%rax
        xor     %r10,%r10
        cmp     \$0,$arg3
@@ -297,6 +304,7 @@ CRYPTO_memcmp:
        shr     \$63,%rax
 .Lno_data:
        ret
+.cfi_endproc
 .size  CRYPTO_memcmp,.-CRYPTO_memcmp
 ___
 
@@ -305,6 +313,7 @@ print<<___ if (!$win64);
 .type  OPENSSL_wipe_cpu,\@abi-omnipotent
 .align 16
 OPENSSL_wipe_cpu:
+.cfi_startproc
        pxor    %xmm0,%xmm0
        pxor    %xmm1,%xmm1
        pxor    %xmm2,%xmm2
@@ -331,6 +340,7 @@ OPENSSL_wipe_cpu:
        xorq    %r11,%r11
        leaq    8(%rsp),%rax
        ret
+.cfi_endproc
 .size  OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
 ___
 print<<___ if ($win64);
@@ -367,6 +377,7 @@ print<<___;
 .type  OPENSSL_instrument_bus,\@abi-omnipotent
 .align 16
 OPENSSL_instrument_bus:
+.cfi_startproc
        mov     $arg1,$out      # tribute to Win64
        mov     $arg2,$cnt
        mov     $arg2,$max
@@ -393,12 +404,14 @@ OPENSSL_instrument_bus:
 
        mov     $max,%rax
        ret
+.cfi_endproc
 .size  OPENSSL_instrument_bus,.-OPENSSL_instrument_bus
 
 .globl OPENSSL_instrument_bus2
 .type  OPENSSL_instrument_bus2,\@abi-omnipotent
 .align 16
 OPENSSL_instrument_bus2:
+.cfi_startproc
        mov     $arg1,$out      # tribute to Win64
        mov     $arg2,$cnt
        mov     $arg3,$max
@@ -441,6 +454,7 @@ OPENSSL_instrument_bus2:
        mov     $redzone(%rsp),%rax
        sub     $cnt,%rax
        ret
+.cfi_endproc
 .size  OPENSSL_instrument_bus2,.-OPENSSL_instrument_bus2
 ___
 }
@@ -452,6 +466,7 @@ print<<___;
 .type  OPENSSL_ia32_${rdop}_bytes,\@abi-omnipotent
 .align 16
 OPENSSL_ia32_${rdop}_bytes:
+.cfi_startproc
        xor     %rax, %rax      # return value
        cmp     \$0,$arg2
        je      .Ldone_${rdop}_bytes
@@ -488,6 +503,7 @@ OPENSSL_ia32_${rdop}_bytes:
 .Ldone_${rdop}_bytes:
        xor     %r10,%r10       # Clear sensitive data from register
        ret
+.cfi_endproc
 .size  OPENSSL_ia32_${rdop}_bytes,.-OPENSSL_ia32_${rdop}_bytes
 ___
 }