about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog13
-rw-r--r--sysdeps/s390/s390-32/start.S7
-rw-r--r--sysdeps/s390/s390-64/start.S7
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/__makecontext_ret.S10
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/clone.S4
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/__makecontext_ret.S10
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/clone.S4
7 files changed, 39 insertions, 16 deletions
diff --git a/ChangeLog b/ChangeLog
index ca6024c35c..f9e2e18e50 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,18 @@
 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.
+
+2017-11-21  Stefan Liebler  <stli@linux.vnet.ibm.com>
+
 	* include/wchar.h (__wcsnlen, __wcscat, __wcsncpy, __wcpncpy,
 	__wcschrnul): Remove attribute_hidden.
 
diff --git a/sysdeps/s390/s390-32/start.S b/sysdeps/s390/s390-32/start.S
index 07400f1752..66c00f3b0a 100644
--- a/sysdeps/s390/s390-32/start.S
+++ b/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
diff --git a/sysdeps/s390/s390-64/start.S b/sysdeps/s390/s390-64/start.S
index d8e65450d8..d3e62d2ec7 100644
--- a/sysdeps/s390/s390-64/start.S
+++ b/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
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/__makecontext_ret.S b/sysdeps/unix/sysv/linux/s390/s390-32/__makecontext_ret.S
index 887d841a87..ba38a303ee 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/__makecontext_ret.S
+++ b/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
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/clone.S b/sysdeps/unix/sysv/linux/s390/s390-32/clone.S
index a8b4dbc90f..91f8ede966 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/clone.S
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/clone.S
@@ -54,12 +54,16 @@ error:
 PSEUDO_END (__clone)
 
 thread_start:
+	cfi_startproc
+	/* Mark r14 as undefined in order to stop unwinding here!  */
+	cfi_undefined (r14)
 	/* fn is in gpr 1, arg in gpr 0 */
 	lr      %r2,%r0         /* set first parameter to void *arg */
 	ahi     %r15,-96        /* make room on the stack for the save area */
 	xc	0(4,%r15),0(%r15)
 	basr    %r14,%r1        /* jump to fn */
 	DO_CALL (exit, 1)
+	cfi_endproc
 
 libc_hidden_def (__clone)
 weak_alias (__clone, clone)
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/__makecontext_ret.S b/sysdeps/unix/sysv/linux/s390/s390-64/__makecontext_ret.S
index 16901638b5..2dcd43ff6e 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/__makecontext_ret.S
+++ b/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
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/clone.S b/sysdeps/unix/sysv/linux/s390/s390-64/clone.S
index daf8a58326..8b0cc7e019 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/clone.S
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/clone.S
@@ -55,12 +55,16 @@ error:
 PSEUDO_END (__clone)
 
 thread_start:
+	cfi_startproc
+	/* Mark r14 as undefined in order to stop unwinding here!  */
+	cfi_undefined (r14)
 	/* fn is in gpr 1, arg in gpr 0 */
 	lgr	%r2,%r0		/* set first parameter to void *arg */
 	aghi	%r15,-160	/* make room on the stack for the save area */
 	xc	0(8,%r15),0(%r15)
 	basr	%r14,%r1	/* jump to fn */
 	DO_CALL	(exit, 1)
+	cfi_endproc
 
 libc_hidden_def (__clone)
 weak_alias (__clone, clone)