diff --git a/ChangeLog b/ChangeLog index 85f6ff7fa7..1bf1d01fd4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,55 @@ +2003-12-05 Martin Schwidefsky + + * 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 * 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 +#include #include #include +#include +#include /* 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 +#include #include #include +#include +#include /* 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 +#include +#include +#include + +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, ¶meters); + 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 + +#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 */