]> sourceware.org Git - glibc.git/commitdiff
S390: Add CFI rule in _dl_runtime_resolve[_vx] for unwinding.
authorStefan Liebler <stli@linux.vnet.ibm.com>
Mon, 11 Dec 2017 07:47:51 +0000 (08:47 +0100)
committerStefan Liebler <stli@linux.vnet.ibm.com>
Mon, 11 Dec 2017 07:47:51 +0000 (08:47 +0100)
In _dl_runtime_resolve[_vx], unwinding fails after the new stack frame
is created as there is no CFI rule for r15. This is also observeable in
GDB: Backtrace stopped: previous frame inner to this frame (corrupt stack?)

Therefore this patch is now storing r15 on stack and is using cfi_offset rule.
The stmg/lmg instruction is used to store/load r14 and r15 with one instruction.
On 64bit, the offsets of the fprs have moved to store r15 directly after r14.
On 31bit, the r14/r15 is now stored between the other gprs and fprs as the space
wasn't used.

ChangeLog:

* sysdeps/s390/s390-64/dl-trampoline.h (_dl_runtime_resolve):
Store r15 on stack and add cfi rule.
* sysdeps/s390/s390-32/dl-trampoline.h (_dl_runtime_resolve):
Likewise.

ChangeLog
sysdeps/s390/s390-32/dl-trampoline.h
sysdeps/s390/s390-64/dl-trampoline.h

index 4e4ab69f10915ade73c96237c99a479a499ca15f..252c25c0fb429eb669dfa916f84e8ede6d8b1b95 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2017-12-11  Stefan Liebler  <stli@linux.vnet.ibm.com>
+
+       * sysdeps/s390/s390-64/dl-trampoline.h (_dl_runtime_resolve):
+       Store r15 on stack and add cfi rule.
+       * sysdeps/s390/s390-32/dl-trampoline.h (_dl_runtime_resolve):
+       Likewise.
+
 2017-12-10  Aurelien Jarno <aurelien@aurel32.net>
 
        [BZ #22577]
index 19776eec8a8aa91a84e729900a8bca0cbecacb7c..2d6a67474f05ab7ff8a95a05026dc7c9bc18b8a3 100644 (file)
@@ -51,12 +51,13 @@ _dl_runtime_resolve:
        cfi_offset (r3, -60)
        cfi_offset (r4, -56)
        cfi_offset (r5, -52)
+       stm    %r14,%r15,48(%r15)
+       cfi_offset (r14, -48)
+       cfi_offset (r15, -44)
        std    %f0,56(%r15)
        cfi_offset (f0, -40)
        std    %f2,64(%r15)
        cfi_offset (f2, -32)
-       st     %r14,8(%r15)
-       cfi_offset (r14, -88)
        lr     %r0,%r15
        lm     %r2,%r3,24(%r15)         # load args saved by PLT
 #ifdef RESTORE_VRS
@@ -90,13 +91,11 @@ _dl_runtime_resolve:
        .machinemode "zarch_nohighgprs"
        vlm    %v24,%v31,96(%r15)       # restore vector registers
        .machine pop
-       ahi   %r15,224                  # remove stack frame
-       cfi_adjust_cfa_offset (-224)
+       lm     %r14,%r15,272(%r15)# remove stack frame and restore registers
 #else
-       ahi    %r15,96                  # remove stack frame
-       cfi_adjust_cfa_offset (-96)
+       lm     %r14,%r15,144(%r15)# remove stack frame and restore registers
 #endif
-       l      %r14,8(15)               # restore registers
+       cfi_def_cfa_offset (96)
        ld     %f0,56(%r15)
        ld     %f2,64(%r15)
        lm     %r2,%r5,32(%r15)
index e1f95e2ecd56162d53d74776d6e1e9b1915458f6..29bdbb1196f98dd48bc65249af8959a5fee77b24 100644 (file)
@@ -47,16 +47,17 @@ _dl_runtime_resolve:
        cfi_offset (r3, -88)
        cfi_offset (r4, -80)
        cfi_offset (r5, -72)
-       std    %f0,104(%r15)
-       cfi_offset (f0, -56)
-       std    %f2,112(%r15)
-       cfi_offset (f2, -48)
-       std    %f4,120(%r15)
-       cfi_offset (f4, -40)
-       std    %f6,128(%r15)
-       cfi_offset (f6, -32)
-       stg    %r14,96(15)
+       stmg   %r14,%r15,96(%r15)
        cfi_offset (r14, -64)
+       cfi_offset (r15, -56)
+       std    %f0,112(%r15)
+       cfi_offset (f0, -48)
+       std    %f2,120(%r15)
+       cfi_offset (f2, -40)
+       std    %f4,128(%r15)
+       cfi_offset (f4, -32)
+       std    %f6,136(%r15)
+       cfi_offset (f6, -24)
        lmg    %r2,%r3,48(%r15) # load args for fixup saved by PLT
        lgr    %r0,%r15
 #ifdef RESTORE_VRS
@@ -86,17 +87,15 @@ _dl_runtime_resolve:
        .machine "z13"
        vlm    %v24,%v31,160(%r15)# restore vector registers
        .machine pop
-       aghi   %r15,288         # remove stack frame
-       cfi_adjust_cfa_offset (-288)
+       lmg    %r14,%r15,384(%r15)# remove stack frame and restore registers
 #else
-       aghi   %r15,160         # remove stack frame
-       cfi_adjust_cfa_offset (-160)
+       lmg    %r14,%r15,256(%r15)# remove stack frame and restore registers
 #endif
-       lg     %r14,96(%r15)    # restore registers
-       ld     %f0,104(%r15)
-       ld     %f2,112(%r15)
-       ld     %f4,120(%r15)
-       ld     %f6,128(%r15)
+       cfi_def_cfa_offset (160)
+       ld     %f0,112(%r15)
+       ld     %f2,120(%r15)
+       ld     %f4,128(%r15)
+       ld     %f6,136(%r15)
        lmg    %r2,%r5,64(%r15)
        br     %r1
        cfi_endproc
This page took 0.084224 seconds and 5 git commands to generate.