Update.
authorUlrich Drepper <drepper@redhat.com>
Sat, 6 Dec 2003 00:20:16 +0000 (00:20 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sat, 6 Dec 2003 00:20:16 +0000 (00:20 +0000)
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.

30 files changed:
ChangeLog
scripts/data/c++-types-s390-linux-gnu.data [new file with mode: 0644]
scripts/data/c++-types-s390x-linux-gnu.data [new file with mode: 0644]
sysdeps/s390/s390-32/add_n.S
sysdeps/s390/s390-32/addmul_1.S
sysdeps/s390/s390-32/backtrace.c
sysdeps/s390/s390-32/dl-machine.h
sysdeps/s390/s390-32/elf/setjmp.S
sysdeps/s390/s390-32/mul_1.S
sysdeps/s390/s390-32/sub_n.S
sysdeps/s390/s390-32/sysdep.h
sysdeps/s390/s390-64/add_n.S
sysdeps/s390/s390-64/backtrace.c
sysdeps/s390/s390-64/dl-machine.h
sysdeps/s390/s390-64/elf/setjmp.S
sysdeps/s390/s390-64/sub_n.S
sysdeps/s390/s390-64/sysdep.h
sysdeps/unix/sysv/linux/s390/s390-32/clone.S
sysdeps/unix/sysv/linux/s390/s390-32/mmap.S
sysdeps/unix/sysv/linux/s390/s390-32/mmap64.S
sysdeps/unix/sysv/linux/s390/s390-32/posix_fadvise64.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/s390-32/socket.S
sysdeps/unix/sysv/linux/s390/s390-32/syscall.S
sysdeps/unix/sysv/linux/s390/s390-32/sysdep.S
sysdeps/unix/sysv/linux/s390/s390-64/clone.S
sysdeps/unix/sysv/linux/s390/s390-64/mmap.S
sysdeps/unix/sysv/linux/s390/s390-64/socket.S
sysdeps/unix/sysv/linux/s390/s390-64/syscall.S
sysdeps/unix/sysv/linux/s390/s390-64/sysdep.S
sysdeps/unix/sysv/linux/s390/sys/procfs.h

index 85f6ff7fa7cf9b179f8d56e6c9e99fbc2764179d..1bf1d01fd4775c8d8336d5a9f1d2eebdfe678849 100644 (file)
--- 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 (file)
index 0000000..17647ef
--- /dev/null
@@ -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 (file)
index 0000000..9072e89
--- /dev/null
@@ -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
index 8183017fac2ded666035956c1855dde76bcd5922..b7e6682ddf49c61a08b23c8958b771c318eef367 100644 (file)
@@ -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
index f83c34500f8afb229f9b4d544cbf00243ef9582f..40ba8716239b410048f8b0a59bf2154bdbb9a3b9 100644 (file)
@@ -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)
index 11d2219c2ce17432f02ceb6e820b9b0ed3e182b2..c52750cecf6b0aab07d1ba3b39ba9c426a149a35 100644 (file)
@@ -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.
 
    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)
index 9eb04192c27d4536a61f432fa0c16fcc601c0158..7a7dfbebb3925c9403d371e7c8e040824ad0d114 100644 (file)
@@ -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\
 ");
index f785201d756709a58d7e98d2841aa506eb9d2730..0d1fa8e41d9291ae7033bcf307241fb962fe2467 100644 (file)
@@ -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:
index 92c18e44b40a17cde7112207248b7b3a9715053d..01944761883f5242b556ae5318dcb0828731403a 100644 (file)
@@ -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)
index 1241b1bbd4b197b5fd269deb421fa49698c600e9..058183bc8b5ab55872adac751b5252be85917be1 100644 (file)
@@ -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
index 941575b817c1be16b3d07fdfdea18170d04d1f14..f2d5bada88d0ce283728c7da149b0abecf62d2e4 100644 (file)
   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.  */
index c4e0a62ad6845f58280e7e41d2396c3dc04ba5a8..51bf73f6f43e1cc6cbb9b4baf144b55a22a0e73a 100644 (file)
@@ -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
index 1eed72adab27be9ada714a068da8f2d7057f45bf..8efdc6c0acb495914acaab721afd92fa4acce391 100644 (file)
@@ -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.
 
    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)
index 2d9e63a2a72c3bfedc0ec174ec58016ab7de0dc8..c898c7f67a03de4181b72ebde51f1819a9f79dfb 100644 (file)
@@ -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\
 ");
index 657514d0f04e6b2a3b050081e41c4fa22dc5c1e8..fa3ac724800c4ed7d4daea9f5b50f0b21459cf61 100644 (file)
@@ -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:
index 231ab44c1bfb2f418df98d5e9564d40417daf8bb..65d1c9f79f671eedd3a940a2aa8049400865f170 100644 (file)
@@ -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
index 224762932b52bd844555207d7f87d453bb34fd67..75fee7380dd702935ededdc5e7f2954609fed016 100644 (file)
   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.  */
index 650384cbc9fd4e48a45f140e675e58e09911e549..f01433ff0f4fa5ba2982228997178bb1e8829d26 100644 (file)
@@ -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)
index 28fa2006da706ef0854749a82a000916e32e5c96..c0d7cd459043046cb063707f3ff34bd25bdef293 100644 (file)
 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 */
index c0652cae834dd86d929e04c6d3910db243c74753..aba4ac34e33f1834fe5ffc043e6b59cde9ee2168 100644 (file)
 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 (file)
index 0000000..6c539cd
--- /dev/null
@@ -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
index 204770964769c6dcf2b2ac6152111295cfb25ff1..bc0153324c5b5677c3708446ac89fa9d4f982e6f 100644 (file)
@@ -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)
index 5455ec832d95ba43930e95c358c62d039c031264..d1ce925ac3463e9dbecae0a38ca93095ef153358 100644 (file)
 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
index 94d772f67e4857eb9bbfe263d6a106f8fb1f139d..b1f17335f779fa1f2067a6778e7e66f4f0aa0fe5 100644 (file)
@@ -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
index c6f2bdcbd8afc636c2bc484e7662dae3fa80ca53..f70bd15260abd0e3a91e56b4d08629b64619eafe 100644 (file)
@@ -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)
index 8c94fd4c28590e5f88addc438fe48a98560636e7..443d432e1cc0c4b7b66e7990660763418a5b1ff8 100644 (file)
 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.  */ 
index 3985a9c4b729e9a5344e65d2bfb86a098b66c245..c98a97449ba455d9d1100fe10fc110a7bed235e5 100644 (file)
@@ -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)
index 5a6bcfc90d78834947128c8ef3a369c680ea9a13..4caeaeaf50257e74c4a8e25a532a498364be865c 100644 (file)
 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
index 84c747aef023dab3e05555c87695210ed09db0c9..ce1f03e0065696623d6c9cfcc72ac2407fc73671 100644 (file)
@@ -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
index e4aaa39fe13640bd182d1ea90e15332d87bf155a..9c6caacaea7d579cbe9fdc4349458ad192e66ccf 100644 (file)
@@ -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 */