227 lines
8.7 KiB
Diff
227 lines
8.7 KiB
Diff
From 27e039455d5ef0d30b835fb422fffafd42600fa4 Mon Sep 17 00:00:00 2001
|
|
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
|
Date: Tue, 11 Dec 2018 16:52:47 -0200
|
|
Subject: [PATCH 63] m68k: Fix sigaction kernel definition (BZ #23967)
|
|
|
|
Commit b4a5d26d883 (linux: Consolidate sigaction implementation) added
|
|
a wrong kernel_sigaction definition for m68k, meant for __NR_sigaction
|
|
instead of __NR_rt_sigaction as used on generic Linux sigaction
|
|
implementation. This patch fixes it by using the Linux generic
|
|
definition meant for the RT kernel ABI.
|
|
|
|
Checked the signal tests on emulated m68-linux-gnu (Aranym). It fixes
|
|
the faulty signal/tst-sigaction and man works as expected.
|
|
|
|
Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
|
James Clarke <jrtc27@jrtc27.com>
|
|
|
|
[BZ #23967]
|
|
* sysdeps/unix/sysv/linux/kernel_sigaction.h (HAS_SA_RESTORER):
|
|
Define if SA_RESTORER is defined.
|
|
(kernel_sigaction): Define sa_restorer if HAS_SA_RESTORER is defined.
|
|
(SET_SA_RESTORER, RESET_SA_RESTORER): Define iff the macro are not
|
|
already defined.
|
|
* sysdeps/unix/sysv/linux/m68k/kernel_sigaction.h (SA_RESTORER,
|
|
kernel_sigaction, SET_SA_RESTORER, RESET_SA_RESTORER): Remove
|
|
definitions.
|
|
(HAS_SA_RESTORER): Define.
|
|
* sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h (SA_RESTORER,
|
|
SET_SA_RESTORER, RESET_SA_RESTORER): Remove definition.
|
|
(HAS_SA_RESTORER): Define.
|
|
* sysdeps/unix/sysv/linux/nios2/kernel_sigaction.h: Include generic
|
|
kernel_sigaction after define SET_SA_RESTORER and RESET_SA_RESTORER.
|
|
* sysdeps/unix/sysv/linux/powerpc/kernel_sigaction.h: Likewise.
|
|
* sysdeps/unix/sysv/linux/x86_64/sigaction.c: Likewise.
|
|
|
|
(cherry picked from commit 43a45c2d829f164c1fb94d5f44afe326fae946e1)
|
|
---
|
|
ChangeLog | 22 ++++++++++++++++
|
|
sysdeps/unix/sysv/linux/kernel_sigaction.h | 12 +++++++--
|
|
.../unix/sysv/linux/m68k/kernel_sigaction.h | 26 +++----------------
|
|
.../unix/sysv/linux/nios2/kernel_sigaction.h | 3 ++-
|
|
.../sysv/linux/powerpc/kernel_sigaction.h | 3 ++-
|
|
sysdeps/unix/sysv/linux/sh/kernel_sigaction.h | 3 ++-
|
|
.../unix/sysv/linux/sparc/kernel_sigaction.h | 7 +----
|
|
sysdeps/unix/sysv/linux/x86_64/sigaction.c | 3 ++-
|
|
8 files changed, 45 insertions(+), 34 deletions(-)
|
|
|
|
diff --git a/ChangeLog b/ChangeLog
|
|
index 81555f1675..739fe56d73 100644
|
|
--- a/ChangeLog
|
|
+++ b/ChangeLog
|
|
@@ -1,3 +1,25 @@
|
|
+2018-12-18 Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
|
+ James Clarke <jrtc27@jrtc27.com>
|
|
+
|
|
+ [BZ #23967]
|
|
+ * sysdeps/unix/sysv/linux/kernel_sigaction.h (HAS_SA_RESTORER):
|
|
+ Define if SA_RESTORER is defined.
|
|
+ (kernel_sigaction): Define sa_restorer if HAS_SA_RESTORER is defined.
|
|
+ (SET_SA_RESTORER, RESET_SA_RESTORER): Define iff the macro are not
|
|
+ already defined.
|
|
+ * sysdeps/unix/sysv/linux/m68k/kernel_sigaction.h (SA_RESTORER,
|
|
+ kernel_sigaction, SET_SA_RESTORER, RESET_SA_RESTORER): Remove
|
|
+ definitions.
|
|
+ (HAS_SA_RESTORER): Define.
|
|
+ * sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h (SA_RESTORER,
|
|
+ SET_SA_RESTORER, RESET_SA_RESTORER): Remove definition.
|
|
+ (HAS_SA_RESTORER): Define.
|
|
+ * sysdeps/unix/sysv/linux/nios2/kernel_sigaction.h: Include generic
|
|
+ kernel_sigaction after define SET_SA_RESTORER and RESET_SA_RESTORER.
|
|
+ * sysdeps/unix/sysv/linux/powerpc/kernel_sigaction.h: Likewise.
|
|
+ * sysdeps/unix/sysv/linux/s390/kernel_sigaction.h: Likewise.
|
|
+ * sysdeps/unix/sysv/linux/x86_64/sigaction.c: Likewise.
|
|
+
|
|
2018-10-30 Andreas Schwab <schwab@suse.de>
|
|
|
|
[BZ #23125]
|
|
diff --git a/sysdeps/unix/sysv/linux/kernel_sigaction.h b/sysdeps/unix/sysv/linux/kernel_sigaction.h
|
|
index 2dbec08099..1c36146d46 100644
|
|
--- a/sysdeps/unix/sysv/linux/kernel_sigaction.h
|
|
+++ b/sysdeps/unix/sysv/linux/kernel_sigaction.h
|
|
@@ -1,19 +1,27 @@
|
|
#ifndef _KERNEL_SIGACTION_H
|
|
# define _KERNEL_SIGACTION_H
|
|
|
|
+#ifdef SA_RESTORER
|
|
+# define HAS_SA_RESTORER 1
|
|
+#endif
|
|
+
|
|
/* This is the sigaction structure from the Linux 3.2 kernel. */
|
|
struct kernel_sigaction
|
|
{
|
|
__sighandler_t k_sa_handler;
|
|
unsigned long sa_flags;
|
|
-#ifdef SA_RESTORER
|
|
+#ifdef HAS_SA_RESTORER
|
|
void (*sa_restorer) (void);
|
|
#endif
|
|
+ /* glibc sigset is larger than kernel expected one, however sigaction
|
|
+ passes the kernel expected size on rt_sigaction syscall. */
|
|
sigset_t sa_mask;
|
|
};
|
|
|
|
-#ifndef SA_RESTORER
|
|
+#ifndef SET_SA_RESTORER
|
|
# define SET_SA_RESTORER(kact, act)
|
|
+#endif
|
|
+#ifndef RESET_SA_RESTORER
|
|
# define RESET_SA_RESTORER(act, kact)
|
|
#endif
|
|
|
|
diff --git a/sysdeps/unix/sysv/linux/m68k/kernel_sigaction.h b/sysdeps/unix/sysv/linux/m68k/kernel_sigaction.h
|
|
index 54972feb13..464b351d6d 100644
|
|
--- a/sysdeps/unix/sysv/linux/m68k/kernel_sigaction.h
|
|
+++ b/sysdeps/unix/sysv/linux/m68k/kernel_sigaction.h
|
|
@@ -1,22 +1,4 @@
|
|
-#ifndef _KERNEL_SIGACTION_H
|
|
-# define _KERNEL_SIGACTION_H
|
|
-
|
|
-#include <signal.h>
|
|
-
|
|
-#define SA_RESTORER 0x04000000
|
|
-
|
|
-/* This is the sigaction structure from the Linux 3.2 kernel. */
|
|
-struct kernel_sigaction
|
|
-{
|
|
- __sighandler_t k_sa_handler;
|
|
- sigset_t sa_mask;
|
|
- unsigned long sa_flags;
|
|
- void (*sa_restorer) (void);
|
|
-};
|
|
-
|
|
-#define SET_SA_RESTORER(kact, act) \
|
|
- (kact)->sa_restorer = (act)->sa_restorer
|
|
-#define RESET_SA_RESTORER(act, kact) \
|
|
- (act)->sa_restorer = (kact)->sa_restorer
|
|
-
|
|
-#endif
|
|
+/* m68k does not define SA_RESTORER, but does have sa_restorer member
|
|
+ on kernel sigaction struct. */
|
|
+#define HAS_SA_RESTORER 1
|
|
+#include <sysdeps/unix/sysv/linux/kernel_sigaction.h>
|
|
diff --git a/sysdeps/unix/sysv/linux/nios2/kernel_sigaction.h b/sysdeps/unix/sysv/linux/nios2/kernel_sigaction.h
|
|
index 4ada322104..89f9bcedfd 100644
|
|
--- a/sysdeps/unix/sysv/linux/nios2/kernel_sigaction.h
|
|
+++ b/sysdeps/unix/sysv/linux/nios2/kernel_sigaction.h
|
|
@@ -1,8 +1,9 @@
|
|
/* NIOS2 uses the generic Linux UAPI but defines SA_RESTORER. */
|
|
#define SA_RESTORER 0x04000000
|
|
-#include <sysdeps/unix/sysv/linux/kernel_sigaction.h>
|
|
|
|
#define SET_SA_RESTORER(kact, act) \
|
|
(kact)->sa_restorer = (act)->sa_restorer
|
|
#define RESET_SA_RESTORER(act, kact) \
|
|
(act)->sa_restorer = (kact)->sa_restorer
|
|
+
|
|
+#include <sysdeps/unix/sysv/linux/kernel_sigaction.h>
|
|
diff --git a/sysdeps/unix/sysv/linux/powerpc/kernel_sigaction.h b/sysdeps/unix/sysv/linux/powerpc/kernel_sigaction.h
|
|
index aef3d5a3b3..bac03ee45d 100644
|
|
--- a/sysdeps/unix/sysv/linux/powerpc/kernel_sigaction.h
|
|
+++ b/sysdeps/unix/sysv/linux/powerpc/kernel_sigaction.h
|
|
@@ -1,9 +1,10 @@
|
|
/* powerpc kernel sigaction is similar to generic Linux UAPI one,
|
|
but the architecture also defines SA_RESTORER. */
|
|
#define SA_RESTORER 0x04000000
|
|
-#include <sysdeps/unix/sysv/linux/kernel_sigaction.h>
|
|
|
|
#define SET_SA_RESTORER(kact, act) \
|
|
(kact)->sa_restorer = (act)->sa_restorer
|
|
#define RESET_SA_RESTORER(act, kact) \
|
|
(act)->sa_restorer = (kact)->sa_restorer
|
|
+
|
|
+#include <sysdeps/unix/sysv/linux/kernel_sigaction.h>
|
|
diff --git a/sysdeps/unix/sysv/linux/sh/kernel_sigaction.h b/sysdeps/unix/sysv/linux/sh/kernel_sigaction.h
|
|
index 7ebcd08d62..c8dc77a02b 100644
|
|
--- a/sysdeps/unix/sysv/linux/sh/kernel_sigaction.h
|
|
+++ b/sysdeps/unix/sysv/linux/sh/kernel_sigaction.h
|
|
@@ -1,8 +1,9 @@
|
|
/* SH uses the generic Linux UAPI but defines SA_RESTORER. */
|
|
#define SA_RESTORER 0x04000000
|
|
-#include <sysdeps/unix/sysv/linux/kernel_sigaction.h>
|
|
|
|
#define SET_SA_RESTORER(kact, act) \
|
|
(kact)->sa_restorer = (act)->sa_restorer
|
|
#define RESET_SA_RESTORER(act, kact) \
|
|
(act)->sa_restorer = (kact)->sa_restorer
|
|
+
|
|
+#include <sysdeps/unix/sysv/linux/kernel_sigaction.h>
|
|
diff --git a/sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h b/sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h
|
|
index bee7e9cd03..eb4a522453 100644
|
|
--- a/sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h
|
|
+++ b/sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h
|
|
@@ -1,10 +1,5 @@
|
|
/* SPARC 'struct __new_sigaction' is similar to generic Linux UAPI with
|
|
a sa_restorer field, even though function is passed as an argument
|
|
to rt_sigaction syscall. */
|
|
-#define SA_RESTORER 0x04000000
|
|
+#define HAS_SA_RESTORER 1
|
|
#include <sysdeps/unix/sysv/linux/kernel_sigaction.h>
|
|
-
|
|
-#define SET_SA_RESTORER(kact, act) \
|
|
- (kact)->sa_restorer = NULL
|
|
-#define RESET_SA_RESTORER(act, kact) \
|
|
- (act)->sa_restorer = (kact)->sa_restorer
|
|
diff --git a/sysdeps/unix/sysv/linux/x86_64/sigaction.c b/sysdeps/unix/sysv/linux/x86_64/sigaction.c
|
|
index 4e6d9cc32e..9aa2c7f860 100644
|
|
--- a/sysdeps/unix/sysv/linux/x86_64/sigaction.c
|
|
+++ b/sysdeps/unix/sysv/linux/x86_64/sigaction.c
|
|
@@ -18,7 +18,6 @@
|
|
|
|
#include <signal.h>
|
|
#define SA_RESTORER 0x04000000
|
|
-#include <kernel_sigaction.h>
|
|
|
|
extern void restore_rt (void) asm ("__restore_rt") attribute_hidden;
|
|
|
|
@@ -29,6 +28,8 @@ extern void restore_rt (void) asm ("__restore_rt") attribute_hidden;
|
|
#define RESET_SA_RESTORER(act, kact) \
|
|
(act)->sa_restorer = (kact)->sa_restorer
|
|
|
|
+#include <kernel_sigaction.h>
|
|
+
|
|
#include <sysdeps/unix/sysv/linux/sigaction.c>
|
|
|
|
/* NOTE: Please think twice before making any changes to the bits of
|
|
|