File s390-unwind-info.patch of Package glibc.26367
2017-11-21 Stefan Liebler <stli@linux.vnet.ibm.com>
* sysdeps/s390/s390-64/start.S (_start): Add cfi information for r14.
* sysdeps/s390/s390-32/start.S (_start): Likewise
* sysdeps/unix/sysv/linux/s390/s390-64/clone.S
(thread_start): Likewise.
* sysdeps/unix/sysv/linux/s390/s390-32/clone.S
(thread_start): Likewise.
* sysdeps/unix/sysv/linux/s390/s390-64/__makecontext_ret.S
(__makecontext_ret): Likewise.
* sysdeps/unix/sysv/linux/s390/s390-32/__makecontext_ret.S
(__makecontext_ret): Likewise.
Index: glibc-2.22/sysdeps/s390/s390-32/start.S
===================================================================
--- glibc-2.22.orig/sysdeps/s390/s390-32/start.S
+++ glibc-2.22/sysdeps/s390/s390-32/start.S
@@ -34,6 +34,8 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
+#include <sysdep.h>
+
/*
This is the canonical entry point, usually the first thing in the text
segment. Most registers' values are unspecified, except for:
@@ -57,6 +59,10 @@
.globl _start
.type _start,@function
_start:
+ cfi_startproc
+ /* Mark r14 as undefined in order to stop unwinding here! */
+ cfi_undefined (r14)
+
/* Check if the kernel provides highgprs facility if needed by
the binary. */
@@ -188,6 +194,7 @@ _start:
/* crash if __libc_start_main returns */
.word 0
+ cfi_endproc
.Llit:
#ifndef PIC
.L1: .long __libc_csu_init
Index: glibc-2.22/sysdeps/s390/s390-64/start.S
===================================================================
--- glibc-2.22.orig/sysdeps/s390/s390-64/start.S
+++ glibc-2.22/sysdeps/s390/s390-64/start.S
@@ -34,6 +34,8 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
+#include <sysdep.h>
+
/*
This is the canonical entry point, usually the first thing in the text
segment. Most registers' values are unspecified, except for:
@@ -57,6 +59,9 @@
.globl _start
.type _start,@function
_start:
+ cfi_startproc
+ /* Mark r14 as undefined in order to stop unwinding here! */
+ cfi_undefined (r14)
/* Load argc and argv from stack. */
la %r4,8(%r15) # get argv
lg %r3,0(%r15) # get argc
@@ -91,6 +96,8 @@ _start:
/* Crash if __libc_start_main returns. */
.word 0
+ cfi_endproc
+
/* Define a symbol for the first piece of initialized data. */
.data
.globl __data_start
Index: glibc-2.22/sysdeps/unix/sysv/linux/s390/s390-32/__makecontext_ret.S
===================================================================
--- glibc-2.22.orig/sysdeps/unix/sysv/linux/s390/s390-32/__makecontext_ret.S
+++ glibc-2.22/sysdeps/unix/sysv/linux/s390/s390-32/__makecontext_ret.S
@@ -17,15 +17,9 @@
#include <sysdep.h>
-/* We do not want .eh_frame info so that __makecontext_ret stops unwinding
- if backtrace was called within a context created by makecontext. (There
- is also no .eh_frame info for _start or thread_start.) */
-#undef cfi_startproc
-#define cfi_startproc
-#undef cfi_endproc
-#define cfi_endproc
-
ENTRY(__makecontext_ret)
+ /* Mark r14 as undefined in order to stop unwinding here! */
+ cfi_undefined (r14)
basr %r14,%r7
ltr %r8,%r8 /* Check whether uc_link is 0. */
jz 1f
Index: glibc-2.22/sysdeps/unix/sysv/linux/s390/s390-32/clone.S
===================================================================
--- glibc-2.22.orig/sysdeps/unix/sysv/linux/s390/s390-32/clone.S
+++ glibc-2.22/sysdeps/unix/sysv/linux/s390/s390-32/clone.S
@@ -54,6 +54,9 @@ error:
PSEUDO_END (__clone)
thread_start:
+ cfi_startproc
+ /* Mark r14 as undefined in order to stop unwinding here! */
+ cfi_undefined (r14)
tmh %r3,1 /* CLONE_THREAD == 0x00010000 */
jne 1f
lhi %r2,-1
@@ -70,4 +73,5 @@ thread_start:
xc 0(4,%r15),0(%r15)
basr %r14,%r1 /* jump to fn */
DO_CALL (exit, 1)
+ cfi_endproc
weak_alias (__clone, clone)
Index: glibc-2.22/sysdeps/unix/sysv/linux/s390/s390-64/__makecontext_ret.S
===================================================================
--- glibc-2.22.orig/sysdeps/unix/sysv/linux/s390/s390-64/__makecontext_ret.S
+++ glibc-2.22/sysdeps/unix/sysv/linux/s390/s390-64/__makecontext_ret.S
@@ -17,15 +17,9 @@
#include <sysdep.h>
-/* We do not want .eh_frame info so that __makecontext_ret stops unwinding
- if backtrace was called within a context created by makecontext. (There
- is also no .eh_frame info for _start or thread_start.) */
-#undef cfi_startproc
-#define cfi_startproc
-#undef cfi_endproc
-#define cfi_endproc
-
ENTRY(__makecontext_ret)
+ /* Mark r14 as undefined in order to stop unwinding here! */
+ cfi_undefined (r14)
basr %r14,%r7
ltgr %r8,%r8 /* Check whether uc_link is 0. */
jz 1f
Index: glibc-2.22/sysdeps/unix/sysv/linux/s390/s390-64/clone.S
===================================================================
--- glibc-2.22.orig/sysdeps/unix/sysv/linux/s390/s390-64/clone.S
+++ glibc-2.22/sysdeps/unix/sysv/linux/s390/s390-64/clone.S
@@ -55,6 +55,9 @@ error:
PSEUDO_END (__clone)
thread_start:
+ cfi_startproc
+ /* Mark r14 as undefined in order to stop unwinding here! */
+ cfi_undefined (r14)
tmh %r3,1 /* CLONE_THREAD == 0x00010000 */
jne 1f
lhi %r2,-1
@@ -73,4 +76,5 @@ thread_start:
xc 0(8,%r15),0(%r15)
basr %r14,%r1 /* jump to fn */
DO_CALL (exit, 1)
+ cfi_endproc
weak_alias (__clone, clone)