platform/upstream/glibc.git
4 years agoLinux: unlockpt needs to fail with EINVAL, not ENOTTY (bug 26053)
Florian Weimer [Wed, 7 Oct 2020 08:48:10 +0000 (10:48 +0200)]
Linux: unlockpt needs to fail with EINVAL, not ENOTTY (bug 26053)

The EINVAL error code is mandated by POSIX and documented in the
manual.  Also clean up the unlockpt implementation a bit, assuming
that TIOCSPTLCK is always defined.

Enhance login/tst-grantpt to cover unlockpt corner cases.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
4 years agologin/tst-grantpt: Convert to support framework, more error checking
Florian Weimer [Wed, 7 Oct 2020 08:48:10 +0000 (10:48 +0200)]
login/tst-grantpt: Convert to support framework, more error checking

The test now requires working /dev/pts pseudo-terminals.

A new subtest (test_not_ptmx) attempts to call grantpt on a
pseudo-terminal that is not a ptmx device.  POSIX requires an EINVAL
error in this case.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
4 years agoposix: Fix -Warray-bounds instances building timer_create [BZ #26687]
Adhemerval Zanella [Mon, 5 Oct 2020 20:30:05 +0000 (17:30 -0300)]
posix: Fix -Warray-bounds instances building timer_create [BZ #26687]

GCC 11 -Warray-bounds triggers invalid warnings when building
Linux timer_create.c:

../sysdeps/unix/sysv/linux/timer_create.c: In function '__timer_create_new':
../sysdeps/unix/sysv/linux/timer_create.c:83:17: warning: array subscript 'struct timer[0]' is partly outside array bounds of 'unsigned char[8]' [-Warray-bounds]
   83 |             newp->sigev_notify = (evp != NULL
      |                 ^~
../sysdeps/unix/sysv/linux/timer_create.c:59:47: note: referencing an object of size 8 allocated by 'malloc'
   59 |         struct timer *newp = (struct timer *) malloc (offsetof (struct timer,
      |                                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   60 |                                                                 thrfunc));
      |                                                                 ~~~~~~~~~

The struct allocated for !SIGEV_THREAD timers only requires two 'int'
fields (sigev_notify and ktimerid) and the offsetof trick tries minimize
the memory usage by only allocation the required size.  However,
although the resulting size is suffice for !SIGEV_THREAD time, accessing
the partially allocated object is error-prone and UB.

This patch fixes both issues by embedding the information whether
the timer if a SIGEV_THREAD in the returned 'timer_t'.  For
!SIGEV_THREAD, the resulting 'timer_t' is the returned kernel timer
identifer (kernel_timer_t), while for SIGEV_THREAD it uses the fact
malloc returns at least _Alignof (max_align_t) pointers plus that
valid kernel_timer_t are always positive to set MSB bit of the returned
'timer_t' to indicate the timer handles a SIGEV_THREAD.

It allows to remove the memory allocation for !SIGEV_THREAD and also
remove the 'sigev_notify' field from 'struct timer'.

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

4 years agoReplace Minumum/minumum with Minimum/minimum
H.J. Lu [Tue, 6 Oct 2020 12:15:11 +0000 (05:15 -0700)]
Replace Minumum/minumum with Minimum/minimum

Replace Minumum/minumum in comments with Minimum/minimum.

4 years agoOptimize scripts/merge-test-results.sh
DJ Delorie [Wed, 1 Apr 2020 19:33:00 +0000 (15:33 -0400)]
Optimize scripts/merge-test-results.sh

The inner loop is called thousands of times per "make check" even
if there's otherwise nothing to do.  Avoid calling /bin/head all
those times when a builtin will do.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
4 years agoFix GCC 11 -Warray-parameter warning for __sigsetjmp (bug 26647)
Joseph Myers [Mon, 5 Oct 2020 16:46:46 +0000 (16:46 +0000)]
Fix GCC 11 -Warray-parameter warning for __sigsetjmp (bug 26647)

This patch fixes part of bug 26647 (-Werror=array-parameter error
building with GCC 11 because of __sigsetjmp being declared using an
array parameter in one header and a pointer parameter in another).

The fix is to split the struct __jmp_buf_tag definition out to a
separate bits/types/ header so it can be included in pthread.h, so
that pthread.h can declare __sigsetjmp with the type contents visible,
so can use an array (as in setjmp.h) rather than a pointer in the
declaration.

Note that several other build failures with GCC 11 remain.  This does
not fix the jmp_buf-related -Wstringop-overflow errors (also discussed
in bug 26647), or -Warray-parameter errors for other functions (bug
26686), or -Warray-bounds errors (bug 26687).

Tested, with older compilers, natively for x86_64 and with
build-many-glibc.py for aarch64-linux-gnu.  Tested with
build-many-glibcs.py with GCC mainline for aarch64-linux-gnu that this
gets past the -Warray-parameter issue for __sigsetjmp (with the next
build failure being the other one discussed in bug 26647).

4 years agomanual: Fix typo
Jonathan Wakely [Mon, 5 Oct 2020 16:29:38 +0000 (17:29 +0100)]
manual: Fix typo

4 years agoy2038: nptl: Convert pthread_rwlock_{clock|timed}{rd|wr}lock to support 64 bit time
Lukasz Majewski [Tue, 8 Sep 2020 09:51:23 +0000 (11:51 +0200)]
y2038: nptl: Convert pthread_rwlock_{clock|timed}{rd|wr}lock to support 64 bit time

The pthread_rwlock_clockrdlock, pthread_rwlock_clockwrlock,
pthread_rwlock_timedrdlock and pthread_rwlock_timedwrlock have been converted
to support 64 bit time.

This change uses new futex_abstimed_wait64 function in
./sysdeps/nptl/futex-helpers.c, which uses futex_time64 where possible.

The pthread_rwlock_{clock|timed}{rd|wr}lock only accepts absolute time.
Moreover, there is no need to check for NULL passed as *abstime pointer to the
syscalls as those calls have exported symbols marked with __nonull attribute
for abstime.

For systems with __TIMESIZE != 64 && __WORDSIZE == 32:
- Conversions between 64 bit time to 32 bit are necessary
- Redirection to pthread_rwlock_{clock|timed}{rd|wr}lock will provide support
  for 64 bit time

Build tests:
./src/scripts/build-many-glibcs.py glibcs

Run-time tests:
- Run specific tests on ARM/x86 32bit systems (qemu):
  https://github.com/lmajewski/meta-y2038 and run tests:
  https://github.com/lmajewski/y2038-tests/commits/master

Above tests were performed with Y2038 redirection applied as well as without
to test the proper usage of both __pthread_rwlock_{clock|timed}{rd|wr}lock64
and __pthread_rwlock_{clock|timed}{rd|wr}lock.

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4 years agoY2038: nptl: Provide futex_abstimed_wait64 supporting 64 bit time
Lukasz Majewski [Tue, 8 Sep 2020 08:54:35 +0000 (10:54 +0200)]
Y2038: nptl: Provide futex_abstimed_wait64 supporting 64 bit time

This is the helper function, which uses struct __timespec64
to provide 64 bit absolute time to futex syscalls.

The aim of this function is to move convoluted pre-processor
macro code from sysdeps/nptl/lowlevellock-futex.h to C
function in futex-internal.c

The futex_abstimed_wait64 function has been put into a separate
file on the purpose - to avoid issues apparent on the m68k
architecture related to small number of available registers (there
is not enough registers to put all necessary arguments in them if
the above function would be added to futex-internal.h with
__always_inline attribute).

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4 years agosysvipc: Return EINVAL for invalid msgctl commands
Adhemerval Zanella [Tue, 29 Sep 2020 17:45:09 +0000 (14:45 -0300)]
sysvipc: Return EINVAL for invalid msgctl commands

It avoids regressions on possible future commands that might require
additional libc support.  The downside is new commands added by newer
kernels will need further glibc support.

Checked on x86_64-linux-gnu and i686-linux-gnu (Linux v4.15 and v5.4).

4 years agosysvipc: Fix IPC_INFO and MSG_INFO handling [BZ #26639]
Adhemerval Zanella [Tue, 29 Sep 2020 17:39:56 +0000 (14:39 -0300)]
sysvipc: Fix IPC_INFO and MSG_INFO handling [BZ #26639]

Both commands are Linux extensions where the third argument is a
'struct msginfo' instead of 'struct msqid_ds' and its information
does not contain any time related fields (so there is no need to
extra conversion for __IPC_TIME64.

The regression testcase checks for Linux specifix SysV ipc message
control extension.  For IPC_INFO/MSG_INFO it tries to match the values
against the tunable /proc values and for MSG_STAT/MSG_STAT_ANY it
check if the create message queue is within the global list returned
by the kernel.

Checked on x86_64-linux-gnu and on i686-linux-gnu (Linux v5.4 and on
Linux v4.15).

4 years agosysvipc: Return EINVAL for invalid semctl commands
Adhemerval Zanella [Tue, 29 Sep 2020 17:29:48 +0000 (14:29 -0300)]
sysvipc: Return EINVAL for invalid semctl commands

It avoids regressions on possible future commands that might require
additional libc support.  The downside is new commands added by newer
kernels will need further glibc support.

Checked on x86_64-linux-gnu and i686-linux-gnu (Linux v4.15 and v5.4).

4 years agosysvipc: Fix SEM_STAT_ANY kernel argument pass [BZ #26637]
Dmitry V. Levin [Tue, 29 Sep 2020 17:10:20 +0000 (14:10 -0300)]
sysvipc: Fix SEM_STAT_ANY kernel argument pass [BZ #26637]

Handle SEM_STAT_ANY the same way as SEM_STAT so that the buffer argument
of SEM_STAT_ANY is properly passed to the kernel and back.

The regression testcase checks for Linux specifix SysV ipc message
control extension.  For IPC_INFO/SEM_INFO it tries to match the values
against the tunable /proc values and for SEM_STAT/SEM_STAT_ANY it
check if the create message queue is within the global list returned
by the kernel.

Checked on x86_64-linux-gnu and on i686-linux-gnu (Linux v5.4 and on
Linux v4.15).

Co-authored-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
4 years agoaarch64: enforce >=64K guard size [BZ #26691]
Szabolcs Nagy [Wed, 13 Dec 2017 15:50:21 +0000 (15:50 +0000)]
aarch64: enforce >=64K guard size [BZ #26691]

There are several compiler implementations that allow large stack
allocations to jump over the guard page at the end of the stack and
corrupt memory beyond that. See CVE-2017-1000364.

Compilers can emit code to probe the stack such that the guard page
cannot be skipped, but on aarch64 the probe interval is 64K by default
instead of the minimum supported page size (4K).

This patch enforces at least 64K guard on aarch64 unless the guard
is disabled by setting its size to 0.  For backward compatibility
reasons the increased guard is not reported, so it is only observable
by exhausting the address space or parsing /proc/self/maps on linux.

On other targets the patch has no effect. If the stack probe interval
is larger than a page size on a target then ARCH_MIN_GUARD_SIZE can
be defined to get large enough stack guard on libc allocated stacks.

The patch does not affect threads with user allocated stacks.

Fixes bug 26691.

4 years agosysvipc: Fix semtimedop for Linux < 5.1 for 64-bit ABI
Adhemerval Zanella [Wed, 30 Sep 2020 19:52:19 +0000 (16:52 -0300)]
sysvipc: Fix semtimedop for Linux < 5.1 for 64-bit ABI

Both powerpc64 and s390x provides semtimedop through __NR_ipc for
pre v5.1 kernel.  Neither the y2038 support (7c437d3778) nor the
attempt to fix an issue for !__ASSUME_DIRECT_SYSVIPC_SYSCALLS
(aaa12e9ff0) took this in consideration.

This patch fixes it by issuing __NR_semtimedop_time64 iff it is
defined, otherwise __NR_semtimeop is issued if both
__ASSUME_DIRECT_SYSVIPC_SYSCALLS it set and __NR_semtimedop is
define, other __NR_ipc is used instead.  To summarize:

  1. For 32-bit architetures __NR_semtimedop_time64 is always
     issued.  The fallback is used only for !__ASSUME_TIME64_SYSCALLS
     and it issues either __NR_ipc or __NR_semtimedop.

  2. For 64-bit architecture with wire-up SysV syscall
     (__ASSUME_DIRECT_SYSVIPC_SYSCALLS and __NR_semtimeop defined)
     __NR_semtimeop is issued.

  3. Otherwise __NR_ipc is used instead.

Checked on x86_64-linux-gnu, i686-linux-gnu (kernel 4.15 and 5.4),
powerpc64le (kernel 4.18), and s390x (kernel 4.12).

Reviewed-by: Matheus Castanho <msc@linux.ibm.com>
4 years agonptl: futex: Move __NR_futex_time64 alias to beginning of futex-internal.h
Lukasz Majewski [Tue, 8 Sep 2020 08:48:13 +0000 (10:48 +0200)]
nptl: futex: Move __NR_futex_time64 alias to beginning of futex-internal.h

This alias macro shall be moved to the beginning of the futex-internal.h
to be easily reused by other functions, which would support 64 bit time.

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
4 years agonptl: Provide proper spelling for 32 bit version of futex_abstimed_wait
Lukasz Majewski [Wed, 16 Sep 2020 07:38:52 +0000 (09:38 +0200)]
nptl: Provide proper spelling for 32 bit version of futex_abstimed_wait

This change provides proper spelling of 32 bit __futex_abstimed_wait_cancelable32
function

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4 years agostring: Fix strerrorname_np return value [BZ #26555]
Adhemerval Zanella [Mon, 31 Aug 2020 14:53:51 +0000 (11:53 -0300)]
string: Fix strerrorname_np return value [BZ #26555]

It returns the string of the error constant, not its description (as
strerrordesc_np).  To handle the Hurd error mapping, the ERR_MAP was
removed from errlist.h to errlist.c.

Also, the testcase test-strerr (added on 325081b9eb2) was not added
on the check build neither it builds correctly.  This patch also
changed it to decouple from errlist.h, the expected return values
are added explicitly for both both strerrorname_np and strerrordesc_np
directly.

Checked on x86_64-linux-gnu and i686-linux-gnu.  I also run a make
check for i686-gnu.

4 years agoSet tunable value as well as min/max values
H.J. Lu [Mon, 1 Jun 2020 21:11:32 +0000 (14:11 -0700)]
Set tunable value as well as min/max values

Some tunable values and their minimum/maximum values must be determinted
at run-time.  Add TUNABLE_SET_WITH_BOUNDS and TUNABLE_SET_WITH_BOUNDS_FULL
to update tunable value together with minimum and maximum values.
__tunable_set_val is updated to set tunable value as well as min/max
values.

4 years agold.so: add an --argv0 option [BZ #16124]
Vincent Mihalkovic [Tue, 29 Sep 2020 10:34:39 +0000 (12:34 +0200)]
ld.so: add an --argv0 option [BZ #16124]

4 years agoReversing calculation of __x86_shared_non_temporal_threshold
Patrick McGehearty [Mon, 28 Sep 2020 20:11:28 +0000 (20:11 +0000)]
Reversing calculation of __x86_shared_non_temporal_threshold

The __x86_shared_non_temporal_threshold determines when memcpy on x86
uses non_temporal stores to avoid pushing other data out of the last
level cache.

This patch proposes to revert the calculation change made by H.J. Lu's
patch of June 2, 2017.

H.J. Lu's patch selected a threshold suitable for a single thread
getting maximum performance. It was tuned using the single threaded
large memcpy micro benchmark on an 8 core processor. The last change
changes the threshold from using 3/4 of one thread's share of the
cache to using 3/4 of the entire cache of a multi-threaded system
before switching to non-temporal stores. Multi-threaded systems with
more than a few threads are server-class and typically have many
active threads. If one thread consumes 3/4 of the available cache for
all threads, it will cause other active threads to have data removed
from the cache. Two examples show the range of the effect. John
McCalpin's widely parallel Stream benchmark, which runs in parallel
and fetches data sequentially, saw a 20% slowdown with this patch on
an internal system test of 128 threads. This regression was discovered
when comparing OL8 performance to OL7.  An example that compares
normal stores to non-temporal stores may be found at
https://vgatherps.github.io/2018-09-02-nontemporal/.  A simple test
shows performance loss of 400 to 500% due to a failure to use
nontemporal stores. These performance losses are most likely to occur
when the system load is heaviest and good performance is critical.

The tunable x86_non_temporal_threshold can be used to override the
default for the knowledgable user who really wants maximum cache
allocation to a single thread in a multi-threaded system.
The manual entry for the tunable has been expanded to provide
more information about its purpose.

modified: sysdeps/x86/cacheinfo.c
modified: manual/tunables.texi

4 years agolinux: Add time64 recvmmsg support
Adhemerval Zanella [Mon, 6 Jul 2020 19:55:46 +0000 (16:55 -0300)]
linux: Add time64 recvmmsg support

The wire-up syscall __NR_recvmmsg_time64 (for 32-bit) or
__NR_recvmmsg (for 64-bit) is used as default.  The 32-bit fallback
is used iff __ASSUME_TIME64_SYSCALLS is not defined, which assumes the
kernel ABI provides either __NR_socketcall or __NR_recvmmsg
(32-bit time_t).

It does not handle the timestamps on ancillary data (SCM_TIMESTAMPING
records).

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

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4 years agolinux: Add time64 support for nanosleep
Adhemerval Zanella [Sun, 12 Jul 2020 17:55:30 +0000 (14:55 -0300)]
linux: Add time64 support for nanosleep

It uses __clock_nanosleep64 and adds the __nanosleep64 symbol.

Checked on x86_64-linux-gnu and i686-linux-gnu (on 5.4 and on 4.15
kernel).

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4 years agolinux: Consolidate utimes
Adhemerval Zanella [Thu, 9 Jul 2020 19:35:28 +0000 (16:35 -0300)]
linux: Consolidate utimes

The generic version does not have time64 support and Linux default
uses utimensat.  With hppa version gone, __ASSUME_UTIMES is not used
anymore.

Checked on x86_64-linux-gnu and i686-linux-gnu (on 5.4 and on 4.15
kernel).

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4 years agolinux: Use 64-bit time_t syscall on clock_getcputclockid
Adhemerval Zanella [Tue, 7 Jul 2020 20:25:00 +0000 (17:25 -0300)]
linux: Use 64-bit time_t syscall on clock_getcputclockid

The syscall __NR_clock_getres_time64 (for 32-bit) or __NR_clock_getres
(for 64-bit) is used as default.  The 32-bit fallback is used iff
__ASSUME_TIME64_SYSCALLS is not defined, which assumes the kernel ABI
provides either __NR_rt_sigtimedwait (32-bit time_t).

Since the symbol does not use any type which might be affected by the
time_t, there is no need to add a 64-bit variant.

Checked on x86_64-linux-gnu and i686-linux-gnu (on 5.4 and on 4.15
kernel).

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4 years agolinux: Add time64 sigtimedwait support
Adhemerval Zanella [Mon, 6 Jul 2020 20:14:42 +0000 (17:14 -0300)]
linux: Add time64 sigtimedwait support

The syscall __NR_sigtimedwait_time64 (for 32-bit) or __NR_sigtimedwait
(for 64-bit) is used as default.  The 32-bit fallback is used iff
__ASSUME_TIME64_SYSCALLS is not defined, which assumes the kernel ABI
provides either __NR_rt_sigtimedwait (32-bit time_t).

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

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4 years agolinux: Add time64 select support
Adhemerval Zanella [Mon, 6 Jul 2020 19:06:51 +0000 (16:06 -0300)]
linux: Add time64 select support

The syscall __NR_pselect6_time64 (32-bit) or __NR_pselect6 (64-bit)
is used as default.  For architectures with __ASSUME_TIME64_SYSCALLS
the 32-bit fallback uses __NR_select/__NR__newselect or __NR_pselect6
(it should cover the microblaze case where older kernels do not
provide __NR_pselect6).

Checked on x86_64-linux-gnu and i686-linux-gnu (on 5.4 and on 4.15
kernel).

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4 years agonptl: Fix __futex_abstimed_wait_cancellable32
Adhemerval Zanella [Mon, 28 Sep 2020 19:05:32 +0000 (16:05 -0300)]
nptl: Fix __futex_abstimed_wait_cancellable32

Similar to 64-bit time __futex_abstimed_wait_cancellable64, it should
check for overflow and convert to 32-bit timespec iff timeout is not
NULL.

It fixes some regression on i686-linux-gnu running on a 4.15 kernel.

4 years agosysvipc: Fix semtimeop for !__ASSUME_DIRECT_SYSVIPC_SYSCALLS
Adhemerval Zanella [Fri, 25 Sep 2020 18:04:34 +0000 (15:04 -0300)]
sysvipc: Fix semtimeop for !__ASSUME_DIRECT_SYSVIPC_SYSCALLS

The __NR_ipc syscall does not support 64-bit time operations.  It
fixes 7c437d3778.

Checked on i686-linux-gnu on a Linux 5.4.

4 years agohurd: add ST_RELATIME
Samuel Thibault [Sun, 27 Sep 2020 16:23:24 +0000 (18:23 +0200)]
hurd: add ST_RELATIME

sysdeps/mach/hurd/bits/statvfs.h (ST_RELATIME): New macro.

4 years agointl: Handle translation output codesets with suffixes [BZ #26383]
Arjun Shankar [Fri, 25 Sep 2020 12:47:06 +0000 (14:47 +0200)]
intl: Handle translation output codesets with suffixes [BZ #26383]

Commit 91927b7c7643 (Rewrite iconv option parsing [BZ #19519]) did not
handle cases where the output codeset for translations (via the `gettext'
family of functions) might have a caller specified encoding suffix such as
TRANSLIT or IGNORE.  This led to a regression where translations did not
work when the codeset had a suffix.

This commit fixes the above issue by parsing any suffixes passed to
__dcigettext and adds two new test-cases to intl/tst-codeset.c to
verify correct behaviour.  The iconv-internal function __gconv_create_spec
and the static iconv-internal function gconv_destroy_spec are now visible
internally within glibc and used in intl/dcigettext.c.

4 years agobench-strcmp.c: Add workloads on page boundary
H.J. Lu [Thu, 11 Jun 2020 16:00:12 +0000 (09:00 -0700)]
bench-strcmp.c: Add workloads on page boundary

Add strcmp workloads on page boundary.

4 years agobench-strncmp.c: Add workloads on page boundary
H.J. Lu [Thu, 11 Jun 2020 15:52:42 +0000 (08:52 -0700)]
bench-strncmp.c: Add workloads on page boundary

Add strncmp workloads on page boundary.

4 years agostrcmp: Add a testcase for page boundary
H.J. Lu [Thu, 11 Jun 2020 16:03:56 +0000 (09:03 -0700)]
strcmp: Add a testcase for page boundary

Add a strcmp testcase to cover cases where both strings end on the page
boundary.

4 years agostrncmp: Add a testcase for page boundary [BZ #25933]
H.J. Lu [Thu, 7 May 2020 14:29:46 +0000 (07:29 -0700)]
strncmp: Add a testcase for page boundary [BZ #25933]

Add a strncmp testcase to cover cases where one of strings ends on the
page boundary with the maximum string length less than the number bytes
of each AVX2 loop iteration and different offsets from page boundary.

The updated string/test-strncmp fails on Intel Core i7-8559U without

ommit 1c6432316bc434a72108d7b0c7cfbfdde64c3124
Author: Sunil K Pandey <skpgkp1@gmail.com>
Date:   Fri Jun 12 08:57:16 2020 -0700

    Fix avx2 strncmp offset compare condition check [BZ #25933]

4 years agoSet locale related environment variables in debugglibc.sh
Arjun Shankar [Thu, 24 Sep 2020 12:58:36 +0000 (14:58 +0200)]
Set locale related environment variables in debugglibc.sh

Tests and binaries that use locale related functions need to run in the
correct locale environment when being debugged via debugglibc.sh.  This
commit sets up the environment, specifically: GCONV_PATH, LOCPATH, and
LC_ALL for such tests and binaries when they are being debugged outside
of a test container.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
4 years agobenchtests: Run _Float128 tests only on architectures that support it
Arjun Shankar [Wed, 23 Sep 2020 14:11:57 +0000 (16:11 +0200)]
benchtests: Run _Float128 tests only on architectures that support it

__float128 is a non-standard name and is not available on some architectures
(like aarch64 or s390x) even though they may support the standard _Float128
type.  Other architectures (like armv7) don't support quad-precision
floating-point operations at all.

This commit replaces benchtests references to __float128 with _Float128 and
runs the corresponding tests only on architectures that support it.

4 years agopowerpc: Protect dl_powerpc_cpu_features on INIT_ARCH() [BZ #26615]
Raphael Moreira Zinsly [Mon, 14 Sep 2020 14:59:24 +0000 (11:59 -0300)]
powerpc: Protect dl_powerpc_cpu_features on INIT_ARCH() [BZ #26615]

dl_powerpc_cpu_features also needs to be protected by __GLRO to check
for the _rtld_global_ro realocation before accessing it.

Reviewed-by: Tulio Magno Quites Machado Filho <tuliom@linux.ibm.com>
4 years agox86: Harden printf against non-normal long double values (bug 26649)
Florian Weimer [Tue, 22 Sep 2020 17:07:48 +0000 (19:07 +0200)]
x86: Harden printf against non-normal long double values (bug 26649)

The behavior of isnan/__builtin_isnan on bit patterns that do not
correspond to something that the CPU would produce from valid inputs
is currently under-defined in the toolchain. (The GCC built-in and
glibc disagree.)

The isnan check in PRINTF_FP_FETCH in stdio-common/printf_fp.c
assumes the GCC behavior that returns true for non-normal numbers
which are not specified as NaN. (The glibc implementation returns
false for such numbers.)

At present, passing non-normal numbers to __mpn_extract_long_double
causes this function to produce irregularly shaped multi-precision
integers, triggering undefined behavior in __printf_fp_l.

With GCC 10 and glibc 2.32, this behavior is not visible because
__builtin_isnan is used, which avoids calling
__mpn_extract_long_double in this case.  This commit updates the
implementation of __mpn_extract_long_double so that regularly shaped
multi-precision integers are produced in this case, avoiding
undefined behavior in __printf_fp_l.

4 years agox86: Use one ldbl2mpn.c file for both i386 and x86_64
Florian Weimer [Tue, 22 Sep 2020 15:29:35 +0000 (17:29 +0200)]
x86: Use one ldbl2mpn.c file for both i386 and x86_64

4 years agoDefine __THROW to noexcept for C++11 and later
Jonathan Wakely [Tue, 22 Sep 2020 10:54:38 +0000 (11:54 +0100)]
Define __THROW to noexcept for C++11 and later

The __THROW macro and friends expand to "throw ()" for C++ code, but
that syntax is deprecated in C++11 and no longer supported at all since
C++20. In order for glibc headers to be compatible with C++20,
"noexcept" should be used instead.

This patch uses "noexcept (true)" rather than just "noexcept", which is
semantically equivalent, but avoids any possibility of parsing
ambiguities if the next preprocessor token happens to be an opening
parenthesis. This is probably unnecessary, but it seems safer to be
cautious.

4 years agoUpdate mallinfo2 ABI, and test
DJ Delorie [Tue, 1 Sep 2020 20:17:25 +0000 (16:17 -0400)]
Update mallinfo2 ABI, and test

This patch adds the ABI-related bits to reflect the new mallinfo2
function, and adds a test case to verify basic functionality.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
4 years agoAllow memset local PLT reference for RISC-V.
Alistair Francis [Fri, 19 Jun 2020 16:00:23 +0000 (09:00 -0700)]
Allow memset local PLT reference for RISC-V.

This is similar to commit a26e2e9feab87d4f745c31411458b048742ac733
"Allow memset local PLT reference for powerpc soft-float.".

GCC 10.1 results in the localplt test failing for RISC-V.

From the original commit for power-pc:
    Since memset is documented as a function GCC may always implicitly
    generate calls to, it seems reasonable to allow that local PLT
    reference (just like those for libgcc functions that GCC implicitly
    generates calls to and that are also exported from libc.so), which
    this patch does.

Acked-by: Palmer Dabbelt <palmerdabbelt@google.com>
4 years agopowerpc: fix ifunc implementation list for POWER9 strlen and stpcpy
Raphael Moreira Zinsly [Thu, 17 Sep 2020 14:16:36 +0000 (11:16 -0300)]
powerpc: fix ifunc implementation list for POWER9 strlen and stpcpy

__strlen_power9 and __stpcpy_power9 were added to their ifunc lists
using the wrong function names.

4 years agonscd: bump GC cycle during cache pruning (bug 26130)
Andreas Schwab [Wed, 17 Jun 2020 14:05:13 +0000 (16:05 +0200)]
nscd: bump GC cycle during cache pruning (bug 26130)

While nscd prunes a cache it becomes inconsistent temporarily, which is
visible to clients if that cache is shared.  Bump the GC cycle counter so
that the clients notice the modification window.

Uniformly use atomic_fetch_add to modify the GC cycle counter.

4 years agox86: Use HAS_CPU_FEATURE with IBT and SHSTK [BZ #26625]
H.J. Lu [Wed, 16 Sep 2020 12:27:32 +0000 (05:27 -0700)]
x86: Use HAS_CPU_FEATURE with IBT and SHSTK [BZ #26625]

commit 04bba1e5d84b6fd8d3a3b006bc240cd5d241ee30
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Wed Aug 5 13:51:56 2020 -0700

    x86: Set CPU usable feature bits conservatively [BZ #26552]

    Set CPU usable feature bits only for CPU features which are usable in
    user space and whose usability can be detected from user space, excluding
    features like FSGSBASE whose enable bit can only be checked in the kernel.

no longer turns on the usable bits of IBT and SHSTK since we don't know
if IBT and SHSTK are usable until much later.  Use HAS_CPU_FEATURE to
check if the processor supports IBT and SHSTK.

4 years ago<sys/platform/x86.h>: Add Intel Key Locker support
H.J. Lu [Tue, 15 Sep 2020 12:49:27 +0000 (05:49 -0700)]
<sys/platform/x86.h>: Add Intel Key Locker support

Add Intel Key Locker:

https://software.intel.com/content/www/us/en/develop/download/intel-key-locker-specification.html

support to <sys/platform/x86.h>.  Intel Key Locker has

1. KL: AES Key Locker instructions.
2. WIDE_KL: AES wide Key Locker instructions.
3. AESKLE: AES Key Locker instructions are enabled by OS.

Applications should use

if (CPU_FEATURE_USABLE (KL))

and

if (CPU_FEATURE_USABLE (WIDE_KL))

to check if AES Key Locker instructions and AES wide Key Locker
instructions are usable.

4 years agoFix handling of collating symbols in fnmatch (bug 26620)
Andreas Schwab [Wed, 16 Sep 2020 10:41:14 +0000 (12:41 +0200)]
Fix handling of collating symbols in fnmatch (bug 26620)

The variable idx contains the index into the extra array, whereas wextra
points into the extra array at this index, containing the length of the
following collating sequence in the wide character representation.

4 years agopselect.c: Pass a pointer to SYSCALL_CANCEL [BZ #26606]
H.J. Lu [Sat, 12 Sep 2020 02:36:12 +0000 (19:36 -0700)]
pselect.c: Pass a pointer to SYSCALL_CANCEL [BZ #26606]

commit a92f4e6299fe0e3cb6f77e79de00817aece501ce
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Date:   Mon Jul 6 13:27:12 2020 -0300

    linux: Add time64 pselect support

changed pselect.c to

     r = SYSCALL_CANCEL (pselect6_time64, nfds, readfds, writefds, exceptfds,
  timeout,
  ((__syscall_ulong_t[]){ (uintptr_t) sigmask,
  __NSIG_BYTES }));

which doesn't work with x32's ARGIFY and data passed to syscall isn't
initialized with sigmask and __NSIG_BYTES.  Change to

     __syscall_ulong_t data[2] =
{
  (uintptr_t) sigmask, __NSIG_BYTES
};
      r = SYSCALL_CANCEL (pselect6_time64, nfds, readfds, writefds, exceptfds,
  timeout, data);

fixes [BZ #26606].

4 years agoy2038: nptl: Convert sem_{clock|timed}wait to support 64 bit time
Lukasz Majewski [Mon, 7 Sep 2020 08:22:21 +0000 (10:22 +0200)]
y2038: nptl: Convert sem_{clock|timed}wait to support 64 bit time

The sem_clockwait and sem_timedwait have been converted to support 64 bit time.

This change reuses futex_abstimed_wait_cancelable64 function introduced earlier.
The sem_{clock|timed}wait only accepts absolute time. Moreover, there is no
need to check for NULL passed as *abstime pointer to the syscalls as both calls
have exported symbols marked with __nonull attribute for abstime.

For systems with __TIMESIZE != 64 && __WORDSIZE == 32:
- Conversion from 32 bit time to 64 bit struct __timespec64 was necessary
- Redirection to __sem_{clock|timed}wait64 will provide support for 64 bit
  time

Build tests:
./src/scripts/build-many-glibcs.py glibcs

Run-time tests:
- Run specific tests on ARM/x86 32bit systems (qemu):
  https://github.com/lmajewski/meta-y2038 and run tests:
  https://github.com/lmajewski/y2038-tests/commits/master

Above tests were performed with Y2038 redirection applied as well as without
to test the proper usage of both __sem_{clock|timed}wait64 and
__sem_{clock|timed}wait.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
4 years agohurd: Add __x86_get_cpu_features to ld.abilist
H.J. Lu [Sun, 13 Sep 2020 12:30:11 +0000 (05:30 -0700)]
hurd: Add __x86_get_cpu_features to ld.abilist

Add __x86_get_cpu_features to ld.abilist for <sys/platform/x86.h>.

4 years agox86: Install <sys/platform/x86.h> [BZ #26124]
H.J. Lu [Tue, 30 Jun 2020 01:30:54 +0000 (18:30 -0700)]
x86: Install <sys/platform/x86.h> [BZ #26124]

Install <sys/platform/x86.h> so that programmers can do

 #if __has_include(<sys/platform/x86.h>)
 #include <sys/platform/x86.h>
 #endif
 ...

   if (CPU_FEATURE_USABLE (SSE2))
 ...
   if (CPU_FEATURE_USABLE (AVX2))
 ...

<sys/platform/x86.h> exports only:

enum
{
  COMMON_CPUID_INDEX_1 = 0,
  COMMON_CPUID_INDEX_7,
  COMMON_CPUID_INDEX_80000001,
  COMMON_CPUID_INDEX_D_ECX_1,
  COMMON_CPUID_INDEX_80000007,
  COMMON_CPUID_INDEX_80000008,
  COMMON_CPUID_INDEX_7_ECX_1,
  /* Keep the following line at the end.  */
  COMMON_CPUID_INDEX_MAX
};

struct cpuid_features
{
  struct cpuid_registers cpuid;
  struct cpuid_registers usable;
};

struct cpu_features
{
  struct cpu_features_basic basic;
  struct cpuid_features features[COMMON_CPUID_INDEX_MAX];
};

/* Get a pointer to the CPU features structure.  */
extern const struct cpu_features *__x86_get_cpu_features
  (unsigned int max) __attribute__ ((const));

Since all feature checks are done through macros, programs compiled with
a newer <sys/platform/x86.h> are compatible with the older glibc binaries
as long as the layout of struct cpu_features is identical.  The features
array can be expanded with backward binary compatibility for both .o and
.so files.  When COMMON_CPUID_INDEX_MAX is increased to support new
processor features, __x86_get_cpu_features in the older glibc binaries
returns NULL and HAS_CPU_FEATURE/CPU_FEATURE_USABLE return false on the
new processor feature.  No new symbol version is neeeded.

Both CPU_FEATURE_USABLE and HAS_CPU_FEATURE are provided.  HAS_CPU_FEATURE
can be used to identify processor features.

Note: Although GCC has __builtin_cpu_supports, it only supports a subset
of <sys/platform/x86.h> and it is equivalent to CPU_FEATURE_USABLE.  It
doesn't support HAS_CPU_FEATURE.

4 years agolinux: Add time64 pselect support
Adhemerval Zanella [Mon, 6 Jul 2020 16:27:12 +0000 (13:27 -0300)]
linux: Add time64 pselect support

The syscall __NR_pselect6_time64 (32-bit) or __NR_pselect6 (64-bit)
is used as default.  For architectures with __ASSUME_TIME64_SYSCALLS
the 32-bit fallback uses __NR_pselec6.

To accomodate microblaze missing pselect6 support on kernel older
than 3.15 the fallback is moved to its own function to the microblaze
specific implementation can override it.

Checked on x86_64-linux-gnu and i686-linux-gnu (on 5.4 and on 4.15
kernel).

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4 years agolinux: Add time64 semtimedop support
Adhemerval Zanella [Mon, 6 Jul 2020 20:40:34 +0000 (17:40 -0300)]
linux: Add time64 semtimedop support

Either the __NR_semtimedop_time64 (for 32-bit) or the __NR_semtimedop
(for 64-bit) syscall is used as default.  The 32-bit fallback is used
iff __ASSUME_TIME64_SYSCALLS is not defined, which assumes the kernel
ABI provides either __NR_ipc or __NR_semtimeop (for 32-bit time_t).

Checked on x86_64-linux-gnu and i686-linux-gnu (on 5.4 and on 4.15
kernel).

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4 years agolinux: Add ppoll time64 optimization
Adhemerval Zanella [Fri, 10 Jul 2020 16:50:56 +0000 (13:50 -0300)]
linux: Add ppoll time64 optimization

It avoid continuing issue the __NR_ppoll_time64 syscall once the kernel
advertise it does not support it.

Checked on x86_64-linux-gnu and i686-linux-gnu (on 5.4 and on 4.15
kernel).

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4 years agolinux: Simplify clock_getres
Adhemerval Zanella [Thu, 9 Jul 2020 20:46:34 +0000 (17:46 -0300)]
linux: Simplify clock_getres

With arch-syscall.h it can now assumes the existance of either
__NR_clock_getres or __NR_clock_getres_time64.  The 32-bit time_t
support is now only build for !__ASSUME_TIME64_SYSCALLS.

It also uses the time64-support functions to simplify it further.

Checked on x86_64-linux-gnu and i686-linux-gnu (on 5.4 and on 4.15
kernel).

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4 years agoUpdate sparc libm-test-ulps
Adhemerval Zanella [Fri, 11 Sep 2020 17:39:03 +0000 (14:39 -0300)]
Update sparc libm-test-ulps

4 years agoRemove internal usage of extensible stat functions
Adhemerval Zanella [Wed, 15 Jul 2020 19:35:58 +0000 (19:35 +0000)]
Remove internal usage of extensible stat functions

It replaces the internal usage of __{f,l}xstat{at}{64} with the
__{f,l}stat{at}{64}.  It should not change the generate code since
sys/stat.h explicit defines redirections to internal calls back to
xstat* symbols.

Checked with a build for all affected ABIs.  I also check on
x86_64-linux-gnu and i686-linux-gnu.

Reviewed-by: Lukasz Majewski <lukma@denx.de>
4 years agoLinux: Consolidate xmknod
Adhemerval Zanella [Wed, 15 Jul 2020 18:42:42 +0000 (18:42 +0000)]
Linux: Consolidate xmknod

The __NR_mknodat syscall is supported on all kernels, so the generic
implementation is used as default.

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

Reviewed-by: Lukasz Majewski <lukma@denx.de>
4 years agolinux: Consolidate fxstatat{64}
Adhemerval Zanella [Wed, 15 Jul 2020 18:05:52 +0000 (18:05 +0000)]
linux: Consolidate fxstatat{64}

The LFS support is implemented on fxstat64.c, instead of fxstat.c for
64-bit architectures.  The fxstatat.c implements the non-LFS and it is
a no-op for !XSTAT_IS_XSTAT64.

The generic non-LFS implementation handles two cases:

  1. New kABIs which uses generic pre 64-bit time Linux ABI (csky and
     nios): it issues __NR_fstatat64 plus handle the overflow on st_ino,
     st_size, or st_blocks.  It only handles _STAT_VER_KERNEL.

  2. Old kABIs with old non-LFS support (arm, i386, hppa, m68k, mips32,
     microblaze, s390, sh, powerpc, and sparc32).  it issues
     __NR_fstatat64 and convert to non-LFS stat struct based on the
     version.

Also non-LFS mips64 is an outlier and it has its own implementation
since _STAT_VER_LINUX requires a different conversion function (it
uses the kernel_stat as the sysissues argument since its exported ABI
is different than the kernel one for both non-LFS and LFS
implementation).

The generic LFS implementation handles multiple cases:

  1. XSTAT_IS_XSTAT64 being 1:

    1.1. 64-bit kABI (aarch64, ia64, powerpc64*, s390x, riscv64, and
         x86_64): it issues __NR_newfstatat for _STAT_VER_KERNEL or
         _STAT_VER_LINUX.

    1.2. 64-bit kABI outlier (sparc64): it issuess fstatat64 with a
         temporary stat64 and convert to output stat64 based on the
         input version (and using a sparc64 specific __xstat32_conv).

    1.3. New 32-bit kABIs with only 64-bit time_t support (arc and
 riscv32): it issues __NR_statx and covert to struct stat64.

  2. Old ABIs with XSTAT_IS_XSTAT64 being 0 (arm, csky, i386, hppa, m68k,
     microblaze, mips32, nios2, sh, powerpc32, and sparc32): it issues
     __NR_fstat64.

Also, two special cases requires specific implementations:

  1. alpha: it uses the __NR_fstatat64 syscall instead.

  2. mips64: as for non-LFS implementation its ABIs differ from
     glibc exported one, which requires an specific conversion
     function to handle the kernel_stat.

Checked with a build for all affected ABIs. I also checked on x86_64,
i686, powerpc, powerpc64le, sparcv9, sparc64, s390, and s390x.

Reviewed-by: Lukasz Majewski <lukma@denx.de>
4 years agolinux: Consolidate fxstat{64}
Adhemerval Zanella [Wed, 15 Jul 2020 16:34:47 +0000 (16:34 +0000)]
linux: Consolidate fxstat{64}

The LFS support is implemented on fxstat64.c, instead of fxstat.c for
64-bit architectures.  The fxstat.c implements the non-LFS and it is
a no-op for !XSTAT_IS_XSTAT64.

The generic non-LFS implementation handles two cases:

  1. New kABIs which uses generic pre 64-bit time Linux ABI (csky and
     nios): it issuess __NR_fstat64 plus handle the overflow on st_ino,
     st_size, or st_blocks.  It only handles _STAT_VER_KERNEL.

  2. Old KABIs with old non-LFS support (arm, i386, hppa, m68k,
     microblaze, s390, sh, powerpc, and sparc32).  For _STAT_VER_KERNEL
     it issues __NR_fstat, otherwise it calls __NR_fstat64 and convert
     to non-LFS stat struct and handle possible overflows on st_ino,
     st_size, or st_blocks.

Also non-LFS mips is an outlier and it has its own implementation since
_STAT_VER_LINUX requires a different conversion function (it uses the
kernel_stat as the sysissues argument since its exported ABI is
different than the kernel one for both non-LFS and LFS implementation).

The generic LFS implementation handles multiple cases:

  1. XSTAT_IS_XSTAT64 being 1:

    1.1. 64-bit kABI (aarch64, ia64, powerpc64*, s390x, riscv64, and
 x86_64): it issuess __NR_fstat for _STAT_VER_KERNEL or
 _STAT_VER_LINUX.

    1.2. Old 64-bit kABI with defines __NR_fstat64 instead of __NR_fstat
         (sparc64): it issues __NR_fstat for _STAT_VER_KERNEL or
         __NR_fstat64 and convert to struct stat64.

    1.3. New 32-bit kABIs with only 64-bit time_t support (arc and
 riscv32): it issuess __NR_statx and covert to struct stat64.

  2. Old ABIs with XSTAT_IS_XSTAT64 being 0 (arm, csky, i386, hppa,
     m68k, microblaze, mips32, nios2, sh, powerpc32, and sparc32): it
     issues __NR_fstat64.

Also, two special cases requires specific implementations:

  1. alpha: it requires to handle _STAT_VER_KERNEL64 to issues
     __NR_fstat64 and use the kernel_stat with __NR_fstat otherwise.

  2. mips64: as for non-LFS implementation its ABIs differ from
     glibc exported one, which requires an specific conversion
     function to handle the kernel_stat.

Checked with a build for all affected ABIs. I also checked on x86_64,
i686, powerpc, powerpc64le, sparcv9, sparc64, s390, and s390x.

Reviewed-by: Lukasz Majewski <lukma@denx.de>
4 years agolinux: Consolidate lxstat{64}
Adhemerval Zanella [Wed, 15 Jul 2020 14:08:13 +0000 (14:08 +0000)]
linux: Consolidate lxstat{64}

The LFS support is implemented on lxstat64.c, instead of lxstat.c for
64-bit architectures.  The xstat.c implements the non-LFS and it is
a no-op for !XSTAT_IS_XSTAT64.

The generic non-LFS implementation handles two cases:

  1. New kABIs which uses generic pre 64-bit time Linux ABI (csky and
     nios): it issues __NR_fstat64 with AT_SYMLINK_NOFOLLOW plus handles
     the possible overflow off st_ino, st_size, or st_blocks.  It only
     handles _STAT_VER_KERNEL.

  2. Old KABIs with old non-LFS support (arm, i386, hppa, m68k,
     microblaze, s390, sh, powerpc, and sparc32).  For _STAT_VER_KERNEL
     it issues __NR_lstat, otherwise it isseus __NR_lstat64 and convert
     to non-LFS stat struct and handle possible overflows on st_ino,
     st_size, or st_blocks.

Also non-LFS mips is an outlier and it has its own implementation since
_STAT_VER_LINUX requires a different conversion function (it uses the
kernel_stat as the syscall argument since its exported ABI is different
than the kernel one for both non-LFS and LFS implementation).

The generic LFS implementation handles multiple cases:

  1. XSTAT_IS_XSTAT64 being 1:

    1.1. Old 64-bit kABI (ia64, powerpc64*, s390x, sparc64, x86_64): it
         issues __NR_lstat for _STAT_VER_KERNEL or _STAT_VER_LINUX.

    1.2. Old 64-bit kABI with defines __NR_lstat64 instead of __NR_lstat
         (sparc64): it issues __NR_lstat for _STAT_VER_KERNEL or
         __NR_lstat64 and convert to struct stat64.

    1.3. New kABIs which uses generic 64-bit Linux ABI (aarch64 and
         riscv64): it issues __NR_newfstatat with AT_SYMLINK_NOFOLLOW
 and only for _STAT_VER_KERNEL.

    1.4. New 32-bit kABIs with only 64-bit time_t support (arc and
         riscv32): it issues __NR_statx and covert to struct stat64.

  2. Old ABIs with XSTAT_IS_XSTAT64 being 0:

    2.1. New kABIs which uses generic pre 64-bit time Linux ABI (csky
 and nios2): it issues __NR_fstatat64 for _STAT_VER_KERNEL.

    2.2. Old kABIs with old non-LFS support (arm, i386, hppa, m68k,
 microblaze, s390, sh, mips32, powerpc32, and sparc32): it
 issues __NR_lstat64.

Also, two special cases requires specific LFS implementations:

  1. alpha: it requires to handle _STAT_VER_KERNEL64 to issue
     __NR_lstat64 and use the kernel_stat with __NR_lstat otherwise.

  2. mips64: as for non-LFS implementation its ABIs differ from
     glibc exported one, which requires a specific conversion
     function to handle the kernel_stat.

Checked with a build for all affected ABIs. I also checked on x86_64,
i686, powerpc, powerpc64le, sparcv9, sparc64, s390, and s390x.

Reviewed-by: Lukasz Majewski <lukma@denx.de>
4 years agolinux: Consolidate xstat{64}
Adhemerval Zanella [Mon, 13 Jul 2020 12:13:12 +0000 (09:13 -0300)]
linux: Consolidate xstat{64}

The LFS support is implemented on xstat64.c, instead of xstat.c for
64-bit architectures.  The xstat.c implements the non-LFS it is
no-op for !XSTAT_IS_XSTAT64.

The generic non-LFS implementation handle two cases:

  1. New kABIs which uses generic pre 64-bit time Linux ABI (csky and
     nios): it issues __NR_fstat64 plus handle the overflow on st_ino,
     st_size, or st_blocks.  It only handles _STAT_VER_KERNEL.

  2. Old KABIs with old non-LFS support (arm, i386, hppa, m68k,
     microblaze, s390, sh, powerpc, and sparc32).  For _STAT_VER_KERNEL
     it issues __NR_stat, otherwise it issues __NR_stat64 and convert
     to non-LFS stat struct handling possible overflows on st_ino,
     st_size, or st_blocks.

Also the non-LFS mips is an outlier and it has its own implementation
since _STAT_VER_LINUX requires a different conversion function (it uses
the kernel_stat as the syscall argument since its exported ABI is
different than the kernel one for both non-LFS and LFS implementation).

The generic LFS implementation handles multiple cases:

  1. XSTAT_IS_XSTAT64 being 1:

    1.1. Old 64-bit kABI (ia64, powerpc64*, s390x, x86_64): it
         issues __NR_stat for _STAT_VER_KERNEL or _STAT_VER_LINUX.

    1.2. Old 64-bit kABI with defines __NR_stat64 instead of __NR_stat
 (sparc64): it issues __NR_stat for _STAT_VER_KERNEL or
 __NR_stat64 and convert to struct stat64.

    1.3. New kABIs which uses generic 64-bit Linux ABI (aarch64 and
         riscv64): it issues __NR_newfstatat and only for
         _STAT_VER_KERNEL.

    1.4. New 32-bit kABIs with only 64-bit time_t support (arc and
 riscv32): it issues __NR_statx and covert to struct stat64.

  2. Old ABIs with XSTAT_IS_XSTAT64 being 0:

    2.1. New kABIs which uses generic pre 64-bit time Linux ABI (csky
 and nios2): it issues __NR_fstatat64 for _STAT_VER_KERNEL.

    2.2. Old kABIs with old non-LFS support (arm, i386, hppa, m68k,
 microblaze, s390, sh, mips32, powerpc32, and sparc32): it
 issues __NR_stat64.

Also, two special cases requires specific LFS implementations:

  1. alpha: it requires to handle _STAT_VER_KERNEL64 to call __NR_stat64
     or use the kernel_stat with __NR_stat otherwise.

  2. mips64: as for non-LFS implementation its ABIs differ from glibc
     exported one, which requires an specific conversion function to
     handle the kernel_stat.

Checked with a build for all affected ABIs. I also checked on x86_64,
i686, powerpc, powerpc64le, sparcv9, sparc64, s390, and s390x.

Reviewed-by: Lukasz Majewski <lukma@denx.de>
4 years agolinux: Define STAT64_IS_KERNEL_STAT64
Adhemerval Zanella [Sat, 18 Jul 2020 02:49:50 +0000 (23:49 -0300)]
linux: Define STAT64_IS_KERNEL_STAT64

It indicates that the glibc export stat64 is similar in size and
layout of the kernel stat64 used on the syscall.  It is not currently
used on stat implementation, but the idea is to indicate whether
to use the kernel_stat to issue on the syscall on the *stat*64
variant (more specifically on mips which its exported ABI does not
match the kernel).

Reviewed-by: Lukasz Majewski <lukma@denx.de>
4 years agolinux: Always define STAT_IS_KERNEL_STAT
Adhemerval Zanella [Wed, 15 Jul 2020 12:42:32 +0000 (12:42 +0000)]
linux: Always define STAT_IS_KERNEL_STAT

It allows to check for its value instead of its existence.

Checked with a build for all affected ABIS.

Reviewed-by: Lukasz Majewski <lukma@denx.de>
4 years agoUpdate powerpc libm-test-ulps
Matheus Castanho [Thu, 10 Sep 2020 18:06:34 +0000 (15:06 -0300)]
Update powerpc libm-test-ulps

Before this patch, the following tests were failing:

ppc and ppc64:
    FAIL: math/test-ldouble-j0

ppc64le:
    FAIL: math/test-float128-j0
    FAIL: math/test-float64x-j0
    FAIL: math/test-ibm128-j0
    FAIL: math/test-ldouble-j0

4 years agobenchtests: Add "workload" traces for sinf128
Paul Zimmermann [Thu, 27 Aug 2020 13:28:56 +0000 (10:28 -0300)]
benchtests: Add "workload" traces for sinf128

This patch adds workload traces for sinf128 in binary32.  The trace is
made of 1000 random numbers, generated with SageMath.

4 years agobenchtests: Add "workload" traces for sinf
Paul Zimmermann [Thu, 27 Aug 2020 13:27:44 +0000 (10:27 -0300)]
benchtests: Add "workload" traces for sinf

This patch adds workload traces for sinf in binary32.  The trace is
made of 1000 random numbers, generated with SageMath.

4 years agobenchtests: Add "workload" traces for sin
Paul Zimmermann [Thu, 27 Aug 2020 13:26:45 +0000 (10:26 -0300)]
benchtests: Add "workload" traces for sin

This patch adds workload traces for sin in binary64.  The trace is
made of 1000 random numbers, generated with SageMath.

4 years agobenchtests: Add "workload" traces for powf128
Paul Zimmermann [Thu, 27 Aug 2020 13:25:04 +0000 (10:25 -0300)]
benchtests: Add "workload" traces for powf128

This patch adds workload traces for pow in binary128.  The trace is
made of 1000 random numbers, generated with SageMath.

4 years agobenchtests: Add "workload" traces for pow
Paul Zimmermann [Thu, 27 Aug 2020 13:23:11 +0000 (10:23 -0300)]
benchtests: Add "workload" traces for pow

This patch adds workload traces for pow in binary64.  The trace is
made of 1000 random numbers, generated with SageMath.

4 years agobenchtests: Add "workload" traces for expf128
Paul Zimmermann [Thu, 27 Aug 2020 13:21:37 +0000 (10:21 -0300)]
benchtests: Add "workload" traces for expf128

This patch adds workload traces for exp in binary128.  The trace is
made of 1000 random numbers, generated with SageMath.

4 years agobenchtests: Add "workload" traces for exp
Paul Zimmermann [Thu, 27 Aug 2020 13:17:09 +0000 (10:17 -0300)]
benchtests: Add "workload" traces for exp

This patch adds workload traces for exp in binary64.  The trace is
made of 1000 random numbers, generated with SageMath.

4 years agonptl: futex: Provide correct indentation for part of __futex_abstimed_wait_cancelable64
Lukasz Majewski [Tue, 8 Sep 2020 13:01:59 +0000 (15:01 +0200)]
nptl: futex: Provide correct indentation for part of __futex_abstimed_wait_cancelable64

By mistake the if for calling __futex_abstimed_wait_cancellable32 was
misaligned with the rest of the function body.

4 years agoDisable -Wstringop-overread for some string tests
Joseph Myers [Mon, 7 Sep 2020 18:11:12 +0000 (18:11 +0000)]
Disable -Wstringop-overread for some string tests

Similarly to Maciej's changes to fix the build of rawmemchr in the
presence of GCC 11's -Wstringop-overread, also disable that option in
two string function tests that have similar warnings and other string
function warnings already disabled.

Tested with build-many-glibcs.py for aarch64-linux-gnu and
arm-linux-gnueabi that it fixes building the glibc testsuite.

4 years agostring: Fix GCC 11 `-Werror=stringop-overread' error
Maciej W. Rozycki [Mon, 31 Aug 2020 13:26:47 +0000 (14:26 +0100)]
string: Fix GCC 11 `-Werror=stringop-overread' error

Fix a compilation error:

In function '__rawmemchr',
    inlined from '__rawmemchr' at rawmemchr.c:27:1:
rawmemchr.c:36:12: error: 'memchr' specified bound 18446744073709551615 exceeds maximum object size 9223372036854775807 [-Werror=stringop-overread]
   36 |     return memchr (s, c, (size_t)-1);
      |            ^~~~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
../o-iterator.mk:9: recipe for target '.../string/rawmemchr.o' failed

introduced with GCC 11 commit d14c547abd48 ("Add -Wstringop-overread
for reading past the end by string functions.").

4 years agoC11 threads: Fix inaccuracies in testsuite
Corinna Vinschen [Mon, 7 Sep 2020 09:42:51 +0000 (11:42 +0200)]
C11 threads: Fix inaccuracies in testsuite

- tst-mtx-recursive.c: mtx_init fails to use mtx_plain.  Per C11
  specs, using mtx_recursive alone is not supported.  This isn't
  catched because mtx_plain is defined as 0.

- tst-thrd-sleep.c: thrd_sleep returns 0 on success, a negative
  value on failure.  Testing against thrd_success is incorrect.

- tst-tss-basic.c: tss_set is incorrectly checkd for a non-0
  value.  The test should test aginst C11 threads error codes.
  This isn't catched because thrd_success is defined as 0.

Note that all three tests fail on FreeBSD, which defines all mutex type
values, as well as all C11 threads error codes with non-0 values.

4 years agoelf.h: Add aarch64 bti/pac dynamic tag constants
Mark Wielaard [Fri, 28 Aug 2020 16:44:16 +0000 (18:44 +0200)]
elf.h: Add aarch64 bti/pac dynamic tag constants

Constants double checked against binutils and the ELF for the Arm 64-bit
Architecture (AArch64) Release 2020Q2 document.

Only BTI PLT is used in glibc, there's no PAC PLT with glibc, and people
are expected to use BIND_NOW.

4 years agox86: Set CPU usable feature bits conservatively [BZ #26552]
H.J. Lu [Wed, 5 Aug 2020 20:51:56 +0000 (13:51 -0700)]
x86: Set CPU usable feature bits conservatively [BZ #26552]

Set CPU usable feature bits only for CPU features which are usable in
user space and whose usability can be detected from user space, excluding
features like FSGSBASE whose enable bit can only be checked in the kernel.

4 years agoUpdate i686 ulps.
Patsy Griffin [Tue, 1 Sep 2020 20:48:23 +0000 (16:48 -0400)]
Update i686 ulps.

Without this ULP patch these 3 tests fail on i686:
FAIL: math/test-float128-j0
FAIL: math/test-float64x-j0
FAIL: math/test-ldouble-j0

CPU info:
Vendor ID:                       GenuineIntel
CPU family:                      6
Model:                           85
Model name:                      Intel Xeon Processor (Cascadelake)

4 years agoUse LFS readdir in generic POSIX getcwd [BZ# 22899]
Adhemerval Zanella [Tue, 25 Aug 2020 20:22:09 +0000 (17:22 -0300)]
Use LFS readdir in generic POSIX getcwd [BZ# 22899]

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

4 years agolinux: Remove __ASSUME_ATFCTS
Adhemerval Zanella [Tue, 25 Aug 2020 19:57:12 +0000 (16:57 -0300)]
linux: Remove __ASSUME_ATFCTS

The __have_atfcts is not used anywhere.

Checked on x86_64-linux-gnu.

4 years agoSync getcwd with gnulib
Adhemerval Zanella [Thu, 20 Aug 2020 12:04:16 +0000 (09:04 -0300)]
Sync getcwd with gnulib

This is the first of a series of patches to sync with Gnulib commit
615b43e1f9.  This patch adopts most of the changes of Gnulib, except it
retains GETCWD_RETURN_TYPE and does not always use a 64-bit internal
API. These remaining discrepancies will be addressed in later patches
in this series.

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

4 years agox86-64: Fix FMA4 detection in ifunc [BZ #26534]
Ondřej Hošek [Wed, 26 Aug 2020 02:26:50 +0000 (04:26 +0200)]
x86-64: Fix FMA4 detection in ifunc [BZ #26534]

A typo in commit 107e6a3c2212ba7a3a4ec7cae8d82d73f7c95d0b causes the
FMA4 code path to be taken on systems that support FMA, even if they do
not support FMA4. Fix this to detect FMA4.

4 years agoy2038: nptl: Convert pthread_cond_{clock|timed}wait to support 64 bit time
Lukasz Majewski [Tue, 11 Aug 2020 08:49:03 +0000 (10:49 +0200)]
y2038: nptl: Convert pthread_cond_{clock|timed}wait to support 64 bit time

The pthread_cond_clockwait and pthread_cond_timedwait have been converted
to support 64 bit time.

This change introduces new futex_abstimed_wait_cancelable64 function in
./sysdeps/nptl/futex-helpers.c, which uses futex_time64 where possible
and tries to replace low-level preprocessor macros from
lowlevellock-futex.h
The pthread_cond_{clock|timed}wait only accepts absolute time. Moreover,
there is no need to check for NULL passed as *abstime pointer as
__pthread_cond_wait_common() always passes non-NULL struct __timespec64
pointer to futex_abstimed_wait_cancellable64().

For systems with __TIMESIZE != 64 && __WORDSIZE == 32:
- Conversions between 64 bit time to 32 bit are necessary
- Redirection to __pthread_cond_{clock|timed}wait64 will provide support
  for 64 bit time

The futex_abstimed_wait_cancelable64 function has been put into a separate
file on the purpose - to avoid issues apparent on the m68k architecture
related to small number of available registers (there is not enough
registers to put all necessary arguments in them if the above function
would be added to futex-internal.h with __always_inline attribute).

In fact - new function - namely __futex_abstimed_wait_cancellable32 is
used to reduce number of needed registers (as some in-register values are
stored on the stack when function call is made).

Build tests:
./src/scripts/build-many-glibcs.py glibcs

Run-time tests:
- Run specific tests on ARM/x86 32bit systems (qemu):
  https://github.com/lmajewski/meta-y2038 and run tests:
  https://github.com/lmajewski/y2038-tests/commits/master

Above tests were performed with Y2038 redirection applied as well as without
to test the proper usage of both __pthread_cond_{clock|timed}wait64 and
__pthread_cond_{clock|timed}wait.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
4 years agomalloc: Fix mallinfo deprecation declaration
Adhemerval Zanella [Mon, 31 Aug 2020 14:14:01 +0000 (11:14 -0300)]
malloc: Fix mallinfo deprecation declaration

It fixes the build issue below introduced by e3960d1c57e57 (Add
mallinfo2  function that support sizes >= 4GB).  It moves the
__MALLOC_DEPRECATED to the usual place for function attributes:

  In file included from ../include/malloc.h:3,
                   from ../sysdeps/x86_64/multiarch/../../../test-skeleton.c:31,
                   from ../sysdeps/x86_64/multiarch/test-multiarch.c:96:
  ../malloc/malloc.h:118:1: error: empty declaration [-Werror]
    118 | __MALLOC_DEPRECATED;

It also adds the required deprecated warning suppression on the tests.

Checked on x86_64-linux-gnu.

4 years agox32: Add <fixup-asm-unistd.h> and regenerate arch-syscall.h
H.J. Lu [Tue, 25 Aug 2020 12:35:45 +0000 (05:35 -0700)]
x32: Add <fixup-asm-unistd.h> and regenerate arch-syscall.h

X32 uses the same 64-bit syscall interface for set_thread_area.  But
__NR_set_thread_area is missing from <asm/unistd_x32.h>.  A kernel patch
was submitted:

From 7b05d5b43ae2545e0d4a3edb24205d18bc883626 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Sat, 15 Aug 2020 10:34:00 -0700
Subject: [PATCH] x86-64: Enable x32 set_thread_area

X32 uses the common 64-bit syscall interface for set_thread_area.  Add
<fixup-asm-unistd.h> to provide __NR_set_thread_area.

Co-authored-by: Florian Weimer <fweimer@redhat.com>
4 years agoAdd mallinfo2 function that support sizes >= 4GB.
Martin Liska [Tue, 7 Jul 2020 11:58:24 +0000 (13:58 +0200)]
Add mallinfo2 function that support sizes >= 4GB.

The current int type can easily overflow for allocation of more
than 4GB.

4 years agoRemove obsolete default/nss code
Thorsten Kukuk [Sat, 29 Aug 2020 09:42:39 +0000 (11:42 +0200)]
Remove obsolete default/nss code

All code reading /etc/default/nss and using the internal
defines got removed, so the config file should be removed, too.

4 years agoAArch64: Improve backwards memmove performance
Wilco Dijkstra [Fri, 28 Aug 2020 16:51:40 +0000 (17:51 +0100)]
AArch64: Improve backwards memmove performance

On some microarchitectures performance of the backwards memmove improves if
the stores use STR with decreasing addresses.  So change the memmove loop
in memcpy_advsimd.S to use 2x STR rather than STP.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
4 years agoAdd RISC-V 32-bit target to build-many-glibcs.py
Zong Li [Fri, 30 Nov 2018 09:18:40 +0000 (17:18 +0800)]
Add RISC-V 32-bit target to build-many-glibcs.py

Support building three variants of 32-bit RISC-V glibc as follows:
- riscv32-linux-gnu-rv32imac-ilp32
- riscv32-linux-gnu-rv32imafdc-ilp32
- riscv32-linux-gnu-rv32imafdc-ilp32d

Reviewed-by: Maciej W. Rozycki <macro@wdc.com>
4 years agoDocumentation for the RISC-V 32-bit port
Alistair Francis [Tue, 14 Jul 2020 13:29:56 +0000 (06:29 -0700)]
Documentation for the RISC-V 32-bit port

There is already RISC-V 64-bit port information in the documentation.
Let's add some documentation entries for the RISC-V 32-bit as well.

Reviewed-by: Maciej W. Rozycki <macro@wdc.com>
4 years agoRISC-V: Build infrastructure for 32-bit port
Zong Li [Fri, 30 Nov 2018 09:18:00 +0000 (17:18 +0800)]
RISC-V: Build infrastructure for 32-bit port

This patch lays out the top-level organisation of the RISC-V 32-bit port.
It provides all the Implies files as well as various other fragments of
the build infrastructure.

Reviewed-by: Maciej W. Rozycki <macro@wdc.com>
4 years agoRISC-V: Add rv32 path to RTLDLIST in ldd
Zong Li [Tue, 10 Sep 2019 04:35:50 +0000 (21:35 -0700)]
RISC-V: Add rv32 path to RTLDLIST in ldd

Reviewed-by: Maciej W. Rozycki <macro@wdc.com>
4 years agoriscv32: Specify the arch_minimum_kernel as 5.4
Alistair Francis [Sat, 21 Dec 2019 02:29:42 +0000 (18:29 -0800)]
riscv32: Specify the arch_minimum_kernel as 5.4

Specify the minimum kernel version for RISC-V 32-bit as the 5.4 kernel.
We require this commit: "waitid: Add support for waiting for the current
process group" for the kernel as it adds support for the P_PGID id for
the waitid syscall.  Without this patch we can't replace the wait4
syscall on 64-bit time_t only systems.

Reviewed-by: Maciej W. Rozycki <macro@wdc.com>
4 years agoRISC-V: Fix llrint and llround missing exceptions on RV32
Zong Li [Fri, 30 Nov 2018 09:18:20 +0000 (17:18 +0800)]
RISC-V: Fix llrint and llround missing exceptions on RV32

Conversions from a float to a long long on 32-bit RISC-V (RV32) may not
raise the correct exceptions on overflow, it also may raise spurious
"inexact" exceptions on non overflow cases.  This patch fixes the
problem, similarly to the fix for MIPS, ARM and S390.

Reviewed-by: Maciej W. Rozycki <macro@wdc.com>
4 years agoRISC-V: Add the RV32 libm-test-ulps
Alistair Francis [Sat, 4 Jan 2020 01:56:50 +0000 (17:56 -0800)]
RISC-V: Add the RV32 libm-test-ulps

Add a libm-test-ulps for RV32, this is the same as the RV64 one.

This dosn't match what is generated by running `make regen-ulps` on RV32
QEMU, but the current in tree RV64 doesn't match that either.

Reviewed-by: Maciej W. Rozycki <macro@wdc.com>
4 years agoRISC-V: Add 32-bit ABI lists
Alistair Francis [Mon, 13 Jul 2020 16:08:25 +0000 (09:08 -0700)]
RISC-V: Add 32-bit ABI lists

Use the update-abi Make target to generate the abilist for RV32.

Reviewed-by: Maciej W. Rozycki <macro@wdc.com>
4 years agoRISC-V: Add hard float support for 32-bit CPUs
Zong Li [Fri, 30 Nov 2018 09:16:38 +0000 (17:16 +0800)]
RISC-V: Add hard float support for 32-bit CPUs

This patch adds support for hardware floating-point support for the
RV32IF and RV32IFD platforms.

Reviewed-by: Maciej W. Rozycki <macro@wdc.com>
4 years agoRISC-V: Support the 32-bit ABI implementation
Alistair Francis [Mon, 10 Feb 2020 18:36:21 +0000 (10:36 -0800)]
RISC-V: Support the 32-bit ABI implementation

This patch adds the ABI implementation for 32-bit RISC-V.  It contains
the Linux-specific and RISC-V architecture code.

Reviewed-by: Maciej W. Rozycki <macro@wdc.com>