Module Name: src
Committed By: thorpej
Date: Sat Nov 6 20:42:57 UTC 2021
Modified Files:
src/sys/arch/aarch64/aarch64: netbsd32_machdep.c
src/sys/arch/amd64/amd64: netbsd32_machdep.c netbsd32_machdep_16.c
src/sys/arch/arm/include: netbsd32_machdep.h
src/sys/arch/mips/mips: netbsd32_machdep.c netbsd32_machdep_16.c
src/sys/arch/sparc64/sparc64: netbsd32_machdep.c netbsd32_machdep_16.c
src/sys/compat/netbsd32: netbsd32.h netbsd32_exec.h netbsd32_signal.c
Log Message:
COMPAT_NETBSD32 is all about running the 32-bit flavor of native
binaries on a 64-bit platform[*], as such:
- Make the logic about which "sendsig" flavor to call MI (as it is in the
native 64-bit environment) and follow the same rules as the native 32-bit
environment.
- Make COMPAT_NETBSD32 x COMPAT_16 work the same as it would in the
native 32-bit environment by providing a netbsd32_sendsig_sigcontext_16_hook,
rather than overriding the entire sendsig logic with a netbsd32_sendsig_hook.
- In netbsd32___sigaction_sigtramp(), make sure the compat_netbsd32_16
module is loaded if the trampoline version specifies a sigcontext style
handler, otherwise return EINVAL so that libc can try again with siginfo
style.
[*] ...except for arm32, which uses it to mean "run 32-bit OABI binaries
from the 32-bit EABI environment". Doing it this way was arguably a mistake,
but we are stuck with it for now, so support it by providing a machine-
dependent override for netbsd32_sendsig() that also disables the corresponding
logic in netbsd32___sigaction_sigtramp().
Fixes PR kern/56487.
To generate a diff of this commit:
cvs rdiff -u -r1.21 -r1.22 src/sys/arch/aarch64/aarch64/netbsd32_machdep.c
cvs rdiff -u -r1.139 -r1.140 src/sys/arch/amd64/amd64/netbsd32_machdep.c
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/amd64/amd64/netbsd32_machdep_16.c
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/include/netbsd32_machdep.h
cvs rdiff -u -r1.22 -r1.23 src/sys/arch/mips/mips/netbsd32_machdep.c
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/mips/mips/netbsd32_machdep_16.c
cvs rdiff -u -r1.116 -r1.117 src/sys/arch/sparc64/sparc64/netbsd32_machdep.c
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/sparc64/sparc64/netbsd32_machdep_16.c
cvs rdiff -u -r1.137 -r1.138 src/sys/compat/netbsd32/netbsd32.h
cvs rdiff -u -r1.36 -r1.37 src/sys/compat/netbsd32/netbsd32_exec.h
cvs rdiff -u -r1.52 -r1.53 src/sys/compat/netbsd32/netbsd32_signal.c
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/aarch64/aarch64/netbsd32_machdep.c
diff -u src/sys/arch/aarch64/aarch64/netbsd32_machdep.c:1.21 src/sys/arch/aarch64/aarch64/netbsd32_machdep.c:1.22
--- src/sys/arch/aarch64/aarch64/netbsd32_machdep.c:1.21 Mon Nov 1 05:07:15 2021
+++ src/sys/arch/aarch64/aarch64/netbsd32_machdep.c Sat Nov 6 20:42:56 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: netbsd32_machdep.c,v 1.21 2021/11/01 05:07:15 thorpej Exp $ */
+/* $NetBSD: netbsd32_machdep.c,v 1.22 2021/11/06 20:42:56 thorpej Exp $ */
/*
* Copyright (c) 2018 Ryo Shimizu <[email protected]>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_machdep.c,v 1.21 2021/11/01 05:07:15 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_machdep.c,v 1.22 2021/11/06 20:42:56 thorpej Exp $");
#if defined(_KERNEL_OPT)
#include "opt_compat_netbsd.h"
@@ -300,7 +300,7 @@ cpu_coredump32(struct lwp *l, struct cor
return error;
}
-static void
+void
netbsd32_sendsig_siginfo(const ksiginfo_t *ksi, const sigset_t *mask)
{
struct lwp * const l = curlwp;
@@ -375,19 +375,6 @@ netbsd32_sendsig_siginfo(const ksiginfo_
}
void
-netbsd32_sendsig(const ksiginfo_t *ksi, const sigset_t *mask)
-{
-#ifdef COMPAT_16
-#error non EABI generation binaries are not supported
- if (curproc->p_sigacts->sa_sigdesc[ksi->ksi_signo].sd_vers <
- __SIGTRAMP_SIGINFO_VERSION)
- netbsd32_sendsig_sigcontext(ksi, mask);
- else
-#endif
- netbsd32_sendsig_siginfo(ksi, mask);
-}
-
-void
startlwp32(void *arg)
{
ucontext32_t *uc = arg;
Index: src/sys/arch/amd64/amd64/netbsd32_machdep.c
diff -u src/sys/arch/amd64/amd64/netbsd32_machdep.c:1.139 src/sys/arch/amd64/amd64/netbsd32_machdep.c:1.140
--- src/sys/arch/amd64/amd64/netbsd32_machdep.c:1.139 Mon Nov 1 05:07:15 2021
+++ src/sys/arch/amd64/amd64/netbsd32_machdep.c Sat Nov 6 20:42:56 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: netbsd32_machdep.c,v 1.139 2021/11/01 05:07:15 thorpej Exp $ */
+/* $NetBSD: netbsd32_machdep.c,v 1.140 2021/11/06 20:42:56 thorpej Exp $ */
/*
* Copyright (c) 2001 Wasabi Systems, Inc.
@@ -36,7 +36,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_machdep.c,v 1.139 2021/11/01 05:07:15 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_machdep.c,v 1.140 2021/11/06 20:42:56 thorpej Exp $");
#ifdef _KERNEL_OPT
#include "opt_compat_netbsd.h"
@@ -109,7 +109,6 @@ static int x86_64_set_mtrr32(struct lwp
int check_sigcontext32(struct lwp *, const struct netbsd32_sigcontext *);
void netbsd32_buildcontext(struct lwp *, struct trapframe *, void *,
sig_t, int);
-int netbsd32_sendsig_siginfo(const ksiginfo_t *, const sigset_t *);
#ifdef EXEC_AOUT
/*
@@ -206,7 +205,7 @@ netbsd32_buildcontext(struct lwp *l, str
}
}
-int
+void
netbsd32_sendsig_siginfo(const ksiginfo_t *ksi, const sigset_t *mask)
{
struct lwp *l = curlwp;
@@ -274,18 +273,6 @@ netbsd32_sendsig_siginfo(const ksiginfo_
}
netbsd32_buildcontext(l, tf, fp, catcher, onstack);
-
- return 0;
-}
-
-struct netbsd32_sendsig_hook_t netbsd32_sendsig_hook;
-
-void
-netbsd32_sendsig(const ksiginfo_t *ksi, const sigset_t *mask)
-{
-
- MODULE_HOOK_CALL_VOID(netbsd32_sendsig_hook, (ksi, mask),
- netbsd32_sendsig_siginfo(ksi, mask));
}
/*
Index: src/sys/arch/amd64/amd64/netbsd32_machdep_16.c
diff -u src/sys/arch/amd64/amd64/netbsd32_machdep_16.c:1.6 src/sys/arch/amd64/amd64/netbsd32_machdep_16.c:1.7
--- src/sys/arch/amd64/amd64/netbsd32_machdep_16.c:1.6 Wed Oct 27 04:14:59 2021
+++ src/sys/arch/amd64/amd64/netbsd32_machdep_16.c Sat Nov 6 20:42:56 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: netbsd32_machdep_16.c,v 1.6 2021/10/27 04:14:59 thorpej Exp $ */
+/* $NetBSD: netbsd32_machdep_16.c,v 1.7 2021/11/06 20:42:56 thorpej Exp $ */
/*
* Copyright (c) 2001 Wasabi Systems, Inc.
@@ -36,7 +36,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_machdep_16.c,v 1.6 2021/10/27 04:14:59 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_machdep_16.c,v 1.7 2021/11/06 20:42:56 thorpej Exp $");
#ifdef _KERNEL_OPT
#include "opt_compat_netbsd.h"
@@ -79,14 +79,8 @@ __KERNEL_RCSID(0, "$NetBSD: netbsd32_mac
void netbsd32_buildcontext(struct lwp *, struct trapframe *, void *,
sig_t, int);
-void netbsd32_sendsig_siginfo(const ksiginfo_t *, const sigset_t *);
-
int check_sigcontext32(struct lwp *, const struct netbsd32_sigcontext *);
-void netbsd32_sendsig_16(const ksiginfo_t *, const sigset_t *);
-
-extern struct netbsd32_sendsig_hook_t netbsd32_sendsig_hook;
-
static void
netbsd32_sendsig_sigcontext(const ksiginfo_t *ksi, const sigset_t *mask)
{
@@ -176,16 +170,6 @@ netbsd32_sendsig_sigcontext(const ksigin
netbsd32_buildcontext(l, tf, fp, catcher, onstack);
}
-void
-netbsd32_sendsig_16(const ksiginfo_t *ksi, const sigset_t *mask)
-{
- if (curproc->p_sigacts->sa_sigdesc[ksi->ksi_signo].sd_vers <
- __SIGTRAMP_SIGINFO_VERSION)
- netbsd32_sendsig_sigcontext(ksi, mask);
- else
- netbsd32_sendsig_siginfo(ksi, mask);
-}
-
int
compat_16_netbsd32___sigreturn14(struct lwp *l,
const struct compat_16_netbsd32___sigreturn14_args *uap,
@@ -251,12 +235,13 @@ void
netbsd32_machdep_md_16_init(void)
{
- MODULE_HOOK_SET(netbsd32_sendsig_hook, netbsd32_sendsig_16);
+ MODULE_HOOK_SET(netbsd32_sendsig_sigcontext_16_hook,
+ netbsd32_sendsig_sigcontext);
}
void
netbsd32_machdep_md_16_fini(void)
{
- MODULE_HOOK_UNSET(netbsd32_sendsig_hook);
+ MODULE_HOOK_UNSET(netbsd32_sendsig_sigcontext_16_hook);
}
Index: src/sys/arch/arm/include/netbsd32_machdep.h
diff -u src/sys/arch/arm/include/netbsd32_machdep.h:1.3 src/sys/arch/arm/include/netbsd32_machdep.h:1.4
--- src/sys/arch/arm/include/netbsd32_machdep.h:1.3 Wed Oct 6 05:33:15 2021
+++ src/sys/arch/arm/include/netbsd32_machdep.h Sat Nov 6 20:42:56 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: netbsd32_machdep.h,v 1.3 2021/10/06 05:33:15 skrll Exp $ */
+/* $NetBSD: netbsd32_machdep.h,v 1.4 2021/11/06 20:42:56 thorpej Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -34,6 +34,10 @@
#include <sys/types.h>
+#ifdef __aarch64__
+#error You have wandered from the path of righteousness.
+#endif
+
#define NETBSD32_POINTER_TYPE uint32_t
typedef struct { NETBSD32_POINTER_TYPE i32; } netbsd32_pointer_t;
@@ -55,6 +59,12 @@ typedef netbsd32_pointer_t netbsd32_si
#define netbsd32_esigcode esigcode
/*
+ * Using the entirety of COMPAT_NETBSD32 to support the OABI was
+ * a gigantic mistake, but here we are.
+ */
+#define __HAVE_MD_NETBSD32_SENDSIG
+
+/*
* Note: syscall_intern and setregs do not care about COMPAT_NETBSD32.
*/
#define netbsd32_syscall_intern syscall_intern
Index: src/sys/arch/mips/mips/netbsd32_machdep.c
diff -u src/sys/arch/mips/mips/netbsd32_machdep.c:1.22 src/sys/arch/mips/mips/netbsd32_machdep.c:1.23
--- src/sys/arch/mips/mips/netbsd32_machdep.c:1.22 Wed Oct 27 04:15:00 2021
+++ src/sys/arch/mips/mips/netbsd32_machdep.c Sat Nov 6 20:42:56 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: netbsd32_machdep.c,v 1.22 2021/10/27 04:15:00 thorpej Exp $ */
+/* $NetBSD: netbsd32_machdep.c,v 1.23 2021/11/06 20:42:56 thorpej Exp $ */
/*-
* Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_machdep.c,v 1.22 2021/10/27 04:15:00 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_machdep.c,v 1.23 2021/11/06 20:42:56 thorpej Exp $");
#include "opt_compat_netbsd.h"
@@ -78,8 +78,6 @@ netbsd32_cpu_upcall
netbsd32_vm_default_addr
#endif
-int netbsd32_sendsig_siginfo(const ksiginfo_t *, const sigset_t *);
-
struct sigframe_siginfo32 {
siginfo32_t sf_si;
ucontext32_t sf_uc;
@@ -88,7 +86,7 @@ struct sigframe_siginfo32 {
/*
* Send a signal to process.
*/
-int
+void
netbsd32_sendsig_siginfo(const ksiginfo_t *ksi, const sigset_t *mask)
{
struct lwp * const l = curlwp;
@@ -160,8 +158,6 @@ netbsd32_sendsig_siginfo(const ksiginfo_
/* Remember that we're now on the signal stack. */
if (onstack)
l->l_sigstk.ss_flags |= SS_ONSTACK;
-
- return 0;
}
int
@@ -310,16 +306,6 @@ cpu_coredump32(struct lwp *l, struct cor
return error;
}
-struct netbsd32_sendsig_hook_t netbsd32_sendsig_hook;
-
-void
-netbsd32_sendsig(const ksiginfo_t *ksi, const sigset_t *mask)
-{
-
- MODULE_HOOK_CALL_VOID(netbsd32_sendsig_hook, (ksi, mask),
- netbsd32_sendsig_siginfo(ksi, mask));
-}
-
static const char *
netbsd32_machine32(void)
{
Index: src/sys/arch/mips/mips/netbsd32_machdep_16.c
diff -u src/sys/arch/mips/mips/netbsd32_machdep_16.c:1.6 src/sys/arch/mips/mips/netbsd32_machdep_16.c:1.7
--- src/sys/arch/mips/mips/netbsd32_machdep_16.c:1.6 Wed Oct 27 04:15:00 2021
+++ src/sys/arch/mips/mips/netbsd32_machdep_16.c Sat Nov 6 20:42:56 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: netbsd32_machdep_16.c,v 1.6 2021/10/27 04:15:00 thorpej Exp $ */
+/* $NetBSD: netbsd32_machdep_16.c,v 1.7 2021/11/06 20:42:56 thorpej Exp $ */
/*-
* Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_machdep_16.c,v 1.6 2021/10/27 04:15:00 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_machdep_16.c,v 1.7 2021/11/06 20:42:56 thorpej Exp $");
#include "opt_compat_netbsd.h"
@@ -66,12 +66,7 @@ __KERNEL_RCSID(0, "$NetBSD: netbsd32_mac
#include <uvm/uvm_extern.h>
-void netbsd32_sendsig_16(const ksiginfo_t *, const sigset_t *);
-
void sendsig_context(const ksiginfo_t *, const sigset_t *);
-int netbsd32_sendsig_siginfo(const ksiginfo_t *, const sigset_t *);
-
-extern struct netbsd32_sendsig_hook_t netbsd32_sendsig_hook;
int
compat_16_netbsd32___sigreturn14(struct lwp *l,
@@ -85,26 +80,17 @@ compat_16_netbsd32___sigreturn14(struct
return compat_16_sys___sigreturn14(l, &ua, retval);
}
-void
-netbsd32_sendsig_16(const ksiginfo_t *ksi, const sigset_t *mask)
-{
- if (curproc->p_sigacts->sa_sigdesc[ksi->ksi_signo].sd_vers <
- __SIGTRAMP_SIGINFO_VERSION)
- sendsig_sigcontext(ksi, mask);
- else
- netbsd32_sendsig_siginfo(ksi, mask);
-}
-
void
netbsd32_machdep_md_16_init(void)
{
- MODULE_HOOK_SET(netbsd32_sendsig_hook, netbsd32_sendsig_16);
+ MODULE_HOOK_SET(netbsd32_sendsig_sigcontext_16_hook,
+ sendsig_sigcontext);
}
void
netbsd32_machdep_md_16_fini(void)
{
- MODULE_HOOK_UNSET(netbsd32_sendsig_hook);
+ MODULE_HOOK_UNSET(netbsd32_sendsig_sigcontext_16_hook);
}
Index: src/sys/arch/sparc64/sparc64/netbsd32_machdep.c
diff -u src/sys/arch/sparc64/sparc64/netbsd32_machdep.c:1.116 src/sys/arch/sparc64/sparc64/netbsd32_machdep.c:1.117
--- src/sys/arch/sparc64/sparc64/netbsd32_machdep.c:1.116 Wed Oct 27 04:15:00 2021
+++ src/sys/arch/sparc64/sparc64/netbsd32_machdep.c Sat Nov 6 20:42:56 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: netbsd32_machdep.c,v 1.116 2021/10/27 04:15:00 thorpej Exp $ */
+/* $NetBSD: netbsd32_machdep.c,v 1.117 2021/11/06 20:42:56 thorpej Exp $ */
/*
* Copyright (c) 1998, 2001 Matthew R. Green
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_machdep.c,v 1.116 2021/10/27 04:15:00 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_machdep.c,v 1.117 2021/11/06 20:42:56 thorpej Exp $");
#ifdef _KERNEL_OPT
#include "opt_compat_netbsd.h"
@@ -89,8 +89,6 @@ __KERNEL_RCSID(0, "$NetBSD: netbsd32_mac
const char machine32[] = "sparc";
const char machine_arch32[] = "sparc";
-int netbsd32_sendsig_siginfo(const ksiginfo_t *, const sigset_t *);
-
#if NFIRM_EVENTS > 0
static int ev_out32(struct firm_event *, int, struct uio *);
#endif
@@ -158,7 +156,7 @@ struct sparc32_sigframe_siginfo {
ucontext32_t sf_uc;
};
-int
+void
netbsd32_sendsig_siginfo(const ksiginfo_t *ksi, const sigset_t *mask)
{
struct lwp *l = curlwp;
@@ -256,18 +254,6 @@ netbsd32_sendsig_siginfo(const ksiginfo_
/* Remember that we're now on the signal stack. */
if (onstack)
l->l_sigstk.ss_flags |= SS_ONSTACK;
-
- return 0;
-}
-
-struct netbsd32_sendsig_hook_t netbsd32_sendsig_hook;
-
-void
-netbsd32_sendsig(const ksiginfo_t *ksi, const sigset_t *mask)
-{
-
- MODULE_HOOK_CALL_VOID(netbsd32_sendsig_hook, (ksi, mask),
- netbsd32_sendsig_siginfo(ksi, mask));
}
#undef DEBUG
Index: src/sys/arch/sparc64/sparc64/netbsd32_machdep_16.c
diff -u src/sys/arch/sparc64/sparc64/netbsd32_machdep_16.c:1.5 src/sys/arch/sparc64/sparc64/netbsd32_machdep_16.c:1.6
--- src/sys/arch/sparc64/sparc64/netbsd32_machdep_16.c:1.5 Wed Oct 27 04:15:00 2021
+++ src/sys/arch/sparc64/sparc64/netbsd32_machdep_16.c Sat Nov 6 20:42:56 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: netbsd32_machdep_16.c,v 1.5 2021/10/27 04:15:00 thorpej Exp $ */
+/* $NetBSD: netbsd32_machdep_16.c,v 1.6 2021/11/06 20:42:56 thorpej Exp $ */
/*
* Copyright (c) 1998, 2001 Matthew R. Green
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_machdep_16.c,v 1.5 2021/10/27 04:15:00 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_machdep_16.c,v 1.6 2021/11/06 20:42:56 thorpej Exp $");
#ifdef _KERNEL_OPT
#include "opt_compat_netbsd.h"
@@ -83,10 +83,6 @@ __KERNEL_RCSID(0, "$NetBSD: netbsd32_mac
#include <machine/netbsd32_machdep.h>
#include <machine/userret.h>
-void netbsd32_sendsig_siginfo(const ksiginfo_t *, const sigset_t *);
-
-void netbsd32_sendsig_16(const ksiginfo_t *, const sigset_t *);
-
/*
* NB: since this is a 32-bit address world, sf_scp and sf_sc
* can't be a pointer since those are 64-bits wide.
@@ -99,8 +95,6 @@ struct sparc32_sigframe {
struct netbsd32_sigcontext sf_sc; /* actual sigcontext */
};
-extern struct netbsd32_sendsig_hook_t netbsd32_sendsig_hook;
-
#undef DEBUG
#ifdef DEBUG
extern int sigdebug;
@@ -245,16 +239,6 @@ struct sparc32_sigframe_siginfo {
ucontext32_t sf_uc;
};
-void
-netbsd32_sendsig_16(const ksiginfo_t *ksi, const sigset_t *mask)
-{
- if (curproc->p_sigacts->sa_sigdesc[ksi->ksi_signo].sd_vers <
- __SIGTRAMP_SIGINFO_VERSION)
- netbsd32_sendsig_sigcontext(ksi, mask);
- else
- netbsd32_sendsig_siginfo(ksi, mask);
-}
-
#undef DEBUG
/*
@@ -353,12 +337,13 @@ void
netbsd32_machdep_md_16_init(void)
{
- MODULE_HOOK_SET(netbsd32_sendsig_hook, netbsd32_sendsig_16);
+ MODULE_HOOK_SET(netbsd32_sendsig_sigcontext_16_hook,
+ netbsd32_sendsig_sigcontext);
}
void
netbsd32_machdep_md_16_fini(void)
{
- MODULE_HOOK_UNSET(netbsd32_sendsig_hook);
+ MODULE_HOOK_UNSET(netbsd32_sendsig_sigcontext_16_hook);
}
Index: src/sys/compat/netbsd32/netbsd32.h
diff -u src/sys/compat/netbsd32/netbsd32.h:1.137 src/sys/compat/netbsd32/netbsd32.h:1.138
--- src/sys/compat/netbsd32/netbsd32.h:1.137 Tue Jan 19 03:41:22 2021
+++ src/sys/compat/netbsd32/netbsd32.h Sat Nov 6 20:42:56 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: netbsd32.h,v 1.137 2021/01/19 03:41:22 simonb Exp $ */
+/* $NetBSD: netbsd32.h,v 1.138 2021/11/06 20:42:56 thorpej Exp $ */
/*
* Copyright (c) 1998, 2001, 2008, 2015 Matthew R. Green
@@ -1250,8 +1250,10 @@ struct iovec *netbsd32_get_iov(struct ne
SYSCTL_SETUP_PROTO(netbsd32_sysctl_emul_setup);
#endif /* SYSCTL_SETUP_PROTO */
-MODULE_HOOK(netbsd32_sendsig_hook, void,
- (const ksiginfo_t *, const sigset_t *));
+#ifdef __HAVE_STRUCT_SIGCONTEXT
+MODULE_HOOK(netbsd32_sendsig_sigcontext_16_hook, void,
+ (const struct ksiginfo *, const sigset_t *));
+#endif
extern struct sysent netbsd32_sysent[];
extern const uint32_t netbsd32_sysent_nomodbits[];
Index: src/sys/compat/netbsd32/netbsd32_exec.h
diff -u src/sys/compat/netbsd32/netbsd32_exec.h:1.36 src/sys/compat/netbsd32/netbsd32_exec.h:1.37
--- src/sys/compat/netbsd32/netbsd32_exec.h:1.36 Tue Jan 19 02:40:07 2021
+++ src/sys/compat/netbsd32/netbsd32_exec.h Sat Nov 6 20:42:56 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: netbsd32_exec.h,v 1.36 2021/01/19 02:40:07 simonb Exp $ */
+/* $NetBSD: netbsd32_exec.h,v 1.37 2021/11/06 20:42:56 thorpej Exp $ */
/*
* Copyright (c) 1998, 2001 Matthew R. Green
@@ -73,6 +73,7 @@ static __inline int netbsd32_copyargs(st
void netbsd32_setregs(struct lwp *, struct exec_package *, vaddr_t stack);
int netbsd32_sigreturn(struct proc *, void *, register_t *);
void netbsd32_sendsig(const ksiginfo_t *, const sigset_t *);
+void netbsd32_sendsig_siginfo(const ksiginfo_t *, const sigset_t *);
extern char netbsd32_esigcode[], netbsd32_sigcode[];
Index: src/sys/compat/netbsd32/netbsd32_signal.c
diff -u src/sys/compat/netbsd32/netbsd32_signal.c:1.52 src/sys/compat/netbsd32/netbsd32_signal.c:1.53
--- src/sys/compat/netbsd32/netbsd32_signal.c:1.52 Tue Sep 7 11:43:05 2021
+++ src/sys/compat/netbsd32/netbsd32_signal.c Sat Nov 6 20:42:56 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: netbsd32_signal.c,v 1.52 2021/09/07 11:43:05 riastradh Exp $ */
+/* $NetBSD: netbsd32_signal.c,v 1.53 2021/11/06 20:42:56 thorpej Exp $ */
/*
* Copyright (c) 1998, 2001 Matthew R. Green
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_signal.c,v 1.52 2021/09/07 11:43:05 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_signal.c,v 1.53 2021/11/06 20:42:56 thorpej Exp $");
#if defined(_KERNEL_OPT)
#include "opt_ktrace.h"
@@ -43,11 +43,14 @@ __KERNEL_RCSID(0, "$NetBSD: netbsd32_sig
#include <sys/proc.h>
#include <sys/wait.h>
#include <sys/dirent.h>
+#include <sys/module.h>
+#include <sys/exec.h>
#include <uvm/uvm_extern.h>
#include <compat/netbsd32/netbsd32.h>
#include <compat/netbsd32/netbsd32_conv.h>
+#include <compat/netbsd32/netbsd32_exec.h>
#include <compat/netbsd32/netbsd32_syscallargs.h>
#include <compat/sys/signal.h>
@@ -160,7 +163,7 @@ netbsd32___sigaction_sigtramp(struct lwp
} */
struct netbsd32_sigaction sa32;
struct sigaction nsa, osa;
- int error;
+ int error, vers;
if (SCARG_P32(uap, nsa)) {
error = copyin(SCARG_P32(uap, nsa), &sa32, sizeof(sa32));
@@ -170,10 +173,53 @@ netbsd32___sigaction_sigtramp(struct lwp
nsa.sa_mask = sa32.netbsd32_sa_mask;
nsa.sa_flags = sa32.netbsd32_sa_flags;
}
+ vers = SCARG(uap, vers);
+#ifndef __HAVE_MD_NETBSD32_SENDSIG /* XXX paying for yesterday's sins */
+ if (vers < __SIGTRAMP_SIGINFO_VERSION_MIN) {
+ /*
+ * sigaction1() doesn't enforce sigcontext-ness for
+ * __SIGTRAMP_SIGCODE_VERSION because it might be
+ * a foreign emulation. However, we know these are
+ * native NetBSD 32-bit binaries, so we do.
+ */
+#ifdef __HAVE_STRUCT_SIGCONTEXT
+ struct proc *p = l->l_proc;
+ bool sigcontext_valid = false;
+
+ /*
+ * We need to ensure the compat_netbsd32_16 module
+ * is loaded, because sigaction1() gives a free pass
+ * to processes marked PK_32 (it can't be sure which
+ * 32-bit compat module is needed).
+ */
+ if ((p->p_lflag & PL_SIGCOMPAT) == 0) {
+ kernconfig_lock();
+ (void)module_autoload("compat_netbsd32_16",
+ MODULE_CLASS_ANY);
+ if (netbsd32_sendsig_sigcontext_16_hook.hooked) {
+ sigcontext_valid = true;
+ }
+ mutex_enter(&proc_lock);
+ /*
+ * Prevent unload of compat module while
+ * this process remains.
+ */
+ p->p_lflag |= PL_SIGCOMPAT;
+ mutex_exit(&proc_lock);
+ kernconfig_unlock();
+ }
+ if (!sigcontext_valid) {
+ return EINVAL;
+ }
+#else /* ! __HAVE_STRUCT_SIGCONTEXT */
+ return EINVAL;
+#endif /* __HAVE_STRUCT_SIGCONTEXT */
+ }
+#endif /* __HAVE_MD_NETBSD32_SENDSIG */
error = sigaction1(l, SCARG(uap, signum),
SCARG_P32(uap, nsa) ? &nsa : 0,
SCARG_P32(uap, osa) ? &osa : 0,
- SCARG_P32(uap, tramp), SCARG(uap, vers));
+ SCARG_P32(uap, tramp), vers);
if (error)
return error;
if (SCARG_P32(uap, osa)) {
@@ -188,6 +234,43 @@ netbsd32___sigaction_sigtramp(struct lwp
return 0;
}
+#ifndef __HAVE_MD_NETBSD32_SENDSIG /* XXX paying for yesterday's sins */
+#ifdef __HAVE_STRUCT_SIGCONTEXT
+struct netbsd32_sendsig_sigcontext_16_hook_t netbsd32_sendsig_sigcontext_16_hook;
+#endif
+
+void
+netbsd32_sendsig(const struct ksiginfo *ksi, const sigset_t *mask)
+{
+ struct sigacts *sa;
+ int sig;
+
+ sig = ksi->ksi_signo;
+ sa = curproc->p_sigacts;
+
+ switch (sa->sa_sigdesc[sig].sd_vers) {
+#ifdef __HAVE_STRUCT_SIGCONTEXT
+ case __SIGTRAMP_SIGCODE_VERSION:
+ case __SIGTRAMP_SIGCONTEXT_VERSION_MIN ...
+ __SIGTRAMP_SIGCONTEXT_VERSION_MAX:
+ /* Compat for 1.6 and earlier. */
+ MODULE_HOOK_CALL_VOID(netbsd32_sendsig_sigcontext_16_hook,
+ (ksi, mask), break);
+ return;
+#endif /* __HAVE_STRUCT_SIGCONTEXT */
+ case __SIGTRAMP_SIGINFO_VERSION_MIN ...
+ __SIGTRAMP_SIGINFO_VERSION_MAX:
+ netbsd32_sendsig_siginfo(ksi, mask);
+ return;
+ default:
+ break;
+ }
+
+ printf("%s: bad version %d\n", __func__, sa->sa_sigdesc[sig].sd_vers);
+ sigexit(curlwp, SIGILL);
+}
+#endif /* __HAVE_MD_NETBSD32_SENDSIG */
+
void
netbsd32_ksi32_to_ksi(struct _ksiginfo *si, const struct __ksiginfo32 *si32)
{