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 */

Reply via email to