mirror of git://sourceware.org/git/glibc.git
* sysdeps/powerpc/elf/libc-start.c (AUX_VECTOR_INIT): Define it.
(LIBC_START_MAIN, LIBC_START_MAIN_AUXVEC_ARG, MAIN_AUXVEC_ARG) (INIT_MAIN_ARGS): Define, and #include <sysdeps/generic/libc-start.c>. (__libc_start_main): Just call the generic one for most of the work. * sysdeps/generic/libc-start.c [LIBC_START_MAIN]: If defined, define a static function by that name instead of BP_SYM (__libc_start_main). [LIBC_START_MAIN_AUXVEC_ARG]: Take AUXVEC as argument. [MAIN_AUXVEC_ARG]: Pass 4th argument to MAIN. [INIT_MAIN_ARGS]: Give INIT the same args as MAIN. * sysdeps/generic/dl-sysdep.c (_dl_sysdep_start) [DL_PLATFORM_AUXV]: Use this macro for extra AT_* cases. * sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c (DL_PLATFORM_AUXV): New macro, guts from ... (__aux_init_cache): ... here, function removed. (DL_PLATFORM_INIT): Don't define this. * sysdeps/powerpc/powerpc32/memset.S: Put __cache_line_size in bss. * sysdeps/powerpc/powerpc64/memset.S: Likewise. * Versions.def (libthread_db): Add GLICB_2.3.3 set.
This commit is contained in:
parent
2b089f2101
commit
124dcac84b
25
ChangeLog
25
ChangeLog
|
@ -1,3 +1,28 @@
|
||||||
|
2003-03-15 Roland McGrath <roland@redhat.com>
|
||||||
|
|
||||||
|
* sysdeps/powerpc/elf/libc-start.c (AUX_VECTOR_INIT): Define it.
|
||||||
|
(LIBC_START_MAIN, LIBC_START_MAIN_AUXVEC_ARG, MAIN_AUXVEC_ARG)
|
||||||
|
(INIT_MAIN_ARGS): Define, and #include <sysdeps/generic/libc-start.c>.
|
||||||
|
(__libc_start_main): Just call the generic one for most of the work.
|
||||||
|
|
||||||
|
* sysdeps/generic/libc-start.c [LIBC_START_MAIN]: If defined, define a
|
||||||
|
static function by that name instead of BP_SYM (__libc_start_main).
|
||||||
|
[LIBC_START_MAIN_AUXVEC_ARG]: Take AUXVEC as argument.
|
||||||
|
[MAIN_AUXVEC_ARG]: Pass 4th argument to MAIN.
|
||||||
|
[INIT_MAIN_ARGS]: Give INIT the same args as MAIN.
|
||||||
|
|
||||||
|
* sysdeps/generic/dl-sysdep.c (_dl_sysdep_start) [DL_PLATFORM_AUXV]:
|
||||||
|
Use this macro for extra AT_* cases.
|
||||||
|
* sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c (DL_PLATFORM_AUXV):
|
||||||
|
New macro, guts from ...
|
||||||
|
(__aux_init_cache): ... here, function removed.
|
||||||
|
(DL_PLATFORM_INIT): Don't define this.
|
||||||
|
|
||||||
|
* sysdeps/powerpc/powerpc32/memset.S: Put __cache_line_size in bss.
|
||||||
|
* sysdeps/powerpc/powerpc64/memset.S: Likewise.
|
||||||
|
|
||||||
|
* Versions.def (libthread_db): Add GLICB_2.3.3 set.
|
||||||
|
|
||||||
2003-03-14 Roland McGrath <roland@redhat.com>
|
2003-03-14 Roland McGrath <roland@redhat.com>
|
||||||
|
|
||||||
* dlfcn/dlerror.c (dlerror): If objname is "", don't put ": " after it.
|
* dlfcn/dlerror.c (dlerror): If objname is "", don't put ": " after it.
|
||||||
|
|
|
@ -98,6 +98,7 @@ libthread_db {
|
||||||
GLIBC_2.1.3
|
GLIBC_2.1.3
|
||||||
GLIBC_2.2.3
|
GLIBC_2.2.3
|
||||||
GLIBC_2.3
|
GLIBC_2.3
|
||||||
|
GLIBC_2.3.3
|
||||||
}
|
}
|
||||||
libanl {
|
libanl {
|
||||||
GLIBC_2.2.3
|
GLIBC_2.2.3
|
||||||
|
|
|
@ -139,6 +139,9 @@ _dl_sysdep_start (void **start_argptr,
|
||||||
case AT_SYSINFO:
|
case AT_SYSINFO:
|
||||||
GL(dl_sysinfo) = av->a_un.a_val;
|
GL(dl_sysinfo) = av->a_un.a_val;
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef DL_PLATFORM_AUXV
|
||||||
|
DL_PLATFORM_AUXV
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (C) 1998,2000,2001,2002 Free Software Foundation, Inc.
|
/* Copyright (C) 1998,2000,2001,2002,2003 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
@ -22,31 +22,9 @@
|
||||||
#include <bp-start.h>
|
#include <bp-start.h>
|
||||||
#include <bp-sym.h>
|
#include <bp-sym.h>
|
||||||
|
|
||||||
extern void __libc_init_first (int argc, char **argv, char **envp);
|
|
||||||
|
|
||||||
extern int __cache_line_size;
|
extern int __cache_line_size;
|
||||||
weak_extern (__cache_line_size)
|
weak_extern (__cache_line_size)
|
||||||
|
|
||||||
extern int __libc_multiple_libcs;
|
|
||||||
extern void *__libc_stack_end;
|
|
||||||
|
|
||||||
#ifndef SHARED
|
|
||||||
# include <tls.h>
|
|
||||||
extern void __pthread_initialize_minimal (void)
|
|
||||||
# if !(USE_TLS - 0) && !defined NONTLS_INIT_TP
|
|
||||||
__attribute__ ((weak))
|
|
||||||
# endif
|
|
||||||
;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct startup_info
|
|
||||||
{
|
|
||||||
void *__unbounded sda_base;
|
|
||||||
int (*main) (int, char **, char **, void *);
|
|
||||||
int (*init) (int, char **, char **, void *);
|
|
||||||
void (*fini) (void);
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Scan the Aux Vector for the "Data Cache Block Size" entry. If found
|
/* Scan the Aux Vector for the "Data Cache Block Size" entry. If found
|
||||||
verify that the static extern __cache_line_size is defined by checking
|
verify that the static extern __cache_line_size is defined by checking
|
||||||
for not NULL. If it is defined then assign the cache block size
|
for not NULL. If it is defined then assign the cache block size
|
||||||
|
@ -66,6 +44,24 @@ __aux_init_cache (ElfW(auxv_t) *av)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/* This is used in sysdeps/generic/libc-start.c. */
|
||||||
|
#define AUX_VECTOR_INIT __aux_init_cache
|
||||||
|
|
||||||
|
/* The main work is done in the generic function. */
|
||||||
|
#define LIBC_START_MAIN generic_start_main
|
||||||
|
#define LIBC_START_MAIN_AUXVEC_ARG
|
||||||
|
#define MAIN_AUXVEC_ARG
|
||||||
|
#define INIT_MAIN_ARGS
|
||||||
|
#include <sysdeps/generic/libc-start.c>
|
||||||
|
|
||||||
|
|
||||||
|
struct startup_info
|
||||||
|
{
|
||||||
|
void *__unbounded sda_base;
|
||||||
|
int (*main) (int, char **, char **, void *);
|
||||||
|
int (*init) (int, char **, char **, void *);
|
||||||
|
void (*fini) (void);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -73,7 +69,8 @@ int
|
||||||
BPs in the arglist of startup_info.main and startup_info.init. */
|
BPs in the arglist of startup_info.main and startup_info.init. */
|
||||||
BP_SYM (__libc_start_main) (int argc, char *__unbounded *__unbounded ubp_av,
|
BP_SYM (__libc_start_main) (int argc, char *__unbounded *__unbounded ubp_av,
|
||||||
char *__unbounded *__unbounded ubp_ev,
|
char *__unbounded *__unbounded ubp_ev,
|
||||||
ElfW(auxv_t) *__unbounded auxvec, void (*rtld_fini) (void),
|
ElfW(auxv_t) *__unbounded auxvec,
|
||||||
|
void (*rtld_fini) (void),
|
||||||
struct startup_info *__unbounded stinfo,
|
struct startup_info *__unbounded stinfo,
|
||||||
char *__unbounded *__unbounded stack_on_entry)
|
char *__unbounded *__unbounded stack_on_entry)
|
||||||
{
|
{
|
||||||
|
@ -83,15 +80,6 @@ BP_SYM (__libc_start_main) (int argc, char *__unbounded *__unbounded ubp_av,
|
||||||
# define argv ubp_av
|
# define argv ubp_av
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef SHARED
|
|
||||||
/* The next variable is only here to work around a bug in gcc <= 2.7.2.2.
|
|
||||||
If the address would be taken inside the expression the optimizer
|
|
||||||
would try to be too smart and throws it away. Grrr. */
|
|
||||||
int *dummy_addr = &_dl_starting_up;
|
|
||||||
|
|
||||||
__libc_multiple_libcs = dummy_addr && !_dl_starting_up;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* the PPC SVR4 ABI says that the top thing on the stack will
|
/* the PPC SVR4 ABI says that the top thing on the stack will
|
||||||
be a NULL pointer, so if not we assume that we're being called
|
be a NULL pointer, so if not we assume that we're being called
|
||||||
as a statically-linked program by Linux... */
|
as a statically-linked program by Linux... */
|
||||||
|
@ -110,78 +98,14 @@ BP_SYM (__libc_start_main) (int argc, char *__unbounded *__unbounded ubp_av,
|
||||||
while (*temp != NULL)
|
while (*temp != NULL)
|
||||||
++temp;
|
++temp;
|
||||||
auxvec = (ElfW(auxv_t) *)++temp;
|
auxvec = (ElfW(auxv_t) *)++temp;
|
||||||
|
|
||||||
# ifndef SHARED
|
|
||||||
_dl_aux_init (auxvec);
|
|
||||||
# endif
|
|
||||||
#endif
|
#endif
|
||||||
rtld_fini = NULL;
|
rtld_fini = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
INIT_ARGV_and_ENVIRON;
|
|
||||||
|
|
||||||
/* Initialize the __cache_line_size variable from the aux vector. */
|
/* Initialize the __cache_line_size variable from the aux vector. */
|
||||||
__aux_init_cache(auxvec);
|
__aux_init_cache (auxvec);
|
||||||
|
|
||||||
/* Store something that has some relationship to the end of the
|
return generic_start_main (stinfo->main, argc, ubp_av, auxvec,
|
||||||
stack, for backtraces. This variable should be thread-specific.
|
stinfo->init, stinfo->fini, rtld_fini,
|
||||||
Use +8 so it works for both 32- and 64-bit. */
|
stack_on_entry);
|
||||||
__libc_stack_end = stack_on_entry + 8;
|
|
||||||
|
|
||||||
#ifndef SHARED
|
|
||||||
# ifdef DL_SYSDEP_OSCHECK
|
|
||||||
if (!__libc_multiple_libcs)
|
|
||||||
{
|
|
||||||
/* This needs to run to initiliaze _dl_osversion before TLS
|
|
||||||
setup might check it. */
|
|
||||||
DL_SYSDEP_OSCHECK (__libc_fatal);
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
/* Initialize the thread library at least a bit since the libgcc
|
|
||||||
functions are using thread functions if these are available and
|
|
||||||
we need to setup errno. If there is no thread library and we
|
|
||||||
handle TLS the function is defined in the libc to initialized the
|
|
||||||
TLS handling. */
|
|
||||||
# if !(USE_TLS - 0) && !defined NONTLS_INIT_TP
|
|
||||||
if (__pthread_initialize_minimal)
|
|
||||||
# endif
|
|
||||||
__pthread_initialize_minimal ();
|
|
||||||
|
|
||||||
/* Some security at this point. Prevent starting a SUID binary where
|
|
||||||
the standard file descriptors are not opened. We have to do this
|
|
||||||
only for statically linked applications since otherwise the dynamic
|
|
||||||
loader did the work already. */
|
|
||||||
if (__builtin_expect (__libc_enable_secure, 0))
|
|
||||||
__libc_check_standard_fds ();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Register the destructor of the dynamic linker if there is any. */
|
|
||||||
if (rtld_fini != NULL)
|
|
||||||
__cxa_atexit ((void (*) (void *)) rtld_fini, NULL, NULL);
|
|
||||||
|
|
||||||
/* Call the initializer of the libc. */
|
|
||||||
#ifdef SHARED
|
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
|
|
||||||
_dl_debug_printf ("\ninitialize libc\n\n");
|
|
||||||
#endif
|
|
||||||
__libc_init_first (argc, argv, __environ);
|
|
||||||
|
|
||||||
/* Register the destructor of the program, if any. */
|
|
||||||
if (stinfo->fini)
|
|
||||||
__cxa_atexit ((void (*) (void *)) stinfo->fini, NULL, NULL);
|
|
||||||
|
|
||||||
/* Call the initializer of the program, if any. */
|
|
||||||
#ifdef SHARED
|
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
|
|
||||||
_dl_debug_printf ("\ninitialize program: %s\n\n", argv[0]);
|
|
||||||
#endif
|
|
||||||
if (stinfo->init)
|
|
||||||
stinfo->init (argc, argv, __environ, auxvec);
|
|
||||||
|
|
||||||
#ifdef SHARED
|
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
|
|
||||||
_dl_debug_printf ("\ntransferring control: %s\n\n", argv[0]);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
exit (stinfo->main (argc, argv, __environ, auxvec));
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Optimized memset implementation for PowerPC.
|
/* Optimized memset implementation for PowerPC.
|
||||||
Copyright (C) 1997, 1999, 2000 Free Software Foundation, Inc.
|
Copyright (C) 1997, 1999, 2000, 2003 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
@ -27,13 +27,8 @@
|
||||||
variable. */
|
variable. */
|
||||||
|
|
||||||
.globl __cache_line_size
|
.globl __cache_line_size
|
||||||
.section ".data","aw"
|
.lcomm __cache_line_size,4,4
|
||||||
.align 2
|
|
||||||
.type __cache_line_size,@object
|
|
||||||
.size __cache_line_size,4
|
|
||||||
__cache_line_size:
|
|
||||||
.long 0
|
|
||||||
.section ".text"
|
|
||||||
/* __ptr_t [r3] memset (__ptr_t s [r3], int c [r4], size_t n [r5]));
|
/* __ptr_t [r3] memset (__ptr_t s [r3], int c [r4], size_t n [r5]));
|
||||||
Returns 's'.
|
Returns 's'.
|
||||||
|
|
||||||
|
@ -42,6 +37,7 @@ __cache_line_size:
|
||||||
There is a special case for setting whole cache lines to 0, which
|
There is a special case for setting whole cache lines to 0, which
|
||||||
takes advantage of the dcbz instruction. */
|
takes advantage of the dcbz instruction. */
|
||||||
|
|
||||||
|
.section ".text"
|
||||||
EALIGN (BP_SYM (memset), 5, 1)
|
EALIGN (BP_SYM (memset), 5, 1)
|
||||||
|
|
||||||
#define rTMP r0
|
#define rTMP r0
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Optimized memset implementation for PowerPC64.
|
/* Optimized memset implementation for PowerPC64.
|
||||||
Copyright (C) 1997, 1999, 2000, 2002 Free Software Foundation, Inc.
|
Copyright (C) 1997, 1999, 2000, 2002, 2003 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
@ -26,12 +26,7 @@
|
||||||
to obtain the value set by the kernel and store it into this
|
to obtain the value set by the kernel and store it into this
|
||||||
variable. */
|
variable. */
|
||||||
.globl __cache_line_size
|
.globl __cache_line_size
|
||||||
.section ".data"
|
.lcomm __cache_line_size,4,4
|
||||||
.align 2
|
|
||||||
.type __cache_line_size,@object
|
|
||||||
.size __cache_line_size,4
|
|
||||||
__cache_line_size:
|
|
||||||
.long 0
|
|
||||||
.section ".toc","aw"
|
.section ".toc","aw"
|
||||||
.LC0:
|
.LC0:
|
||||||
.tc __cache_line_size[TC],__cache_line_size
|
.tc __cache_line_size[TC],__cache_line_size
|
||||||
|
@ -293,4 +288,3 @@ ENTRY (BP_SYM (__bzero))
|
||||||
END_GEN_TB (BP_SYM (__bzero),TB_TOCLESS)
|
END_GEN_TB (BP_SYM (__bzero),TB_TOCLESS)
|
||||||
|
|
||||||
weak_alias (BP_SYM (__bzero), BP_SYM (bzero))
|
weak_alias (BP_SYM (__bzero), BP_SYM (bzero))
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Operating system support for run-time dynamic linker. Linux/PPC version.
|
/* Operating system support for run-time dynamic linker. Linux/PPC version.
|
||||||
Copyright (C) 1997, 1998, 2001 Free Software Foundation, Inc.
|
Copyright (C) 1997, 1998, 2001, 2003 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
@ -25,27 +25,18 @@
|
||||||
extern int __cache_line_size;
|
extern int __cache_line_size;
|
||||||
weak_extern (__cache_line_size)
|
weak_extern (__cache_line_size)
|
||||||
|
|
||||||
#define DL_PLATFORM_INIT __aux_init_cache(_dl_auxv)
|
|
||||||
|
|
||||||
/* Scan the Aux Vector for the "Data Cache Block Size" entry. If found
|
/* Scan the Aux Vector for the "Data Cache Block Size" entry. If found
|
||||||
verify that the static extern __cache_line_size is defined by checking
|
verify that the static extern __cache_line_size is defined by checking
|
||||||
for not NULL. If it is defined then assign the cache block size
|
for not NULL. If it is defined then assign the cache block size
|
||||||
value to __cache_line_size. */
|
value to __cache_line_size. */
|
||||||
static inline void
|
#define DL_PLATFORM_AUXV \
|
||||||
__aux_init_cache (ElfW(auxv_t) *av)
|
case AT_DCACHEBSIZE: \
|
||||||
{
|
{ \
|
||||||
for (; av->a_type != AT_NULL; ++av)
|
int *cls = & __cache_line_size; \
|
||||||
switch (av->a_type)
|
if (cls != NULL) \
|
||||||
{
|
*cls = av->a_un.a_val; \
|
||||||
case AT_DCACHEBSIZE:
|
} \
|
||||||
{
|
|
||||||
int *cls = & __cache_line_size;
|
|
||||||
if (cls != NULL)
|
|
||||||
*cls = av->a_un.a_val;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef __ASSUME_STD_AUXV
|
#ifndef __ASSUME_STD_AUXV
|
||||||
|
|
||||||
|
@ -78,4 +69,4 @@ __aux_init_cache (ElfW(auxv_t) *av)
|
||||||
} while (0)
|
} while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <sysdeps/unix/sysv/linux/dl-sysdep.c>
|
#include_next <sysdeps/unix/sysv/linux/dl-sysdep.c>
|
||||||
|
|
Loading…
Reference in New Issue