about summary refs log tree commit diff
path: root/sysdeps/unix
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-12-06 00:20:16 +0000
committerUlrich Drepper <drepper@redhat.com>2003-12-06 00:20:16 +0000
commit844a34a2ae4b493f86ed1e79c5992329b54a5511 (patch)
tree4c28fbeb9a311bd9acfa4a7a7d11f133ae516603 /sysdeps/unix
parentdd17514ce7a10d785b977586224d31563888cb9d (diff)
downloadglibc-844a34a2ae4b493f86ed1e79c5992329b54a5511.tar.gz
glibc-844a34a2ae4b493f86ed1e79c5992329b54a5511.tar.xz
glibc-844a34a2ae4b493f86ed1e79c5992329b54a5511.zip
Update.
2003-12-05  Martin Schwidefsky  <schwidefsky@de.ibm.com>

	* sysdeps/s390/s390-32/elf/setjmp.S (setjmp, __setjmp): Add END
	statements.
	* sysdeps/s390/s390-64/elf/setjmp.S (setjmp, __setjmp): Likewise.
	* sysdeps/s390/s390-32/sysdep.h (ENTRY): Add cfi_startproc directive.
	(END): Add cfi_endproc directive.
	* sysdeps/s390/s390-64/sysdep.h (ENTRY, END): Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-32/socket.S (__socket): Remove
	cfi_startproc and cfi_endproc directive.
	* sysdeps/unix/sysv/linux/s390/s390-64/socket.S (__socket): Likewise.
	* sysdeps/s390/s390-32/addmul_1.S (__mpn_addmul_1): Add CFI directives.
	* sysdeps/s390/s390-32/add_n.S (__mpn_add_n): Likewise.
	* sysdeps/s390/s390-64/add_n.S (__mpn_add_n): Likewise.
	* sysdeps/s390/s390-32/dl-machine.h (ELF_MACHINE_RUNTIME_TRAMPOLINE):
	Likewise.
	* sysdeps/s390/s390-64/dl-machine.h (ELF_MACHINE_RUNTIME_TRAMPOLINE):
	Likewise.
	* sysdeps/s390/s390-32/mul_1.S (__mpn_mul_1): Likewise.
	* sysdeps/s390/s390-32/sub_n.S (__mpn_sub_n): Likewise.
	* sysdeps/s390/s390-64/sub_n.S (__mpn_sub_n): Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-32/mmap64.S (__mmap64): Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-32/mmap.S (__mmap): Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-64/mmap.S (__mmap): Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-32/syscall.S (syscall): Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-64/syscall.S (syscall): Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-32/sysdep.S (__syscall_error):
	Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-64/sysdep.S (__syscall_error):
	Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-32/clone.S (__clone): Add CFI
	directives. Move thread_start out of ENTRY/PSEUDO_END block to
	make backchain terminate.
	* sysdeps/unix/sysv/linux/s390/s390-64/clone.S (__clone): Likewise.

	* sysdeps/s390/s390-32/backtrace.c (trace_arg): New structure.
	(unwind_backtrace, unwind_getip): New variables.
	(init, __backchain_backtrace, backtrace_helper): New functions.
	(__backtrace): Use unwind info for backtrace instead of backchain
	walking if the unwind functions can be found.
	* sysdeps/s390/s390-64/backtrace.c: Likewise.

	* sysdeps/unix/sysv/linux/s390/s390-32/posix_fadvise64.c: New file.

	* sysdeps/unix/sysv/linux/s390/sys/procfs.h (ELF_NGREG32): New #define.
	(elf_greg_t32, elf_gregset_t32, elf_fpregset_t32): New types.
	(elf_prstatus32, elf_prpsinfo32): New structures.
	(prgregset32_t, prfpregset32_t, prstatus32_t, prpsinfo32_t): New types.

	* scripts/data/c++-types-s390-linux-gnu.data: New file.
	* scripts/data/c++-types-s390x-linux-gnu.data: New file.
Diffstat (limited to 'sysdeps/unix')
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/clone.S3
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/mmap.S12
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/mmap64.S12
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/posix_fadvise64.c90
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/socket.S3
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/syscall.S12
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/sysdep.S12
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/clone.S3
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/mmap.S12
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/socket.S6
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/syscall.S12
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/sysdep.S10
-rw-r--r--sysdeps/unix/sysv/linux/s390/sys/procfs.h53
13 files changed, 230 insertions, 10 deletions
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/clone.S b/sysdeps/unix/sysv/linux/s390/s390-32/clone.S
index 650384cbc9..f01433ff0f 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/clone.S
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/clone.S
@@ -32,6 +32,7 @@
 	.text
 ENTRY(__clone)
 	st	%r6,24(%r15)		/* store %r6 to save area */
+	cfi_offset (%r6, -72)
 	lr	%r0,%r5			/* move *arg out of the way */
 	ltr     %r1,%r2			/* check fn and move to %r1 */
 	jz      error			/* no NULL function pointers */
@@ -50,6 +51,7 @@ ENTRY(__clone)
 error:
 	lhi	%r2,-EINVAL
 	j	SYSCALL_ERROR_LABEL
+PSEUDO_END (__clone)
 	
 thread_start:
 	/* fn is in gpr 1, arg in gpr 0 */
@@ -71,5 +73,4 @@ thread_start:
 	br      %r1             /* branch to _exit -> thread termination */
 .L1:	.long   _exit - .L0
 #endif
-PSEUDO_END (__clone)
 weak_alias (__clone, clone)
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/mmap.S b/sysdeps/unix/sysv/linux/s390/s390-32/mmap.S
index 28fa2006da..c0d7cd4590 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/mmap.S
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/mmap.S
@@ -25,8 +25,19 @@
 ENTRY(__mmap)
 	/* Save registers and setup stack frame.  */
 	stm     %r6,%r15,24(%r15)
+	cfi_offset (%r15, -36)
+	cfi_offset (%r14, -40)
+	cfi_offset (%r13, -44)
+	cfi_offset (%r12, -48)
+	cfi_offset (%r11, -52)
+	cfi_offset (%r10, -56)
+	cfi_offset (%r9, -60)
+	cfi_offset (%r8, -64)
+	cfi_offset (%r7, -68)
+	cfi_offset (%r6, -72)
 	lr      %r1,%r15
 	ahi     %r15,-120               /* buy stack space */
+	cfi_adjust_cfa_offset (120)
 	st      %r1,0(%r15)             /* store back chain */
 
 	/* Store parameters on stack, because old_mmap/mmap2
@@ -57,6 +68,7 @@ ENTRY(__mmap)
 #endif
 
 1:	l       %r15,0(%r15)            /* Load back chain.  */
+	cfi_adjust_cfa_offset (-120)
 	lm      %r6,%r15,24(%r15)       /* Load registers.  */
 
 	/* check gpr 2 for error */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/mmap64.S b/sysdeps/unix/sysv/linux/s390/s390-32/mmap64.S
index c0652cae83..aba4ac34e3 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/mmap64.S
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/mmap64.S
@@ -26,8 +26,19 @@
 ENTRY(__mmap64)
 	/* Save registers and setup stack frame.  */
 	stm	%r6,%r15,24(%r15)
+	cfi_offset (%r15, -36)
+	cfi_offset (%r14, -40)
+	cfi_offset (%r13, -44)
+	cfi_offset (%r12, -48)
+	cfi_offset (%r11, -52)
+	cfi_offset (%r10, -56)
+	cfi_offset (%r9, -60)
+	cfi_offset (%r8, -64)
+	cfi_offset (%r7, -68)
+	cfi_offset (%r6, -72)
 	lr	%r1,%r15
 	ahi	%r15,-120		/* Buy stack space.   */
+	cfi_adjust_cfa_offset (120)
 	st	%r1,0(%r15)		/* Store back chain.  */
 
 	/* Store parameters on stack, because mmap2 and old_mmap
@@ -56,6 +67,7 @@ ENTRY(__mmap64)
 #endif
 
 	l	%r15,0(%r15)		/* Load back chain.  */
+	cfi_adjust_cfa_offset (-120)
 	lm	%r6,%r15,24(%r15)	/* Load registers.  */
 
 	/* Check gpr 2 for error.  */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/posix_fadvise64.c b/sysdeps/unix/sysv/linux/s390/s390-32/posix_fadvise64.c
new file mode 100644
index 0000000000..6c539cd700
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/posix_fadvise64.c
@@ -0,0 +1,90 @@
+/* Copyright (C) 2003 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <sysdep.h>
+#include <kernel-features.h>
+
+int __posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise);
+int __posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise);
+
+/* Advice the system about the expected behaviour of the application with
+   respect to the file associated with FD.  */
+
+struct fadvise64_64_layout
+{
+  int fd;
+  off64_t offset;
+  off64_t len;
+  int advise;
+};
+
+int
+__posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise)
+{
+#ifdef __NR_fadvise64_64
+  struct fadvise64_64_layout parameters;
+  INTERNAL_SYSCALL_DECL (err);
+  
+  parameters.fd = fd;
+  parameters.offset = offset;
+  parameters.len = len;
+  parameters.advise = advise;
+  int ret = INTERNAL_SYSCALL (fadvise64_64, err, 1, &parameters);
+  if (!INTERNAL_SYSCALL_ERROR_P (ret, err))
+    return 0;
+# ifndef __ASSUME_FADVISE64_64_SYSCALL
+  if (INTERNAL_SYSCALL_ERRNO (ret, err) != ENOSYS)
+# endif
+   return INTERNAL_SYSCALL_ERRNO (ret, err);
+#endif
+#ifndef __ASSUME_FADVISE64_64_SYSCALL
+# ifdef __NR_fadvise64
+  if (len != (off_t) len)
+    return EOVERFLOW;
+
+  INTERNAL_SYSCALL_DECL (err2);
+  int ret2 = INTERNAL_SYSCALL (fadvise64, err2, 5, fd,
+			       __LONG_LONG_PAIR ((long) (offset >> 32),
+						 (long) offset),
+			       (off_t) len, advise);
+  if (!INTERNAL_SYSCALL_ERROR_P (ret2, err2))
+    return 0;
+  return INTERNAL_SYSCALL_ERRNO (ret2, err2);
+# else
+  return ENOSYS;
+# endif
+#endif
+}
+
+#include <shlib-compat.h>
+
+#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3)
+
+int
+__posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise)
+{
+  return __posix_fadvise64_l64 (fd, offset, len, advise);
+}
+
+versioned_symbol (libc, __posix_fadvise64_l64, posix_fadvise64, GLIBC_2_3_3);
+compat_symbol (libc, __posix_fadvise64_l32, posix_fadvise64, GLIBC_2_2);
+#else
+strong_alias (__posix_fadvise64_l64, posix_fadvise64);
+#endif
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/socket.S b/sysdeps/unix/sysv/linux/s390/s390-32/socket.S
index 2047709647..bc0153324c 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/socket.S
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/socket.S
@@ -47,8 +47,6 @@
 
 .globl __socket
 ENTRY(__socket)
-	cfi_startproc
-
 	/* Save registers and setup stack.  */
 	stm     %r6,%r15,24(%r15)       /* save registers */
 	cfi_offset (%r15, -36)
@@ -136,7 +134,6 @@ L(socket_cancel):
 2:	.long	CENABLE-1b
 3:	.long	CDISABLE-1b
 #endif
-	cfi_endproc
 
 	SYSCALL_ERROR_HANDLER
 END (__socket)
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/syscall.S b/sysdeps/unix/sysv/linux/s390/s390-32/syscall.S
index 5455ec832d..d1ce925ac3 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/syscall.S
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/syscall.S
@@ -25,9 +25,20 @@
 ENTRY (syscall)
 	/* Save registers and setup stack.  */
 	stm     %r6,%r15,24(%r15)  /* save registers */
+	cfi_offset (%r15, -36)
+	cfi_offset (%r14, -40)
+	cfi_offset (%r13, -44)
+	cfi_offset (%r12, -48)
+	cfi_offset (%r11, -52)
+	cfi_offset (%r10, -56)
+	cfi_offset (%r9, -60)
+	cfi_offset (%r8, -64)
+	cfi_offset (%r7, -68)
+	cfi_offset (%r6, -72)
 	lr      %r1,%r15
 	l       %r0,4(0,%r15)      /* load eos */
 	ahi     %r15,-96           /* buy stack space */
+	cfi_adjust_cfa_offset (96)
 	st      %r1,0(0,%r15)      /* store back chain */
 	st      %r0,4(0,%r15)      /* store eos */
 
@@ -45,6 +56,7 @@ ENTRY (syscall)
 	j      3f
 2:	ex     %r1,1b-0b(%r7)      /* lsb of R1 is subsituted as SVC number */
 3:	l      %r15,0(%r15)        /* load back chain */
+	cfi_adjust_cfa_offset (-96)
 	lm     %r6,15,24(%r15)     /* load registers */
 
 	lhi    %r0,-4095
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.S b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.S
index 94d772f67e..b1f17335f7 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.S
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.S
@@ -55,8 +55,12 @@ ENTRY(__syscall_error)
 1:	.long  errno
 # else
 	stm	%r13,%r15,52(%r15)
+	cfi_offset (%r15, -36)
+	cfi_offset (%r14, -40)
+	cfi_offset (%r13, -44)
 	lr	%r0,%r15
 	ahi	%r15,-96
+	cfi_adjust_cfa_offset (96)
 	lcr	%r13,%r2
 	st	%r0,0(%r15)
 	basr	%r1,0
@@ -64,6 +68,7 @@ ENTRY(__syscall_error)
 	basr	%r14,%r1
 	st	%r13,0(%r2)
 	lm	%r13,%r15,148(%r15)
+	cfi_adjust_cfa_offset (-96)
 	lhi	%r2,-1
 	br	%r14
 1:	.long  __errno_location
@@ -103,8 +108,14 @@ ENTRY(__syscall_error)
 1:	.long	_GLOBAL_OFFSET_TABLE_-0b
 # else
 	stm	%r11,%r15,44(%r15)
+	cfi_offset (%r15, -36)
+	cfi_offset (%r14, -40)
+	cfi_offset (%r13, -44)
+	cfi_offset (%r12, -48)
+	cfi_offset (%r11, -52)
 	lr	%r0,%r15
 	ahi	%r15,-96
+	cfi_adjust_cfa_offset (96)
 	lcr	%r11,%r2
 	st	%r0,0(%r15)
 	basr	%r13,0
@@ -114,6 +125,7 @@ ENTRY(__syscall_error)
 	bas	%r14,0(%r1,%r13)
 	st	%r11,0(%r2)
 	lm	%r11,%r15,140(%r15)
+	cfi_adjust_cfa_offset (-96)
 	lhi	%r2,-1
 	br	%r14
 1:	.long _GLOBAL_OFFSET_TABLE_-0b
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/clone.S b/sysdeps/unix/sysv/linux/s390/s390-64/clone.S
index c6f2bdcbd8..f70bd15260 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/clone.S
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/clone.S
@@ -33,6 +33,7 @@
 	.text
 ENTRY(__clone)
 	stg	%r6,48(%r15)		/* store %r6 to save area */
+	cfi_offset (%r6,-112)
 	lgr	%r0,%r5			/* move *arg out of the way */
 	ltgr    %r1,%r2			/* check fn and move to %r1 */
 	jz      error			/* no NULL function pointers */
@@ -51,6 +52,7 @@ ENTRY(__clone)
 error:
 	lghi	%r2,-EINVAL
 	jg	SYSCALL_ERROR_LABEL
+PSEUDO_END (__clone)
 
 thread_start:
 	/* fn is in gpr 1, arg in gpr 0 */
@@ -63,5 +65,4 @@ thread_start:
 #else
 	jg	_exit		/* branch to _exit -> thread termination */
 #endif
-PSEUDO_END (__clone)
 weak_alias (__clone, clone)
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/mmap.S b/sysdeps/unix/sysv/linux/s390/s390-64/mmap.S
index 8c94fd4c28..443d432e1c 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/mmap.S
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/mmap.S
@@ -27,9 +27,20 @@
 ENTRY(__mmap)
 	/* Save registers and setup stack frame.  */
         stmg    %r6,%r15,48(%r15)
+	cfi_offset (%r15,-40)
+	cfi_offset (%r14,-48)
+	cfi_offset (%r13,-56)
+	cfi_offset (%r12,-64)
+	cfi_offset (%r11,-72)
+	cfi_offset (%r10,-80)
+	cfi_offset (%r9,-88)
+	cfi_offset (%r8,-96)
+	cfi_offset (%r7,-104)
+	cfi_offset (%r6,-112)
         lgr     %r1,%r15
         lg      %r0,8(%r15)             /* Load eos.  */
         aghi    %r15,-208               /* Buy stack space.  */
+	cfi_adjust_cfa_offset (208)
         stg     %r1,0(%r15)             /* Store back chain.  */
         stg     %r0,8(%r15)             /* Store eos.  */
 
@@ -50,6 +61,7 @@ ENTRY(__mmap)
         svc     SYS_ify(mmap)
 
         lg      %r15,0(%r15)            /* Load back chain.  */
+	cfi_adjust_cfa_offset (-208)
         lmg     %r6,%r15,48(%r15)       /* Load registers.  */
 
         /* Check gpr 2 for error.  */ 
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/socket.S b/sysdeps/unix/sysv/linux/s390/s390-64/socket.S
index 3985a9c4b7..c98a97449b 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/socket.S
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/socket.S
@@ -47,8 +47,6 @@
 
 .globl __socket
 ENTRY(__socket)
-	cfi_startproc
-
 	/* Save registers and setup stack.  */
         stmg    %r6,%r15,48(%r15)       /* Save registers.  */
 	cfi_offset (%r15,-40)
@@ -130,9 +128,7 @@ L(socket_cancel):
 	j	4b
 #endif
 
-	cfi_endproc
-
-PSEUDO_END (__socket)
+END (__socket)
 
 #ifndef NO_WEAK_ALIAS
 weak_alias (__socket, socket)
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/syscall.S b/sysdeps/unix/sysv/linux/s390/s390-64/syscall.S
index 5a6bcfc90d..4caeaeaf50 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/syscall.S
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/syscall.S
@@ -25,9 +25,20 @@
 ENTRY (syscall)
 	/* Save registers and setup stack.  */
 	stmg	%r6,%r15,48(%r15)  /* Save registers.  */
+	cfi_offset (%r15,-40)
+	cfi_offset (%r14,-48)
+	cfi_offset (%r13,-56)
+	cfi_offset (%r12,-64)
+	cfi_offset (%r11,-72)
+	cfi_offset (%r10,-80)
+	cfi_offset (%r9,-88)
+	cfi_offset (%r8,-96)
+	cfi_offset (%r7,-104)
+	cfi_offset (%r6,-112)
 	lgr	%r1,%r15
 	lg	%r0,8(%r15)	   /* Load eos.	 */
 	aghi	%r15,-160	   /* Buy stack space.	*/
+	cfi_adjust_cfa_offset (160)
 	stg	%r1,0(%r15)	   /* Store back chain.	 */
 	stg	%r0,8(%r15)	   /* Store eos.  */
 	
@@ -45,6 +56,7 @@ ENTRY (syscall)
 	j      3f
 2:	ex     %r1,1b-0b(%r7)      /* lsb of R1 is subsituted as SVC number */
 3:	lg     %r15,0(%r15)        /* load back chain */
+	cfi_adjust_cfa_offset (-160)
 	lmg	%r6,15,48(%r15)	   /* Load registers.  */
 
 	lghi   %r0,-4095
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.S b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.S
index 84c747aef0..ce1f03e006 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.S
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.S
@@ -56,13 +56,18 @@ ENTRY(__syscall_error)
 	br	%r14
 # else
 	stmg	%r13,%r15,104(%r15)
+	cfi_offset (%r15,-40)
+	cfi_offset (%r14,-48)
+	cfi_offset (%r13,-56)
 	lgr	%r0,%r15
 	aghi	%r15,-160
+	cfi_adjust_cfa_offset (160)
 	lcr	%r13,%r2
 	stg	%r0,0(%r15)
 	brasl	%r14,__errno_location
 	st	%r13,0(%r2)
 	lmg	%r13,%r15,264(%r15)
+	cfi_adjust_cfa_offset (-160)
 	lghi	%r2,-1
 	br	%r14
 #endif
@@ -97,13 +102,18 @@ ENTRY(__syscall_error)
 	br	%r14	
 # else
 	stmg	%r13,%r15,104(%r15)
+	cfi_offset (%r15,-40)
+	cfi_offset (%r14,-48)
+	cfi_offset (%r13,-56)
 	lgr	%r0,%r15
 	aghi	%r15,-160
+	cfi_adjust_cfa_offset (160)
 	lcr	%r13,%r2
 	stg	%r0,0(%r15)
 	brasl	%r14,__errno_location@PLT
 	st	%r13,0(%r2)
 	lmg	%r13,%r15,264(%r15)
+	cfi_adjust_cfa_offset (-160)
 	lghi	%r2,-1
 	br	%r14
 # endif
diff --git a/sysdeps/unix/sysv/linux/s390/sys/procfs.h b/sysdeps/unix/sysv/linux/s390/sys/procfs.h
index e4aaa39fe1..9c6caacaea 100644
--- a/sysdeps/unix/sysv/linux/s390/sys/procfs.h
+++ b/sysdeps/unix/sysv/linux/s390/sys/procfs.h
@@ -118,6 +118,59 @@ typedef __pid_t lwpid_t;
 typedef struct elf_prstatus prstatus_t;
 typedef struct elf_prpsinfo prpsinfo_t;
 
+#if __WORDSIZE == 64
+
+/* Provide 32-bit variants so that BFD can read 32-bit
+   core files.  */
+#define ELF_NGREG32	36
+typedef unsigned int elf_greg_t32;
+typedef elf_greg_t32 elf_gregset_t32[ELF_NGREG32];
+typedef elf_fpregset_t elf_fpregset_t32;
+
+struct elf_prstatus32
+  {
+    struct elf_siginfo pr_info;		/* Info associated with signal.  */
+    short int pr_cursig;		/* Current signal.  */
+    unsigned int pr_sigpend;	/* Set of pending signals.  */
+    unsigned int pr_sighold;	/* Set of held signals.  */
+    __pid_t pr_pid;
+    __pid_t pr_ppid;
+    __pid_t pr_pgrp;
+    __pid_t pr_sid;
+    struct
+      {
+	int tv_sec, tv_usec;
+      } pr_utime,			/* User time.  */
+        pr_stime,			/* System time.  */
+        pr_cutime,			/* Cumulative user time.  */
+        pr_cstime;			/* Cumulative system time.  */
+    elf_gregset_t32 pr_reg;		/* GP registers.  */
+    int pr_fpvalid;			/* True if math copro being used.  */
+  };
+
+struct elf_prpsinfo32
+  {
+    char pr_state;			/* Numeric process state.  */
+    char pr_sname;			/* Char for pr_state.  */
+    char pr_zomb;			/* Zombie.  */
+    char pr_nice;			/* Nice val.  */
+    unsigned int pr_flag;		/* Flags.  */
+    unsigned short int pr_uid;
+    unsigned short int pr_gid;
+    int pr_pid, pr_ppid, pr_pgrp, pr_sid;
+    /* Lots missing */
+    char pr_fname[16];			/* Filename of executable.  */
+    char pr_psargs[ELF_PRARGSZ];	/* Initial part of arg list.  */
+  };
+
+typedef elf_gregset_t32 prgregset32_t;
+typedef elf_fpregset_t32 prfpregset32_t;
+
+typedef struct elf_prstatus32 prstatus32_t;
+typedef struct elf_prpsinfo32 prpsinfo32_t;
+
+#endif
+
 __END_DECLS
 
 #endif	/* sys/procfs.h */