]> sourceware.org Git - glibc.git/log
glibc.git
4 years ago elf: Add tst-ldconfig-ld_so_conf-update test
Alexandra Hájková [Thu, 9 Jan 2020 19:44:34 +0000 (20:44 +0100)]
 elf: Add tst-ldconfig-ld_so_conf-update test

 Test ldconfig after /etc/ld.so.conf update and verify a running process
 observes changes to /etc/ld.so.cache.
 The test uses the test-in-container framework.

Reviewed-by: Arjun Shankar <arjun@redhat.com>
4 years agoRevise NEWS description of changes to gettimeofday etc.
Zack Weinberg [Wed, 8 Jan 2020 20:23:12 +0000 (15:23 -0500)]
Revise NEWS description of changes to gettimeofday etc.

Mostly English grammar and style improvements.  The bullet list is
reorganized a little for clarity.  The details of exactly which
Linux-based ports still report system-wide time zone information
from gettimeofday has been removed, as this is not intended to be
something people should rely on.

Also clarify the deprecation of older SPARC ISAs, based on the fact
that “SPARC version 7” is actually the very first version of the SPARC
ISA (Sun Microsystems was very fond of letting the marketing
department pick version numbers).

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
4 years agoDrop dependency of dist target on ChangeLog
Siddhesh Poyarekar [Wed, 8 Jan 2020 08:48:49 +0000 (14:18 +0530)]
Drop dependency of dist target on ChangeLog

We no longer write manual ChangeLog entries since they are
auto-generated at release time.  Drop dependency of the `make dist`
target on the file and document the fact that the latest ChangeLog
entries can be read in the highest numbered ChangeLog.N file in
ChangeLog.old.

The ChangeLog.old/ChangeLog.20 file for 2.31 will thus be generated
just before tagging a release.

Reviewed-by: Paul Eggert <eggert@cs.ucla.edu>
Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
4 years agoMIPS: Fix circular definition of __LDBL_MANT_DIG__ in ieee754.h
Zack Weinberg [Wed, 8 Jan 2020 19:28:23 +0000 (14:28 -0500)]
MIPS: Fix circular definition of __LDBL_MANT_DIG__ in ieee754.h

In commit aa706e13f4bfdf32a27c498902edf4f6006e433e,
sysdeps/mips/ieee754/ieee754.h was changed to use GCC’s predefined
macro __LDBL_MANT_DIG__, instead of including <float.h> and using
LDBL_MANT_DIG (and therefore polluting the user namespace with all of
the macros defined in float.h).  In order to support compilers that
don’t provide __LDBL_MANT_DIG__, there is a fallback #if block which
was supposed to include <float.h> and then define __LDBL_MANT_DIG__ to
LDBL_MANT_DIG.  However, at some point during the development of the
patch, a typo was introduced, causing the fallback block to define
__LDBL_MANT_DIG__ to expand to __LDBL_MANT_DIG__.

Correct this typo.

4 years agosl_SI locale: Use "." as the thousands separator (bug 25233)
Rafał Lużyński [Fri, 3 Jan 2020 11:11:20 +0000 (12:11 +0100)]
sl_SI locale: Use "." as the thousands separator (bug 25233)

This is correct according to CLDR [1] and Florian Weimer's quick
research. [2]

[1] https://st.unicode.org/cldr-apps/v#/sl/Symbols/
[2] https://sourceware.org/bugzilla/show_bug.cgi?id=25233#c0

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
4 years agoFix formatting of ChangeLog ouput
Siddhesh Poyarekar [Tue, 7 Jan 2020 04:25:03 +0000 (09:55 +0530)]
Fix formatting of ChangeLog ouput

Add another newline when the number of files differing is too large.
This is typical for across-the-board changes such as the copyright
year update that happened recently.

4 years agohurd: Fix message reception for timer_thread
Samuel Thibault [Sun, 5 Jan 2020 17:09:13 +0000 (18:09 +0100)]
hurd: Fix message reception for timer_thread

Without a proper size, we get MACH_RCV_TOO_LARGE instead of MACH_MSG_SUCCESS.

* sysdeps/mach/hurd/setitimer.c (timer_thread): Add return_code_type
field to received message, and set the receive size in __mach_msg call.

4 years agohtl: Add __errno_location and __h_errno_location
Samuel Thibault [Sat, 4 Jan 2020 18:37:53 +0000 (19:37 +0100)]
htl: Add __errno_location and __h_errno_location

As explained on
https://sourceware.org/ml/libc-alpha/2020-01/msg00049.html
the presence of __errno_location in libpthread.so on GNU/Linux makes
libpthread getting linked in for libstdc++. This aligns on that behavior, to
avoid issues that only GNU/Hurd would get.

4 years agohtl: Move pthread_atfork to libc_nonshared.a
Samuel Thibault [Sat, 4 Jan 2020 17:53:23 +0000 (18:53 +0100)]
htl: Move pthread_atfork to libc_nonshared.a

This follows bd60ce86520b ('nptl: Move pthread_atfork to libc_nonshared.a')
with the same rationale: there is no non-libpthread equivalent to be used
for making linking against libpthread optional.

libpthread_nonshared.a is unused after this, so remove it from the
build.

There is no ABI impact because pthread_atfork was implemented using
__register_atfork in libc even before this change.

pthread_atfork has to be a weak alias because pthread_* names are not
reserved in libc.

4 years agohtl: Drop common tcbhead_t definition
Samuel Thibault [Sat, 4 Jan 2020 17:52:00 +0000 (18:52 +0100)]
htl: Drop common tcbhead_t definition

This would conflict when including pt-internal.h outside libpthread, while
we can actually just include <tls.h>

4 years agohtl: Use dso_handle.h
Samuel Thibault [Sat, 4 Jan 2020 16:21:22 +0000 (17:21 +0100)]
htl: Use dso_handle.h

4 years agolinux: Optimize fallback 32-bit clock_getres
Adhemerval Zanella [Mon, 16 Dec 2019 16:50:57 +0000 (13:50 -0300)]
linux: Optimize fallback 32-bit clock_getres

This patch avoid probing the __NR_clock_getttime64 syscall each time
__clock_gettime64 is issued on a kernel without 64 bit time support.
Once ENOSYS is obtained, only 32-bit clock_gettime are used.

The following snippet:

  clock_getres (CLOCK_REALTIME, &(struct timespec) { 0 });
  clock_getres (CLOCK_MONOTONIC, &(struct timespec) { 0 });
  clock_getres (CLOCK_BOOTTIME, &(struct timespec) { 0 });
  clock_getres (20, &(struct timespec) { 0 });

On a kernel without 64 bit time support issues the syscalls:

  syscall_0x196(0, 0xffb83330, [...]) = -1 ENOSYS (Function not implemented)
  clock_getres(CLOCK_REALTIME, {tv_sec=0, tv_nsec=1}) = 0
  clock_getres(CLOCK_MONOTONIC, {tv_sec=0, tv_nsec=1}) = 0
  clock_getres(CLOCK_BOOTTIME, {tv_sec=0, tv_nsec=1}) = 0

Checked on i686-linux-gnu on 4.15 kernel.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
4 years agolinux: Add support for clock_getres64 vDSO
Adhemerval Zanella [Wed, 11 Dec 2019 19:39:01 +0000 (16:39 -0300)]
linux: Add support for clock_getres64 vDSO

No architecture currently defines the vDSO symbol.  On archictures
with 64-bit time_t the HAVE_CLOCK_GETRES_VSYSCALL is renamed to
HAVE_CLOCK_GETRES64_VSYSCALL, it simplifies clock_gettime code.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
4 years agolinux: Enable vDSO clock_gettime64 for mips
Adhemerval Zanella [Wed, 11 Dec 2019 14:19:41 +0000 (11:19 -0300)]
linux: Enable vDSO clock_gettime64 for mips

It was added on Linux 5.4 (commit 1f66c45db3302).

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
4 years agolinux: Enable vDSO clock_gettime64 for arm
Adhemerval Zanella [Wed, 11 Dec 2019 14:17:12 +0000 (11:17 -0300)]
linux: Enable vDSO clock_gettime64 for arm

It was added on Linux 5.5 (commit 74d06efb9c2f9).

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
4 years agolinux: Enable vDSO clock_gettime64 for i386
Adhemerval Zanella [Wed, 11 Dec 2019 14:15:21 +0000 (11:15 -0300)]
linux: Enable vDSO clock_gettime64 for i386

It was added on Linux 5.3 (commit 22ca962288c0a).

Checked on i686-linux-gnu with 5.3.0 kernel.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
4 years agolinux: Optimize fallback 32-bit clock_gettime
Adhemerval Zanella [Sat, 14 Dec 2019 13:05:44 +0000 (10:05 -0300)]
linux: Optimize fallback 32-bit clock_gettime

This patch avoid probing the __NR_clock_getttime64 syscall each time
__clock_gettime64 is issued on a kernel without 64 bit time support.
Once ENOSYS is obtained, only 32-bit clock_gettime are used.

The following snippet:

  clock_gettime (CLOCK_REALTIME, &(struct timespec) { 0 });
  clock_gettime (CLOCK_MONOTONIC, &(struct timespec) { 0 });
  clock_gettime (CLOCK_BOOTTIME, &(struct timespec) { 0 });
  clock_gettime (20, &(struct timespec) { 0 });

On a kernel without 64 bit time support and with vDSO support results
on the following syscalls:

  syscall_0x193(0, 0xff87ba30, [...]) = -1 ENOSYS (Function not implemented)
  clock_gettime(CLOCK_BOOTTIME, {tv_sec=927082, tv_nsec=474382032}) = 0
  clock_gettime(0x14 /* CLOCK_??? */, 0xff87b9f8) = -1 EINVAL (Invalid argument)

While on a kernel without vDSO support:

  syscall_0x193(0, 0xbec95550, 0xb6ed2000, 0x1, 0xbec95550, 0) = -1 (errno 38)
  clock_gettime(CLOCK_REALTIME, {tv_sec=1576615930, tv_nsec=638250162}) = 0
  clock_gettime(CLOCK_MONOTONIC, {tv_sec=1665478, tv_nsec=638779620}) = 0
  clock_gettime(CLOCK_BOOTTIME, {tv_sec=1675418, tv_nsec=292932704}) = 0
  clock_gettime(0x14 /* CLOCK_??? */, 0xbec95530) = -1 EINVAL (Invalid argument)

Checked on i686-linux-gnu on 4.15 kernel and on a 5.3 kernel.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
4 years agolinux: Add support for clock_gettime64 vDSO
Adhemerval Zanella [Wed, 11 Dec 2019 14:13:50 +0000 (11:13 -0300)]
linux: Add support for clock_gettime64 vDSO

No architecture currently defines the vDSO symbol.  On architectures
with 64-bit time_t the HAVE_CLOCK_GETTIME_VSYSCALL is renamed to
HAVE_CLOCK_GETTIME64_VSYSCALL, it simplifies clock_gettime code.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
4 years agoelf: Move vDSO setup to rtld (BZ#24967)
Adhemerval Zanella [Fri, 29 Nov 2019 13:44:59 +0000 (10:44 -0300)]
elf: Move vDSO setup to rtld (BZ#24967)

This patch moves the vDSO setup from libc to loader code, just after
the vDSO link_map setup.  For static case the initialization
is moved to _dl_non_dynamic_init instead.

Instead of using the mangled pointer, the vDSO data is set as
attribute_relro (on _rtld_global_ro for shared or _dl_vdso_* for
static).  It is read-only even with partial relro.

It fixes BZ#24967 now that the vDSO pointer is setup earlier than
malloc interposition is called.

Also, vDSO calls should not be a problem for static dlopen as
indicated by BZ#20802.  The vDSO pointer would be zero-initialized
and the syscall will be issued instead.

Checked on x86_64-linux-gnu, i686-linux-gnu, aarch64-linux-gnu,
arm-linux-gnueabihf, powerpc64le-linux-gnu, powerpc64-linux-gnu,
powerpc-linux-gnu, s390x-linux-gnu, sparc64-linux-gnu, and
sparcv9-linux-gnu.  I also run some tests on mips.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
4 years agoelf: Enable relro for static build
Adhemerval Zanella [Fri, 29 Nov 2019 13:26:30 +0000 (10:26 -0300)]
elf: Enable relro for static build

The code is similar to the one at elf/dl-reloc.c, where it checks for
the l_relro_size from the link_map (obtained from PT_GNU_RELRO header
from program headers) and calls_dl_protected_relro.

For testing I will use the ones proposed by Florian's patch
'elf: Add tests for working RELRO protection' [1].

Checked on x86_64-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu,
aarch64-linux-gnu, s390x-linux-gnu, and sparc64-linux-gnu.  I also
check with --enable-static pie on x86_64-linux-gnu, i686-linux-gnu,
and aarch64-linux-gnu which seems the only architectures where
static PIE is actually working (as per 9d7a3741c9e, on
arm-linux-gnueabihf, powerpc64{le}-linux-gnu, and s390x-linux-gnu
I am seeing runtime issues not related to my patch).

[1] https://sourceware.org/ml/libc-alpha/2019-10/msg00059.html

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
4 years agolinux: Consolidate time implementation
Adhemerval Zanella [Mon, 16 Dec 2019 12:58:32 +0000 (09:58 -0300)]
linux: Consolidate time implementation

The IFUNC bypass to vDSO is used when USE_IFUNC_TIME is set.
Currently powerpc and x86 defines it.  Otherwise the generic
implementation is used, which calls clock_gettime.

Checked on powerpc64le-linux-gnu, powerpc64-linux-gnu,
powerpc-linux-gnu-power4, x86_64-linux-gnu, and i686-linux-gnu.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
4 years agolinux: Consolidate Linux gettimeofday
Adhemerval Zanella [Mon, 16 Dec 2019 12:45:55 +0000 (09:45 -0300)]
linux: Consolidate Linux gettimeofday

The IFUNC bypass to vDSO is used when USE_IFUNC_GETTIMEOFDAY is set.
Currently aarch64, powerpc*, and x86 defines it.  Otherwise the
generic implementation is used, which calls clock_gettime.

Checked on aarch64-linux-gnu, powerpc64le-linux-gnu,
powerpc64-linux-gnu, powerpc-linux-gnu-power4, x86_64-linux-gnu,
and i686-linux-gnu.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
4 years agolinux: Update mips vDSO symbols
Adhemerval Zanella [Fri, 29 Nov 2019 12:22:50 +0000 (09:22 -0300)]
linux: Update mips vDSO symbols

The clock_getres is a new implementation added on Linux 5.4
(abed3d826f2f).

Checked with a build against mips-linux-gnu and mips64-linux-gnu.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
4 years agolinux: Update x86 vDSO symbols
Adhemerval Zanella [Fri, 29 Nov 2019 12:14:08 +0000 (09:14 -0300)]
linux: Update x86 vDSO symbols

Add the missing time and clock_getres vDSO symbol names on x86.
For time, the iFUNC already uses expected name so it affects only
the static build.

The clock_getres is a new implementation added on Linux 5.3
(f66501dc53e72).

Checked on x86-linux-gnu and i686-linux-gnu.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
4 years agoRemove vDSO support from make-syscall.sh
Adhemerval Zanella [Fri, 29 Nov 2019 19:28:46 +0000 (16:28 -0300)]
Remove vDSO support from make-syscall.sh

The auto-generated vDSO call shows some issues:

  - It requires sync the auto-generated C file with current glibc
    implementation;
  - It still uses symbol redirections hacks where libc-symbols.h
    provide macros that uses compiler builtins
    (libc_ifunc_redirected for instance);
  - It does not handle all required compiler handling
    (inhibit_stack_protector on iFUNC resolver).
  - No architecure uses it.

Checked with a build against all major ABIs.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
4 years agox86: Make x32 use x86 time implementation
Adhemerval Zanella [Fri, 29 Nov 2019 14:44:30 +0000 (11:44 -0300)]
x86: Make x32 use x86 time implementation

This is the only use of auto-generation syscall which uses a vDSO
plus IFUNC and the current x86 generic implementation already covers
the expected semantic.

Checked on x86_64-linux-gnu-x32.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
4 years agolinux: Fix vDSO macros build with time64 interfaces
Adhemerval Zanella [Fri, 13 Dec 2019 20:30:15 +0000 (17:30 -0300)]
linux: Fix vDSO macros build with time64 interfaces

As indicated on libc-help [1] the ec138c67cb commit broke 32-bit
builds when configured with --enable-kernel=5.1 or higher.  The
scenario 10 from [2] might also occur in this configuration and
INLINE_VSYSCALL will try to use the vDSO symbol and
HAVE_CLOCK_GETTIME64_VSYSCALL does not set HAVE_VSYSCALL prior its
usage.

Also, there is no easy way to just enable the code to use one
vDSO symbol since the macro INLINE_VSYSCALL is redefined if
HAVE_VSYSCALL is set.

Instead of adding more pre-processor handling and making the code
even more convoluted, this patch removes the requirement of defining
HAVE_VSYSCALL before including sysdep-vdso.h to enable vDSO usage.

The INLINE_VSYSCALL is now expected to be issued inside a
HAVE_*_VSYSCALL check, since it will try to use the internal vDSO
pointers.

Both clock_getres and clock_gettime vDSO code for time64_t were
removed since there is no vDSO setup code for the symbol (an
architecture can not set HAVE_CLOCK_GETTIME64_VSYSCALL).

Checked on i686-linux-gnu (default and with --enable-kernel=5.1),
x86_64-linux-gnu, aarch64-linux-gnu, and powerpc64le-linux-gnu.
I also checked against a build to mips64-linux-gnu and
sparc64-linux-gnu.

[1] https://sourceware.org/ml/libc-help/2019-12/msg00014.html
[2] https://sourceware.org/ml/libc-alpha/2019-12/msg00142.html

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
4 years agoLinux: Fix clock_nanosleep time64 check
Adhemerval Zanella [Thu, 2 Jan 2020 18:39:12 +0000 (15:39 -0300)]
Linux: Fix clock_nanosleep time64 check

The result of INTERNAL_SYSCALL_CANCEL should be checked with
macros INTERNAL_SYSCALL_ERROR_P and INTERNAL_SYSCALL_ERRNO instead
of comparing the result directly.

Checked on powerpc-linux-gnu.

4 years agoAdd libm_alias_finite for _finite symbols
Wilco Dijkstra [Tue, 16 Jul 2019 15:17:22 +0000 (12:17 -0300)]
Add libm_alias_finite for _finite symbols

This patch adds a new macro, libm_alias_finite, to define all _finite
symbol.  It sets all _finite symbol as compat symbol based on its first
version (obtained from the definition at built generated first-versions.h).

The <fn>f128_finite symbols were introduced in GLIBC 2.26 and so need
special treatment in code that is shared between long double and float128.
It is done by adding a list, similar to internal symbol redifinition,
on sysdeps/ieee754/float128/float128_private.h.

Alpha also needs some tricky changes to ensure we still emit 2 compat
symbols for sqrt(f).

Passes buildmanyglibc.

Co-authored-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
4 years agoUpdate libc.pot for 2.31 release
Siddhesh Poyarekar [Thu, 2 Jan 2020 14:41:36 +0000 (20:11 +0530)]
Update libc.pot for 2.31 release

4 years agoMultiple locales: Add date_fmt (bug 24054)
Rafał Lużyński [Mon, 30 Dec 2019 10:58:18 +0000 (11:58 +0100)]
Multiple locales: Add date_fmt (bug 24054)

It is not specified what should be the content of d_t_fmt and date_fmt
but in the built-in C locale those fields have only one difference:
date_fmt contains "%Z" (the current time zone) while d_t_fmt does not.

For most of the locales this commit does the following operation:
copy d_t_fmt to date_fmt, and then remove "%Z" from d_t_fmt.
If "%Z" was originally missing from d_t_fmt add it to date_fmt.
It also corrects comments where necessary.

Exceptions:

* In bo_CN, dz_BT, and km_KH "%Z" has not been added to date_fmt because
  it was too difficult.  In these locales date_fmt has been set to the
  copy of d_t_fmt.
* In en_DK "%Z" has not been removed from d_t_fmt in order to preserve
  the conformance with the standard mentioned in the comment.

The command to identify and initially edit the locales that need the
update was:

    for i in `grep -lw d_t_fmt *`
    do
        if ! grep -qw date_fmt $i ; then
            awk '/d_t_fmt/ { print $0; gsub("d_t_fmt", "date_fmt"); } //{ print $0 }' < $i > $i.next
            mv $i.next $i
        fi
    done

and then each file was further edited manually.

4 years agobuild-many-glibcs.py: Fix “glibcs i686-gnu --strip”
Florian Weimer [Thu, 2 Jan 2020 09:18:42 +0000 (10:18 +0100)]
build-many-glibcs.py: Fix “glibcs i686-gnu --strip”

Hurd uses an empty prefix, so the linker scripts end up in /lib, the
find command picked them up, and stripping them failed because they
are not ELF files.

4 years agoLinux: Remove pread/pread64, pwrite/pwrite64 kludges from <sysdep.h>
Florian Weimer [Thu, 2 Jan 2020 09:18:37 +0000 (10:18 +0100)]
Linux: Remove pread/pread64, pwrite/pwrite64 kludges from <sysdep.h>

Since the switch away from auto-generated wrappers for these system
calls, the kludge is already included in the C source file of the
system call wrapper.

4 years agobuild-many-glibcs.py: Implement update-syscalls command
Florian Weimer [Thu, 2 Jan 2020 09:18:34 +0000 (10:18 +0100)]
build-many-glibcs.py: Implement update-syscalls command

This command uses pre-built compilers to re-install the Linux headers
from the current sources into a temporary location and runs glibc's
“make update-syscalls-lists” against that.  This updates the glibc
source tree with the current system call numbers.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
4 years agobuild-many-glibcs.py: Introduce glibc build policy classes
Florian Weimer [Thu, 2 Jan 2020 09:18:31 +0000 (10:18 +0100)]
build-many-glibcs.py: Introduce glibc build policy classes

The new classes GlibcPolicyForCompiler and GlibcPolicyForBuild allow
customization of the Glibc.build_glibc method, replacing the existing
for_compiler flag.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
4 years agobuild-many-glibcs.py: Introduce LinuxHeadersPolicyForBuild
Florian Weimer [Thu, 2 Jan 2020 09:18:26 +0000 (10:18 +0100)]
build-many-glibcs.py: Introduce LinuxHeadersPolicyForBuild

And move install_linux_headers to the top level.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
4 years agoLinux: Use system call tables during build
Florian Weimer [Thu, 2 Jan 2020 09:18:22 +0000 (10:18 +0100)]
Linux: Use system call tables during build

Use <arch-syscall.h> instead of <asm/unistd.h> to obtain the system
call numbers.  A few direct includes of <asm/unistd.h> need to be
removed (if the system call numbers are already provided indirectly
by <sysdep.h>) or replaced with <sys/syscall.h>.

Current Linux headers for alpha define the required system call names,
so most of the _NR_* hacks are no longer needed.  For the 32-bit arm
architecture, eliminate the INTERNAL_SYSCALL_ARM macro, now that we
have regular system call names for cacheflush and set_tls.  There are
more such cleanup opportunities for other architectures, but these
cleanups are required to avoid macro redefinition errors during the
build.

For ia64, it is desirable to use <asm/break.h> directly to obtain
the break number for system calls (which is not a system call number
itself).  This requires replacing __BREAK_SYSCALL with
__IA64_BREAK_SYSCALL because the former is defined as an alias in
<asm/unistd.h>, but not in <asm/break.h>.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
4 years agoLinux: Add tables with system call numbers
Florian Weimer [Thu, 2 Jan 2020 09:18:10 +0000 (10:18 +0100)]
Linux: Add tables with system call numbers

The new tables are currently only used for consistency checks
with the installed kernel headers and the architecture-independent
system call names table.  They are based on Linux 5.4.

The goal is to use these architecture-specific tables to ensure
that system call wrappers are available irrespective of the version
of the installed kernel headers.

The tables are formatted in the form of C header files so that they
can be used directly in an #include directive, without external
preprocessing.  (External preprocessing of a plain table file
would introduce cross-subdirectory dependency issues.)  However,
the intent is that they can still be treated as tables and can be
processed by simple tools.

The irregular system call names on 32-bit arm add a complication.
The <fixup-asm-unistd.h> header is introduced to work around that,
and the system calls are listed under regular names in the
<arch-syscall.h> file.

A make target, update-syscalls-list, is added to patch the glibc
sources with data from the current kernel headers.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
4 years agoUpdate copyright dates not handled by scripts/update-copyrights.
Joseph Myers [Wed, 1 Jan 2020 00:21:22 +0000 (00:21 +0000)]
Update copyright dates not handled by scripts/update-copyrights.

I've updated copyright dates in glibc for 2020.  This is the patch for
the changes not generated by scripts/update-copyrights and subsequent
build / regeneration of generated files.  As well as the usual annual
updates, mainly dates in --version output (minus libc.texinfo which
previously had to be handled manually but is now successfully updated
by update-copyrights), there is a fix to
sysdeps/unix/sysv/linux/powerpc/bits/termios-c_lflag.h where a typo in
the copyright notice meant it failed to be updated automatically.

Please remember to include 2020 in the dates for any new files added
in future (which means updating any existing uncommitted patches you
have that add new files to use the new copyright dates in them).

4 years agoUpdate copyright dates with scripts/update-copyrights.
Joseph Myers [Wed, 1 Jan 2020 00:14:33 +0000 (00:14 +0000)]
Update copyright dates with scripts/update-copyrights.

4 years agoalpha: Set wait4 as cancellation entrypoint
Adhemerval Zanella [Fri, 27 Dec 2019 20:21:56 +0000 (17:21 -0300)]
alpha: Set wait4 as cancellation entrypoint

Since both wait and waitpid are implemented on top of wait4.  It fixes
nptl/tst-cancel{x}{4,5,7}.

Checked on alpha-linux-gnu.

4 years agolv_LV locale: Correct the time part of d_t_fmt (bug 25324)
Rafał Lużyński [Mon, 30 Dec 2019 10:42:46 +0000 (11:42 +0100)]
lv_LV locale: Correct the time part of d_t_fmt (bug 25324)

Currently d_t_fmt formats time as "plkst. %H un %M".  A quick Google
search says that "plkst." means "o’clock" and "un" means "and".
Also this format does not display seconds.

CLDR does not mention anything like that.  We have no reason to use
anything different than "%H:%M:%S".

4 years agokm_KH locale: Use "%M" instead of "m" in d_t_fmt (bug 25323)
Rafał Lużyński [Mon, 30 Dec 2019 10:28:37 +0000 (11:28 +0100)]
km_KH locale: Use "%M" instead of "m" in d_t_fmt (bug 25323)

A quick analysis suggests that the original author meant "%M" (minutes
format specifier) instead of "m" which is just a literal "m" letter.

4 years agohurd: Global signal disposition
Jeremie Koenig [Sun, 29 Dec 2019 16:59:55 +0000 (17:59 +0100)]
hurd: Global signal disposition

This adds _hurd_sigstate_set_global_rcv used by libpthread to enable
POSIX-confirming behavior of signals on a per-thread basis.

This also provides a sigstate destructor _hurd_sigstate_delete, and a
global process signal state, which needs to be locked and check when
global disposition is enabled, thus the addition of _hurd_sigstate_lock
_hurd_sigstate_actions _hurd_sigstate_pending _hurd_sigstate_unlock helpers.

This also updates all the glibc code accordingly.

This also drops support for get_int(INIT_SIGMASK), which did not make sense
any more since we do not have a single signal thread any more.

During fork/spawn, this also reinitializes the child global sigstate's
lock. That cures an issue that would very rarely cause a deadlock in the
child in fork, tries to unlock ss' critical section lock at the end of
fork.  This will typically (always?) be observed in /bin/sh, which is not
surprising as that is the foremost caller of fork.

To reproduce an intermediate state, add an endless loop if
_hurd_global_sigstate is locked after __proc_dostop (cast through
volatile); that is, while still being in the fork's parent process.

When that triggers (use the libtool testsuite), the signal thread has
already locked ss (which is _hurd_global_sigstate), and is stuck at
hurdsig.c:685 in post_signal, trying to lock _hurd_siglock (which the
main thread already has locked and keeps locked until after
__task_create).  This is the case that ss->thread == MACH_PORT_NULL, that
is, a global signal.  In the main thread, between __proc_dostop and
__task_create is the __thread_abort call on the signal thread which would
abort any current kernel operation (but leave ss locked).  Later in fork,
in the parent, when _hurd_siglock is unlocked in fork, the parent's
signal thread can proceed and will unlock eventually the global sigstate.
In the client, _hurd_siglock will likewise be unlocked, but the global
sigstate never will be, as the client's signal thread has been configured
to restart execution from _hurd_msgport_receive.  Thus, when the child
tries to unlock ss' critical section lock at the end of fork, it will
first lock the global sigstate, will spin trying to lock it, which can
never be successful, and we get our deadlock.

Options seem to be:

  * Move the locking of _hurd_siglock earlier in post_signal -- but that
    may generally impact performance, if this locking isn't generally
    needed anyway?

    On the other hand, would it actually make sense to wait here until we
    are not any longer in a critical section (which is meant to disable
    signal delivery anyway (but not for preempted signals?))?

  * Clear the global sigstate in the fork's child with the rationale that
    we're anyway restarting the signal thread from a clean state.  This
    has now been implemented.

Why has this problem not been observed before Jérémie's patches?  (Or has
it?  Perhaps even more rarely?)  In _S_msg_sig_post, the signal is now
posted to a *global receiver thread*, whereas previously it was posted to
the *designated signal-receiving thread*.  The latter one was in a
critical section in fork, so didn't try to handle the signal until after
leaving the critical section?  (Not completely analyzed and verified.)

Another question is what the signal is that is being received
during/around the time __proc_dostop executes.

4 years agohurd sendmsg: Fix warning on calling CMSG_*HDR
Samuel Thibault [Sun, 29 Dec 2019 16:47:52 +0000 (17:47 +0100)]
hurd sendmsg: Fix warning on calling CMSG_*HDR

4 years agohurd: Signal code refactoring
Jeremie Koenig [Sun, 29 Dec 2019 16:18:04 +0000 (17:18 +0100)]
hurd: Signal code refactoring

This should not change the current behavior, although this fixes a few
minor bugs which were made apparent in the process of global signal
disposition work:

- Split into more functions
- Scope variables more restrictively
- Split out inner functions
- refactor check_pending_signals
- make sigsuspend POSIX-conformant.
- fix uninitialized act value.

4 years agohurd: Add getcontext, makecontext, setcontext, swapcontext
Thomas Schwinge [Sun, 29 Dec 2019 15:04:51 +0000 (16:04 +0100)]
hurd: Add getcontext, makecontext, setcontext, swapcontext

Adapted from the Linux x86 functions.

Not thoroughly tested, but manual testing as well as glibc tests look fine, and
manual -lpthread testing also looks fine (within the given bounds for a new
stack to be used with makecontext).

This has also been in use in Debian since 2013.

4 years agohurd: Support sending file descriptors over Unix sockets
Emilio Pozuelo Monfort [Sun, 29 Dec 2019 15:34:20 +0000 (16:34 +0100)]
hurd: Support sending file descriptors over Unix sockets

4 years agoldbl-128ibm-compat: Do not mix -mabi=*longdouble and -mlong-double-128
Gabriel F. T. Gomes [Tue, 10 Sep 2019 13:05:03 +0000 (08:05 -0500)]
ldbl-128ibm-compat: Do not mix -mabi=*longdouble and -mlong-double-128

Some compiler versions, e.g. GCC 7, complain when -mlong-double-128 is
used together with -mabi=ibmlongdouble or -mabi=ieeelongdouble,
producing the following error message:

  cc1: error: ‘-mabi=ibmlongdouble’ requires ‘-mlong-double-128’

This patch removes -mlong-double-128 from the compilation lines that
explicitly request -mabi=*longdouble.

Tested for powerpc64le.

Reviewed-by: Tulio Magno Quites Machado Filho <tuliom@linux.ibm.com>
4 years agoldbl-128ibm-compat: Compiler flags for stdio functions
Tulio Magno Quites Machado Filho [Mon, 30 Jul 2018 15:04:40 +0000 (12:04 -0300)]
ldbl-128ibm-compat: Compiler flags for stdio functions

Some of the files that provide stdio.h and wchar.h functions have a
filename prefixed with 'io', such as 'iovsprintf.c'.  On platforms that
imply ldbl-128ibm-compat, these files must be compiled with the flag
-mabi=ibmlongdouble.  This patch adds this flag to their compilation.

Notice that this is not required for the other files that provide
similar functions, because filenames that are not prefixed with 'io'
have ldbl-128ibm-compat counterparts in the Makefile, which already adds
-mabi=ibmlongdouble to them.

Reviewed-by: Gabriel F. T. Gomes <gabrielftg@linux.ibm.com>
4 years agoDo not redirect calls to __GI_* symbols, when redirecting to *ieee128
Tulio Magno Quites Machado Filho [Sun, 20 Oct 2019 21:00:30 +0000 (16:00 -0500)]
Do not redirect calls to __GI_* symbols, when redirecting to *ieee128

On platforms where long double has IEEE binary128 format as a third
option (initially, only powerpc64le), many exported functions are
redirected to their __*ieee128 equivalents.  This redirection is
provided by installed headers such as stdio-ldbl.h, and is supposed to
work correctly with user code.

However, during the build of glibc, similar redirections are employed,
in internal headers, such as include/stdio.h, in order to avoid extra
PLT entries.  These redirections conflict with the redirections to
__*ieee128, and must be avoided during the build.  This patch protects
the second redirections with a test for __LONG_DOUBLE_USES_FLOAT128, a
new macro that is defined to 1 when functions that deal with long double
typed values reuses the _Float128 implementation (this is currently only
true for powerpc64le).

Tested for powerpc64le, x86_64, and with build-many-glibcs.py.

Co-authored-by: Gabriel F. T. Gomes <gabrielftg@linux.ibm.com>
Reviewed-by: Florian Weimer <fweimer@redhat.com>
4 years agoaarch64: add default memcpy version for kunpeng920
Xuelei Zhang [Fri, 27 Dec 2019 14:59:12 +0000 (11:59 -0300)]
aarch64: add default memcpy version for kunpeng920

Checked on aarch64-linux-gnu.

4 years agoaarch64: ifunc rename for kunpeng
Xuelei Zhang [Fri, 27 Dec 2019 14:58:19 +0000 (11:58 -0300)]
aarch64: ifunc rename for kunpeng

Rename ifunc for kunpeng to kunpeng920, and modify the corresponding
function files including IS_KUNPENG920 judgement.

Checked on aarch64-linux-gnu.

4 years agoaarch64: Modify error-shown comments for strcpy
Xuelei Zhang [Fri, 27 Dec 2019 14:57:24 +0000 (11:57 -0300)]
aarch64: Modify error-shown comments for strcpy

Checked on aarch64-linux-gnu.

4 years agolinux: Consolidate sigprocmask
Adhemerval Zanella [Thu, 5 Dec 2019 11:03:21 +0000 (08:03 -0300)]
linux: Consolidate sigprocmask

All architectures now uses the Linux generic implementation which
uses __NR_rt_sigprocmask.

Checked on x86_64-linux-gnu, sparc64-linux-gnu, ia64-linux-gnu,
s390x-linux-gnu, and alpha-linux-gnu.

4 years agoFix return code for __libc_signal_* functions
Adhemerval Zanella [Thu, 5 Dec 2019 17:56:06 +0000 (14:56 -0300)]
Fix return code for __libc_signal_* functions

The functions do not fail regardless of the argument value.  Also, for
Linux the return value is not correct on some platforms due the missing
usage of INTERNAL_SYSCALL_ERROR_P / INTERNAL_SYSCALL_ERRNO macros.

Checked on x86_64-linux-gnu, i686-linux-gnu, and sparc64-linux-gnu.

4 years agonptl: Remove duplicate internal __SIZEOF_PTHREAD_MUTEX_T (BZ#25241)
Adhemerval Zanella [Thu, 26 Dec 2019 20:03:13 +0000 (17:03 -0300)]
nptl: Remove duplicate internal __SIZEOF_PTHREAD_MUTEX_T (BZ#25241)

Checked on x86_64-linux-gnu, i686-linux-gnu, and x86_64-linux-gnu-x32.

4 years agomnw_MM, my_MM, and shn_MM locales: Do not use %Op
Rafał Lużyński [Thu, 19 Dec 2019 20:57:55 +0000 (21:57 +0100)]
mnw_MM, my_MM, and shn_MM locales: Do not use %Op

The "O" modifier does nothing when used with "%p" so let's better not
use it at all and replace "%Op" with "%p".

4 years agoAvoid compat symbols for totalorder in powerpc64le IEEE long double
Gabriel F. T. Gomes [Mon, 9 Sep 2019 17:59:46 +0000 (12:59 -0500)]
Avoid compat symbols for totalorder in powerpc64le IEEE long double

On powerpc64le, the libm_alias_float128_other_r_ldbl macro is
used to create an alias between totalorderf128 and __totalorderlieee128,
as well as between the totalordermagf128 and __totalordermaglieee128.

However, the totalorder* and totalordermag* functions changed their
parameter type since commit ID 42760d764649 and got compat symbols for
their old versions.  With this change, the aforementioned macro would
create two conflicting aliases for __totalorderlieee128 and
__totalordermaglieee128.

This patch avoids the creation of the alias between the IEEE long double
symbols (__totalorderl*ieee128) and the compat symbols, because the IEEE
long double functions have never been exported thus don't need such
compat symbol.

Tested for powerpc64le.

Reviewed-by: Joseph Myers <joseph@codesourcery.com>
4 years agoldbl-128ibm-compat: Add *cvt functions
Gabriel F. T. Gomes [Thu, 11 Jul 2019 14:48:24 +0000 (11:48 -0300)]
ldbl-128ibm-compat: Add *cvt functions

This patch adds IEEE long double versions of q*cvt* functions for
powerpc64le.  Unlike all other long double to/from string conversion
functions, these do not rely on internal functions that can take
floating-point numbers with different formats and act on them
accordingly, instead, the related files are rebuilt with the
-mabi=ieeelongdouble compiler flag set.

Having -mabi=ieeelongdouble passed to the compiler causes the object
files to be marked with a .gnu_attribute that is incompatible with the
.gnu_attribute in files built with -mabi=ibmlongdouble (the default).
The difference causes error messages similar to the following:

  ld: libc_pic.a(s_isinfl.os) uses IBM long double,
      libc_pic.a(ieee128-qefgcvt_r.os) uses IEEE long double.
  collect2: error: ld returned 1 exit status
  make[2]: *** [../Makerules:649: libc_pic.os] Error 1

Although this warning is useful in other situations, the library
actually needs to have functions with different long double formats, so
.gnu_attribute generation is explicitly disabled for these files with
the use of -mno-gnu-attribute.

Tested for powerpc64le on the branch that actually enables the
sysdeps/ieee754/ldbl-128ibm-compat for powerpc64le.

Reviewed-by: Paul E. Murphy <murphyp@linux.ibm.com>
4 years agoRefactor *cvt functions implementation (2/2)
Gabriel F. T. Gomes [Tue, 26 Nov 2019 17:48:49 +0000 (14:48 -0300)]
Refactor *cvt functions implementation (2/2)

This patch refactors the *cvt functions implementation in a way that
makes it easier to re-use them for implementing the IEEE long double on
powerpc64le.  By removing the macros that generate the function names
(APPEND combined with FUNC_PREFIX), the new code makes it easier to
define new function names, such as __qecvtieee128.

Tested that installed stripped binaries for all build-many-glibcs
targets remain identical before and after this patch.  Also tested for
powerpc64le and x86_64.

Reviewed-by: Paul E. Murphy <murphyp@linux.ibm.com>
4 years agoRefactor *cvt functions implementation (1/2)
Gabriel F. T. Gomes [Thu, 11 Jul 2019 14:48:08 +0000 (11:48 -0300)]
Refactor *cvt functions implementation (1/2)

This patch refactors the *cvt functions implementation in a way that
makes it easier to re-use them for implementing the IEEE long double on
powerpc64le.  By splitting the implementation per se in one file
(efgcvt-template.c) and the alias definitions in others (e.g. efgcvt.c),
the new code makes it easier to define new function names, such as
__qecvtieee128.

Tested that installed stripped binaries for all build-many-glibcs
targets remain identical before and after this patch.  Also tested for
powerpc64le and x86_64.

Reviewed-by: Paul E. Murphy <murphyp@linux.ibm.com>
4 years agoAdd exception-based flags for wait4
Adhemerval Zanella [Fri, 20 Dec 2019 12:59:11 +0000 (09:59 -0300)]
Add exception-based flags for wait4

It fixes the tst-cancelx4 and tst-cancelx5 on sparc{64,v9}.

Checked on sparc64-linux-gnu and sparcv9-linux-gnu.

4 years agoaarch64: Optimized memset for Kunpeng processor.
Xuelei Zhang [Thu, 19 Dec 2019 15:26:33 +0000 (15:26 +0000)]
aarch64: Optimized memset for Kunpeng processor.

Due to the branch prediction issue of Kunpeng processor, we found
memset_generic has poor performance on middle sizes setting, and so
we reconstructed the logic, expanded the loop by 4 times in set_long
to solve the problem, even when setting below 1K sizes have benefit.

Another change is that DZ_ZVA seems no work when setting zero, so we
discarded it and used set_long to set zero instead. Fewer branches and
predictions also make the zero case have slightly improvement.

Checked on aarch64-linux-gnu.

Reviewed-by: Wilco Dijkstra <Wilco.Dijkstra@arm.com>
4 years agoaarch64: Optimized strlen for strlen_asimd
Xuelei Zhang [Thu, 19 Dec 2019 13:41:40 +0000 (13:41 +0000)]
aarch64: Optimized strlen for strlen_asimd

Optimize the strlen implementation by using vector operations and
loop unrolling in main loop.Compared to __strlen_generic,it reduces
latency of cases in bench-strlen by 7%~18% when the length of src
is greater than 128 bytes, with gains throughout the benchmark.

Checked on aarch64-linux-gnu.

Reviewed-by: Wilco Dijkstra <Wilco.Dijkstra@arm.com>
4 years agoaarch64: Add Huawei Kunpeng to tunable cpu list
Xuelei Zhang [Thu, 19 Dec 2019 14:55:06 +0000 (14:55 +0000)]
aarch64: Add Huawei Kunpeng to tunable cpu list

Kunpeng processer is a 64-bit Arm-compatible CPU released by Huawei,
and we have already signed a copyright assignement with the FSF.

This patch adds its to cpu list, and related macro for IFUNC.

Checked on aarch64-linux-gnu.

Reviewed-by: Szabolcs Nagy <Szabolcs.Nagy@arm.com>
4 years agoaarch64: Optimized implementation of memrchr
Xuelei Zhang [Thu, 19 Dec 2019 14:53:29 +0000 (14:53 +0000)]
aarch64: Optimized implementation of memrchr

Considering the excellent performance of memchr.S on glibc 2.30, the
same algorithm is used to find chrin. Compared to memrchr.c, this
method with memrchr.S achieves an average performance improvement
of 58% based on benchtest and its extension cases.

Checked on aarch64-linux-gnu.

Reviewed-by: Wilco Dijkstra <Wilco.Dijkstra@arm.com>
4 years agoaarch64: Optimized implementation of strnlen
Xuelei Zhang [Thu, 19 Dec 2019 13:49:46 +0000 (13:49 +0000)]
aarch64: Optimized implementation of strnlen

Optimize the strlen implementation by using vector operations and
loop unrooling in main loop. Compared to aarch64/strnlen.S, it
reduces latency of cases in bench-strnlen by 11%~24% when the length
of src is greater than 64 bytes, with gains throughout the benchmark.

Checked on aarch64-linux-gnu.

Reviewed-by: Wilco Dijkstra <Wilco.Dijkstra@arm.com>
4 years agoaarch64: Optimized implementation of strcpy
Xuelei Zhang [Thu, 19 Dec 2019 13:08:11 +0000 (13:08 +0000)]
aarch64: Optimized implementation of strcpy

Optimize the strcpy implementation by using vector loads and operations
in main loop.Compared to aarch64/strcpy.S, it reduces latency of cases
in bench-strlen by 5%~18% when the length of src is greater than 64
bytes, with gains throughout the benchmark.

Checked on aarch64-linux-gnu.

Reviewed-by: Wilco Dijkstra <Wilco.Dijkstra@arm.com>
4 years agoaarch64: Optimized implementation of memcmp
Xuelei Zhang [Thu, 19 Dec 2019 12:31:59 +0000 (12:31 +0000)]
aarch64: Optimized implementation of memcmp

The loop body is expanded from a 16-byte comparison to a 64-byte
comparison, and the usage of ldp is replaced by the Post-index
mode to the Base plus offset mode. Hence, compare can faster 18%
around > 128 bytes in all.

Checked on aarch64-linux-gnu.

Reviewed-by: Wilco Dijkstra <Wilco.Dijkstra@arm.com>
4 years agoConsolidate wait3 implementations
Adhemerval Zanella [Thu, 14 Nov 2019 14:37:10 +0000 (11:37 -0300)]
Consolidate wait3 implementations

The generic one calls wait4.

Checked on x86_64-linux-gnu.

4 years agoImplement waitpid in terms of wait4
Adhemerval Zanella [Wed, 13 Nov 2019 20:57:00 +0000 (17:57 -0300)]
Implement waitpid in terms of wait4

This also consolidate all waitpid implementations.

Checked on x86_64-linux-gnu.

4 years agolinux: Use waitid on wait4 if __NR_wait4 is not defined
Adhemerval Zanella [Wed, 13 Nov 2019 20:45:13 +0000 (17:45 -0300)]
linux: Use waitid on wait4 if __NR_wait4 is not defined

If the wait4 syscall is not available (such as y2038 safe 32-bit
systems) waitid should be used instead.  However prior Linux 5.4
waitid is not a full superset of other wait syscalls, since it
does not include support for waiting for the current process group.

It is possible to emulate wait4 by issuing an extra syscall to get
the current process group, but it is inherent racy: after the current
process group is received and before it is passed to waitid a signal
could arrive causing the current process group to change.

So waitid is used if wait4 is not defined iff the build is
enabled with a minimum kernel if 5.4+.  The new assume
__ASSUME_WAITID_PID0_P_PGID is added and an error is issued if waitid
can not be implemented by either __NR_wait4 or
__NR_waitid && __ASSUME_WAITID_PID0_P_PGID.

Checked on x86_64-linux-gnu and i686-linux-gnu.

Co-authored-by: Alistair Francis <alistair.francis@wdc.com>
4 years agoImplement wait in terms of waitpid
Adhemerval Zanella [Wed, 13 Nov 2019 16:30:46 +0000 (13:30 -0300)]
Implement wait in terms of waitpid

The POSIX implementation is used as default and both BSD and Linux
version are removed.  It simplifies the implementation for
architectures that do not provide either __NR_waitpid or
__NR_wait4.

Checked on x86_64-linux-gnu and powerpc64le-linux-gnu.

4 years agonptl: Move waitpid implementation to libc
Adhemerval Zanella [Wed, 13 Nov 2019 14:05:02 +0000 (11:05 -0300)]
nptl: Move waitpid implementation to libc

Checked on x86_64-linux-gnu and powerpc64le-linux-gnu.

4 years agonptl: Move wait implementation to libc
Adhemerval Zanella [Wed, 13 Nov 2019 14:02:13 +0000 (11:02 -0300)]
nptl: Move wait implementation to libc

Checked on x86_64-linux-gnu and powerpc64le-linux-gnu.

4 years agoRemove __waitpid_nocancel
Adhemerval Zanella [Wed, 13 Nov 2019 13:42:05 +0000 (10:42 -0300)]
Remove __waitpid_nocancel

It enables and disables cancellation with pthread_setcancelstate
before calling the waitpid.  It simplifies the waitpid implementation
for architectures that do not provide either __NR_waitpid or
__NR_wait4.

Checked on x86_64-linux-gnu.

4 years agoFix test isolation for elf/tst-ifunc-fault-lazy, elf/tst-ifunc-fault-bindnow
Florian Weimer [Thu, 19 Dec 2019 13:45:50 +0000 (14:45 +0100)]
Fix test isolation for elf/tst-ifunc-fault-lazy, elf/tst-ifunc-fault-bindnow

Previously, ld.so was invoked only with the elf subdirectory on the
library search path.  Since the soname link for libc.so only exists in
the top-level build directory, this leaked the system libc into the
test.

4 years agoFix __libc_signal_block_all on sparc64
Adhemerval Zanella [Mon, 9 Dec 2019 18:50:29 +0000 (15:50 -0300)]
Fix __libc_signal_block_all on sparc64

The posix_spawn on sparc issues invalid sigprocmask calls:

  rt_sigprocmask(0xffe5e15c /* SIG_??? */, ~[], 0xffe5e1dc, 8) = -1 EINVAL (Invalid argument)

Which make support/tst-support_capture_subprocess fails with random
output (due the child signal being wrongly captured by the parent).

Tracking the culprit it seems to be a wrong code generation in the
INTERNAL_SYSCALL due the automatic sigset_t used on
__libc_signal_block_all:

  return INTERNAL_SYSCALL (rt_sigprocmask, err, 4, SIG_BLOCK, &SIGALL_SET,
                          set, _NSIG / 8);

Where SIGALL_SET is defined as:

  ((__sigset_t) { .__val = {[0 ...  _SIGSET_NWORDS-1 ] =  -1 } })

Building the expanded __libc_signal_block_all on sparc64 with recent
compiler (gcc 8.3.1 and 9.1.1):

  #include <signal>

  int
  _libc_signal_block_all (sigset_t *set)
  {
    INTERNAL_SYSCALL_DECL (err);
    return INTERNAL_SYSCALL (rt_sigprocmask, err, 4, SIG_BLOCK, &SIGALL_SET,
     set, _NSIG / 8);
  }

The first argument (SIG_BLOCK) is not correctly set on 'o0' register:

  __libc_signal_block_all:
save    %sp, -304, %sp
add     %fp, 1919, %o0
mov     128, %o2
sethi   %hi(.LC0), %o1
call    memcpy, 0
 or     %o1, %lo(.LC0), %o1
add     %fp, 1919, %o1
mov     %i0, %o2
mov     8, %o3
mov     103, %g1
ta      0x6d;
bcc,pt  %xcc, 1f
mov     0, %g1
sub     %g0, %o0, %o0
mov     1, %g1
     1: sra     %o0, 0, %i0
return  %i7+8
 nop

Where if SIGALL_SET is defined a const object, gcc correctly sets the
expected kernel argument in correct register:

        sethi   %hi(.LC0), %o1
        call    memcpy, 0
         or     %o1, %lo(.LC0), %o1
   ->   mov     1, %o0
add     %fp, 1919, %o1

Another possible fix is use a static const object.  Although there
should not be a difference between a const compound literal and a static
const object, the gcc C99 status page [1] has a note stating that this
optimization is not implemented:

  "const-qualified compound literals could share storage with each
   other and with string literals, but currently don't.".

This patch fixes it by moving both sigset_t that represent the
signal sets to static const data object.  It generates slight better
code where the object reference is used directly instead of a stack
allocation plus the content materialization.

Checked on x86_64-linux-gnu, i686-linux-gnu, and sparc64-linux-gnu.

[1] https://gcc.gnu.org/c99status.html

4 years agopowerpc: Do not run IFUNC resolvers for LD_DEBUG=unused [BZ #24214]
Adhemerval Zanella [Tue, 17 Dec 2019 18:55:59 +0000 (15:55 -0300)]
powerpc: Do not run IFUNC resolvers for LD_DEBUG=unused [BZ #24214]

This patch adds the missing bits for powerpc and fixes both
tst-ifunc-fault-lazy and tst-ifunc-fault-bindnow failures on
powerpc-linux-gnu.

Checked on powerpc-linux-gnu and powerpc-linux-gnu-power4.

Reviewed-by: Florian Weimer <fweimer@redhat.com>
Reviewed-by: Tulio Magno Quites Machado Filho <tuliom@linux.ibm.com>
4 years agohurd: Do not make sigprocmask available in ld.so
Florian Weimer [Wed, 18 Dec 2019 09:27:10 +0000 (10:27 +0100)]
hurd: Do not make sigprocmask available in ld.so

After commit f7649d5780aa4682393b9daedd653e4d9c12784c ("dlopen: Do not
block signals"), the dynamic linker no longer uses sigprocmask, which
means that it does not have to be made available explicitly on hurd.

This reverts commit 892badc9bbcd4a6f8c2eb6c8a99be3aa22517532
("hurd: Make __sigprocmask GLIBC_PRIVATE") and commit
d5ed9ba29a3c818b3433a1784862494968abda45 ("hurd: Fix ld.so link"),
but keeps the comment changes from the second commit.

4 years agobuild-many-glibcs.py: Do not build C++ PCHs by default
Florian Weimer [Tue, 17 Dec 2019 15:23:08 +0000 (16:23 +0100)]
build-many-glibcs.py: Do not build C++ PCHs by default

They are not used during the subsequent glibc build, so creating them
merely wastes time.

4 years agohurd: Make getrandom honour GRND_NONBLOCK
James Clarke [Tue, 17 Dec 2019 18:29:29 +0000 (18:29 +0000)]
hurd: Make getrandom honour GRND_NONBLOCK

* sysdeps/mach/hurd/getrandom.c (__getrandom): Open the random source
with O_NONBLOCK when the GRND_NONBLOCK flag is provided.
Message-Id: <20191217182929.90989-1-jrtc27@jrtc27.com>

4 years agotunables: report sbrk() failure
DJ Delorie [Fri, 13 Dec 2019 18:36:58 +0000 (13:36 -0500)]
tunables: report sbrk() failure

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
4 years agobuild-many-glibcs.py: Add mipsisa64r6el-linux-gnu target
Dragan Mladjenovic [Wed, 11 Dec 2019 10:23:04 +0000 (11:23 +0100)]
build-many-glibcs.py: Add mipsisa64r6el-linux-gnu target

This patch enables building mips/r6 isa/little-endian/hard-float configuration in
o32, n32, and n64 variants.

4 years agomips: Do not include hi and lo in __SYSCALL_CLOBBERS for R6
Dragan Mladjenovic [Tue, 19 Nov 2019 14:06:20 +0000 (15:06 +0100)]
mips: Do not include hi and lo in __SYSCALL_CLOBBERS for R6

GCC 10 (PR 91233) won't silently allow registers that are not architecturally
available to be present in the clobber list anymore, resulting in build failure
for mips*r6 targets in form of:
...
.../sysdep.h:146:2: error: the register ‘lo’ cannot be clobbered in ‘asm’ for the current target
  146 |  __asm__ volatile (      \
      |  ^~~~~~~

This is because base R6 ISA doesn't define hi and lo registers w/o DSP extension.
This patch provides the alternative definitions of __SYSCALL_CLOBBERS for r6
targets that won't include those registers.

* sysdeps/unix/sysv/linux/mips/mips32/sysdep.h (__SYSCALL_CLOBBERS): Exclude
hi and lo from the clobber list for __mips_isa_rev >= 6.
* sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h (__SYSCALL_CLOBBERS): Likewise.
* sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h (__SYSCALL_CLOBBERS): Likewise.

4 years agoldbl-128ibm-compat: Add ISO C99 versions of scanf functions
Gabriel F. T. Gomes [Thu, 11 Jul 2019 14:47:43 +0000 (11:47 -0300)]
ldbl-128ibm-compat: Add ISO C99 versions of scanf functions

In the format string for *scanf functions, the '%as', '%aS', and '%a[]'
modifiers behave differently depending on ISO C99 compatibility.  When
_GNU_SOURCE is defined and -std=c89 is passed to the compiler, these
functions behave like ascanf, and the modifiers allocate memory for the
output.  Otherwise, the ISO C99 compliant version of these functions is
used, and the modifiers consume a floating-point argument.  This patch
adds the IEEE binary128 variant of ISO C99 compliant functions for the
third long double format on powerpc64le.

Tested for powerpc64le.

Reviewed-by: Paul E. Murphy <murphyp@linux.ibm.com>
4 years agoldbl-128ibm-compat: Fix selection of GNU and ISO C99 scanf
Gabriel F. T. Gomes [Wed, 27 Nov 2019 16:06:50 +0000 (10:06 -0600)]
ldbl-128ibm-compat: Fix selection of GNU and ISO C99 scanf

Since commit

commit 03992356e6fedc5a5e9d32df96c1a2c79ea28a8f
Author: Zack Weinberg <zackw@panix.com>
Date:   Sat Feb 10 11:58:35 2018 -0500

    Use C99-compliant scanf under _GNU_SOURCE with modern compilers.

the selection of the GNU versions of scanf functions requires both
_GNU_SOURCE and -std=c89.  This patch changes the tests in
ldbl-128ibm-compat so that they actually test the GNU versions (without
this change, the redirection to the ISO C99 version always happens, so
GNU versions of the new implementation (e.g. __scanfieee128) were left
untested).

Tested for powerpc64le.

Reviewed-by: Paul E. Murphy <murphyp@linux.ibm.com>
4 years agohurd: Fix local PLT
Samuel Thibault [Fri, 13 Dec 2019 09:10:59 +0000 (10:10 +0100)]
hurd: Fix local PLT

* include/sys/random.h (__getrandom): Add hidden prototype.
* stdlib/getrandom.c (getrandom): Rename to hidden definition __getrandom.
Add weak alias.
* sysdeps/mach/hurd/getrandom.c (getrandom): Likewise.
* sysdeps/unix/sysv/linux/getrandom.c (getrandom): Likewise.
* sysdeps/mach/hurd/getentropy.c (getentropy): Use __getrandom instead of
getrandom.

4 years agodlopen: Do not block signals
Florian Weimer [Fri, 13 Dec 2019 09:23:10 +0000 (10:23 +0100)]
dlopen: Do not block signals

Blocking signals causes issues with certain anti-malware solutions
which rely on an unblocked SIGSYS signal for system calls they
intercept.

This reverts commit a2e8aa0d9ea648068d8be52dd7b15f1b6a008e23
("Block signals during the initial part of dlopen") and adds
comments related to async signal safety to active_nodelete and
its caller.

Note that this does not make lazy binding async-signal-safe with regards
to dlopen.  It merely avoids introducing new async-signal-safety hazards
as part of the NODELETE changes.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
4 years agodlopen: Rework handling of pending NODELETE status
Florian Weimer [Fri, 13 Dec 2019 09:18:46 +0000 (10:18 +0100)]
dlopen: Rework handling of pending NODELETE status

Commit a2e8aa0d9ea648068d8be52dd7b15f1b6a008e23 ("Block signals during
the initial part of dlopen") was deemed necessary because of
read-modify-write operations like the one in  add_dependency in
elf/dl-lookup.c.  In the old code, we check for any kind of NODELETE
status and bail out:

      /* Redo the NODELETE check, as when dl_load_lock wasn't held
 yet this could have changed.  */
      if (map->l_nodelete != link_map_nodelete_inactive)
goto out;

And then set pending status (during relocation):

  if (flags & DL_LOOKUP_FOR_RELOCATE)
    map->l_nodelete = link_map_nodelete_pending;
  else
    map->l_nodelete = link_map_nodelete_active;

If a signal arrives during relocation and the signal handler, through
lazy binding, adds a global scope dependency on the same map, it will
set map->l_nodelete to link_map_nodelete_active.  This will be
overwritten with link_map_nodelete_pending by the dlopen relocation
code.

To avoid such problems in relation to the l_nodelete member, this
commit introduces two flags for active NODELETE status (irrevocable)
and pending NODELETE status (revocable until activate_nodelete is
invoked).  As a result, NODELETE processing in dlopen does not
introduce further reasons why lazy binding from signal handlers
is unsafe during dlopen, and a subsequent commit can remove signal
blocking from dlopen.

This does not address pre-existing issues (unrelated to the NODELETE
changes) which make lazy binding in a signal handler during dlopen
unsafe, such as the use of malloc in both cases.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
4 years agodlopen: Fix issues related to NODELETE handling and relocations
Florian Weimer [Fri, 13 Dec 2019 09:18:24 +0000 (10:18 +0100)]
dlopen: Fix issues related to NODELETE handling and relocations

The assumption behind the assert in activate_nodelete was wrong:

Inconsistency detected by ld.so: dl-open.c: 459: activate_nodelete:
Assertion `!imap->l_init_called || imap->l_type != lt_loaded' failed! (edit)

It can happen that an already-loaded object that is in the local
scope is promoted to NODELETE status, via binding to a unique
symbol.

Similarly, it is possible that such NODELETE promotion occurs to
an already-loaded object from the global scope.  This is why the
loop in activate_nodelete has to cover all objects in the namespace
of the new object.

In do_lookup_unique, it could happen that the NODELETE status of
an already-loaded object was overwritten with a pending NODELETE
status.  As a result, if dlopen fails, this could cause a loss of
the NODELETE status of the affected object, eventually resulting
in an incorrect unload.

Fixes commit f63b73814f74032c0e5d0a83300e3d864ef905e5 ("Remove all
loaded objects if dlopen fails, ignoring NODELETE [BZ #20839]").

4 years agohurd: Fix __close_nocancel_nostatus availability
Samuel Thibault [Fri, 13 Dec 2019 02:32:21 +0000 (03:32 +0100)]
hurd: Fix __close_nocancel_nostatus availability

Not only libc/rtld use __close_nocancel_nostatus.

* sysdeps/mach/hurd/Makefile [$(subdir) == io] (sysdep_routines): Add
close_nocancel_nostatus.
* sysdeps/mach/hurd/Versions (libc): Add __close_nocancel_nostatus to
GLIBC_PRIVATE.
* sysdeps/mach/hurd/not-cancel.h (__close_nocancel_nostatus): Declare
function instead of defining inline.
[IS_IN (libc) || IS_IN (rtld)] (__close_nocancel_nostatus): Make
function hidden.
* sysdeps/mach/hurd/close_nocancel_nostatus.c: New file.

4 years agohurd: add getrandom and getentropy implementations
Andrew Eggenberger [Wed, 30 Oct 2019 04:19:32 +0000 (23:19 -0500)]
hurd: add getrandom and getentropy implementations

* sysdeps/mach/hurd/getentropy.c: New file.
* sysdeps/mach/hurd/getrandom.c: Likewise.

4 years agohurd: Implement __close_nocancel_nostatus
Samuel Thibault [Fri, 13 Dec 2019 02:23:14 +0000 (03:23 +0100)]
hurd: Implement __close_nocancel_nostatus

* sysdeps/mach/hurd/not-cancel.h: New file.

4 years agomanual: clarify fopen with the x flag
Paul Eggert [Wed, 11 Dec 2019 17:34:06 +0000 (09:34 -0800)]
manual: clarify fopen with the x flag

* manual/stdio.texi (Opening Streams): Say how glibc's
implementation of fopen with "x" follows ISO C11.

4 years agoS390: Use sysdeps/ieee754/dbl-64/wordsize-64 on s390x.
Stefan Liebler [Wed, 11 Dec 2019 14:09:34 +0000 (15:09 +0100)]
S390: Use sysdeps/ieee754/dbl-64/wordsize-64 on s390x.

This patch enables the usage of implementations in
sysdeps/ieee754/dbl-64/wordsize-64 on 64bit s390x.

4 years agoS390: Implement roundtoint and converttoint and define TOINT_INTRINSICS.
Stefan Liebler [Wed, 11 Dec 2019 14:09:33 +0000 (15:09 +0100)]
S390: Implement roundtoint and converttoint and define TOINT_INTRINSICS.

This patch implements roundtoint and convertoint for s390
by using the load-fp-integer and convert-to-fixed instructions.
Both functions are using "round to nearest with ties away from zero"
rounding mode and do not raise inexact exceptions.

4 years agoS390: Implement math-barriers math_opt_barrier and math_force_eval.
Stefan Liebler [Wed, 11 Dec 2019 14:09:32 +0000 (15:09 +0100)]
S390: Implement math-barriers math_opt_barrier and math_force_eval.

This patch implements the s390 specific math barriers in order
to omit the store and load from stack if possible.

4 years agoS390: Use libc_fe* macros in fe* functions.
Stefan Liebler [Wed, 11 Dec 2019 14:09:32 +0000 (15:09 +0100)]
S390: Use libc_fe* macros in fe* functions.

This patch updates the s390 specific functions fegetround,
fesetround, feholdexcept, fesetenv, feupdateenv, fegetexceptflag,
fetestexcept, fesetexceptflag, fetestexceptflag.
Now those functions are using the libc_fe* macros if possible.

Furthermore fegetexceptflag is now returning the exception from
dxc field shifted to the usual exception-flags.
Thus a special fetestexceptflag implementation is not needed anymore.

This page took 0.084307 seconds and 5 git commands to generate.