mirror of
https://sourceware.org/git/glibc.git
synced 2025-01-03 00:10:10 +00:00
* 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>
|
||||
|
||||
* dlfcn/dlerror.c (dlerror): If objname is "", don't put ": " after it.
|
||||
|
@ -98,6 +98,7 @@ libthread_db {
|
||||
GLIBC_2.1.3
|
||||
GLIBC_2.2.3
|
||||
GLIBC_2.3
|
||||
GLIBC_2.3.3
|
||||
}
|
||||
libanl {
|
||||
GLIBC_2.2.3
|
||||
|
@ -139,6 +139,9 @@ _dl_sysdep_start (void **start_argptr,
|
||||
case AT_SYSINFO:
|
||||
GL(dl_sysinfo) = av->a_un.a_val;
|
||||
break;
|
||||
#endif
|
||||
#ifdef DL_PLATFORM_AUXV
|
||||
DL_PLATFORM_AUXV
|
||||
#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.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
@ -22,31 +22,9 @@
|
||||
#include <bp-start.h>
|
||||
#include <bp-sym.h>
|
||||
|
||||
extern void __libc_init_first (int argc, char **argv, char **envp);
|
||||
|
||||
extern int __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
|
||||
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
|
||||
@ -66,6 +44,24 @@ __aux_init_cache (ElfW(auxv_t) *av)
|
||||
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
|
||||
@ -73,7 +69,8 @@ int
|
||||
BPs in the arglist of startup_info.main and startup_info.init. */
|
||||
BP_SYM (__libc_start_main) (int argc, char *__unbounded *__unbounded ubp_av,
|
||||
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,
|
||||
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
|
||||
#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
|
||||
be a NULL pointer, so if not we assume that we're being called
|
||||
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)
|
||||
++temp;
|
||||
auxvec = (ElfW(auxv_t) *)++temp;
|
||||
|
||||
# ifndef SHARED
|
||||
_dl_aux_init (auxvec);
|
||||
# endif
|
||||
#endif
|
||||
rtld_fini = NULL;
|
||||
}
|
||||
|
||||
INIT_ARGV_and_ENVIRON;
|
||||
|
||||
/* 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
|
||||
stack, for backtraces. This variable should be thread-specific.
|
||||
Use +8 so it works for both 32- and 64-bit. */
|
||||
__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));
|
||||
return generic_start_main (stinfo->main, argc, ubp_av, auxvec,
|
||||
stinfo->init, stinfo->fini, rtld_fini,
|
||||
stack_on_entry);
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
@ -27,13 +27,8 @@
|
||||
variable. */
|
||||
|
||||
.globl __cache_line_size
|
||||
.section ".data","aw"
|
||||
.align 2
|
||||
.type __cache_line_size,@object
|
||||
.size __cache_line_size,4
|
||||
__cache_line_size:
|
||||
.long 0
|
||||
.section ".text"
|
||||
.lcomm __cache_line_size,4,4
|
||||
|
||||
/* __ptr_t [r3] memset (__ptr_t s [r3], int c [r4], size_t n [r5]));
|
||||
Returns 's'.
|
||||
|
||||
@ -42,6 +37,7 @@ __cache_line_size:
|
||||
There is a special case for setting whole cache lines to 0, which
|
||||
takes advantage of the dcbz instruction. */
|
||||
|
||||
.section ".text"
|
||||
EALIGN (BP_SYM (memset), 5, 1)
|
||||
|
||||
#define rTMP r0
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
|
||||
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
|
||||
variable. */
|
||||
.globl __cache_line_size
|
||||
.section ".data"
|
||||
.align 2
|
||||
.type __cache_line_size,@object
|
||||
.size __cache_line_size,4
|
||||
__cache_line_size:
|
||||
.long 0
|
||||
.lcomm __cache_line_size,4,4
|
||||
.section ".toc","aw"
|
||||
.LC0:
|
||||
.tc __cache_line_size[TC],__cache_line_size
|
||||
@ -293,4 +288,3 @@ ENTRY (BP_SYM (__bzero))
|
||||
END_GEN_TB (BP_SYM (__bzero),TB_TOCLESS)
|
||||
|
||||
weak_alias (BP_SYM (__bzero), BP_SYM (bzero))
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
@ -25,27 +25,18 @@
|
||||
extern int __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
|
||||
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
|
||||
value to __cache_line_size. */
|
||||
static inline void
|
||||
__aux_init_cache (ElfW(auxv_t) *av)
|
||||
{
|
||||
for (; av->a_type != AT_NULL; ++av)
|
||||
switch (av->a_type)
|
||||
{
|
||||
case AT_DCACHEBSIZE:
|
||||
{
|
||||
int *cls = & __cache_line_size;
|
||||
if (cls != NULL)
|
||||
*cls = av->a_un.a_val;
|
||||
}
|
||||
#define DL_PLATFORM_AUXV \
|
||||
case AT_DCACHEBSIZE: \
|
||||
{ \
|
||||
int *cls = & __cache_line_size; \
|
||||
if (cls != NULL) \
|
||||
*cls = av->a_un.a_val; \
|
||||
} \
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef __ASSUME_STD_AUXV
|
||||
|
||||
@ -78,4 +69,4 @@ __aux_init_cache (ElfW(auxv_t) *av)
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#include <sysdeps/unix/sysv/linux/dl-sysdep.c>
|
||||
#include_next <sysdeps/unix/sysv/linux/dl-sysdep.c>
|
||||
|
Loading…
Reference in New Issue
Block a user