mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
powerpc: Move cache line size to rtld_global_ro
GCC 10.0 enabled -fno-common by default and this started to point that __cache_line_size had been implemented in 2 different places: loader and libc. In order to avoid this duplication, the libc variable has been removed and the loader variable is moved to rtld_global_ro. File sysdeps/unix/sysv/linux/powerpc/dl-auxv.h has been added in order to reuse code for both static and dynamic linking scenarios. Reviewed-by: Carlos O'Donell <carlos@redhat.com>
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
/* Operating system support for run-time dynamic linker. Linux/PPC version.
|
||||
Copyright (C) 1997-2020 Free Software Foundation, Inc.
|
||||
/* Auxiliary vector processing. Linux/PPC version.
|
||||
Copyright (C) 2020 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
|
||||
@ -16,18 +16,15 @@
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
#include <ldsodefs.h>
|
||||
|
||||
int __cache_line_size attribute_hidden;
|
||||
#if IS_IN (libc) && !defined SHARED
|
||||
int GLRO(dl_cache_line_size);
|
||||
#endif
|
||||
|
||||
/* 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. */
|
||||
/* Scan the Aux Vector for the "Data Cache Block Size" entry and assign it
|
||||
to dl_cache_line_size. */
|
||||
#define DL_PLATFORM_AUXV \
|
||||
case AT_DCACHEBSIZE: \
|
||||
__cache_line_size = av->a_un.a_val; \
|
||||
GLRO(dl_cache_line_size) = av->a_un.a_val; \
|
||||
break;
|
||||
|
||||
#include <sysdeps/unix/sysv/linux/dl-sysdep.c>
|
@ -30,12 +30,14 @@ _dl_var_init (void *array[])
|
||||
DL_AUXV = 1,
|
||||
DL_HWCAP = 2,
|
||||
DL_HWCAP2 = 3,
|
||||
DL_CACHE_LINE_SIZE = 4
|
||||
};
|
||||
|
||||
GLRO(dl_pagesize) = *((size_t *) array[DL_PAGESIZE]);
|
||||
GLRO(dl_auxv) = (ElfW(auxv_t) *) *((size_t *) array[DL_AUXV]);
|
||||
GLRO(dl_hwcap) = *((unsigned long int *) array[DL_HWCAP]);
|
||||
GLRO(dl_hwcap2) = *((unsigned long int *) array[DL_HWCAP2]);
|
||||
GLRO(dl_cache_line_size) = (int) *((int *) array[DL_CACHE_LINE_SIZE]);
|
||||
}
|
||||
|
||||
#else
|
||||
@ -46,6 +48,7 @@ static void *variables[] =
|
||||
&GLRO(dl_auxv),
|
||||
&GLRO(dl_hwcap),
|
||||
&GLRO(dl_hwcap2),
|
||||
&GLRO(dl_cache_line_size)
|
||||
};
|
||||
|
||||
static void
|
||||
|
@ -24,7 +24,6 @@
|
||||
#include <hwcapinfo.h>
|
||||
#endif
|
||||
|
||||
int __cache_line_size attribute_hidden;
|
||||
/* The main work is done in the generic function. */
|
||||
#define LIBC_START_MAIN generic_start_main
|
||||
#define LIBC_START_DISABLE_INLINE
|
||||
@ -71,15 +70,12 @@ __libc_start_main (int argc, char **argv,
|
||||
rtld_fini = NULL;
|
||||
}
|
||||
|
||||
/* Initialize the __cache_line_size variable from the aux vector. For the
|
||||
static case, we also need _dl_hwcap, _dl_hwcap2 and _dl_platform, so we
|
||||
can call __tcb_parse_hwcap_and_convert_at_platform (). */
|
||||
for (ElfW (auxv_t) * av = auxvec; av->a_type != AT_NULL; ++av)
|
||||
switch (av->a_type)
|
||||
{
|
||||
case AT_DCACHEBSIZE:
|
||||
__cache_line_size = av->a_un.a_val;
|
||||
break;
|
||||
/* For the static case, we also need _dl_hwcap, _dl_hwcap2 and
|
||||
_dl_platform, so we can call
|
||||
__tcb_parse_hwcap_and_convert_at_platform (). */
|
||||
#ifndef SHARED
|
||||
case AT_HWCAP:
|
||||
_dl_hwcap = (unsigned long int) av->a_un.a_val;
|
||||
|
Reference in New Issue
Block a user