From 844a34a2ae4b493f86ed1e79c5992329b54a5511 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Sat, 6 Dec 2003 00:20:16 +0000 Subject: Update. 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. --- sysdeps/unix/sysv/linux/s390/s390-32/clone.S | 3 +- sysdeps/unix/sysv/linux/s390/s390-32/mmap.S | 12 +++ sysdeps/unix/sysv/linux/s390/s390-32/mmap64.S | 12 +++ .../unix/sysv/linux/s390/s390-32/posix_fadvise64.c | 90 ++++++++++++++++++++++ sysdeps/unix/sysv/linux/s390/s390-32/socket.S | 3 - sysdeps/unix/sysv/linux/s390/s390-32/syscall.S | 12 +++ sysdeps/unix/sysv/linux/s390/s390-32/sysdep.S | 12 +++ 7 files changed, 140 insertions(+), 4 deletions(-) create mode 100644 sysdeps/unix/sysv/linux/s390/s390-32/posix_fadvise64.c (limited to 'sysdeps/unix/sysv/linux/s390/s390-32') 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 -- cgit v1.2.3