1 1.10 wiz /* $NetBSD: netbsd32_compat_16.c,v 1.10 2025/02/28 18:35:44 wiz Exp $ */ 2 1.2 pgoyette 3 1.2 pgoyette /*- 4 1.2 pgoyette * Copyright (c) 2008 The NetBSD Foundation, Inc. 5 1.2 pgoyette * All rights reserved. 6 1.2 pgoyette * 7 1.2 pgoyette * This code is derived from software contributed to The NetBSD Foundation 8 1.2 pgoyette * by Christos Zoulas. 9 1.2 pgoyette * 10 1.2 pgoyette * Redistribution and use in source and binary forms, with or without 11 1.2 pgoyette * modification, are permitted provided that the following conditions 12 1.2 pgoyette * are met: 13 1.2 pgoyette * 1. Redistributions of source code must retain the above copyright 14 1.2 pgoyette * notice, this list of conditions and the following disclaimer. 15 1.2 pgoyette * 2. Redistributions in binary form must reproduce the above copyright 16 1.2 pgoyette * notice, this list of conditions and the following disclaimer in the 17 1.2 pgoyette * documentation and/or other materials provided with the distribution. 18 1.2 pgoyette * 19 1.2 pgoyette * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.2 pgoyette * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.2 pgoyette * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.2 pgoyette * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.2 pgoyette * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.2 pgoyette * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.2 pgoyette * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.2 pgoyette * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.2 pgoyette * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.2 pgoyette * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.2 pgoyette * POSSIBILITY OF SUCH DAMAGE. 30 1.2 pgoyette */ 31 1.2 pgoyette #include <sys/cdefs.h> 32 1.10 wiz __KERNEL_RCSID(0, "$NetBSD: netbsd32_compat_16.c,v 1.10 2025/02/28 18:35:44 wiz Exp $"); 33 1.2 pgoyette 34 1.2 pgoyette #include <sys/param.h> 35 1.2 pgoyette #include <sys/systm.h> 36 1.2 pgoyette #include <sys/module.h> 37 1.2 pgoyette #include <sys/dirent.h> 38 1.4 ryo #include <sys/exec.h> 39 1.5 mlelstv #include <sys/proc.h> 40 1.2 pgoyette #include <sys/lwp.h> 41 1.2 pgoyette #include <sys/syscallargs.h> 42 1.2 pgoyette #include <sys/syscallvar.h> 43 1.2 pgoyette 44 1.2 pgoyette #include <compat/netbsd32/netbsd32.h> 45 1.2 pgoyette #include <compat/netbsd32/netbsd32_syscall.h> 46 1.2 pgoyette #include <compat/netbsd32/netbsd32_syscallargs.h> 47 1.2 pgoyette #include <compat/netbsd32/netbsd32_conv.h> 48 1.2 pgoyette 49 1.2 pgoyette struct uvm_object *emul_netbsd32_object; 50 1.2 pgoyette 51 1.10 wiz #if defined(__amd64__) || defined(__arm__) || defined(__mips__) || defined(__sparc64__) 52 1.7 mlelstv #define __HAVE_MD_NETBSD32_SIGRETURN14 53 1.7 mlelstv #endif 54 1.7 mlelstv 55 1.9 christos #if defined(__amd64__) || defined(__arm__) || defined(__mips__) || defined(__powerpc__) || defined(__riscv__) 56 1.7 mlelstv #define __HAVE_MD_NETBSD32_SIGCODE 57 1.7 mlelstv #endif 58 1.7 mlelstv 59 1.7 mlelstv 60 1.7 mlelstv #ifdef __HAVE_MD_NETBSD32_SIGRETURN14 61 1.5 mlelstv static const struct syscall_package netbsd32_kern_sig_16_syscalls[] = { 62 1.7 mlelstv /* compat_16_netbsd32___sigreturn14 is in MD code! */ 63 1.5 mlelstv { NETBSD32_SYS_compat_16_netbsd32___sigreturn14, 0, 64 1.5 mlelstv (sy_call_t *)compat_16_netbsd32___sigreturn14 }, 65 1.5 mlelstv { 0, 0, NULL } 66 1.5 mlelstv }; 67 1.7 mlelstv #endif 68 1.5 mlelstv 69 1.5 mlelstv static int 70 1.5 mlelstv compat_netbsd32_16_init(void) 71 1.5 mlelstv { 72 1.7 mlelstv #if defined(__HAVE_MD_NETBSD32_SIGRETURN14) || defined(__HAVE_MD_NETBSD32_SIGCODE) 73 1.5 mlelstv int error; 74 1.7 mlelstv #endif 75 1.5 mlelstv 76 1.7 mlelstv #ifdef __HAVE_MD_NETBSD32_SIGRETURN14 77 1.6 riastrad error = syscall_establish(&emul_netbsd32, 78 1.6 riastrad netbsd32_kern_sig_16_syscalls); 79 1.5 mlelstv if (error) 80 1.5 mlelstv return error; 81 1.7 mlelstv #endif 82 1.5 mlelstv 83 1.7 mlelstv #ifdef __HAVE_MD_NETBSD32_SIGCODE 84 1.5 mlelstv rw_enter(&exec_lock, RW_WRITER); 85 1.5 mlelstv emul_netbsd32.e_sigcode = netbsd32_sigcode; 86 1.5 mlelstv emul_netbsd32.e_esigcode = netbsd32_esigcode; 87 1.5 mlelstv emul_netbsd32.e_sigobject = &emul_netbsd32_object; 88 1.5 mlelstv error = exec_sigcode_alloc(&emul_netbsd); 89 1.5 mlelstv if (error) { 90 1.5 mlelstv emul_netbsd32.e_sigcode = NULL; 91 1.5 mlelstv emul_netbsd32.e_esigcode = NULL; 92 1.5 mlelstv emul_netbsd32.e_sigobject = NULL; 93 1.5 mlelstv } 94 1.5 mlelstv rw_exit(&exec_lock); 95 1.5 mlelstv if (error) 96 1.5 mlelstv return error; 97 1.5 mlelstv netbsd32_machdep_md_16_init(); 98 1.7 mlelstv #endif 99 1.5 mlelstv return 0; 100 1.5 mlelstv } 101 1.5 mlelstv 102 1.5 mlelstv static int 103 1.5 mlelstv compat_netbsd32_16_fini(void) 104 1.5 mlelstv { 105 1.7 mlelstv #if defined(__HAVE_MD_NETBSD32_SIGRETURN14) 106 1.5 mlelstv proc_t *p; 107 1.5 mlelstv int error; 108 1.7 mlelstv #endif 109 1.5 mlelstv 110 1.7 mlelstv #ifdef __HAVE_MD_NETBSD32_SIGRETURN14 111 1.6 riastrad error = syscall_disestablish(&emul_netbsd32, 112 1.6 riastrad netbsd32_kern_sig_16_syscalls); 113 1.6 riastrad if (error) 114 1.6 riastrad return error; 115 1.6 riastrad /* 116 1.6 riastrad * Ensure sendsig_sigcontext() is not being used. 117 1.6 riastrad * module_lock prevents the flag being set on any 118 1.6 riastrad * further processes while we are here. See 119 1.6 riastrad * sigaction1() for the opposing half. 120 1.6 riastrad */ 121 1.6 riastrad mutex_enter(&proc_lock); 122 1.6 riastrad PROCLIST_FOREACH(p, &allproc) { 123 1.6 riastrad if ((p->p_lflag & PL_SIGCOMPAT) != 0) { 124 1.6 riastrad break; 125 1.6 riastrad } 126 1.6 riastrad } 127 1.6 riastrad mutex_exit(&proc_lock); 128 1.6 riastrad if (p != NULL) { 129 1.6 riastrad syscall_establish(&emul_netbsd32, 130 1.6 riastrad netbsd32_kern_sig_16_syscalls); 131 1.6 riastrad return EBUSY; 132 1.6 riastrad } 133 1.7 mlelstv #endif 134 1.5 mlelstv 135 1.7 mlelstv #ifdef __HAVE_MD_NETBSD32_SIGCODE 136 1.5 mlelstv rw_enter(&exec_lock, RW_WRITER); 137 1.5 mlelstv exec_sigcode_free(&emul_netbsd); 138 1.5 mlelstv emul_netbsd32.e_sigcode = NULL; 139 1.6 riastrad emul_netbsd32.e_esigcode = NULL; 140 1.6 riastrad emul_netbsd32.e_sigobject = NULL; 141 1.5 mlelstv rw_exit(&exec_lock); 142 1.5 mlelstv netbsd32_machdep_md_16_fini(); 143 1.7 mlelstv #endif 144 1.5 mlelstv return 0; 145 1.5 mlelstv } 146 1.5 mlelstv 147 1.2 pgoyette MODULE(MODULE_CLASS_EXEC, compat_netbsd32_16, "compat_netbsd32_20,compat_16"); 148 1.2 pgoyette 149 1.2 pgoyette static int 150 1.2 pgoyette compat_netbsd32_16_modcmd(modcmd_t cmd, void *arg) 151 1.2 pgoyette { 152 1.2 pgoyette switch (cmd) { 153 1.2 pgoyette case MODULE_CMD_INIT: 154 1.5 mlelstv return compat_netbsd32_16_init(); 155 1.2 pgoyette 156 1.2 pgoyette case MODULE_CMD_FINI: 157 1.5 mlelstv return compat_netbsd32_16_fini(); 158 1.2 pgoyette 159 1.2 pgoyette default: 160 1.2 pgoyette return ENOTTY; 161 1.2 pgoyette } 162 1.2 pgoyette } 163