glibc/sysdeps
Adhemerval Zanella 1b132d55e2 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
2019-12-19 10:30:49 -03:00
..
aarch64 elf: Do not run IFUNC resolvers for LD_DEBUG=unused [BZ #24214] 2019-12-02 14:55:22 +01:00
alpha nptl: Add default pthread-offsets.h 2019-11-26 13:53:36 +00:00
arm elf: Do not run IFUNC resolvers for LD_DEBUG=unused [BZ #24214] 2019-12-02 14:55:22 +01:00
csky nptl: Add default pthread-offsets.h 2019-11-26 13:53:36 +00:00
generic Use GCC builtins for copysign functions if desired. 2019-12-11 15:12:19 +01:00
gnu Add TCP_TX_DELAY from Linux 5.3 to netinet/tcp.h. 2019-09-27 13:37:36 +00:00
hppa nptl: Add struct_rwlock.h 2019-11-26 13:53:36 +00:00
htl time: Introduce function to check correctness of nanoseconds value 2019-10-27 21:49:25 +01:00
hurd Prefer https to http for gnu.org and fsf.org URLs 2019-09-07 02:43:31 -07:00
i386 elf: Do not run IFUNC resolvers for LD_DEBUG=unused [BZ #24214] 2019-12-02 14:55:22 +01:00
ia64 nptl: Add default pthread-offsets.h 2019-11-26 13:53:36 +00:00
ieee754 ldbl-128ibm-compat: Add ISO C99 versions of scanf functions 2019-12-13 18:02:09 -03:00
init_array Prefer https to http for gnu.org and fsf.org URLs 2019-09-07 02:43:31 -07:00
m68k nptl: Add default pthread-offsets.h 2019-11-26 13:53:36 +00:00
mach hurd: Do not make sigprocmask available in ld.so 2019-12-18 10:53:17 +01:00
microblaze nptl: Add default pthread-offsets.h 2019-11-26 13:53:36 +00:00
mips nptl: Add struct_rwlock.h 2019-11-26 13:53:36 +00:00
nios2 nptl: Add default pthread-offsets.h 2019-11-26 13:53:36 +00:00
nptl nptl: Fix __PTHREAD_MUTEX_INITIALIZER for !__PTHREAD_MUTEX_HAVE_PREV 2019-11-26 17:00:19 -03:00
posix hurd: Fix ld.so __getcwd override from libc 2019-12-01 21:05:51 +00:00
powerpc powerpc: Do not run IFUNC resolvers for LD_DEBUG=unused [BZ #24214] 2019-12-19 09:49:57 -03:00
pthread Change most internal uses of __gettimeofday to __clock_gettime. 2019-10-30 17:04:10 -03:00
riscv sysdeps/riscv/start.S: rename .Lload_gp to load_gp (bug 24376) 2019-12-09 12:05:26 +01:00
s390 S390: Use sysdeps/ieee754/dbl-64/wordsize-64 on s390x. 2019-12-11 15:12:26 +01:00
sh nptl: Add default pthread-offsets.h 2019-11-26 13:53:36 +00:00
sparc Always use wordsize-64 version of s_trunc.c. 2019-12-11 15:12:14 +01:00
unix Fix __libc_signal_block_all on sparc64 2019-12-19 10:30:49 -03:00
wordsize-32 Prefer https to http for gnu.org and fsf.org URLs 2019-09-07 02:43:31 -07:00
wordsize-64 Prefer https to http for gnu.org and fsf.org URLs 2019-09-07 02:43:31 -07:00
x86 nptl: Add struct_rwlock.h 2019-11-26 13:53:36 +00:00
x86_64 Always use wordsize-64 version of s_trunc.c. 2019-12-11 15:12:14 +01:00