This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.
Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
Ulrich Drepper <drepper@redhat.com> writes: > That branch is completely irrelevant when it comes to patches. You are > not getting anything ever on that branch unless it has been proved in the > trunk. The trunk is useless until the audit stuff has been implemented. I have only a patch for an incomplete implementation, maybe someone with more knowledge about the IA64 ABI can complete it. Andreas. -- Andreas Schwab, SuSE Labs, schwab@suse.de SuSE Linux Products GmbH, Maxfeldstraße 5, 90409 Nürnberg, Germany Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different."
Index: elf/dl-runtime.c =================================================================== RCS file: /cvs/glibc/libc/elf/dl-runtime.c,v retrieving revision 1.67 diff -u -a -p -r1.67 dl-runtime.c --- elf/dl-runtime.c 9 Jan 2005 20:22:48 -0000 1.67 +++ elf/dl-runtime.c 21 Jan 2005 14:41:33 -0000 @@ -52,7 +52,7 @@ function. */ #ifndef ELF_MACHINE_NO_PLT -ElfW(Addr) +DL_FIXUP_VALUE_TYPE __attribute ((noinline)) ARCH_FIXUP_ATTRIBUTE _dl_fixup ( # ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS @@ -71,7 +71,7 @@ _dl_fixup ( const ElfW(Sym) *sym = &symtab[ELFW(R_SYM) (reloc->r_info)]; void *const rel_addr = (void *)(l->l_addr + reloc->r_offset); lookup_t result; - ElfW(Addr) value; + DL_FIXUP_VALUE_TYPE value; /* Sanity check that we're really looking at a PLT relocation. */ assert (ELFW(R_TYPE)(reloc->r_info) == ELF_MACHINE_JMP_SLOT); @@ -99,13 +99,14 @@ _dl_fixup ( /* Currently result contains the base load address (or link map) of the object that defines sym. Now add in the symbol offset. */ - value = (sym ? LOOKUP_VALUE_ADDRESS (result) + sym->st_value : 0); + value = DL_FIXUP_MAKE_VALUE (sym ? (LOOKUP_VALUE_ADDRESS (result) + + sym->st_value) : 0, result); } else { /* We already found the symbol. The module (and therefore its load address) is also known. */ - value = l->l_addr + sym->st_value; + value = DL_FIXUP_MAKE_VALUE (l->l_addr + sym->st_value, l); result = l; } @@ -122,7 +123,7 @@ _dl_fixup ( #if !defined PROF && !defined ELF_MACHINE_NO_PLT && !__BOUNDED_POINTERS__ -ElfW(Addr) +DL_FIXUP_VALUE_TYPE __attribute ((noinline)) ARCH_FIXUP_ATTRIBUTE _dl_profile_fixup ( #ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS @@ -137,10 +138,10 @@ _dl_profile_fixup ( relocations. */ struct reloc_result *reloc_result = &l->l_reloc_result[reloc_offset / sizeof (PLTREL)]; - ElfW(Addr) *resultp = &reloc_result->addr; + DL_FIXUP_VALUE_TYPE *resultp = &reloc_result->addr; - ElfW(Addr) value = *resultp; - if (value == 0) + DL_FIXUP_VALUE_TYPE value = *resultp; + if (DL_FIXUP_VALUE_CODE_ADDR (value) == 0) { /* This is the first time we have to relocate this object. */ const ElfW(Sym) *const symtab @@ -180,14 +181,15 @@ _dl_profile_fixup ( /* Currently result contains the base load address (or link map) of the object that defines sym. Now add in the symbol offset. */ - value = (defsym != NULL - ? LOOKUP_VALUE_ADDRESS (result) + defsym->st_value : 0); + value = DL_FIXUP_MAKE_VALUE (defsym != NULL + ? (LOOKUP_VALUE_ADDRESS (result) + + defsym->st_value) : 0, result); } else { /* We already found the symbol. The module (and therefore its load address) is also known. */ - value = l->l_addr + refsym->st_value; + value = DL_FIXUP_MAKE_VALUE (l->l_addr + refsym->st_value, l); result = l; } /* And now perhaps the relocation addend. */ @@ -215,7 +217,7 @@ _dl_profile_fixup ( /* Synthesize a symbol record where the st_value field is the result. */ ElfW(Sym) sym = *defsym; - sym.st_value = value; + sym.st_value = DL_FIXUP_VALUE_CODE_ADDR (value); /* Keep track whether there is any interest in tracing the call in the lower two bits. */ @@ -268,7 +270,7 @@ _dl_profile_fixup ( } reloc_result->flags = altvalue; - value = sym.st_value; + DL_FIXUP_VALUE_SET_CODE_ADDR (value, sym.st_value); } else /* Set all bits since this symbol binding is not interesting. */ @@ -287,7 +289,7 @@ _dl_profile_fixup ( #ifdef SHARED /* Auditing checkpoint: report the PLT entering and allow the auditors to change the value. */ - if (value != 0 && GLRO(dl_naudit) > 0 + if (DL_FIXUP_VALUE_CODE_ADDR (value) != 0 && GLRO(dl_naudit) > 0 /* Don't do anything if no auditor wants to intercept this call. */ && (reloc_result->enterexit & LA_SYMB_NOPLTENTER) == 0) { @@ -297,7 +299,7 @@ _dl_profile_fixup ( /* Set up the sym parameter. */ ElfW(Sym) sym = *defsym; - sym.st_value = value; + sym.st_value = DL_FIXUP_VALUE_CODE_ADDR (value); /* Get the symbol name. */ const char *strtab = (const void *) D_PTR (reloc_result->bound, @@ -352,14 +354,14 @@ _dl_profile_fixup ( afct = afct->next; } - value = sym.st_value; + DL_FIXUP_VALUE_SET_CODE_ADDR (value, sym.st_value); } #endif /* Store the frame size information. */ *framesizep = framesize; - (*mcount_fct) (retaddr, value); + (*mcount_fct) (retaddr, DL_FIXUP_VALUE_CODE_ADDR (value)); return value; } Index: elf/tst-auditmod1.c =================================================================== RCS file: /cvs/glibc/libc/elf/tst-auditmod1.c,v retrieving revision 1.7 diff -u -a -p -r1.7 tst-auditmod1.c --- elf/tst-auditmod1.c 16 Jan 2005 06:24:59 -0000 1.7 +++ elf/tst-auditmod1.c 21 Jan 2005 14:41:33 -0000 @@ -138,6 +138,12 @@ la_symbind64 (Elf64_Sym *sym, unsigned i # define La_regs La_m68k_regs # define La_retval La_m68k_retval # define int_retval lrv_d0 +#elif defined __ia64__ +# define pltenter la_ia64_gnu_pltenter +# define pltexit la_ia64_gnu_pltexit +# define La_regs La_ia64_regs +# define La_retval La_ia64_retval +# define int_retval lrv_r8 #else # error "architecture specific code needed" #endif Index: include/link.h =================================================================== RCS file: /cvs/glibc/libc/include/link.h,v retrieving revision 1.35 diff -u -a -p -r1.35 link.h --- include/link.h 18 Jan 2005 01:19:29 -0000 1.35 +++ include/link.h 21 Jan 2005 14:41:33 -0000 @@ -214,7 +214,7 @@ struct link_map /* Collected results of relocation while profiling. */ struct reloc_result { - ElfW(Addr) addr; + DL_FIXUP_VALUE_TYPE addr; struct link_map *bound; unsigned int boundndx; uint32_t enterexit; Index: sysdeps/generic/dl-fptr.h =================================================================== RCS file: /cvs/glibc/libc/sysdeps/generic/dl-fptr.h,v retrieving revision 1.1 diff -u -a -p -r1.1 dl-fptr.h --- sysdeps/generic/dl-fptr.h 2 May 2003 02:37:21 -0000 1.1 +++ sysdeps/generic/dl-fptr.h 21 Jan 2005 14:41:35 -0000 @@ -20,6 +20,8 @@ #ifndef dl_fptr_h #define dl_fptr_h 1 +struct link_map; + /* An FDESC is a function descriptor. */ struct fdesc Index: sysdeps/generic/dl-lookupcfg.h =================================================================== RCS file: /cvs/glibc/libc/sysdeps/generic/dl-lookupcfg.h,v retrieving revision 1.5 diff -u -a -p -r1.5 dl-lookupcfg.h --- sysdeps/generic/dl-lookupcfg.h 6 Jan 2005 22:40:20 -0000 1.5 +++ sysdeps/generic/dl-lookupcfg.h 21 Jan 2005 14:41:35 -0000 @@ -17,4 +17,11 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -/* Nothing special. */ +/* The type of the return value of fixup/profile_fixup. */ +#define DL_FIXUP_VALUE_TYPE ElfW(Addr) +/* Construct a value of type DL_FIXUP_VALUE_TYPE from a code address and a + link map. */ +#define DL_FIXUP_MAKE_VALUE(v, t) v +/* Extract the code address from a value of type DL_FIXUP_MAKE_VALUE. */ +#define DL_FIXUP_VALUE_CODE_ADDR(v) v +#define DL_FIXUP_VALUE_SET_CODE_ADDR(v, a) ((v) = (a)) Index: sysdeps/generic/ldsodefs.h =================================================================== RCS file: /cvs/glibc/libc/sysdeps/generic/ldsodefs.h,v retrieving revision 1.112 diff -u -a -p -r1.112 ldsodefs.h --- sysdeps/generic/ldsodefs.h 16 Jan 2005 02:07:29 -0000 1.112 +++ sysdeps/generic/ldsodefs.h 21 Jan 2005 14:41:35 -0000 @@ -187,6 +187,8 @@ struct La_sh_regs; struct La_sh_retval; struct La_m68k_regs; struct La_m68k_retval; +struct La_ia64_regs; +struct La_ia64_retval; struct audit_ifaces @@ -228,6 +230,10 @@ struct audit_ifaces uintptr_t *, struct La_m68k_regs *, unsigned int *, const char *name, long int *framesizep); + Elf64_Addr (*ia64_gnu_pltenter) (Elf64_Sym *, unsigned int, uintptr_t *, + uintptr_t *, struct La_ia64_regs *, + unsigned int *, const char *name, + long int *framesizep); }; union { @@ -253,6 +259,9 @@ struct audit_ifaces unsigned int (*m68k_gnu_pltexit) (Elf32_Sym *, unsigned int, uintptr_t *, uintptr_t *, const struct La_m68k_regs *, struct La_m68k_retval *, const char *); + unsigned int (*ia64_gnu_pltexit) (Elf64_Sym *, unsigned int, uintptr_t *, + uintptr_t *, const struct La_ia64_regs *, + struct La_ia64_retval *, const char *); }; unsigned int (*objclose) (uintptr_t *); Index: sysdeps/hppa/dl-lookupcfg.h =================================================================== RCS file: /cvs/glibc/libc/sysdeps/hppa/dl-lookupcfg.h,v retrieving revision 1.6 diff -u -a -p -r1.6 dl-lookupcfg.h --- sysdeps/hppa/dl-lookupcfg.h 6 Jan 2005 22:40:18 -0000 1.6 +++ sysdeps/hppa/dl-lookupcfg.h 21 Jan 2005 14:41:35 -0000 @@ -63,3 +63,12 @@ void _dl_unmap (struct link_map *map); ((Elf32_Addr)(addr) & 2 ? (addr) : DL_AUTO_FUNCTION_ADDRESS (map, addr)) #define DL_DT_FINI_ADDRESS(map, addr) \ ((Elf32_Addr)(addr) & 2 ? (addr) : DL_AUTO_FUNCTION_ADDRESS (map, addr)) + +/* The type of the return value of fixup/profile_fixup. */ +#define DL_FIXUP_VALUE_TYPE ElfW(Addr) +/* Construct a value of type DL_FIXUP_VALUE_TYPE from a code address and a + link map. */ +#define DL_FIXUP_MAKE_VALUE(v, t) v +/* Extract the code address from a value of type DL_FIXUP_MAKE_VALUE. */ +#define DL_FIXUP_VALUE_CODE_ADDR(v) v +#define DL_FIXUP_VALUE_SET_CODE_ADDR(v, a) ((v) = (a)) Index: sysdeps/ia64/dl-lookupcfg.h =================================================================== RCS file: /cvs/glibc/libc/sysdeps/ia64/dl-lookupcfg.h,v retrieving revision 1.11 diff -u -a -p -r1.11 dl-lookupcfg.h --- sysdeps/ia64/dl-lookupcfg.h 6 Jan 2005 22:40:17 -0000 1.11 +++ sysdeps/ia64/dl-lookupcfg.h 21 Jan 2005 14:41:35 -0000 @@ -17,6 +17,8 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#include <dl-fptr.h> + #define ELF_FUNCTION_PTR_IS_SPECIAL #define DL_UNMAP_IS_SPECIAL @@ -56,3 +58,13 @@ extern void _dl_unmap (struct link_map * #define DL_DT_INIT_ADDRESS(map, addr) DL_AUTO_FUNCTION_ADDRESS (map, addr) #define DL_DT_FINI_ADDRESS(map, addr) DL_AUTO_FUNCTION_ADDRESS (map, addr) + +/* The type of the return value of fixup/profile_fixup. */ +#define DL_FIXUP_VALUE_TYPE struct fdesc +/* Construct a value of type DL_FIXUP_VALUE_TYPE from a code address and a + link map. */ +#define DL_FIXUP_MAKE_VALUE(v, t) \ + ((struct fdesc) { (v), (t)->l_info[DT_PLTGOT]->d_un.d_ptr }) +/* Extract the code address from a value of type DL_FIXUP_MAKE_VALUE. */ +#define DL_FIXUP_VALUE_CODE_ADDR(v) (v).ip +#define DL_FIXUP_VALUE_SET_CODE_ADDR(v, a) ((v).ip = (a)) Index: sysdeps/ia64/dl-machine.h =================================================================== RCS file: /cvs/glibc/libc/sysdeps/ia64/dl-machine.h,v retrieving revision 1.36 diff -u -a -p -r1.36 dl-machine.h --- sysdeps/ia64/dl-machine.h 15 Dec 2004 08:54:00 -0000 1.36 +++ sysdeps/ia64/dl-machine.h 21 Jan 2005 14:41:35 -0000 @@ -123,7 +123,8 @@ elf_machine_runtime_setup (struct link_m doit = (Elf64_Addr) ((struct fdesc *) &_dl_runtime_resolve)->ip; else { - if (_dl_name_match_p (GLRO(dl_profile), l)) + if (GLRO(dl_profile) != NULL + && _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. */ @@ -140,133 +141,6 @@ elf_machine_runtime_setup (struct link_m } -/* - This code is used in dl-runtime.c to call the `fixup' function - and then redirect to the address it returns. `fixup()' takes two - arguments, however profile_fixup() takes three. - - The ABI specifies that we will never see more than 8 input - registers to a function call, thus it is safe to simply allocate - those, and simpler than playing stack games. - - 12/09/99 Jes - */ -#define TRAMPOLINE_TEMPLATE(tramp_name, fixup_name) \ - extern void tramp_name (void); \ - asm ( \ -" .global " #tramp_name "#\n" \ -" .proc " #tramp_name "#\n" \ -#tramp_name ":\n" \ -" { .mmi\n" \ -" .prologue\n" \ -" .save ar.pfs, r40\n" \ -" alloc loc0 = ar.pfs, 8, 6, 3, 0\n" \ -" adds r2 = -144, r12\n" \ -" adds r3 = -128, r12\n" \ -" }\n" \ -" { .mii\n" \ -" .fframe 160\n" \ -" adds r12 = -160, r12\n" \ -" .save rp, r41\n" \ -" mov loc1 = b0\n" \ -" .body\n" \ -" mov out2 = b0 /* needed by fixup_profile */\n" \ -" ;;\n" \ -" }\n" \ -" { .mfb\n" \ -" mov loc2 = r8 /* preserve struct value register */\n" \ -" nop.f 0\n" \ -" nop.b 0\n" \ -" }\n" \ -" { .mii\n" \ -" mov loc3 = r9 /* preserve language specific register */\n" \ -" mov loc4 = r10 /* preserve language specific register */\n" \ -" mov loc5 = r11 /* preserve language specific register */\n" \ -" }\n" \ -" { .mmi\n" \ -" stf.spill [r2] = f8, 32\n" \ -" stf.spill [r3] = f9, 32\n" \ -" mov out0 = r16\n" \ -" ;;\n" \ -" }\n" \ -" { .mmi\n" \ -" stf.spill [r2] = f10, 32\n" \ -" stf.spill [r3] = f11, 32\n" \ -" shl out1 = r15, 4\n" \ -" ;;\n" \ -" }\n" \ -" { .mmi\n" \ -" stf.spill [r2] = f12, 32\n" \ -" stf.spill [r3] = f13, 32\n" \ -" shladd out1 = r15, 3, out1\n" \ -" ;;\n" \ -" }\n" \ -" { .mmb\n" \ -" stf.spill [r2] = f14\n" \ -" stf.spill [r3] = f15\n" \ -" br.call.sptk.many b0 = " #fixup_name "#\n" \ -" }\n" \ -" { .mii\n" \ -" ld8 r9 = [ret0], 8\n" \ -" adds r2 = 16, r12\n" \ -" adds r3 = 32, r12\n" \ -" ;;\n" \ -" }\n" \ -" { .mmi\n" \ -" ldf.fill f8 = [r2], 32\n" \ -" ldf.fill f9 = [r3], 32\n" \ -" mov b0 = loc1\n" \ -" ;;\n" \ -" }\n" \ -" { .mmi\n" \ -" ldf.fill f10 = [r2], 32\n" \ -" ldf.fill f11 = [r3], 32\n" \ -" mov b6 = r9\n" \ -" ;;\n" \ -" }\n" \ -" { .mmi\n" \ -" ldf.fill f12 = [r2], 32\n" \ -" ldf.fill f13 = [r3], 32\n" \ -" mov ar.pfs = loc0\n" \ -" ;;\n" \ -" }\n" \ -" { .mmi\n" \ -" ldf.fill f14 = [r2], 32\n" \ -" ldf.fill f15 = [r3], 32\n" \ -" .restore sp /* pop the unwind frame state */\n" \ -" adds r12 = 160, r12\n" \ -" ;;\n" \ -" }\n" \ -" { .mii\n" \ -" mov r9 = loc3 /* restore language specific register */\n" \ -" mov r10 = loc4 /* restore language specific register */\n" \ -" mov r11 = loc5 /* restore language specific register */\n" \ -" }\n" \ -" { .mii\n" \ -" ld8 gp = [ret0]\n" \ -" mov r8 = loc2 /* restore struct value register */\n" \ -" ;;\n" \ -" }\n" \ -" /* An alloc is needed for the break system call to work.\n" \ -" We don't care about the old value of the pfs register. */\n" \ -" { .mmb\n" \ -" .prologue\n" \ -" .body\n" \ -" alloc r2 = ar.pfs, 0, 0, 8, 0\n" \ -" br.sptk.many b6\n" \ -" ;;\n" \ -" }\n" \ -" .endp " #tramp_name "#\n"); - -#ifndef PROF -#define ELF_MACHINE_RUNTIME_TRAMPOLINE \ - TRAMPOLINE_TEMPLATE (_dl_runtime_resolve, fixup); \ - TRAMPOLINE_TEMPLATE (_dl_runtime_profile, profile_fixup); -#else -#define ELF_MACHINE_RUNTIME_TRAMPOLINE \ - TRAMPOLINE_TEMPLATE (_dl_runtime_resolve, fixup); \ - strong_alias (_dl_runtime_resolve, _dl_runtime_profile); -#endif - /* Undo the adds out0 = 16, sp below to get at the value we want in __libc_stack_end. */ #define DL_STACK_END(cookie) \ @@ -454,36 +328,35 @@ elf_machine_runtime_setup (struct link_m #define ELF_MACHINE_START_ADDRESS(map, start) \ DL_STATIC_FUNCTION_ADDRESS (map, start) -#define elf_machine_profile_fixup_plt(l, reloc, rel_addr, value) \ - elf_machine_fixup_plt (l, reloc, rel_addr, value) - -#define elf_machine_profile_plt(reloc_addr) ((Elf64_Addr) (reloc_addr)) - /* Fixup a PLT entry to bounce directly to the function at VALUE. */ -static inline Elf64_Addr __attribute__ ((always_inline)) +static inline struct fdesc __attribute__ ((always_inline)) elf_machine_fixup_plt (struct link_map *l, lookup_t t, const Elf64_Rela *reloc, - Elf64_Addr *reloc_addr, Elf64_Addr value) + Elf64_Addr *reloc_addr, struct fdesc value) { /* l is the link_map for the caller, t is the link_map for the object * being called */ /* got has already been relocated in elf_get_dynamic_info() */ - reloc_addr[1] = t->l_info[DT_PLTGOT]->d_un.d_ptr; + reloc_addr[1] = value.gp; /* we need a "release" here to ensure that the gp is visible before the code entry point is updated: */ - ((volatile Elf64_Addr *) reloc_addr)[0] = value; - return (Elf64_Addr) reloc_addr; + ((volatile Elf64_Addr *) reloc_addr)[0] = value.ip; + return value; } /* Return the final value of a plt relocation. */ -static inline Elf64_Addr +static inline struct fdesc elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc, - Elf64_Addr value) + struct fdesc value) { /* No need to handle rel vs rela since IA64 is rela only */ - return value + reloc->r_addend; + return (struct fdesc) { value.ip + reloc->r_addend, value.gp }; } +/* Names of the architecture-specific auditing callback functions. */ +#define ARCH_LA_PLTENTER ia64_gnu_pltenter +#define ARCH_LA_PLTEXIT ia64_gnu_pltexit + #endif /* !dl_machine_h */ #ifdef RESOLVE_MAP @@ -552,7 +425,8 @@ elf_machine_rela (struct link_map *map, ;/* No adjustment. */ else if (r_type == R_IA64_IPLTLSB) { - elf_machine_fixup_plt (NULL, sym_map, reloc, reloc_addr, value); + elf_machine_fixup_plt (NULL, NULL, reloc, reloc_addr, + DL_FIXUP_MAKE_VALUE (value, sym_map)); return; } else if (R_IA64_TYPE (r_type) == R_IA64_TYPE (R_IA64_FPTR64LSB)) Index: sysdeps/ia64/dl-trampoline.S =================================================================== RCS file: sysdeps/ia64/dl-trampoline.S diff -N sysdeps/ia64/dl-trampoline.S --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ sysdeps/ia64/dl-trampoline.S 21 Jan 2005 14:41:35 -0000 @@ -0,0 +1,227 @@ +/* PLT trampolines. ia64 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. */ + +#include <sysdep.h> + + .text + .global _dl_runtime_resolve# + .proc _dl_runtime_resolve# +_dl_runtime_resolve: + { .mmi + .prologue + .save ar.pfs, r40 + alloc loc0 = ar.pfs, 8, 6, 3, 0 + adds r2 = -144, r12 + adds r3 = -128, r12 + } + { .mii + .fframe 160 + adds r12 = -160, r12 + .save rp, r41 + mov loc1 = b0 + .body + mov out2 = b0 /* needed by fixup_profile */ + ;; + } + { .mfb + mov loc2 = r8 /* preserve struct value register */ + nop.f 0 + nop.b 0 + } + { .mii + mov loc3 = r9 /* preserve language specific register */ + mov loc4 = r10 /* preserve language specific register */ + mov loc5 = r11 /* preserve language specific register */ + } + { .mmi + stf.spill [r2] = f8, 32 + stf.spill [r3] = f9, 32 + mov out0 = r16 + ;; + } + { .mmi + stf.spill [r2] = f10, 32 + stf.spill [r3] = f11, 32 + shl out1 = r15, 4 + ;; + } + { .mmi + stf.spill [r2] = f12, 32 + stf.spill [r3] = f13, 32 + shladd out1 = r15, 3, out1 + ;; + } + { .mmb + stf.spill [r2] = f14 + stf.spill [r3] = f15 + br.call.sptk.many b0 = _dl_fixup# + } + { .mii + adds r2 = 16, r12 + adds r3 = 32, r12 + mov b6 = ret0 + ;; + } + { .mmi + ldf.fill f8 = [r2], 32 + ldf.fill f9 = [r3], 32 + mov b0 = loc1 + ;; + } + { .mmi + ldf.fill f10 = [r2], 32 + ldf.fill f11 = [r3], 32 + mov gp = ret1 + ;; + } + { .mmi + ldf.fill f12 = [r2], 32 + ldf.fill f13 = [r3], 32 + mov ar.pfs = loc0 + ;; + } + { .mmi + ldf.fill f14 = [r2], 32 + ldf.fill f15 = [r3], 32 + .restore sp /* pop the unwind frame state */ + adds r12 = 160, r12 + ;; + } + { .mii + mov r9 = loc3 /* restore language specific register */ + mov r10 = loc4 /* restore language specific register */ + mov r11 = loc5 /* restore language specific register */ + } + { .mii + mov r8 = loc2 /* restore struct value register */ + ;; + } + /* An alloc is needed for the break system call to work. + We don't care about the old value of the pfs register. */ + { .mmb + .prologue + .body + alloc r2 = ar.pfs, 0, 0, 8, 0 + br.sptk.many b6 + ;; + } + .endp _dl_runtime_resolve# + + .global _dl_runtime_profile# + .proc _dl_runtime_profile# +_dl_runtime_profile: + { .mmi + .prologue + .save ar.pfs, r40 + alloc loc0 = ar.pfs, 8, 6, 5, 0 + adds r2 = -144, r12 + adds r3 = -128, r12 + } + { .mii + .fframe 160 + adds r12 = -160, r12 + .save rp, r41 + mov loc1 = b0 + .body + mov out2 = b0 /* needed by _dl_profile_fixup */ + ;; + } + { .mii + mov loc2 = r8 /* preserve struct value register */ + adds out3 = 16, r12 /* needed by _dl_profile_fixup */ + adds out4 = 8, r12 /* needed by _dl_profile_fixup */ + } + { .mii + mov loc3 = r9 /* preserve language specific register */ + mov loc4 = r10 /* preserve language specific register */ + mov loc5 = r11 /* preserve language specific register */ + } + { .mmi + stf.spill [r2] = f8, 32 + stf.spill [r3] = f9, 32 + mov out0 = r16 + ;; + } + { .mmi + stf.spill [r2] = f10, 32 + stf.spill [r3] = f11, 32 + shl out1 = r15, 4 + ;; + } + { .mmi + stf.spill [r2] = f12, 32 + stf.spill [r3] = f13, 32 + shladd out1 = r15, 3, out1 + ;; + } + { .mmb + stf.spill [r2] = f14 + stf.spill [r3] = f15 + br.call.sptk.many b0 = _dl_profile_fixup# + } + { .mii + adds r2 = 16, r12 + adds r3 = 32, r12 + mov b6 = ret0 + ;; + } + { .mmi + ldf.fill f8 = [r2], 32 + ldf.fill f9 = [r3], 32 + mov b0 = loc1 + ;; + } + { .mmi + ldf.fill f10 = [r2], 32 + ldf.fill f11 = [r3], 32 + mov gp = ret1 + ;; + } + { .mmi + ldf.fill f12 = [r2], 32 + ldf.fill f13 = [r3], 32 + mov ar.pfs = loc0 + ;; + } + { .mmi + ldf.fill f14 = [r2], 32 + ldf.fill f15 = [r3], 32 + .restore sp /* pop the unwind frame state */ + adds r12 = 160, r12 + ;; + } + { .mii + mov r9 = loc3 /* restore language specific register */ + mov r10 = loc4 /* restore language specific register */ + mov r11 = loc5 /* restore language specific register */ + } + { .mii + mov r8 = loc2 /* restore struct value register */ + ;; + } + /* An alloc is needed for the break system call to work. + We don't care about the old value of the pfs register. */ + { .mmb + .prologue + .body + alloc r2 = ar.pfs, 0, 0, 8, 0 + br.sptk.many b6 + ;; + } + .endp _dl_runtime_profile# Index: sysdeps/ia64/bits/link.h =================================================================== RCS file: /cvs/glibc/libc/sysdeps/ia64/bits/link.h,v retrieving revision 1.2 diff -u -a -p -r1.2 link.h --- sysdeps/ia64/bits/link.h 6 Jan 2005 22:40:16 -0000 1.2 +++ sysdeps/ia64/bits/link.h 21 Jan 2005 14:41:35 -0000 @@ -0,0 +1,54 @@ +/* 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. */ + +#ifndef _LINK_H +# error "Never include <bits/link.h> directly; use <link.h> instead." +#endif + + +/* Registers for entry into PLT on IA-64. */ +typedef struct La_ia64_regs +{ + /* To be defined. */ +} La_ia64_regs; + +/* Return values for calls from PLT on IA-64. */ +typedef struct La_ia64_retval +{ + uint64_t lrv_r8; + /* To be defined. */ +} La_ia64_retval; + + +__BEGIN_DECLS + +extern Elf64_Addr la_ia64_gnu_pltenter (Elf64_Sym *__sym, unsigned int __ndx, + uintptr_t *__refcook, + uintptr_t *__defcook, + La_ia64_regs *__regs, + unsigned int *__flags, + const char *__symname, + long int *__framesizep); +extern unsigned int la_ia64_gnu_pltexit (Elf64_Sym *__sym, unsigned int __ndx, + uintptr_t *__refcook, + uintptr_t *__defcook, + const La_ia64_regs *__inregs, + La_ia64_retval *__outregs, + const char *symname); + +__END_DECLS Index: sysdeps/powerpc/powerpc64/dl-lookupcfg.h =================================================================== RCS file: /cvs/glibc/libc/sysdeps/powerpc/powerpc64/dl-lookupcfg.h,v retrieving revision 1.2 diff -u -a -p -r1.2 dl-lookupcfg.h --- sysdeps/powerpc/powerpc64/dl-lookupcfg.h 6 Jan 2005 22:40:16 -0000 1.2 +++ sysdeps/powerpc/powerpc64/dl-lookupcfg.h 21 Jan 2005 14:41:35 -0000 @@ -0,0 +1,27 @@ +/* Configuration of lookup functions. PowerPC64 version. + Copyright (C) 2002, 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 type of the return value of fixup/profile_fixup. */ +#define DL_FIXUP_VALUE_TYPE ElfW(Addr) +/* Construct a value of type DL_FIXUP_VALUE_TYPE from a code address and a + link map. */ +#define DL_FIXUP_MAKE_VALUE(v, t) v +/* Extract the code address from a value of type DL_FIXUP_MAKE_VALUE. */ +#define DL_FIXUP_VALUE_CODE_ADDR(v) v +#define DL_FIXUP_VALUE_SET_CODE_ADDR(v, a) ((v) = (a))
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |