sparc, sparc64: fix rt_sigaction decoding
Fix regression introduced by commit v4.9-9-gc3a5c01.
* signal.c (HAVE_SA_RESTORER): New macro.
[HPPA || IA64]: Do not undefine SA_RESTORER.
(old_sigaction, old_sigaction32, new_sigaction): Use HAVE_SA_RESTORER
instead of SA_RESTORER to check whether to define sa_restorer.
(decode_old_sigaction, decode_new_sigaction): Use HAVE_SA_RESTORER in
addition to SA_RESTORER to check whether to use sa_restorer.
diff --git a/signal.c b/signal.c
index e77fd4e..7342bbc 100644
--- a/signal.c
+++ b/signal.c
@@ -69,8 +69,6 @@
# error: NSIG < 32
#endif
-#ifdef HAVE_SIGACTION
-
/* The libc headers do not define this constant since it should only be
used by the implementation. So we define it here. */
#ifndef SA_RESTORER
@@ -79,17 +77,30 @@
# endif
#endif
-/* Some arches define this in their headers, but don't actually have it,
- so we have to delete the define. */
-#if defined(HPPA) || defined(IA64)
-# undef SA_RESTORER
+/*
+ * Some architectures define SA_RESTORER in their headers,
+ * but do not actually have sa_restorer.
+ *
+ * Some architectures, otherwise, do not define SA_RESTORER in their headers,
+ * but actually have sa_restorer.
+ */
+#ifdef SA_RESTORER
+# if defined HPPA || defined IA64
+# define HAVE_SA_RESTORER 0
+# else
+# define HAVE_SA_RESTORER 1
+# endif
+#else /* !SA_RESTORER */
+# if defined SPARC || defined SPARC64
+# define HAVE_SA_RESTORER 1
+# else
+# define HAVE_SA_RESTORER 0
+# endif
#endif
#include "xlat/sigact_flags.h"
#include "xlat/sigprocmaskcmds.h"
-#endif /* HAVE_SIGACTION */
-
/* Anonymous realtime signals. */
/* Under glibc 2.1, SIGRTMIN et al are functions, but __SIGRTMIN is a
constant. This is what we want. Otherwise, just use SIGRTMIN. */
@@ -541,7 +552,7 @@
unsigned long sa_mask;
unsigned long sa_flags;
#endif /* !MIPS */
-#ifdef SA_RESTORER
+#if HAVE_SA_RESTORER
void (*sa_restorer)(void);
#endif
};
@@ -551,7 +562,7 @@
uint32_t __sa_handler;
uint32_t sa_mask;
uint32_t sa_flags;
-#ifdef SA_RESTORER
+#if HAVE_SA_RESTORER
uint32_t sa_restorer;
#endif
};
@@ -579,7 +590,7 @@
memset(&sa, 0, sizeof(sa));
sa.__sa_handler = (void*)(uintptr_t)sa32.__sa_handler;
sa.sa_flags = sa32.sa_flags;
-#ifdef SA_RESTORER
+#if HAVE_SA_RESTORER && defined SA_RESTORER
sa.sa_restorer = (void*)(uintptr_t)sa32.sa_restorer;
#endif
sa.sa_mask = sa32.sa_mask;
@@ -617,7 +628,7 @@
#endif
tprints(", ");
printflags(sigact_flags, sa.sa_flags, "SA_???");
-#ifdef SA_RESTORER
+#if HAVE_SA_RESTORER && defined SA_RESTORER
if (sa.sa_flags & SA_RESTORER)
tprintf(", %p", sa.sa_restorer);
#endif
@@ -1117,7 +1128,7 @@
void (*__sa_handler)(int);
unsigned long sa_flags;
#endif /* !MIPS */
-#ifdef SA_RESTORER
+#if HAVE_SA_RESTORER
void (*sa_restorer)(void);
#endif
/* Kernel treats sa_mask as an array of longs. */
@@ -1128,7 +1139,7 @@
{
uint32_t __sa_handler;
uint32_t sa_flags;
-#ifdef SA_RESTORER
+#if HAVE_SA_RESTORER
uint32_t sa_restorer;
#endif
uint32_t sa_mask[2 * (NSIG / sizeof(long) ? NSIG / sizeof(long) : 1)];
@@ -1156,7 +1167,7 @@
memset(&sa, 0, sizeof(sa));
sa.__sa_handler = (void*)(unsigned long)sa32.__sa_handler;
sa.sa_flags = sa32.sa_flags;
-#ifdef SA_RESTORER
+#if HAVE_SA_RESTORER && defined SA_RESTORER
sa.sa_restorer = (void*)(unsigned long)sa32.sa_restorer;
#endif
/* Kernel treats sa_mask as an array of longs.
@@ -1205,7 +1216,7 @@
tprints(", ");
printflags(sigact_flags, sa.sa_flags, "SA_???");
-#ifdef SA_RESTORER
+#if HAVE_SA_RESTORER && defined SA_RESTORER
if (sa.sa_flags & SA_RESTORER)
tprintf(", %p", sa.sa_restorer);
#endif