From 07210473414469e26051f5e53b9cc8e6e9429bea Mon Sep 17 00:00:00 2001 From: Carlos Eduardo Seo Date: Wed, 12 Aug 2015 15:45:31 -0300 Subject: [PATCH] [powerpc] Add hwcap/hwcap2/platform data to TCB. This patch adds a new feature for powerpc. In order to get faster access to the HWCAP/HWCAP2 bits and platform number (i.e. for implementing __builtin_cpu_is()/__builtin_cpu_supports() in GCC) without the overhead of reading from the auxiliary vector, we now reserve space for them in the TCB. This is an ABI change for GLIBC 2.23. A new versioned symbol 'init_hwcapinfo' is available to get the data from the auxiliary vector and parse it, and store it for later use in the TLS initialization code. This function also has control code to make sure it is run only once per program execution. A new API is published in ppc.h to get the HWCAP+HWCAP2 and platform number data from the TCB as well. 2015-08-12 Carlos Eduardo Seo * manual/platform.texi: Added a manual entry for the new API. * sysdeps/powerpc/Makefile: Added testcases and new init_hwcapinfo function to the Makefile. * sysdeps/powerpc/Versions: Added new init_hwcapinfo symbol to GLIBC-2.23. * sysdeps/powerpc/hwcapinfo.c: New file. (init_hwcapinfo): New function to initialize and parse hwcap, hwcap2 and platform number information. * sysdeps/powerpc/hwcapinfo.h: New file. Creates global variables to store HWCAP+HWCAP2, platform number and control data. * sysdeps/powerpc/nptl/tcb-offsets.sym: Added new offests for HWCAP+HWCAP2 and platform number in the TCB. * sysdeps/powerpc/nptl/tls.h: New functionality. Stores the HWCAP, HWCAP2 and platform number in the TCB. (dtv): Added new fields for HWCAP+HWCAP2 and platform number. (TLS_INIT_TP): Included calls to add the hwcap and at_platform values in the TCB in TP initialization. (TLS_DEFINE_INIT_TP): Likewise. (THREAD_GET_HWCAP): New macro. (THREAD_SET_HWCAP): Likewise. (THREAD_GET_AT_PLATFORM): Likewise. (THREAD_SET_AT_PLATFORM): Likewise. * sysdeps/powerpc/sys/platform/ppc.h: Added new functions to get the HWCAP+HWCAP2 and platform number values from the TCB. (__ppc_get_hwcap): New function. (__ppc_get_at_platform): Likewise. * sysdeps/powerpc/test-get_hwcap.c: Testcase for this functionality. * sysdeps/unix/sysv/linux/powerpc/dl-support.c: New file. Adds support for AT_PLATFORM in static glibc. * sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist: Included the new init_hwcapinfo symbol in the ABI list for GLIBC 2.23. * sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist: Likewise. --- manual/platform.texi | 25 +++++ sysdeps/powerpc/Makefile | 7 +- sysdeps/powerpc/Versions | 3 + sysdeps/powerpc/hwcapinfo.c | 69 ++++++++++++++ sysdeps/powerpc/hwcapinfo.h | 31 ++++++ sysdeps/powerpc/nptl/tcb-offsets.sym | 8 ++ sysdeps/powerpc/nptl/tls.h | 46 ++++++++- sysdeps/powerpc/sys/platform/ppc.h | 58 ++++++++++++ sysdeps/powerpc/test-get_hwcap.c | 104 +++++++++++++++++++++ sysdeps/unix/sysv/linux/powerpc/dl-support.c | 25 +++++ .../sysv/linux/powerpc/powerpc32/fpu/libc.abilist | 3 + .../sysv/linux/powerpc/powerpc64/libc-le.abilist | 3 + .../unix/sysv/linux/powerpc/powerpc64/libc.abilist | 3 + 13 files changed, 379 insertions(+), 6 deletions(-) create mode 100644 sysdeps/powerpc/hwcapinfo.c create mode 100644 sysdeps/powerpc/hwcapinfo.h create mode 100644 sysdeps/powerpc/test-get_hwcap.c create mode 100644 sysdeps/unix/sysv/linux/powerpc/dl-support.c diff --git a/manual/platform.texi b/manual/platform.texi index 872e32e..65107df 100644 --- a/manual/platform.texi +++ b/manual/platform.texi @@ -14,6 +14,31 @@ Facilities specific to PowerPC that are not specific to a particular operating system are declared in @file{sys/platform/ppc.h}. +@deftypefun {uint64_t} __ppc_get_hwcap (void) +Read the current value of the Hardware Capability (HWCAP) and HWCAP2 +bits from the Thread Control Block (TCB). The result returned is a single +doubleword containing the HWCAP value in the 32 high-order bits and the +HWCAP2 value in the lower 32 bits. + +The HWCAP/HWCAP2 bits state the hardware features available in the current +processor. Those bits are set into the TCB during TLS initialization. + +@code{__ppc_get_hwcap} reads the value of the HWCAP/HWCAP2 bits directly from +the TCB, without the overhead of querying the auxiliary vector. +@end deftypefun + +@deftypefun {uint32_t} __ppc_get_at_platform (void) +Read the current value of the platform number from the Thread Control +Block (TCB). + +The platform number identifies the current processor. It is derived from +the AT_PLATFORM variable in the auxiliary vector. This value is set into +the TCB during TLS initialization. + +@code{__ppc_get_at_platform} reads the value of the platform number directly +from the TCB, without the overhead of querying the auxiliary vector. +@end deftypefun + @deftypefun {uint64_t} __ppc_get_timebase (void) @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} Read the current value of the Time Base Register. diff --git a/sysdeps/powerpc/Makefile b/sysdeps/powerpc/Makefile index 533d763..7a3a156 100644 --- a/sysdeps/powerpc/Makefile +++ b/sysdeps/powerpc/Makefile @@ -4,10 +4,10 @@ endif ifeq ($(subdir),elf) # extra shared linker files to link into dl-allobjs.so and libc -sysdep-dl-routines += dl-machine +sysdep-dl-routines += dl-machine hwcapinfo sysdep_routines += dl-machine # extra shared linker files to link only into dl-allobjs.so -sysdep-rtld-routines += dl-machine +sysdep-rtld-routines += dl-machine hwcapinfo # Don't optimize GD tls sequence to LE. LDFLAGS-tst-tlsopt-powerpc += -Wl,--no-tls-optimize tests += tst-tlsopt-powerpc @@ -24,11 +24,12 @@ ifeq ($(subdir),csu) gen-as-const-headers += rtld-global-offsets.sym # get offset to __locale_struct.__ctype_tolower gen-as-const-headers += locale-defines.sym +sysdep_routines += hwcapinfo endif ifeq ($(subdir),misc) sysdep_headers += sys/platform/ppc.h -tests += test-gettimebase +tests += test-gettimebase test-get_hwcap endif ifneq (,$(filter %le,$(config-machine))) diff --git a/sysdeps/powerpc/Versions b/sysdeps/powerpc/Versions index 2aebf7c..c2731b3 100644 --- a/sysdeps/powerpc/Versions +++ b/sysdeps/powerpc/Versions @@ -6,6 +6,9 @@ libm { } libc { + GLIBC_2.23 { + init_hwcapinfo; + } GLIBC_2.3.4 { _longjmp; __sigsetjmp; _setjmp; longjmp; setjmp; diff --git a/sysdeps/powerpc/hwcapinfo.c b/sysdeps/powerpc/hwcapinfo.c new file mode 100644 index 0000000..d0bb1a8 --- /dev/null +++ b/sysdeps/powerpc/hwcapinfo.c @@ -0,0 +1,69 @@ +/* powerpc hwcap info. + Copyright (C) 2015 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 +#include + +uint64_t __tcb_hwcap __attribute__ ((visibility ("hidden"))); +uint32_t __tcb_platform __attribute__ ((visibility ("hidden"))); +uint32_t __tcb_hwcap_init __attribute__ ((visibility ("hidden"))); + +void +__init_hwcapinfo (void) +{ + + uint64_t h1, h2; + + /* Read AT_PLATFORM string from auxv. */ + __tcb_platform = _dl_string_platform (GLRO(dl_platform)); + + /* Read HWCAP and HWCAP2 from auxv. */ + h1 = GLRO(dl_hwcap); + h2 = GLRO(dl_hwcap2); + + /* hwcap contains only the latest supported ISA, the code checks which is + and fills the previous supported ones. */ + + if (h1 & PPC_FEATURE_ARCH_2_06) + h1 |= PPC_FEATURE_ARCH_2_05 | \ + PPC_FEATURE_POWER5_PLUS | \ + PPC_FEATURE_POWER5 | \ + PPC_FEATURE_POWER4; + else if (h1 & PPC_FEATURE_ARCH_2_05) + h1 |= PPC_FEATURE_POWER5_PLUS | \ + PPC_FEATURE_POWER5 | \ + PPC_FEATURE_POWER4; + else if (h1 & PPC_FEATURE_POWER5_PLUS) + h1 |= PPC_FEATURE_POWER5 | \ + PPC_FEATURE_POWER4; + else if (h1 & PPC_FEATURE_POWER5) + h1|= PPC_FEATURE_POWER4; + + /* Consolidate both HWCAP and HWCAP2 into a single doubleword so that + we can read both in a single load later. */ + __tcb_hwcap = h2; + __tcb_hwcap = (h1 << 32) | __tcb_hwcap; + + __tcb_hwcap_init = 1; + +} +#if IS_IN (libc) +versioned_symbol (libc, __init_hwcapinfo, init_hwcapinfo, GLIBC_2_23); +#endif + diff --git a/sysdeps/powerpc/hwcapinfo.h b/sysdeps/powerpc/hwcapinfo.h new file mode 100644 index 0000000..29bb128 --- /dev/null +++ b/sysdeps/powerpc/hwcapinfo.h @@ -0,0 +1,31 @@ +/* powerpc hwcap info. + Copyright (C) 2015 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 + +#ifndef HWCAPINFO_H +# define HWCAPINFO_H + +extern uint64_t __tcb_hwcap attribute_hidden; +extern uint32_t __tcb_platform attribute_hidden; +extern uint32_t __tcb_hwcap_init attribute_hidden; + +extern void __init_hwcapinfo (void); + +#endif + diff --git a/sysdeps/powerpc/nptl/tcb-offsets.sym b/sysdeps/powerpc/nptl/tcb-offsets.sym index d955142..f580e69 100644 --- a/sysdeps/powerpc/nptl/tcb-offsets.sym +++ b/sysdeps/powerpc/nptl/tcb-offsets.sym @@ -19,7 +19,15 @@ POINTER_GUARD (offsetof (tcbhead_t, pointer_guard) - TLS_TCB_OFFSET - sizeof ( TAR_SAVE (offsetof (tcbhead_t, tar_save) - TLS_TCB_OFFSET - sizeof (tcbhead_t)) DSO_SLOT1 (offsetof (tcbhead_t, dso_slot1) - TLS_TCB_OFFSET - sizeof (tcbhead_t)) DSO_SLOT2 (offsetof (tcbhead_t, dso_slot2) - TLS_TCB_OFFSET - sizeof (tcbhead_t)) +#ifdef __powerpc64__ +TCB_AT_PLATFORM (offsetof (tcbhead_t, at_platform) - TLS_TCB_OFFSET - sizeof(tcbhead_t)) +#endif TM_CAPABLE (offsetof (tcbhead_t, tm_capable) - TLS_TCB_OFFSET - sizeof (tcbhead_t)) +#ifndef __powerpc64__ +TCB_AT_PLATFORM (offsetof (tcbhead_t, at_platform) - TLS_TCB_OFFSET - sizeof(tcbhead_t)) +PADDING (offsetof (tcbhead_t, padding) - TLS_TCB_OFFSET - sizeof(tcbhead_t)) +#endif +TCB_HWCAP (offsetof (tcbhead_t, hwcap) - TLS_TCB_OFFSET - sizeof (tcbhead_t)) #ifndef __ASSUME_PRIVATE_FUTEX PRIVATE_FUTEX_OFFSET thread_offsetof (header.private_futex) #endif diff --git a/sysdeps/powerpc/nptl/tls.h b/sysdeps/powerpc/nptl/tls.h index 1f3d97a..54523c9 100644 --- a/sysdeps/powerpc/nptl/tls.h +++ b/sysdeps/powerpc/nptl/tls.h @@ -44,6 +44,8 @@ typedef union dtv #ifndef __ASSEMBLER__ +# include + /* Get system call information. */ # include @@ -63,8 +65,24 @@ typedef union dtv are private. */ typedef struct { + /* Reservation for HWCAP data. To be accessed by GCC in + __builtin_cpu_supports(), so it is a part of public ABI. */ + uint64_t hwcap; + /* Reservation for AT_PLATFORM data. To be accessed by GCC in + __builtin_cpu_is(), so it is a part of public ABI. Since there + are different ABIs for 32 and 64 bit, we put this field in a + previously empty padding space for powerpc64. */ +#ifndef __powerpc64__ + /* Padding to maintain alignment. */ + uint32_t padding; + uint32_t at_platform; +#endif /* Indicate if HTM capable (ISA 2.07). */ - int tm_capable; + uint32_t tm_capable; + /* Reservation for AT_PLATFORM data - powerpc64. */ +#ifdef __powerpc64__ + uint32_t at_platform; +#endif /* Reservation for Dynamic System Optimizer ABI. */ uintptr_t dso_slot2; uintptr_t dso_slot1; @@ -134,7 +152,11 @@ register void *__thread_register __asm__ ("r13"); # define TLS_INIT_TP(tcbp) \ ({ \ __thread_register = (void *) (tcbp) + TLS_TCB_OFFSET; \ - THREAD_SET_TM_CAPABLE (GLRO (dl_hwcap2) & PPC_FEATURE2_HAS_HTM ? 1 : 0); \ + if (!__tcb_hwcap_init) \ + __init_hwcapinfo(); \ + THREAD_SET_TM_CAPABLE (__tcb_hwcap & PPC_FEATURE2_HAS_HTM ? 1 : 0); \ + THREAD_SET_HWCAP (__tcb_hwcap); \ + THREAD_SET_AT_PLATFORM (__tcb_platform); \ NULL; \ }) @@ -142,7 +164,11 @@ register void *__thread_register __asm__ ("r13"); # define TLS_DEFINE_INIT_TP(tp, pd) \ void *tp = (void *) (pd) + TLS_TCB_OFFSET + TLS_PRE_TCB_SIZE; \ (((tcbhead_t *) ((char *) tp - TLS_TCB_OFFSET))[-1].tm_capable) = \ - THREAD_GET_TM_CAPABLE (); + THREAD_GET_TM_CAPABLE (); \ + (((tcbhead_t *) ((char *) tp - TLS_TCB_OFFSET))[-1].hwcap) = \ + THREAD_GET_HWCAP (); \ + (((tcbhead_t *) ((char *) tp - TLS_TCB_OFFSET))[-1].at_platform) = \ + THREAD_GET_AT_PLATFORM (); /* Return the address of the dtv for the current thread. */ # define THREAD_DTV() \ @@ -203,6 +229,20 @@ register void *__thread_register __asm__ ("r13"); # define THREAD_SET_TM_CAPABLE(value) \ (THREAD_GET_TM_CAPABLE () = (value)) +/* hwcap field in TCB head. */ +# define THREAD_GET_HWCAP() \ + (((tcbhead_t *) ((char *) __thread_register \ + - TLS_TCB_OFFSET))[-1].hwcap) +# define THREAD_SET_HWCAP(value) \ + (THREAD_GET_HWCAP () = (value)) + +/* at_platform field in TCB head. */ +# define THREAD_GET_AT_PLATFORM() \ + (((tcbhead_t *) ((char *) __thread_register \ + - TLS_TCB_OFFSET))[-1].at_platform) +# define THREAD_SET_AT_PLATFORM(value) \ + (THREAD_GET_AT_PLATFORM () = (value)) + /* l_tls_offset == 0 is perfectly valid on PPC, so we have to use some different value to mean unset l_tls_offset. */ # define NO_TLS_OFFSET -1 diff --git a/sysdeps/powerpc/sys/platform/ppc.h b/sysdeps/powerpc/sys/platform/ppc.h index 3febb61..e9a05bc 100644 --- a/sysdeps/powerpc/sys/platform/ppc.h +++ b/sysdeps/powerpc/sys/platform/ppc.h @@ -23,6 +23,64 @@ #include #include + +/* Offsets copied from tcb-offsets.h. */ + +#ifdef __powerpc64__ +# define __TPREG "r13" +# define __HWCAPOFF -28776 +# define __ATPLATOFF -28764 +#else +# define __TPREG "r2" +# define __HWCAPOFF -28736 +# define __HWCAP2OFF -28732 +# define __ATPLATOFF -28724 +#endif + +/* Get the hwcap/hwcap2 information from the TCB. */ + +static __inline__ uint64_t +__ppc_get_hwcap (void) +{ + + uint64_t __tcb_hwcap; + + register unsigned long __tp __asm__ (__TPREG); +#ifdef __powerpc64__ + __asm__ ("ld %0,%1(%2)\n" + : "=r" (__tcb_hwcap) + : "i" (__HWCAPOFF), "r" (__tp)); +#else + uint64_t h1, h2; + + __asm__ ("lwz %0,%1(%2)\n" + : "=r" (h1) + : "i" (__HWCAPOFF), "r" (__tp)); + __asm__ ("lwz %0,%1(%2)\n" + : "=r" (h2) + : "i" (__HWCAP2OFF), "r" (__tp)); + __tcb_hwcap = (h1 >> 32) << 32 | (h2 >> 32); +#endif + + return __tcb_hwcap; +} + +/* Get the AT_PLATFORM number from the TCB. */ + +static __inline__ uint32_t +__ppc_get_at_platform (void) +{ + + uint32_t __tcb_at_platform; + + register unsigned long __tp __asm__ (__TPREG); + __asm__ ("lwz %0,%1(%2)\n" + : "=r" (__tcb_at_platform) + : "i" (__ATPLATOFF), "r" (__tp)); + + return __tcb_at_platform; +} + /* Read the Time Base Register. */ static inline uint64_t __ppc_get_timebase (void) diff --git a/sysdeps/powerpc/test-get_hwcap.c b/sysdeps/powerpc/test-get_hwcap.c new file mode 100644 index 0000000..d03cb3b --- /dev/null +++ b/sysdeps/powerpc/test-get_hwcap.c @@ -0,0 +1,104 @@ +/* Check __ppc_get_hwcap(), __ppc_get_hwcap2() and __ppc_get_at_plaftorm() + functionality. + Copyright (C) 2015 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 + . */ + +/* Tests if the hwcap and hwcap2 data is stored in the TCB. */ + +#include +#include +#include + +#include +#include + +#include + +const char _dl_powerpc_platforms[14][12] += { + [PPC_PLATFORM_POWER4] = "power4", + [PPC_PLATFORM_PPC970] = "ppc970", + [PPC_PLATFORM_POWER5] = "power5", + [PPC_PLATFORM_POWER5_PLUS] = "power5+", + [PPC_PLATFORM_POWER6] = "power6", + [PPC_PLATFORM_CELL_BE] = "ppc-cell-be", + [PPC_PLATFORM_POWER6X] = "power6x", + [PPC_PLATFORM_POWER7] = "power7", + [PPC_PLATFORM_PPCA2] = "ppca2", + [PPC_PLATFORM_PPC405] = "ppc405", + [PPC_PLATFORM_PPC440] = "ppc440", + [PPC_PLATFORM_PPC464] = "ppc464", + [PPC_PLATFORM_PPC476] = "ppc476", + [PPC_PLATFORM_POWER8] = "power8", + }; + +static int +do_test (void) +{ + uint32_t a1, at_platform; + uint64_t h1, h2, hwcap, hwcap2; + const char *at_platform_string; + + /* Testing the get function and if the data is correctly initialized by + TLS_INIT. */ + + h1 = __ppc_get_hwcap (); + hwcap = getauxval(AT_HWCAP); + hwcap2 = getauxval(AT_HWCAP2); + + /* hwcap contains only the latest supported ISA, the code checks which is + and fills the previous supported ones. This is necessary because the + same is done in hwcapinfo.c when setting the values that are copied to + the TCB. */ + + if (hwcap & PPC_FEATURE_ARCH_2_06) + hwcap |= PPC_FEATURE_ARCH_2_05 | PPC_FEATURE_POWER5_PLUS | + PPC_FEATURE_POWER5 | PPC_FEATURE_POWER4; + else if (hwcap & PPC_FEATURE_ARCH_2_05) + hwcap |= PPC_FEATURE_POWER5_PLUS | PPC_FEATURE_POWER5 | PPC_FEATURE_POWER4; + else if (hwcap & PPC_FEATURE_POWER5_PLUS) + hwcap |= PPC_FEATURE_POWER5 | PPC_FEATURE_POWER4; + else if (hwcap & PPC_FEATURE_POWER5) + hwcap |= PPC_FEATURE_POWER4; + + h2 = (hwcap << 32) + hwcap2; + + if ( h1 != h2 ) + { + printf("Fail: __ppc_get_hwcap() - HWCAP is %" PRIx64 ". Should be %" PRIx64 ".\n", h1, h2); + return 1; + } + + at_platform_string = (const char *) getauxval (AT_PLATFORM); + a1 = __ppc_get_at_platform (); + at_platform = _dl_string_platform (at_platform_string); + + if ( a1 != at_platform ) + { + printf("Fail: __ppc_get_at_platform() - AT_PLATFORM is %x. Should be %x\n", a1, at_platform); + return 1; + } + + printf("Pass: HWCAP, HWCAP2 and AT_PLATFORM are correctly set in the TCB.\n"); + + return 0; + +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" + diff --git a/sysdeps/unix/sysv/linux/powerpc/dl-support.c b/sysdeps/unix/sysv/linux/powerpc/dl-support.c new file mode 100644 index 0000000..b221a4c --- /dev/null +++ b/sysdeps/unix/sysv/linux/powerpc/dl-support.c @@ -0,0 +1,25 @@ +/* Operating system support for dynamic linking code in static glibc. + Linux/PPC version. + Copyright (C) 2015 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 + . */ + +#define DL_PLATFORM_AUXV \ + case AT_PLATFORM: \ + GLRO(dl_platform) = (void *) av->a_un.a_val; \ + break; + +#include diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist index 0f15463..f91b60c 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist @@ -1986,6 +1986,9 @@ GLIBC_2.2.6 GLIBC_2.22 GLIBC_2.22 A fmemopen F +GLIBC_2.23 + GLIBC_2.23 A + init_hwcapinfo F GLIBC_2.3 GLIBC_2.3 A __ctype_b_loc F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist index c0b3985..17df4bb 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist @@ -2172,3 +2172,6 @@ GLIBC_2.18 GLIBC_2.22 GLIBC_2.22 A fmemopen F +GLIBC_2.23 + GLIBC_2.23 A + init_hwcapinfo F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist index e58a00d..3aab8e9 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist @@ -93,6 +93,9 @@ GLIBC_2.18 GLIBC_2.22 GLIBC_2.22 A fmemopen F +GLIBC_2.23 + GLIBC_2.23 A + init_hwcapinfo F GLIBC_2.3 GLIBC_2.3 A _Exit F -- 2.3.2 (Apple Git-55)