aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog52
-rw-r--r--scripts/data/c++-types-s390-linux-gnu.data58
-rw-r--r--scripts/data/c++-types-s390x-linux-gnu.data58
-rw-r--r--sysdeps/s390/s390-32/add_n.S1
-rw-r--r--sysdeps/s390/s390-32/addmul_1.S1
-rw-r--r--sysdeps/s390/s390-32/backtrace.c68
-rw-r--r--sysdeps/s390/s390-32/dl-machine.h12
-rw-r--r--sysdeps/s390/s390-32/elf/setjmp.S6
-rw-r--r--sysdeps/s390/s390-32/mul_1.S1
-rw-r--r--sysdeps/s390/s390-32/sub_n.S1
-rw-r--r--sysdeps/s390/s390-32/sysdep.h2
-rw-r--r--sysdeps/s390/s390-64/add_n.S1
-rw-r--r--sysdeps/s390/s390-64/backtrace.c64
-rw-r--r--sysdeps/s390/s390-64/dl-machine.h12
-rw-r--r--sysdeps/s390/s390-64/elf/setjmp.S6
-rw-r--r--sysdeps/s390/s390-64/sub_n.S1
-rw-r--r--sysdeps/s390/s390-64/sysdep.h2
-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
30 files changed, 566 insertions, 20 deletions
diff --git a/ChangeLog b/ChangeLog
index 85f6ff7fa7..1bf1d01fd4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,55 @@
+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.
+
2003-11-30 Petter Reinholdtsen <pere@hungry.com>
* stdlib/strfmon.c: Correct formatting of international currency
diff --git a/scripts/data/c++-types-s390-linux-gnu.data b/scripts/data/c++-types-s390-linux-gnu.data
new file mode 100644
index 0000000000..17647ef5ee
--- /dev/null
+++ b/scripts/data/c++-types-s390-linux-gnu.data
@@ -0,0 +1,58 @@
+blkcnt64_t:x
+blkcnt_t:l
+blksize_t:l
+caddr_t:Pc
+clockid_t:i
+clock_t:l
+daddr_t:i
+dev_t:y
+fd_mask:l
+fsblkcnt64_t:y
+fsblkcnt_t:m
+fsfilcnt64_t:y
+fsfilcnt_t:m
+fsid_t:8__fsid_t
+gid_t:j
+id_t:j
+ino64_t:y
+ino_t:m
+int16_t:s
+int32_t:i
+int64_t:x
+int8_t:a
+intptr_t:i
+key_t:i
+loff_t:x
+mode_t:j
+nlink_t:j
+off64_t:x
+off_t:l
+pid_t:i
+pthread_key_t:j
+pthread_once_t:i
+pthread_spinlock_t:i
+pthread_t:m
+quad_t:x
+register_t:i
+rlim64_t:y
+rlim_t:m
+sigset_t:10__sigset_t
+size_t:m
+socklen_t:j
+ssize_t:l
+suseconds_t:l
+time_t:l
+u_char:h
+uid_t:j
+uint:j
+u_int:j
+u_int16_t:t
+u_int32_t:j
+u_int64_t:y
+u_int8_t:h
+ulong:m
+u_long:m
+u_quad_t:y
+useconds_t:j
+ushort:t
+u_short:t
diff --git a/scripts/data/c++-types-s390x-linux-gnu.data b/scripts/data/c++-types-s390x-linux-gnu.data
new file mode 100644
index 0000000000..9072e891f2
--- /dev/null
+++ b/scripts/data/c++-types-s390x-linux-gnu.data
@@ -0,0 +1,58 @@
+blkcnt64_t:l
+blkcnt_t:l
+blksize_t:l
+caddr_t:Pc
+clockid_t:i
+clock_t:l
+daddr_t:i
+dev_t:m
+fd_mask:l
+fsblkcnt64_t:m
+fsblkcnt_t:m
+fsfilcnt64_t:m
+fsfilcnt_t:m
+fsid_t:8__fsid_t
+gid_t:j
+id_t:j
+ino64_t:m
+ino_t:m
+int16_t:s
+int32_t:i
+int64_t:l
+int8_t:a
+intptr_t:l
+key_t:i
+loff_t:l
+mode_t:j
+nlink_t:m
+off64_t:l
+off_t:l
+pid_t:i
+pthread_key_t:j
+pthread_once_t:i
+pthread_spinlock_t:i
+pthread_t:m
+quad_t:l
+register_t:l
+rlim64_t:m
+rlim_t:m
+sigset_t:10__sigset_t
+size_t:m
+socklen_t:j
+ssize_t:l
+suseconds_t:l
+time_t:l
+u_char:h
+uid_t:j
+uint:j
+u_int:j
+u_int16_t:t
+u_int32_t:j
+u_int64_t:m
+u_int8_t:h
+ulong:m
+u_long:m
+u_quad_t:m
+useconds_t:j
+ushort:t
+u_short:t
diff --git a/sysdeps/s390/s390-32/add_n.S b/sysdeps/s390/s390-32/add_n.S
index 8183017fac..b7e6682ddf 100644
--- a/sysdeps/s390/s390-32/add_n.S
+++ b/sysdeps/s390/s390-32/add_n.S
@@ -33,6 +33,7 @@
.text
ENTRY(__mpn_add_n)
st %r6,24(%r15) # save register 6
+ cfi_offset (%r6, -72)
sr %r1,%r1
lhi %r0,1 # cannot use ahi to add carry, use alr
.L0: l %r6,0(%r1,%r3) # .L0 -> no carry from last add
diff --git a/sysdeps/s390/s390-32/addmul_1.S b/sysdeps/s390/s390-32/addmul_1.S
index f83c34500f..40ba871623 100644
--- a/sysdeps/s390/s390-32/addmul_1.S
+++ b/sysdeps/s390/s390-32/addmul_1.S
@@ -33,6 +33,7 @@
.text
ENTRY(__mpn_addmul_1)
st %r6,24(%r15)
+ cfi_offset (%r6, -72)
slr %r6,%r6 # cy_limb = 0
.L0: icm %r1,15,0(%r3) # get s1_ptr[i]
mr %r0,%r5 # umul_ppmm(prod_high,prod_low,s1_ptr[j],s2_limb)
diff --git a/sysdeps/s390/s390-32/backtrace.c b/sysdeps/s390/s390-32/backtrace.c
index 11d2219c2c..c52750cecf 100644
--- a/sysdeps/s390/s390-32/backtrace.c
+++ b/sysdeps/s390/s390-32/backtrace.c
@@ -1,5 +1,5 @@
/* Return backtrace of current program state.
- Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001, 2003 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library.
@@ -18,8 +18,12 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
+#include <bits/libc-lock.h>
+#include <dlfcn.h>
#include <execinfo.h>
#include <stddef.h>
+#include <stdlib.h>
+#include <unwind.h>
/* This is a global variable set at program start time. It marks the
highest used stack address. */
@@ -51,10 +55,31 @@ struct layout
int empty[2];
};
-int
-__backtrace (array, size)
- void **array;
- int size;
+struct trace_arg
+{
+ void **array;
+ int cnt, size;
+};
+
+static _Unwind_Reason_Code (*unwind_backtrace) (_Unwind_Trace_Fn, void *);
+static _Unwind_Ptr (*unwind_getip) (struct _Unwind_Context *);
+
+static void
+init (void)
+{
+ void *handle = __libc_dlopen ("libgcc_s.so.1");
+
+ if (handle == NULL)
+ return;
+
+ unwind_backtrace = __libc_dlsym (handle, "_Unwind_Backtrace");
+ unwind_getip = __libc_dlsym (handle, "_Unwind_GetIP");
+ if (unwind_getip == NULL)
+ unwind_backtrace = NULL;
+}
+
+static int
+__backchain_backtrace (void **array, int size)
{
/* We assume that all the code is generated with frame pointers set. */
struct layout *stack;
@@ -71,11 +96,42 @@ __backtrace (array, size)
out of range. */
break;
- array[cnt++] = stack->save_grps[8] & 0x7fffffff;
+ array[cnt++] = (void *) (stack->save_grps[8] & 0x7fffffff);
stack = (struct layout *) stack->back_chain;
}
return cnt;
}
+
+static _Unwind_Reason_Code
+backtrace_helper (struct _Unwind_Context *ctx, void *a)
+{
+ struct trace_arg *arg = a;
+
+ /* We are first called with address in the __backtrace function.
+ Skip it. */
+ if (arg->cnt != -1)
+ arg->array[arg->cnt] = (void *) unwind_getip (ctx);
+ if (++arg->cnt == arg->size)
+ return _URC_END_OF_STACK;
+ return _URC_NO_REASON;
+}
+
+int
+__backtrace (void **array, int size)
+{
+ struct trace_arg arg = { .array = array, .size = size, .cnt = -1 };
+ __libc_once_define (static, once);
+
+ __libc_once (once, init);
+ if (unwind_backtrace == NULL)
+ return __backchain_backtrace (array, size);
+
+ if (size >= 1)
+ unwind_backtrace (backtrace_helper, &arg);
+
+ return arg.cnt != -1 ? arg.cnt : 0;
+}
+
weak_alias (__backtrace, backtrace)
diff --git a/sysdeps/s390/s390-32/dl-machine.h b/sysdeps/s390/s390-32/dl-machine.h
index 9eb04192c2..7a7dfbebb3 100644
--- a/sysdeps/s390/s390-32/dl-machine.h
+++ b/sysdeps/s390/s390-32/dl-machine.h
@@ -146,12 +146,14 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
.globl _dl_runtime_resolve\n\
.type _dl_runtime_resolve, @function\n\
.align 16\n\
+ " CFI_STARTPROC "\n\
_dl_runtime_resolve:\n\
# save registers\n\
stm 2,5,32(15)\n\
st 14,48(15)\n\
lr 0,15\n\
ahi 15,-96\n\
+ " CFI_ADJUST_CFA_OFFSET(96)"\n\
st 0,0(15)\n\
# load args saved by PLT\n\
lm 2,3,120(15)\n\
@@ -162,21 +164,25 @@ _dl_runtime_resolve:\n\
lr 1,2 # function addr returned in r2\n\
# restore registers\n\
ahi 15,96\n\
+ " CFI_ADJUST_CFA_OFFSET(-96)" \n\
l 14,48(15)\n\
lm 2,5,32(15)\n\
br 1\n\
1: .long fixup-1b\n\
+ " CFI_ENDPROC "\n\
.size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
\n\
.globl _dl_runtime_profile\n\
.type _dl_runtime_profile, @function\n\
.align 16\n\
+ " CFI_STARTPROC "\n\
_dl_runtime_profile:\n\
# save registers\n\
stm 2,5,32(15)\n\
st 14,48(15)\n\
lr 0,15\n\
ahi 15,-96\n\
+ " CFI_ADJUST_CFA_OFFSET(96)"\n\
st 0,0(15)\n\
# load args saved by PLT\n\
lm 2,3,120(15)\n\
@@ -189,10 +195,12 @@ _dl_runtime_profile:\n\
lr 1,2 # function addr returned in r2\n\
# restore registers\n\
ahi 15,96\n\
+ " CFI_ADJUST_CFA_OFFSET(-96)" \n\
l 14,48(15)\n\
lm 2,5,32(15)\n\
br 1\n\
1: .long profile_fixup-1b\n\
+ " CFI_ENDPROC "\n\
.size _dl_runtime_profile, .-_dl_runtime_profile\n\
");
#else
@@ -204,6 +212,7 @@ _dl_runtime_profile:\n\
.type _dl_runtime_resolve, @function\n\
.type _dl_runtime_profile, @function\n\
.align 16\n\
+ " CFI_STARTPROC "\n\
_dl_runtime_resolve:\n\
_dl_runtime_profile:\n\
# save registers\n\
@@ -211,6 +220,7 @@ _dl_runtime_profile:\n\
st 14,48(15)\n\
lr 0,15\n\
ahi 15,-96\n\
+ " CFI_ADJUST_CFA_OFFSET(96)"\n\
st 0,0(15)\n\
# load args saved by PLT\n\
lm 2,3,120(15)\n\
@@ -223,10 +233,12 @@ _dl_runtime_profile:\n\
lr 1,2 # function addr returned in r2\n\
# restore registers\n\
ahi 15,96\n\
+ " CFI_ADJUST_CFA_OFFSET(-96)" \n\
l 14,48(15)\n\
lm 2,5,32(15)\n\
br 1\n\
1: .long fixup-1b\n\
+ " CFI_ENDPROC "\n\
.size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
.size _dl_runtime_profile, .-_dl_runtime_profile\n\
");
diff --git a/sysdeps/s390/s390-32/elf/setjmp.S b/sysdeps/s390/s390-32/elf/setjmp.S
index f785201d75..0d1fa8e41d 100644
--- a/sysdeps/s390/s390-32/elf/setjmp.S
+++ b/sysdeps/s390/s390-32/elf/setjmp.S
@@ -34,9 +34,15 @@ END (setjmp)
/* Binary compatibility entry point. */
ENTRY(_setjmp)
.weak C_SYMBOL_NAME (_setjmp)
+ lhi %r3,0 /* second argument of zero */
+ j .Linternal_sigsetjmp /* branch relativ to __sigsetjmp */
+END (_setjmp)
libc_hidden_def (_setjmp)
+
ENTRY(__setjmp)
lhi %r3,0 /* second argument of zero */
+ j .Linternal_sigsetjmp /* branch relativ to __sigsetjmp */
+END (__setjmp)
ENTRY(__sigsetjmp)
.Linternal_sigsetjmp:
diff --git a/sysdeps/s390/s390-32/mul_1.S b/sysdeps/s390/s390-32/mul_1.S
index 92c18e44b4..0194476188 100644
--- a/sysdeps/s390/s390-32/mul_1.S
+++ b/sysdeps/s390/s390-32/mul_1.S
@@ -33,6 +33,7 @@
.text
ENTRY(__mpn_mul_1)
st %r6,24(%r15)
+ cfi_offset (%r6, -72)
slr %r6,%r6 # cy_limb = 0
.L0: icm %r1,15,0(%r3) # get s1_ptr[i]
mr %r0,%r5 # umul_ppmm(prod_high,prod_low,s1_ptr[j],s2_limb)
diff --git a/sysdeps/s390/s390-32/sub_n.S b/sysdeps/s390/s390-32/sub_n.S
index 1241b1bbd4..058183bc8b 100644
--- a/sysdeps/s390/s390-32/sub_n.S
+++ b/sysdeps/s390/s390-32/sub_n.S
@@ -32,6 +32,7 @@
ENTRY(__mpn_sub_n)
st %r6,24(%r15) # save register 6
+ cfi_offset (%r6, -72)
sr %r1,%r1
lhi %r0,1 # cannot use ahi to add carry, use slr
.L0: l %r6,0(%r1,%r3) # .L0 -> no carry from last sub
diff --git a/sysdeps/s390/s390-32/sysdep.h b/sysdeps/s390/s390-32/sysdep.h
index 941575b817..f2d5bada88 100644
--- a/sysdeps/s390/s390-32/sysdep.h
+++ b/sysdeps/s390/s390-32/sysdep.h
@@ -51,10 +51,12 @@
ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \
.align ALIGNARG(2); \
C_LABEL(name) \
+ cfi_startproc; \
CALL_MCOUNT
#undef END
#define END(name) \
+ cfi_endproc; \
ASM_SIZE_DIRECTIVE(name) \
/* If compiled for profiling, call `mcount' at the start of each function. */
diff --git a/sysdeps/s390/s390-64/add_n.S b/sysdeps/s390/s390-64/add_n.S
index c4e0a62ad6..51bf73f6f4 100644
--- a/sysdeps/s390/s390-64/add_n.S
+++ b/sysdeps/s390/s390-64/add_n.S
@@ -33,6 +33,7 @@
.text
ENTRY(__mpn_add_n)
stg %r6,48(%r15) # save register 6
+ cfi_offset (%r6,-112)
slgr %r1,%r1
lghi %r0,1 # cannot use ahi to add carry, use alr
.L0: lg %r6,0(%r1,%r3) # .L0 -> no carry from last add
diff --git a/sysdeps/s390/s390-64/backtrace.c b/sysdeps/s390/s390-64/backtrace.c
index 1eed72adab..8efdc6c0ac 100644
--- a/sysdeps/s390/s390-64/backtrace.c
+++ b/sysdeps/s390/s390-64/backtrace.c
@@ -1,5 +1,5 @@
/* Return backtrace of current program state. 64 bit S/390 version.
- Copyright (C) 2001 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2003 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library.
@@ -18,8 +18,12 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
+#include <bits/libc-lock.h>
+#include <dlfcn.h>
#include <execinfo.h>
#include <stddef.h>
+#include <stdlib.h>
+#include <unwind.h>
/* This is a global variable set at program start time. It marks the
@@ -50,10 +54,31 @@ struct layout
long empty[2];
};
+struct trace_arg
+{
+ void **array;
+ int cnt, size;
+};
+
+static _Unwind_Reason_Code (*unwind_backtrace) (_Unwind_Trace_Fn, void *);
+static _Unwind_Ptr (*unwind_getip) (struct _Unwind_Context *);
+
+static void
+init (void)
+{
+ void *handle = __libc_dlopen ("libgcc_s.so.1");
+
+ if (handle == NULL)
+ return;
+
+ unwind_backtrace = __libc_dlsym (handle, "_Unwind_Backtrace");
+ unwind_getip = __libc_dlsym (handle, "_Unwind_GetIP");
+ if (unwind_getip == NULL)
+ unwind_backtrace = NULL;
+}
+
int
-__backtrace (array, size)
- void **array;
- int size;
+__backchain_backtrace (void **array, int size)
{
/* We assume that all the code is generated with frame pointers set. */
struct layout *stack;
@@ -77,4 +102,35 @@ __backtrace (array, size)
return cnt;
}
+
+static _Unwind_Reason_Code
+backtrace_helper (struct _Unwind_Context *ctx, void *a)
+{
+ struct trace_arg *arg = a;
+
+ /* We are first called with address in the __backtrace function.
+ Skip it. */
+ if (arg->cnt != -1)
+ arg->array[arg->cnt] = (void *) unwind_getip (ctx);
+ if (++arg->cnt == arg->size)
+ return _URC_END_OF_STACK;
+ return _URC_NO_REASON;
+}
+
+int
+__backtrace (void **array, int size)
+{
+ struct trace_arg arg = { .array = array, .size = size, .cnt = -1 };
+ __libc_once_define (static, once);
+
+ __libc_once (once, init);
+ if (unwind_backtrace == NULL)
+ return __backchain_backtrace (array, size);
+
+ if (size >= 1)
+ unwind_backtrace (backtrace_helper, &arg);
+
+ return arg.cnt != -1 ? arg.cnt : 0;
+}
+
weak_alias (__backtrace, backtrace)
diff --git a/sysdeps/s390/s390-64/dl-machine.h b/sysdeps/s390/s390-64/dl-machine.h
index 2d9e63a2a7..c898c7f67a 100644
--- a/sysdeps/s390/s390-64/dl-machine.h
+++ b/sysdeps/s390/s390-64/dl-machine.h
@@ -139,12 +139,14 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
.globl _dl_runtime_resolve\n\
.type _dl_runtime_resolve, @function\n\
.align 16\n\
+ " CFI_STARTPROC "\n\
_dl_runtime_resolve:\n\
# save registers\n\
stmg 2,5,64(15)\n\
stg 14,96(15)\n\
lgr 0,15\n\
aghi 15,-160\n\
+ " CFI_ADJUST_CFA_OFFSET(160)"\n\
stg 0,0(15)\n\
# load args saved by PLT\n\
lmg 2,3,208(15)\n\
@@ -152,20 +154,24 @@ _dl_runtime_resolve:\n\
lgr 1,2 # function addr returned in r2\n\
# restore registers\n\
aghi 15,160\n\
+ " CFI_ADJUST_CFA_OFFSET(-160)" \n\
lg 14,96(15)\n\
lmg 2,5,64(15)\n\
br 1\n\
+ " CFI_ENDPROC "\n\
.size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
\n\
.globl _dl_runtime_profile\n\
.type _dl_runtime_profile, @function\n\
.align 16\n\
+ " CFI_STARTPROC "\n\
_dl_runtime_profile:\n\
# save registers\n\
stmg 2,5,64(15)\n\
stg 14,96(15)\n\
lgr 0,15\n\
aghi 15,-160\n\
+ " CFI_ADJUST_CFA_OFFSET(160)"\n\
stg 0,0(15)\n\
# load args saved by PLT\n\
lmg 2,3,208(15)\n\
@@ -175,9 +181,11 @@ _dl_runtime_profile:\n\
lgr 1,2 # function addr returned in r2\n\
# restore registers\n\
aghi 15,160\n\
+ " CFI_ADJUST_CFA_OFFSET(-160)" \n\
lg 14,96(15)\n\
lmg 2,5,64(15)\n\
br 1\n\
+ " CFI_ENDPROC "\n\
.size _dl_runtime_profile, .-_dl_runtime_profile\n\
");
#else
@@ -189,6 +197,7 @@ _dl_runtime_profile:\n\
.type _dl_runtime_resolve, @function\n\
.type _dl_runtime_profile, @function\n\
.align 16\n\
+ " CFI_STARTPROC "\n\
_dl_runtime_resolve:\n\
_dl_runtime_profile:\n\
# save registers\n\
@@ -196,6 +205,7 @@ _dl_runtime_profile:\n\
stg 14,96(15)\n\
lgr 0,15\n\
aghi 15,-160\n\
+ " CFI_ADJUST_CFA_OFFSET(160)"\n\
stg 0,0(15)\n\
# load args saved by PLT\n\
lmg 2,3,208(15)\n\
@@ -205,9 +215,11 @@ _dl_runtime_profile:\n\
lgr 1,2 # function addr returned in r2\n\
# restore registers\n\
aghi 15,160\n\
+ " CFI_ADJUST_CFA_OFFSET(-160)" \n\
lg 14,96(15)\n\
lmg 2,5,64(15)\n\
br 1\n\
+ " CFI_ENDPROC "\n\
.size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
.size _dl_runtime_profile, .-_dl_runtime_profile\n\
");
diff --git a/sysdeps/s390/s390-64/elf/setjmp.S b/sysdeps/s390/s390-64/elf/setjmp.S
index 657514d0f0..fa3ac72480 100644
--- a/sysdeps/s390/s390-64/elf/setjmp.S
+++ b/sysdeps/s390/s390-64/elf/setjmp.S
@@ -34,9 +34,15 @@ END (setjmp)
/* Binary compatibility entry point. */
ENTRY(_setjmp)
.weak C_SYMBOL_NAME (_setjmp)
+ slgr %r3,%r3 /* Second argument of zero. */
+ j .Linternal_sigsetjmp /* Branch relativ to __sigsetjmp. */
+END (setjmp)
libc_hidden_def (_setjmp)
+
ENTRY(__setjmp)
slgr %r3,%r3 /* Second argument of zero. */
+ j .Linternal_sigsetjmp /* Branch relativ to __sigsetjmp. */
+END (setjmp)
ENTRY(__sigsetjmp)
.Linternal_sigsetjmp:
diff --git a/sysdeps/s390/s390-64/sub_n.S b/sysdeps/s390/s390-64/sub_n.S
index 231ab44c1b..65d1c9f79f 100644
--- a/sysdeps/s390/s390-64/sub_n.S
+++ b/sysdeps/s390/s390-64/sub_n.S
@@ -30,6 +30,7 @@
ENTRY(__mpn_sub_n)
stg %r6,48(%r15) # save register 6
+ cfi_offset (%r6,-112)
sgr %r1,%r1
lghi %r0,1 # cannot use ahi to add carry, use slr
.L0: lg %r6,0(%r1,%r3) # .L0 -> no carry from last sub
diff --git a/sysdeps/s390/s390-64/sysdep.h b/sysdeps/s390/s390-64/sysdep.h
index 224762932b..75fee7380d 100644
--- a/sysdeps/s390/s390-64/sysdep.h
+++ b/sysdeps/s390/s390-64/sysdep.h
@@ -51,10 +51,12 @@
ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \
.align ALIGNARG(2); \
C_LABEL(name) \
+ cfi_startproc; \
CALL_MCOUNT
#undef END
#define END(name) \
+ cfi_endproc; \
ASM_SIZE_DIRECTIVE(name) \
/* If compiled for profiling, call `mcount' at the start of each function. */
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 */