This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] signal: Use correct type for si_band in siginfo_t [BZ #23562]


* Joseph Myers:

> On Mon, 22 Oct 2018, Florian Weimer wrote:
>
>> > For 64-bit SPARC this would be a case where the kernel having the
>> > wrong type means you need an appropriately conditioned and commented
>> > XFAIL in signal.h-data and sys/wait.h-data (and appropriately
>> > conditioned and commented conformtest-xfail-conds definition in a
>> > relevant sysdeps Makefile to define the condition that's used in the
>> > conform/ data changes).
>> 
>> Why wasn't this a problem before
>> sysdeps/unix/sysv/linux/bits/types/siginfo_t.h was split out?  SPARC
>> clearly had int as the type of si_band back then.
>
> XFAILs at the Makefile level for the signal.h and sys/wait.h tests for 
> most standards weren't removed until August 2017 (commit 
> 4fa9b3bfe6759c82beb4b043a54a3598ca467289, once the ucontext.h namespace 
> fixes were completed), after the accidental SPARC si_band change, and so 
> served to hide that architecture-specific problem.

This is what I came up with.  I tried it on x86-64, sparcv9, and
sparc64, and the conform tests no longer fail.

conform: XFAIL siginfo_t si_band test on sparc64

We can use long int on sparcv9, but on sparc64, we must match the int
type used by the kernel (and not long int, as in POSIX).

2018-10-25  Florian Weimer  <fweimer@redhat.com>

	[BZ #23562]
	[BZ #23821]
	XFAIL siginfo_t si_band conform test on sparc64.
	* sysdeps/unix/sysv/linux/sparc/bits/siginfo-arch.h
	(__SI_BAND_TYPE): Only override long int default type on sparc64.
	* sysdeps/unix/sysv/linux/sparc/sparc64/Makefile
	(conformtest-xfail-conds): Add sparc64-linux.
	* conform/data/signal.h-data (siginfo_t): XFAIL si_band test on
	sparc64.
	* conform/data/sys/wait.h-data (siginfo_t): Likewise.

diff --git a/conform/data/signal.h-data b/conform/data/signal.h-data
index 11e54adb04..674e5793db 100644
--- a/conform/data/signal.h-data
+++ b/conform/data/signal.h-data
@@ -172,7 +172,8 @@ element siginfo_t pid_t si_pid
 element siginfo_t uid_t si_uid
 element siginfo_t {void*} si_addr
 element siginfo_t int si_status
-element siginfo_t long si_band
+// Bug 23821: si_band has type int on sparc64.
+xfail[sparc64-linux]-element siginfo_t long si_band
 #  endif
 #  ifndef XPG42
 element siginfo_t {union sigval} si_value
diff --git a/conform/data/sys/wait.h-data b/conform/data/sys/wait.h-data
index ed3869b34f..c0761424da 100644
--- a/conform/data/sys/wait.h-data
+++ b/conform/data/sys/wait.h-data
@@ -46,7 +46,8 @@ element siginfo_t pid_t si_pid
 element siginfo_t uid_t si_uid
 element siginfo_t {void*} si_addr
 element siginfo_t int si_status
-element siginfo_t long si_band
+// Bug 23821: si_band has type int on sparc64.
+xfail[sparc64-linux]-element siginfo_t long si_band
 # ifndef XPG42
 element siginfo_t {union sigval} si_value
 # endif
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/siginfo-arch.h b/sysdeps/unix/sysv/linux/sparc/bits/siginfo-arch.h
index 9f79715ebe..4dd35237f6 100644
--- a/sysdeps/unix/sysv/linux/sparc/bits/siginfo-arch.h
+++ b/sysdeps/unix/sysv/linux/sparc/bits/siginfo-arch.h
@@ -2,7 +2,12 @@
 #ifndef _BITS_SIGINFO_ARCH_H
 #define _BITS_SIGINFO_ARCH_H 1
 
-#define __SI_BAND_TYPE int
+/* The kernel uses int instead of long int (as in POSIX).  In 32-bit
+   mode, we can still use long int, but in 64-bit mode, we need to
+   deviate from POSIX.  */
+#if __WORDSIZE == 64
+# define __SI_BAND_TYPE int
+#endif
 
 #define __SI_SIGFAULT_ADDL \
   int _si_trapno;
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile b/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile
index 715af3df7b..218c246f16 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile
@@ -7,3 +7,8 @@ LD += -melf64_sparc
 ifeq ($(subdir),stdlib)
 sysdep_routines += __start_context
 endif
+
+ifeq ($(subdir),conform)
+# For bug 23821 (incorrect type of si_band).
+conformtest-xfail-conds += sparc64-linux
+endif


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]