Module Name: src
Committed By: thorpej
Date: Wed Oct 27 04:10:48 UTC 2021
Modified Files:
src/sys/arch/vax/include: signal.h
src/sys/sys: signal.h
Log Message:
Centrally define constants that define the signal return trampoline
versioning scheme, and add a big block comment describing how it works.
To generate a diff of this commit:
cvs rdiff -u -r1.19 -r1.20 src/sys/arch/vax/include/signal.h
cvs rdiff -u -r1.72 -r1.73 src/sys/sys/signal.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/vax/include/signal.h
diff -u src/sys/arch/vax/include/signal.h:1.19 src/sys/arch/vax/include/signal.h:1.20
--- src/sys/arch/vax/include/signal.h:1.19 Wed Oct 27 01:13:22 2021
+++ src/sys/arch/vax/include/signal.h Wed Oct 27 04:10:48 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: signal.h,v 1.19 2021/10/27 01:13:22 thorpej Exp $ */
+/* $NetBSD: signal.h,v 1.20 2021/10/27 04:10:48 thorpej Exp $ */
/*
* Copyright (c) 1982, 1986, 1989, 1991 Regents of the University of California.
@@ -40,6 +40,9 @@
#include <sys/siginfo.h>
#include <machine/trap.h>
+/* VAX versioned its sigcontext trampoline ABI (Sept 2002). */
+#define __SIGTRAMP_SIGCONTEXT_VERSION_MAX 2
+
typedef int sig_atomic_t;
#if defined(_NETBSD_SOURCE)
Index: src/sys/sys/signal.h
diff -u src/sys/sys/signal.h:1.72 src/sys/sys/signal.h:1.73
--- src/sys/sys/signal.h:1.72 Fri Apr 21 15:10:35 2017
+++ src/sys/sys/signal.h Wed Oct 27 04:10:47 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: signal.h,v 1.72 2017/04/21 15:10:35 christos Exp $ */
+/* $NetBSD: signal.h,v 1.73 2021/10/27 04:10:47 thorpej Exp $ */
/*
* Copyright (c) 1982, 1986, 1989, 1991, 1993
@@ -138,8 +138,80 @@ struct sigaction {
#define sa_sigaction _sa_u._sa_sigaction
#endif
+/*
+ * Signal return trampoline versioning:
+ *
+ * In historical BSD, the kernel provided the signal trampoline, copying
+ * it out to the process's stack. In NetBSD 2.0, the signal trampoline
+ * was moved into libc, and versioned in order to support the historical
+ * BSD "sigcontext" style of handler in addition to the modern "siginfo"
+ * style of handler. The trampoline and its ABI version are registered
+ * with the kernel along with the handlers.
+ *
+ * The versioning follows this general pattern:
+ *
+ * 0 Historical BSD style, trampoline provided by the kernel. This is
+ * now used only by COMPAT_* modules.
+ *
+ * 1 Legacy BSD "sigcontext" trampoline. This style is deprecated and
+ * no longer documented. However, on platforms that have a legacy
+ * "sigcontext" structure, it is still possible to register a handler
+ * that uses this trampoline.
+ *
+ * 2 Modern "siginfo" trampoline. This style is used if a handler
+ * explicitly requests "siginfo", or if the deprecation of "sigcontext"
+ * style handlers pre-dates support for the platform.
+ *
+ * Some architectures have, in the past, needed to version the "sigcontext"
+ * trampoline; an override mechanism (__SIGTRAMP_SIGCONTEXT_VERSION_MAX) is
+ * provided for this purpose. No more changes to the old "sigcontext"
+ * trampoline ABI will ever be performed, and support for it should not be
+ * included when adding support for new architectures. Those architectures
+ * that support the "sigcontext" trampoline must define
+ * __HAVE_STRUCT_SIGCONTEXT in <machine/signal.h>. If a 64-bit architecture
+ * needs to support "sigcontext" trampolines only for 32-bit compatibility,
+ * then __HAVE_STRUCT_SIGCONTEXT can be conditional on _KERNEL.
+ *
+ * If an architecture defines a sigcontext structure in <machine/signal.h>,
+ * it should be visible only for _KERNEL and _LIBC.
+ *
+ * In the unlikely event that an an architecture needs to version
+ * the "siginfo" trampoline, it can achieve this by overriding
+ * __SIGTRAMP_SIGINFO_VERSION_MAX.
+ */
+
#include <machine/signal.h> /* sigcontext; codes for SIGILL, SIGFPE */
+#define __SIGTRAMP_SIGCODE_VERSION 0
+
+#define __SIGTRAMP_SIGCONTEXT_VERSION_MIN 1
+
+#ifndef __SIGTRAMP_SIGCONTEXT_VERSION_MAX
+#define __SIGTRAMP_SIGCONTEXT_VERSION_MAX __SIGTRAMP_SIGCONTEXT_VERSION_MIN
+#endif
+
+#if __SIGTRAMP_SIGCONTEXT_VERSION_MAX < __SIGTRAMP_SIGCONTEXT_VERSION_MIN
+#error invalid __SIGTRAMP_SIGCONTEXT_VERSION_MAX
+#endif
+
+#define __SIGTRAMP_SIGINFO_VERSION_MIN (__SIGTRAMP_SIGCONTEXT_VERSION_MAX + 1)
+
+#ifndef __SIGTRAMP_SIGINFO_VERSION_MAX
+#define __SIGTRAMP_SIGINFO_VERSION_MAX __SIGTRAMP_SIGINFO_VERSION_MIN
+#endif
+
+#if __SIGTRAMP_SIGINFO_VERSION_MAX < __SIGTRAMP_SIGINFO_VERSION_MIN
+#error invalid __SIGTRAMP_SIGINFO_VERSION_MAX
+#endif
+
+#ifndef __SIGTRAMP_SIGCONTEXT_VERSION
+#define __SIGTRAMP_SIGCONTEXT_VERSION __SIGTRAMP_SIGCONTEXT_VERSION_MAX
+#endif
+
+#ifndef __SIGTRAMP_SIGINFO_VERSION
+#define __SIGTRAMP_SIGINFO_VERSION __SIGTRAMP_SIGINFO_VERSION_MAX
+#endif
+
#if (defined(_XOPEN_SOURCE) && defined(_XOPEN_SOURCE_EXTENDED)) || \
(_XOPEN_SOURCE - 0) >= 500 || defined(_NETBSD_SOURCE)
#define SA_ONSTACK 0x0001 /* take signal on signal stack */