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] | |
On Sun, Jan 23, 2005 at 11:36:42PM +0100, Andreas Schwab wrote:
> 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.
>
This is my incomplete patch. I need to spend some time on audit code.
H.J.
-----
2005-01-24 H.J. Lu <hongjiu.lu@intel.com>
* elf/tst-auditmod1.c: Add ia64 entries.
* sysdeps/generic/ldsodefs.h (La_ia64_regs): New.
(La_ia64_retval): New.
(audit_ifaces): Add ia64 entries.
* sysdeps/ia64/bits/link.h: New file.
* sysdeps/ia64/dl-machine.h (elf_machine_runtime_setup): Test
for dl_profile non-null.
(ARCH_LA_PLTENTER): New.
(ARCH_LA_PLTEXIT): New.
* sysdeps/ia64/dl-trampoline.S (_dl_runtime_resolve): Only
allocate 2 output registers. Call _dl_fixup instead of fixup.
(_dl_runtime_profile): Try to support audit.
--- libc/elf/tst-auditmod1.c.tramp 2005-01-24 15:30:36.000000000 -0800
+++ libc/elf/tst-auditmod1.c 2005-01-24 15:41:02.000000000 -0800
@@ -144,6 +144,12 @@ la_symbind64 (Elf64_Sym *sym, unsigned i
# define La_regs La_alpha_regs
# define La_retval La_alpha_retval
# define int_retval lrv_r0
+#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
--- libc/sysdeps/generic/ldsodefs.h.tramp 2005-01-24 15:30:39.000000000 -0800
+++ libc/sysdeps/generic/ldsodefs.h 2005-01-24 15:43:13.000000000 -0800
@@ -189,6 +189,8 @@ struct La_m68k_regs;
struct La_m68k_retval;
struct La_alpha_regs;
struct La_alpha_retval;
+struct La_ia64_regs;
+struct La_ia64_retval;
struct audit_ifaces
{
@@ -233,6 +235,10 @@ struct audit_ifaces
uintptr_t *, struct La_alpha_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
{
@@ -262,6 +268,10 @@ struct audit_ifaces
uintptr_t *,
const struct La_alpha_regs *,
struct La_alpha_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 *);
--- libc/sysdeps/ia64/bits/link.h.tramp 2005-01-07 14:13:48.000000000 -0800
+++ libc/sysdeps/ia64/bits/link.h 2005-01-24 15:40:07.000000000 -0800
@@ -0,0 +1,60 @@
+/* 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 ia64. */
+typedef struct La_ia64_regs
+{
+ uint64_t lr_gr [8];
+ long double lr_fr [8];
+ uint64_t lr_sp;
+ uint64_t lr_gp;
+} La_ia64_regs;
+
+/* Return values for calls from PLT on ia64. */
+typedef struct La_ia64_retval
+{
+ uint64_t lrv_r8;
+ uint64_t lrv_r9;
+ uint64_t lrv_r10;
+ uint64_t lrv_r11;
+ long double lr_fr [8];
+} 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
--- libc/sysdeps/ia64/dl-machine.h.tramp 2005-01-24 15:30:39.000000000 -0800
+++ libc/sysdeps/ia64/dl-machine.h 2005-01-24 16:03:55.000000000 -0800
@@ -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. */
@@ -139,6 +140,9 @@ elf_machine_runtime_setup (struct link_m
return lazy;
}
+/* Names of the architecture-specific auditing callback functions. */
+#define ARCH_LA_PLTENTER ia64_gnu_pltenter
+#define ARCH_LA_PLTEXIT ia64_gnu_pltexit
/* Undo the adds out0 = 16, sp below to get at the value we want in
__libc_stack_end. */
--- libc/sysdeps/ia64/dl-trampoline.S.tramp 2005-01-22 21:11:50.000000000 -0800
+++ libc/sysdeps/ia64/dl-trampoline.S 2005-01-24 16:16:27.795490484 -0800
@@ -32,7 +32,7 @@ ENTRY(_dl_runtime_resolve)
{ .mmi
.prologue
.save ar.pfs, r40
- alloc loc0 = ar.pfs, 8, 6, 3, 0
+ alloc loc0 = ar.pfs, 8, 6, 2, 0
adds r2 = -144, r12
adds r3 = -128, r12
}
@@ -42,13 +42,8 @@ ENTRY(_dl_runtime_resolve)
.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 */
@@ -76,7 +71,7 @@ ENTRY(_dl_runtime_resolve)
{ .mmb
stf.spill [r2] = f14
stf.spill [r3] = f15
- br.call.sptk.many b0 = fixup
+ br.call.sptk.many b0 = _dl_fixup#
}
{ .mii
ld8 r9 = [ret0], 8
@@ -128,35 +123,55 @@ ENTRY(_dl_runtime_resolve)
br.sptk.many b6
;;
}
-END (_dl_runtime_resolve)
+END(_dl_runtime_resolve)
ENTRY(_dl_runtime_profile)
{ .mmi
.prologue
.save ar.pfs, r40
- alloc loc0 = ar.pfs, 8, 6, 3, 0
- adds r2 = -144, r12
- adds r3 = -128, r12
+ alloc loc0 = ar.pfs, 8, 7, 5, 0
+ adds r2 = -224, r12
+ adds r3 = -216, r12
}
{ .mii
- .fframe 160
- adds r12 = -160, r12
+ .fframe 248
+ adds r12 = -248, r12
.save rp, r41
mov loc1 = b0
.body
- mov out2 = b0 /* needed by fixup_profile */
+ mov out2 = b0 /* needed by _dl_fixup_profile */
;;
}
- { .mfb
+ { .mmi
+ st8.spill [r2] = in0, 16 /* store arg 0 */
+ st8.spill [r3] = in1, 16 /* store arg 1 */
mov loc2 = r8 /* preserve struct value register */
- nop.f 0
- nop.b 0
+ ;;
}
- { .mii
+ { .mmi
+ st8.spill [r2] = in2, 16 /* store arg 2 */
+ st8.spill [r3] = in3, 16 /* store arg 3 */
mov loc3 = r9 /* preserve language specific register */
+ ;;
+ }
+ { .mmi
+ st8.spill [r2] = in4, 16 /* store arg 4 */
+ st8.spill [r3] = in5, 16 /* store arg 5 */
mov loc4 = r10 /* preserve language specific register */
+ ;;
+ }
+ { .mmi
+ st8 [r2] = in6, 16 /* store arg 6 */
+ st8 [r3] = in7, 16 /* store arg 7 */
mov loc5 = r11 /* preserve language specific register */
+ ;;
+ }
+ { .mii
+ adds out3 = 16, r12 /* needed by _dl_fixup_profile */
+ adds out4 = 224, r12 /* needed by _dl_fixup_profile */
+ adds r3 = 8, r3
+ ;;
}
{ .mmi
stf.spill [r2] = f8, 32
@@ -176,10 +191,16 @@ ENTRY(_dl_runtime_profile)
shladd out1 = r15, 3, out1
;;
}
+ { .mmi
+ stf.spill [r2] = f14, 32
+ stf.spill [r3] = f15, 24
+ adds loc6 = 248, r12
+ ;;
+ }
{ .mmb
- stf.spill [r2] = f14
- stf.spill [r3] = f15
- br.call.sptk.many b0 = profile_fixup
+ st8 [r2] = gp /* store gp */
+ st8 [r3] = loc6 /* store sp */
+ br.call.sptk.many b0 = _dl_profile_fixup#
}
{ .mii
ld8 r9 = [ret0], 8
@@ -209,7 +230,7 @@ ENTRY(_dl_runtime_profile)
ldf.fill f14 = [r2], 32
ldf.fill f15 = [r3], 32
.restore sp /* pop the unwind frame state */
- adds r12 = 160, r12
+ adds r12 = 248, r12
;;
}
{ .mii
@@ -231,4 +252,4 @@ ENTRY(_dl_runtime_profile)
br.sptk.many b6
;;
}
-END (_dl_runtime_profile)
+END(_dl_runtime_profile)
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |