From 18363b4f010da9ba459b13310b113ac0647c2fcc Mon Sep 17 00:00:00 2001 From: Tulio Magno Quites Machado Filho Date: Fri, 10 Jan 2020 19:14:56 -0300 Subject: 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 --- sysdeps/unix/sysv/linux/powerpc/dl-auxv.h | 30 +++++++++++++++++++++++++ sysdeps/unix/sysv/linux/powerpc/dl-static.c | 3 +++ sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c | 33 ---------------------------- sysdeps/unix/sysv/linux/powerpc/libc-start.c | 10 +++------ 4 files changed, 36 insertions(+), 40 deletions(-) create mode 100644 sysdeps/unix/sysv/linux/powerpc/dl-auxv.h delete mode 100644 sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c (limited to 'sysdeps/unix/sysv') diff --git a/sysdeps/unix/sysv/linux/powerpc/dl-auxv.h b/sysdeps/unix/sysv/linux/powerpc/dl-auxv.h new file mode 100644 index 0000000000..be2189732a --- /dev/null +++ b/sysdeps/unix/sysv/linux/powerpc/dl-auxv.h @@ -0,0 +1,30 @@ +/* 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 + 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, see + . */ + +#include + +#if IS_IN (libc) && !defined SHARED +int GLRO(dl_cache_line_size); +#endif + +/* 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: \ + GLRO(dl_cache_line_size) = av->a_un.a_val; \ + break; diff --git a/sysdeps/unix/sysv/linux/powerpc/dl-static.c b/sysdeps/unix/sysv/linux/powerpc/dl-static.c index 59ce4e8972..a77e07b503 100644 --- a/sysdeps/unix/sysv/linux/powerpc/dl-static.c +++ b/sysdeps/unix/sysv/linux/powerpc/dl-static.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 diff --git a/sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c b/sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c deleted file mode 100644 index 5d65bc6303..0000000000 --- a/sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c +++ /dev/null @@ -1,33 +0,0 @@ -/* Operating system support for run-time dynamic linker. Linux/PPC version. - Copyright (C) 1997-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 - 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, see - . */ - -#include -#include - -int __cache_line_size attribute_hidden; - -/* 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. */ -#define DL_PLATFORM_AUXV \ - case AT_DCACHEBSIZE: \ - __cache_line_size = av->a_un.a_val; \ - break; - -#include diff --git a/sysdeps/unix/sysv/linux/powerpc/libc-start.c b/sysdeps/unix/sysv/linux/powerpc/libc-start.c index 93f8659fa6..fc86d6e234 100644 --- a/sysdeps/unix/sysv/linux/powerpc/libc-start.c +++ b/sysdeps/unix/sysv/linux/powerpc/libc-start.c @@ -24,7 +24,6 @@ #include #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; -- cgit 1.4.1