diff options
Diffstat (limited to 'sysdeps/s390/s390-64')
-rw-r--r-- | sysdeps/s390/s390-64/Dist | 1 | ||||
-rw-r--r-- | sysdeps/s390/s390-64/__longjmp.c | 41 | ||||
-rw-r--r-- | sysdeps/s390/s390-64/backtrace.c | 5 | ||||
-rw-r--r-- | sysdeps/s390/s390-64/bcopy.S | 14 | ||||
-rw-r--r-- | sysdeps/s390/s390-64/bits/wordsize.h | 11 | ||||
-rw-r--r-- | sysdeps/s390/s390-64/dl-machine.h | 137 | ||||
-rw-r--r-- | sysdeps/s390/s390-64/dl-trampoline.S | 128 | ||||
-rw-r--r-- | sysdeps/s390/s390-64/elf/setjmp.S | 17 | ||||
-rw-r--r-- | sysdeps/s390/s390-64/elf/start.S | 6 | ||||
-rw-r--r-- | sysdeps/s390/s390-64/s390x-mcount.S | 2 | ||||
-rw-r--r-- | sysdeps/s390/s390-64/setjmp.S | 19 |
11 files changed, 155 insertions, 226 deletions
diff --git a/sysdeps/s390/s390-64/Dist b/sysdeps/s390/s390-64/Dist new file mode 100644 index 0000000000..dbf7aa9661 --- /dev/null +++ b/sysdeps/s390/s390-64/Dist @@ -0,0 +1 @@ +s390x-mcount.S diff --git a/sysdeps/s390/s390-64/__longjmp.c b/sysdeps/s390/s390-64/__longjmp.c index 030fb5b515..80abd3849a 100644 --- a/sysdeps/s390/s390-64/__longjmp.c +++ b/sysdeps/s390/s390-64/__longjmp.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001, 2005 Free Software Foundation, Inc. +/* Copyright (C) 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). @@ -29,35 +29,18 @@ void __longjmp (__jmp_buf env, int val) { - register long int r2 __asm ("%r2") = val == 0 ? 1 : val; -#ifdef PTR_DEMANGLE - register uintptr_t r3 __asm ("%r3") = THREAD_GET_POINTER_GUARD (); - register void *r1 __asm ("%r1") = (void *) env; -#endif - /* Restore registers and jump back. */ - asm volatile ("ld %%f7,104(%1)\n\t" - "ld %%f5,96(%1)\n\t" - "ld %%f3,88(%1)\n\t" - "ld %%f1,80(%1)\n\t" -#ifdef PTR_DEMANGLE - "lmg %%r6,%%r13,0(%1)\n\t" - "lmg %%r4,%%r5,64(%1)\n\t" - "xgr %%r4,%2\n\t" - "xgr %%r5,%2\n\t" - "lgr %%r15,%%r5\n\t" - "br %%r4" -#else - "lmg %%r6,%%r15,0(%1)\n\t" - "br %%r14" -#endif - : : "r" (r2), -#ifdef PTR_DEMANGLE - "r" (r1), "r" (r3) -#else - "a" (env) -#endif - ); + /* Restore registers and jump back. */ + asm volatile ("lgr %%r2,%0\n\t" /* Put val in grp 2. */ + "ld %%f7,104(%1)\n\t" + "ld %%f5,96(%1)\n\t" + "ld %%f3,88(%1)\n\t" + "ld %%f1,80(%1)\n\t" + "lmg %%r6,%%r15,0(%1)\n\t" + "br %%r14" + : : "r" (val == 0 ? 1 : val), + "a" (env) : "2" ); /* Avoid `volatile function does return' warnings. */ for (;;); } + diff --git a/sysdeps/s390/s390-64/backtrace.c b/sysdeps/s390/s390-64/backtrace.c index 7ba195cb7a..05321349ca 100644 --- a/sysdeps/s390/s390-64/backtrace.c +++ b/sysdeps/s390/s390-64/backtrace.c @@ -1,6 +1,6 @@ /* Return backtrace of current program state. 64 bit S/390 version. - Copyright (C) 2001, 2003, 2004, 2005 Free Software Foundation, Inc. - Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>. + Copyright (C) 2001, 2003, 2004 Free Software Foundation, Inc. + Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -141,4 +141,3 @@ __backtrace (void **array, int size) } weak_alias (__backtrace, backtrace) -libc_hidden_def (__backtrace) diff --git a/sysdeps/s390/s390-64/bcopy.S b/sysdeps/s390/s390-64/bcopy.S index abcb1fb1b4..ff7966723b 100644 --- a/sysdeps/s390/s390-64/bcopy.S +++ b/sysdeps/s390/s390-64/bcopy.S @@ -1,6 +1,6 @@ /* bcopy -- copy a block from source to destination. 64 bit S/390 version. This file is part of the GNU C Library. - Copyright (C) 2000, 2001, 2005 Free Software Foundation, Inc. + Copyright (C) 2000, 2001 Free Software Foundation, Inc. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). The GNU C Library is free software; you can redistribute it and/or @@ -59,10 +59,14 @@ ENTRY(__bcopy) jo .L6 br %r14 .L7: # destructive overlay, can not use mvcle - lgr %r1,%r2 # bcopy is called with source,dest - lgr %r2,%r3 # memmove with dest,source! Oh, well... - lgr %r3,%r1 - jg HIDDEN_BUILTIN_JUMPTARGET(memmove) + lgr %r1,%r2 # bcopy is called with source,dest + lgr %r2,%r3 # memmove with dest,source! Oh, well... + lgr %r3,%r1 +#ifdef PIC + jg memmove@PLT +#else + jg memmove +#endif END(__bcopy) diff --git a/sysdeps/s390/s390-64/bits/wordsize.h b/sysdeps/s390/s390-64/bits/wordsize.h index b41661217f..4f50d8586c 100644 --- a/sysdeps/s390/s390-64/bits/wordsize.h +++ b/sysdeps/s390/s390-64/bits/wordsize.h @@ -5,14 +5,3 @@ #else # define __WORDSIZE 32 #endif - -#if !defined __NO_LONG_DOUBLE_MATH && !defined __LONG_DOUBLE_MATH_OPTIONAL - -/* Signal that we didn't used to have a `long double'. The changes all - the `long double' function variants to be redirects to the double - functions. */ -# define __LONG_DOUBLE_MATH_OPTIONAL 1 -# ifndef __LONG_DOUBLE_128__ -# define __NO_LONG_DOUBLE_MATH 1 -# endif -#endif diff --git a/sysdeps/s390/s390-64/dl-machine.h b/sysdeps/s390/s390-64/dl-machine.h index 5026a2edad..82ece0be0f 100644 --- a/sysdeps/s390/s390-64/dl-machine.h +++ b/sysdeps/s390/s390-64/dl-machine.h @@ -1,6 +1,6 @@ /* Machine-dependent ELF dynamic relocation inline functions. 64 bit S/390 Version. - Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). This file is part of the GNU C Library. @@ -105,8 +105,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) { got[2] = (Elf64_Addr) &_dl_runtime_profile; - if (GLRO(dl_profile) != NULL - && _dl_name_match_p (GLRO(dl_profile), l)) + if (_dl_name_match_p (GLRO(dl_profile), l)) /* This is the object we are looking for. Say that we really want profiling and the timers are started. */ GL(dl_profile_map) = l; @@ -120,6 +119,112 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) return lazy; } +/* This code is used in dl-runtime.c to call the `fixup' function + and then redirect to the address it returns. */ + +/* s390: + Arguments are in register. + r2 - r7 holds the original parameters for the function call, fixup + and trampoline code use r0-r5 and r14-15. For the correct function + call r2-r5 and r14-15 must be restored. + Arguments from the PLT are stored at 48(r15) and 56(r15) + and must be moved to r2 and r3 for the fixup call (see elf32-s390.c + in the binutils for the PLT code). + Fixup function address in r2. +*/ +#ifndef PROF +#define ELF_MACHINE_RUNTIME_TRAMPOLINE \ + asm ( "\ + .text\n\ + .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\ + brasl 14,fixup # call fixup\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\ + # load return address as third parameter\n\ + lgr 4,14\n\ + brasl 14,profile_fixup # call fixup\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 +#define ELF_MACHINE_RUNTIME_TRAMPOLINE \ + asm ( "\ + .text\n\ + .globl _dl_runtime_resolve\n\ + .globl _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\ + 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\ + # load return address as third parameter\n\ + lgr 4,14\n\ + brasl 14,profile_fixup # call fixup\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\ +"); +#endif + /* Initial entry point code for the dynamic linker. The C function `_dl_start' is the real entry point; its return value is the user program's entry point. */ @@ -238,19 +343,14 @@ elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc, return value; } -/* Names of the architecture-specific auditing callback functions. */ -#define ARCH_LA_PLTENTER s390_64_gnu_pltenter -#define ARCH_LA_PLTEXIT s390_64_gnu_pltexit - #endif /* !dl_machine_h */ -#ifdef RESOLVE_MAP +#ifdef RESOLVE /* Perform the relocation specified by RELOC and SYM (which is fully resolved). MAP is the object containing the reloc. */ -auto inline void -__attribute__ ((always_inline)) +static inline void elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc, const Elf64_Sym *sym, const struct r_found_version *version, void *const reloc_addr_arg) @@ -284,8 +384,17 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc, #ifndef RESOLVE_CONFLICT_FIND_MAP const Elf64_Sym *const refsym = sym; #endif +#if defined USE_TLS && !defined RTLD_BOOTSTRAP struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type); Elf64_Addr value = sym == NULL ? 0 : sym_map->l_addr + sym->st_value; +#else + Elf64_Addr value = RESOLVE (&sym, version, r_type); + +# ifndef RTLD_BOOTSTRAP + if (sym) +# endif + value += sym->st_value; +#endif /* use TLS and !RTLD_BOOTSTRAP */ switch (r_type) { @@ -409,8 +518,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc, } } -auto inline void -__attribute__ ((always_inline)) +static inline void elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc, void *const reloc_addr_arg) { @@ -418,8 +526,7 @@ elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc, *reloc_addr = l_addr + reloc->r_addend; } -auto inline void -__attribute__ ((always_inline)) +static inline void elf_machine_lazy_rel (struct link_map *map, Elf64_Addr l_addr, const Elf64_Rela *reloc) { @@ -439,4 +546,4 @@ elf_machine_lazy_rel (struct link_map *map, _dl_reloc_bad_type (map, r_type, 1); } -#endif /* RESOLVE_MAP */ +#endif /* RESOLVE */ diff --git a/sysdeps/s390/s390-64/dl-trampoline.S b/sysdeps/s390/s390-64/dl-trampoline.S deleted file mode 100644 index 8093582163..0000000000 --- a/sysdeps/s390/s390-64/dl-trampoline.S +++ /dev/null @@ -1,128 +0,0 @@ -/* PLT trampolines. s390 version. - Copyright (C) 2005 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. */ - -/* The PLT stubs will call _dl_runtime_resolve/_dl_runtime_profile - * with the following linkage: - * r2 - r6 : parameter registers - * f0, f2, f4, f6 : floating point parameter registers - * 24(r15), 28(r15) : PLT arguments PLT1, PLT2 - * 96(r15) : additional stack parameters - * The normal clobber rules for function calls apply: - * r0 - r5 : call clobbered - * r6 - r13 : call saved - * r14 : return address (call clobbered) - * r15 : stack pointer (call saved) - * f1, f3, f5, f7 : call saved - * f0 - f3, f5, f7 - f15 : call clobbered - */ - -#include <sysdep.h> - - .text - .globl _dl_runtime_resolve - .type _dl_runtime_resolve, @function - cfi_startproc - .align 16 -_dl_runtime_resolve: - stmg 2,5,64(15) # save registers - stg 14,96(15) - lgr 0,15 # create stack frame - aghi 15,-160 - cfi_adjust_cfa_offset (160) - stg 0,0(15) - lmg 2,3,208(15) # load args saved by PLT - brasl 14,_dl_fixup # call fixup - lgr 1,2 # function addr returned in r2 - aghi 15,160 # remove stack frame - cfi_adjust_cfa_offset (-160) - lg 14,96(15) # restore registers - lmg 2,5,64(15) - br 1 - cfi_endproc - .size _dl_runtime_resolve, .-_dl_runtime_resolve - - -#ifndef PROF - .globl _dl_runtime_profile - .type _dl_runtime_profile, @function - cfi_startproc - .align 16 -_dl_runtime_profile: - stmg %r2,%r6,64(%r15) # save registers - std %f0,104(%r15) - std %f2,112(%r15) - std %f4,120(%r15) - std %f6,128(%r15) - stg %r6,16(%r15) - stg %r12,24(%r15) - stg %r14,32(%r15) - lgr %r12,%r15 # create stack frame - cfi_def_cfa_register (12) - aghi %r15,-160 - stg %r12,0(%r15) - lmg %r2,%r3,48(%r12) # load arguments saved by PLT - lgr %r4,%r14 # return address as third parameter - la %r5,64(%r12) # pointer to struct La_s390_32_regs - la %r6,40(%r12) # long int * framesize - brasl %r14,_dl_profile_fixup # call resolver - lgr %r1,%r2 # function addr returned in r2 - lg %r0,40(%r12) # load framesize - ltgr %r0,%r0 - jnm 1f - lmg %r2,%r6,64(%r12) - ld %f0,104(%r12) - ld %f2,112(%r12) - ld %f4,120(%r12) - ld %f6,128(%r12) - basr %r14,%r1 # call resolved function -0: lr %r15,%r12 # remove stack frame - cfi_def_cfa_register (15) - lg %r14,32(%r15) # restore registers - lg %r12,24(%r15) - lg %r6,16(%r15) - br %r14 - cfi_def_cfa_register (12) -1: jz 4f # framesize == 0 ? - aghi %r0,7 # align framesize to 8 - nill %r0,0xfff8 - slgr %r15,%r0 # make room for framesize bytes - stg %r12,0(%r15) - la %r2,160(%r15) - la %r3,160(%r12) - srlg %r0,%r0,3 -3: mvc 0(8,%r2),0(%r3) # copy additional parameters - la %r2,8(%r2) - la %r3,8(%r3) - brctg %r0,3b -4: lmg %r2,%r6,64(%r12) # load register parameters - ld %f0,104(%r12) - ld %f2,112(%r12) - ld %f4,120(%r12) - ld %f6,128(%r12) - basr %r14,%r1 # call resolved function - stg %r2,136(%r12) - std %f0,144(%r12) - lmg %r2,%r3,48(%r12) # load arguments saved by PLT - la %r4,32(%r12) # pointer to struct La_s390_32_regs - la %r5,72(%r12) # pointer to struct La_s390_32_retval - brasl %r14,_dl_call_pltexit - j 0b - cfi_endproc - .size _dl_runtime_profile, .-_dl_runtime_profile -#endif diff --git a/sysdeps/s390/s390-64/elf/setjmp.S b/sysdeps/s390/s390-64/elf/setjmp.S index 28b6a5a35b..fa3ac72480 100644 --- a/sysdeps/s390/s390-64/elf/setjmp.S +++ b/sysdeps/s390/s390-64/elf/setjmp.S @@ -1,5 +1,5 @@ /* setjmp for 64 bit S/390, ELF version. - Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc. + Copyright (C) 2001, 2002 Free Software Foundation, Inc. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). This file is part of the GNU C Library. @@ -46,25 +46,12 @@ END (setjmp) ENTRY(__sigsetjmp) .Linternal_sigsetjmp: -#ifdef PTR_MANGLE - stmg %r6,%r13,0(%r2) /* Store registers in jmp_buf. */ - lgr %r4,%r14 - lgr %r5,%r15 - PTR_MANGLE (%r4, %r1) - PTR_MANGLE2 (%r5, %r1) - stmg %r4,%r5,64(%r2) -#else stmg %r6,%r15,0(%r2) /* Store registers in jmp_buf. */ -#endif std %f1,80(%r2) std %f3,88(%r2) std %f5,96(%r2) std %f7,104(%r2) -#if defined NOT_IN_libc && defined IS_IN_rtld - /* In ld.so we never save the signal mask. */ - lghi %r2,0 - br %r14 -#elif defined PIC +#ifdef PIC jg __sigjmp_save@PLT /* Branch to PLT of __sigsetjmp. */ #else jg __sigjmp_save diff --git a/sysdeps/s390/s390-64/elf/start.S b/sysdeps/s390/s390-64/elf/start.S index c4cb34d02c..e5013d0057 100644 --- a/sysdeps/s390/s390-64/elf/start.S +++ b/sysdeps/s390/s390-64/elf/start.S @@ -1,5 +1,5 @@ /* Startup code compliant to the 64 bit S/390 ELF ABI. - Copyright (C) 2001, 2002, 2003, 2004, 2006 Free Software Foundation, Inc. + Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). This file is part of the GNU C Library. @@ -78,14 +78,12 @@ _start: la %r7,160(%r15) larl %r6,__libc_csu_fini # load pointer to __libc_csu_fini larl %r5,__libc_csu_init # load pointer to __libc_csu_init + larl %r2,main # load pointer to main /* Ok, now branch to the libc main routine. */ #ifdef PIC - larl %r2,main@GOTENT # load pointer to main - lg %r2,0(%r2) brasl %r14,__libc_start_main@plt #else - larl %r2,main # load pointer to main brasl %r14,__libc_start_main #endif diff --git a/sysdeps/s390/s390-64/s390x-mcount.S b/sysdeps/s390/s390-64/s390x-mcount.S index 0fa614cbf4..5e3890b4f6 100644 --- a/sysdeps/s390/s390-64/s390x-mcount.S +++ b/sysdeps/s390/s390-64/s390x-mcount.S @@ -69,4 +69,4 @@ C_LABEL(_mcount) ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(_mcount)) #undef mcount -weak_alias (_mcount, mcount) +weak_alias(_mcount, mcount) diff --git a/sysdeps/s390/s390-64/setjmp.S b/sysdeps/s390/s390-64/setjmp.S index a962db46ce..7f245c2a1d 100644 --- a/sysdeps/s390/s390-64/setjmp.S +++ b/sysdeps/s390/s390-64/setjmp.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2001, 2005 Free Software Foundation, Inc. +/* Copyright (C) 2001 Free Software Foundation, Inc. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). This file is part of the GNU C Library. @@ -28,27 +28,16 @@ /* R2 = pointer to jmp_buf, R3 = savemask. */ ENTRY(__sigsetjmp) -#ifdef PTR_MANGLE - stmg %r6,%r13,0(%r2) /* Store registers in jmp_buf. */ - lgr %r4,%r14 - lgr %r5,%r15 - PTR_MANGLE (%r4, %r1) - PTR_MANGLE2 (%r5, %r1) - stmg %r4,%r5,64(%r2) -#else stmg %r6,%r15,0(%r2) /* Store registers in jmp_buf. */ -#endif std %f1,80(%r2) std %f3,88(%r2) std %f5,96(%r2) std %f7,104(%r2) -#if defined NOT_IN_libc && defined IS_IN_rtld - /* In ld.so we never save the signal mask. */ - lghi %r2,0 - br %r14 -#elif defined PIC +#ifdef PIC jg __sigjmp_save@PLT /* Tail-call __sigjmp_save. */ #else jg __sigjmp_save /* Tail-call __sigjmp_save. */ #endif END (__sigsetjmp) + + |