| @@ -1,339 +1,340 @@ | | | @@ -1,339 +1,340 @@ |
1 | /* $NetBSD: compat_mod.c,v 1.14 2011/08/08 23:44:06 jakllsch Exp $ */ | | 1 | /* $NetBSD: compat_mod.c,v 1.15 2013/01/22 01:47:20 christos Exp $ */ |
2 | | | 2 | |
3 | /*- | | 3 | /*- |
4 | * Copyright (c) 2008 The NetBSD Foundation, Inc. | | 4 | * Copyright (c) 2008 The NetBSD Foundation, Inc. |
5 | * All rights reserved. | | 5 | * All rights reserved. |
6 | * | | 6 | * |
7 | * This code is derived from software developed for The NetBSD Foundation | | 7 | * This code is derived from software developed for The NetBSD Foundation |
8 | * by Andrew Doran. | | 8 | * by Andrew Doran. |
9 | * | | 9 | * |
10 | * Redistribution and use in source and binary forms, with or without | | 10 | * Redistribution and use in source and binary forms, with or without |
11 | * modification, are permitted provided that the following conditions | | 11 | * modification, are permitted provided that the following conditions |
12 | * are met: | | 12 | * are met: |
13 | * 1. Redistributions of source code must retain the above copyright | | 13 | * 1. Redistributions of source code must retain the above copyright |
14 | * notice, this list of conditions and the following disclaimer. | | 14 | * notice, this list of conditions and the following disclaimer. |
15 | * 2. Redistributions in binary form must reproduce the above copyright | | 15 | * 2. Redistributions in binary form must reproduce the above copyright |
16 | * notice, this list of conditions and the following disclaimer in the | | 16 | * notice, this list of conditions and the following disclaimer in the |
17 | * documentation and/or other materials provided with the distribution. | | 17 | * documentation and/or other materials provided with the distribution. |
18 | * | | 18 | * |
19 | * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS | | 19 | * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS |
20 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | | 20 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
21 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | | 21 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
22 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS | | 22 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS |
23 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | | 23 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
24 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | | 24 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
25 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | | 25 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
26 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | | 26 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
27 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | | 27 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
28 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | | 28 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
29 | * POSSIBILITY OF SUCH DAMAGE. | | 29 | * POSSIBILITY OF SUCH DAMAGE. |
30 | */ | | 30 | */ |
31 | | | 31 | |
32 | /* | | 32 | /* |
33 | * Linkage for the compat module: spaghetti. | | 33 | * Linkage for the compat module: spaghetti. |
34 | */ | | 34 | */ |
35 | | | 35 | |
36 | #include <sys/cdefs.h> | | 36 | #include <sys/cdefs.h> |
37 | __KERNEL_RCSID(0, "$NetBSD: compat_mod.c,v 1.14 2011/08/08 23:44:06 jakllsch Exp $"); | | 37 | __KERNEL_RCSID(0, "$NetBSD: compat_mod.c,v 1.15 2013/01/22 01:47:20 christos Exp $"); |
38 | | | 38 | |
39 | #ifdef _KERNEL_OPT | | 39 | #ifdef _KERNEL_OPT |
40 | #include "opt_compat_netbsd.h" | | 40 | #include "opt_compat_netbsd.h" |
41 | #include "opt_compat_43.h" | | 41 | #include "opt_compat_43.h" |
42 | #include "opt_ntp.h" | | 42 | #include "opt_ntp.h" |
43 | #include "opt_sysv.h" | | 43 | #include "opt_sysv.h" |
44 | #include "opt_lfs.h" | | 44 | #include "opt_lfs.h" |
45 | #endif | | 45 | #endif |
46 | | | 46 | |
47 | #include <sys/systm.h> | | 47 | #include <sys/systm.h> |
48 | #include <sys/module.h> | | 48 | #include <sys/module.h> |
49 | #include <sys/rwlock.h> | | 49 | #include <sys/rwlock.h> |
50 | #include <sys/tty.h> | | 50 | #include <sys/tty.h> |
51 | #include <sys/signalvar.h> | | 51 | #include <sys/signalvar.h> |
52 | #include <sys/syscall.h> | | 52 | #include <sys/syscall.h> |
53 | #include <sys/syscallargs.h> | | 53 | #include <sys/syscallargs.h> |
54 | #include <sys/syscallvar.h> | | 54 | #include <sys/syscallvar.h> |
55 | | | 55 | |
56 | #include <uvm/uvm_extern.h> | | 56 | #include <uvm/uvm_extern.h> |
57 | #include <uvm/uvm_object.h> | | 57 | #include <uvm/uvm_object.h> |
58 | | | 58 | |
59 | #include <compat/common/compat_util.h> | | 59 | #include <compat/common/compat_util.h> |
60 | | | 60 | |
61 | MODULE(MODULE_CLASS_MISC, compat, NULL); | | 61 | MODULE(MODULE_CLASS_MISC, compat, NULL); |
62 | | | 62 | |
63 | int ttcompat(struct tty *, u_long, void *, int, struct lwp *); | | 63 | int ttcompat(struct tty *, u_long, void *, int, struct lwp *); |
64 | | | 64 | |
65 | #ifdef COMPAT_16 | | 65 | #ifdef COMPAT_16 |
66 | #if !(defined(__amd64__) && !defined(COMPAT_NETBSD32)) | | 66 | #if !defined(__amd64__) || defined(COMPAT_NETBSD32) |
| | | 67 | #define COMPAT_SIGCONTEXT |
67 | extern char sigcode[], esigcode[]; | | 68 | extern char sigcode[], esigcode[]; |
68 | struct uvm_object *emul_netbsd_object; | | 69 | struct uvm_object *emul_netbsd_object; |
69 | #endif | | 70 | #endif |
70 | #endif | | 71 | #endif |
71 | | | 72 | |
72 | extern krwlock_t exec_lock; | | 73 | extern krwlock_t exec_lock; |
73 | extern krwlock_t ttcompat_lock; | | 74 | extern krwlock_t ttcompat_lock; |
74 | | | 75 | |
75 | static const struct syscall_package compat_syscalls[] = { | | 76 | static const struct syscall_package compat_syscalls[] = { |
76 | #if defined(COMPAT_43) | | 77 | #if defined(COMPAT_43) |
77 | { SYS_compat_43_fstat43, 0, (sy_call_t *)compat_43_sys_fstat }, | | 78 | { SYS_compat_43_fstat43, 0, (sy_call_t *)compat_43_sys_fstat }, |
78 | { SYS_compat_43_lstat43, 0, (sy_call_t *)compat_43_sys_lstat }, | | 79 | { SYS_compat_43_lstat43, 0, (sy_call_t *)compat_43_sys_lstat }, |
79 | { SYS_compat_43_oaccept, 0, (sy_call_t *)compat_43_sys_accept }, | | 80 | { SYS_compat_43_oaccept, 0, (sy_call_t *)compat_43_sys_accept }, |
80 | { SYS_compat_43_ocreat, 0, (sy_call_t *)compat_43_sys_creat }, | | 81 | { SYS_compat_43_ocreat, 0, (sy_call_t *)compat_43_sys_creat }, |
81 | { SYS_compat_43_oftruncate, 0, (sy_call_t *)compat_43_sys_ftruncate }, | | 82 | { SYS_compat_43_oftruncate, 0, (sy_call_t *)compat_43_sys_ftruncate }, |
82 | { SYS_compat_43_ogetdirentries, 0, (sy_call_t *)compat_43_sys_getdirentries }, | | 83 | { SYS_compat_43_ogetdirentries, 0, (sy_call_t *)compat_43_sys_getdirentries }, |
83 | { SYS_compat_43_ogetdtablesize, 0, (sy_call_t *)compat_43_sys_getdtablesize }, | | 84 | { SYS_compat_43_ogetdtablesize, 0, (sy_call_t *)compat_43_sys_getdtablesize }, |
84 | { SYS_compat_43_ogethostid, 0, (sy_call_t *)compat_43_sys_gethostid }, | | 85 | { SYS_compat_43_ogethostid, 0, (sy_call_t *)compat_43_sys_gethostid }, |
85 | { SYS_compat_43_ogethostname, 0, (sy_call_t *)compat_43_sys_gethostname }, | | 86 | { SYS_compat_43_ogethostname, 0, (sy_call_t *)compat_43_sys_gethostname }, |
86 | { SYS_compat_43_ogetkerninfo, 0, (sy_call_t *)compat_43_sys_getkerninfo }, | | 87 | { SYS_compat_43_ogetkerninfo, 0, (sy_call_t *)compat_43_sys_getkerninfo }, |
87 | { SYS_compat_43_ogetpagesize, 0, (sy_call_t *)compat_43_sys_getpagesize }, | | 88 | { SYS_compat_43_ogetpagesize, 0, (sy_call_t *)compat_43_sys_getpagesize }, |
88 | { SYS_compat_43_ogetpeername, 0, (sy_call_t *)compat_43_sys_getpeername }, | | 89 | { SYS_compat_43_ogetpeername, 0, (sy_call_t *)compat_43_sys_getpeername }, |
89 | { SYS_compat_43_ogetrlimit, 0, (sy_call_t *)compat_43_sys_getrlimit }, | | 90 | { SYS_compat_43_ogetrlimit, 0, (sy_call_t *)compat_43_sys_getrlimit }, |
90 | { SYS_compat_43_ogetsockname, 0, (sy_call_t *)compat_43_sys_getsockname }, | | 91 | { SYS_compat_43_ogetsockname, 0, (sy_call_t *)compat_43_sys_getsockname }, |
91 | { SYS_compat_43_okillpg, 0, (sy_call_t *)compat_43_sys_killpg }, | | 92 | { SYS_compat_43_okillpg, 0, (sy_call_t *)compat_43_sys_killpg }, |
92 | { SYS_compat_43_olseek, 0, (sy_call_t *)compat_43_sys_lseek }, | | 93 | { SYS_compat_43_olseek, 0, (sy_call_t *)compat_43_sys_lseek }, |
93 | { SYS_compat_43_ommap, 0, (sy_call_t *)compat_43_sys_mmap }, | | 94 | { SYS_compat_43_ommap, 0, (sy_call_t *)compat_43_sys_mmap }, |
94 | { SYS_compat_43_oquota, 0, (sy_call_t *)compat_43_sys_quota }, | | 95 | { SYS_compat_43_oquota, 0, (sy_call_t *)compat_43_sys_quota }, |
95 | { SYS_compat_43_orecv, 0, (sy_call_t *)compat_43_sys_recv }, | | 96 | { SYS_compat_43_orecv, 0, (sy_call_t *)compat_43_sys_recv }, |
96 | { SYS_compat_43_orecvfrom, 0, (sy_call_t *)compat_43_sys_recvfrom }, | | 97 | { SYS_compat_43_orecvfrom, 0, (sy_call_t *)compat_43_sys_recvfrom }, |
97 | { SYS_compat_43_orecvmsg, 0, (sy_call_t *)compat_43_sys_recvmsg }, | | 98 | { SYS_compat_43_orecvmsg, 0, (sy_call_t *)compat_43_sys_recvmsg }, |
98 | { SYS_compat_43_osend, 0, (sy_call_t *)compat_43_sys_send }, | | 99 | { SYS_compat_43_osend, 0, (sy_call_t *)compat_43_sys_send }, |
99 | { SYS_compat_43_osendmsg, 0, (sy_call_t *)compat_43_sys_sendmsg }, | | 100 | { SYS_compat_43_osendmsg, 0, (sy_call_t *)compat_43_sys_sendmsg }, |
100 | { SYS_compat_43_osethostid, 0, (sy_call_t *)compat_43_sys_sethostid }, | | 101 | { SYS_compat_43_osethostid, 0, (sy_call_t *)compat_43_sys_sethostid }, |
101 | { SYS_compat_43_osethostname, 0, (sy_call_t *)compat_43_sys_sethostname }, | | 102 | { SYS_compat_43_osethostname, 0, (sy_call_t *)compat_43_sys_sethostname }, |
102 | { SYS_compat_43_osetrlimit, 0, (sy_call_t *)compat_43_sys_setrlimit }, | | 103 | { SYS_compat_43_osetrlimit, 0, (sy_call_t *)compat_43_sys_setrlimit }, |
103 | { SYS_compat_43_osigblock, 0, (sy_call_t *)compat_43_sys_sigblock }, | | 104 | { SYS_compat_43_osigblock, 0, (sy_call_t *)compat_43_sys_sigblock }, |
104 | { SYS_compat_43_osigsetmask, 0, (sy_call_t *)compat_43_sys_sigsetmask }, | | 105 | { SYS_compat_43_osigsetmask, 0, (sy_call_t *)compat_43_sys_sigsetmask }, |
105 | { SYS_compat_43_osigstack, 0, (sy_call_t *)compat_43_sys_sigstack }, | | 106 | { SYS_compat_43_osigstack, 0, (sy_call_t *)compat_43_sys_sigstack }, |
106 | { SYS_compat_43_osigvec, 0, (sy_call_t *)compat_43_sys_sigvec }, | | 107 | { SYS_compat_43_osigvec, 0, (sy_call_t *)compat_43_sys_sigvec }, |
107 | { SYS_compat_43_otruncate, 0, (sy_call_t *)compat_43_sys_truncate }, | | 108 | { SYS_compat_43_otruncate, 0, (sy_call_t *)compat_43_sys_truncate }, |
108 | { SYS_compat_43_owait, 0, (sy_call_t *)compat_43_sys_wait }, | | 109 | { SYS_compat_43_owait, 0, (sy_call_t *)compat_43_sys_wait }, |
109 | { SYS_compat_43_stat43, 0, (sy_call_t *)compat_43_sys_stat }, | | 110 | { SYS_compat_43_stat43, 0, (sy_call_t *)compat_43_sys_stat }, |
110 | #endif | | 111 | #endif |
111 | | | 112 | |
112 | #if defined(COMPAT_09) | | 113 | #if defined(COMPAT_09) |
113 | { SYS_compat_09_ogetdomainname, 0, (sy_call_t *)compat_09_sys_getdomainname }, | | 114 | { SYS_compat_09_ogetdomainname, 0, (sy_call_t *)compat_09_sys_getdomainname }, |
114 | { SYS_compat_09_osetdomainname, 0, (sy_call_t *)compat_09_sys_setdomainname }, | | 115 | { SYS_compat_09_osetdomainname, 0, (sy_call_t *)compat_09_sys_setdomainname }, |
115 | { SYS_compat_09_ouname, 0, (sy_call_t *)compat_09_sys_uname }, | | 116 | { SYS_compat_09_ouname, 0, (sy_call_t *)compat_09_sys_uname }, |
116 | #endif | | 117 | #endif |
117 | | | 118 | |
118 | #if defined(COMPAT_10) && !defined(_LP64) | | 119 | #if defined(COMPAT_10) && !defined(_LP64) |
119 | # if defined(SYSVMSG) | | 120 | # if defined(SYSVMSG) |
120 | { SYS_compat_10_omsgsys, 0, (sy_call_t *)compat_10_sys_msgsys }, | | 121 | { SYS_compat_10_omsgsys, 0, (sy_call_t *)compat_10_sys_msgsys }, |
121 | # endif | | 122 | # endif |
122 | # if defined(SYSVSEM) | | 123 | # if defined(SYSVSEM) |
123 | { SYS_compat_10_osemsys, 0, (sy_call_t *)compat_10_sys_semsys }, | | 124 | { SYS_compat_10_osemsys, 0, (sy_call_t *)compat_10_sys_semsys }, |
124 | # endif | | 125 | # endif |
125 | # if defined(SYSVSHM) | | 126 | # if defined(SYSVSHM) |
126 | { SYS_compat_10_oshmsys, 0, (sy_call_t *)compat_10_sys_shmsys }, | | 127 | { SYS_compat_10_oshmsys, 0, (sy_call_t *)compat_10_sys_shmsys }, |
127 | # endif | | 128 | # endif |
128 | #endif /* defined(COMPAT_10) && !defined(_LP64) */ | | 129 | #endif /* defined(COMPAT_10) && !defined(_LP64) */ |
129 | | | 130 | |
130 | #if defined(COMPAT_12) | | 131 | #if defined(COMPAT_12) |
131 | { SYS_compat_12_fstat12, 0, (sy_call_t *)compat_12_sys_fstat }, | | 132 | { SYS_compat_12_fstat12, 0, (sy_call_t *)compat_12_sys_fstat }, |
132 | { SYS_compat_12_getdirentries, 0, (sy_call_t *)compat_12_sys_getdirentries }, | | 133 | { SYS_compat_12_getdirentries, 0, (sy_call_t *)compat_12_sys_getdirentries }, |
133 | { SYS_compat_12_lstat12, 0, (sy_call_t *)compat_12_sys_lstat }, | | 134 | { SYS_compat_12_lstat12, 0, (sy_call_t *)compat_12_sys_lstat }, |
134 | { SYS_compat_12_msync, 0, (sy_call_t *)compat_12_sys_msync }, | | 135 | { SYS_compat_12_msync, 0, (sy_call_t *)compat_12_sys_msync }, |
135 | { SYS_compat_12_oreboot, 0, (sy_call_t *)compat_12_sys_reboot }, | | 136 | { SYS_compat_12_oreboot, 0, (sy_call_t *)compat_12_sys_reboot }, |
136 | { SYS_compat_12_oswapon, 0, (sy_call_t *)compat_12_sys_swapon }, | | 137 | { SYS_compat_12_oswapon, 0, (sy_call_t *)compat_12_sys_swapon }, |
137 | { SYS_compat_12_stat12, 0, (sy_call_t *)compat_12_sys_stat }, | | 138 | { SYS_compat_12_stat12, 0, (sy_call_t *)compat_12_sys_stat }, |
138 | #endif | | 139 | #endif |
139 | | | 140 | |
140 | #if defined(COMPAT_13) | | 141 | #if defined(COMPAT_13) |
141 | { SYS_compat_13_sigaction13, 0, (sy_call_t *)compat_13_sys_sigaction }, | | 142 | { SYS_compat_13_sigaction13, 0, (sy_call_t *)compat_13_sys_sigaction }, |
142 | { SYS_compat_13_sigaltstack13, 0, (sy_call_t *)compat_13_sys_sigaltstack }, | | 143 | { SYS_compat_13_sigaltstack13, 0, (sy_call_t *)compat_13_sys_sigaltstack }, |
143 | { SYS_compat_13_sigpending13, 0, (sy_call_t *)compat_13_sys_sigpending }, | | 144 | { SYS_compat_13_sigpending13, 0, (sy_call_t *)compat_13_sys_sigpending }, |
144 | { SYS_compat_13_sigprocmask13, 0, (sy_call_t *)compat_13_sys_sigprocmask }, | | 145 | { SYS_compat_13_sigprocmask13, 0, (sy_call_t *)compat_13_sys_sigprocmask }, |
145 | { SYS_compat_13_sigreturn13, 0, (sy_call_t *)compat_13_sys_sigreturn }, | | 146 | { SYS_compat_13_sigreturn13, 0, (sy_call_t *)compat_13_sys_sigreturn }, |
146 | { SYS_compat_13_sigsuspend13, 0, (sy_call_t *)compat_13_sys_sigsuspend }, | | 147 | { SYS_compat_13_sigsuspend13, 0, (sy_call_t *)compat_13_sys_sigsuspend }, |
147 | #endif | | 148 | #endif |
148 | | | 149 | |
149 | #if defined(COMPAT_14) | | 150 | #if defined(COMPAT_14) |
150 | # if defined(SYSVSEM) | | 151 | # if defined(SYSVSEM) |
151 | { SYS_compat_14___semctl, 0, (sy_call_t *)compat_14_sys___semctl }, | | 152 | { SYS_compat_14___semctl, 0, (sy_call_t *)compat_14_sys___semctl }, |
152 | # endif | | 153 | # endif |
153 | # if defined(SYSVMSG) | | 154 | # if defined(SYSVMSG) |
154 | { SYS_compat_14_msgctl, 0, (sy_call_t *)compat_14_sys_msgctl }, | | 155 | { SYS_compat_14_msgctl, 0, (sy_call_t *)compat_14_sys_msgctl }, |
155 | # endif | | 156 | # endif |
156 | # if defined(SYSVSHM) | | 157 | # if defined(SYSVSHM) |
157 | { SYS_compat_14_shmctl, 0, (sy_call_t *)compat_14_sys_shmctl }, | | 158 | { SYS_compat_14_shmctl, 0, (sy_call_t *)compat_14_sys_shmctl }, |
158 | # endif | | 159 | # endif |
159 | #endif | | 160 | #endif |
160 | | | 161 | |
161 | #if defined(COMPAT_16) | | 162 | #if defined(COMPAT_16) |
162 | #if !(defined(__amd64__) && !defined(COMPAT_NETBSD32)) | | 163 | #if defined(COMPAT_SIGCONTEXT) |
163 | { SYS_compat_16___sigaction14, 0, (sy_call_t *)compat_16_sys___sigaction14 }, | | 164 | { SYS_compat_16___sigaction14, 0, (sy_call_t *)compat_16_sys___sigaction14 }, |
164 | { SYS_compat_16___sigreturn14, 0, (sy_call_t *)compat_16_sys___sigreturn14 }, | | 165 | { SYS_compat_16___sigreturn14, 0, (sy_call_t *)compat_16_sys___sigreturn14 }, |
165 | #endif | | 166 | #endif |
166 | #endif | | 167 | #endif |
167 | | | 168 | |
168 | #if defined(COMPAT_20) | | 169 | #if defined(COMPAT_20) |
169 | { SYS_compat_20_fhstatfs, 0, (sy_call_t *)compat_20_sys_fhstatfs }, | | 170 | { SYS_compat_20_fhstatfs, 0, (sy_call_t *)compat_20_sys_fhstatfs }, |
170 | { SYS_compat_20_fstatfs, 0, (sy_call_t *)compat_20_sys_fstatfs }, | | 171 | { SYS_compat_20_fstatfs, 0, (sy_call_t *)compat_20_sys_fstatfs }, |
171 | { SYS_compat_20_getfsstat, 0, (sy_call_t *)compat_20_sys_getfsstat }, | | 172 | { SYS_compat_20_getfsstat, 0, (sy_call_t *)compat_20_sys_getfsstat }, |
172 | { SYS_compat_20_statfs, 0, (sy_call_t *)compat_20_sys_statfs }, | | 173 | { SYS_compat_20_statfs, 0, (sy_call_t *)compat_20_sys_statfs }, |
173 | #endif | | 174 | #endif |
174 | | | 175 | |
175 | #if defined(COMPAT_30) | | 176 | #if defined(COMPAT_30) |
176 | { SYS_compat_30___fhstat30, 0, (sy_call_t *)compat_30_sys___fhstat30 }, | | 177 | { SYS_compat_30___fhstat30, 0, (sy_call_t *)compat_30_sys___fhstat30 }, |
177 | { SYS_compat_30___fstat13, 0, (sy_call_t *)compat_30_sys___fstat13 }, | | 178 | { SYS_compat_30___fstat13, 0, (sy_call_t *)compat_30_sys___fstat13 }, |
178 | { SYS_compat_30___lstat13, 0, (sy_call_t *)compat_30_sys___lstat13 }, | | 179 | { SYS_compat_30___lstat13, 0, (sy_call_t *)compat_30_sys___lstat13 }, |
179 | { SYS_compat_30___stat13, 0, (sy_call_t *)compat_30_sys___stat13 }, | | 180 | { SYS_compat_30___stat13, 0, (sy_call_t *)compat_30_sys___stat13 }, |
180 | { SYS_compat_30_fhopen, 0, (sy_call_t *)compat_30_sys_fhopen }, | | 181 | { SYS_compat_30_fhopen, 0, (sy_call_t *)compat_30_sys_fhopen }, |
181 | { SYS_compat_30_fhstat, 0, (sy_call_t *)compat_30_sys_fhstat }, | | 182 | { SYS_compat_30_fhstat, 0, (sy_call_t *)compat_30_sys_fhstat }, |
182 | { SYS_compat_30_fhstatvfs1, 0, (sy_call_t *)compat_30_sys_fhstatvfs1 }, | | 183 | { SYS_compat_30_fhstatvfs1, 0, (sy_call_t *)compat_30_sys_fhstatvfs1 }, |
183 | { SYS_compat_30_getdents, 0, (sy_call_t *)compat_30_sys_getdents }, | | 184 | { SYS_compat_30_getdents, 0, (sy_call_t *)compat_30_sys_getdents }, |
184 | { SYS_compat_30_getfh, 0, (sy_call_t *)compat_30_sys_getfh }, | | 185 | { SYS_compat_30_getfh, 0, (sy_call_t *)compat_30_sys_getfh }, |
185 | { SYS_compat_30_socket, 0, (sy_call_t *)compat_30_sys_socket }, | | 186 | { SYS_compat_30_socket, 0, (sy_call_t *)compat_30_sys_socket }, |
186 | #endif | | 187 | #endif |
187 | | | 188 | |
188 | #if defined(COMPAT_40) | | 189 | #if defined(COMPAT_40) |
189 | { SYS_compat_40_mount, 0, (sy_call_t *)compat_40_sys_mount }, | | 190 | { SYS_compat_40_mount, 0, (sy_call_t *)compat_40_sys_mount }, |
190 | #endif | | 191 | #endif |
191 | #if defined(COMPAT_50) | | 192 | #if defined(COMPAT_50) |
192 | { SYS_compat_50_wait4, 0, (sy_call_t *)compat_50_sys_wait4 }, | | 193 | { SYS_compat_50_wait4, 0, (sy_call_t *)compat_50_sys_wait4 }, |
193 | { SYS_compat_50_mknod, 0, (sy_call_t *)compat_50_sys_mknod }, | | 194 | { SYS_compat_50_mknod, 0, (sy_call_t *)compat_50_sys_mknod }, |
194 | { SYS_compat_50_setitimer, 0, (sy_call_t *)compat_50_sys_setitimer }, | | 195 | { SYS_compat_50_setitimer, 0, (sy_call_t *)compat_50_sys_setitimer }, |
195 | { SYS_compat_50_getitimer, 0, (sy_call_t *)compat_50_sys_getitimer }, | | 196 | { SYS_compat_50_getitimer, 0, (sy_call_t *)compat_50_sys_getitimer }, |
196 | { SYS_compat_50_select, 0, (sy_call_t *)compat_50_sys_select }, | | 197 | { SYS_compat_50_select, 0, (sy_call_t *)compat_50_sys_select }, |
197 | { SYS_compat_50_gettimeofday, 0, (sy_call_t *)compat_50_sys_gettimeofday }, | | 198 | { SYS_compat_50_gettimeofday, 0, (sy_call_t *)compat_50_sys_gettimeofday }, |
198 | { SYS_compat_50_getrusage, 0, (sy_call_t *)compat_50_sys_getrusage }, | | 199 | { SYS_compat_50_getrusage, 0, (sy_call_t *)compat_50_sys_getrusage }, |
199 | { SYS_compat_50_settimeofday, 0, (sy_call_t *)compat_50_sys_settimeofday }, | | 200 | { SYS_compat_50_settimeofday, 0, (sy_call_t *)compat_50_sys_settimeofday }, |
200 | { SYS_compat_50_utimes, 0, (sy_call_t *)compat_50_sys_utimes }, | | 201 | { SYS_compat_50_utimes, 0, (sy_call_t *)compat_50_sys_utimes }, |
201 | { SYS_compat_50_adjtime, 0, (sy_call_t *)compat_50_sys_adjtime }, | | 202 | { SYS_compat_50_adjtime, 0, (sy_call_t *)compat_50_sys_adjtime }, |
202 | #ifdef LFS | | 203 | #ifdef LFS |
203 | { SYS_compat_50_lfs_segwait, 0, (sy_call_t *)compat_50_sys_lfs_segwait }, | | 204 | { SYS_compat_50_lfs_segwait, 0, (sy_call_t *)compat_50_sys_lfs_segwait }, |
204 | #endif | | 205 | #endif |
205 | { SYS_compat_50_futimes, 0, (sy_call_t *)compat_50_sys_futimes }, | | 206 | { SYS_compat_50_futimes, 0, (sy_call_t *)compat_50_sys_futimes }, |
206 | { SYS_compat_50_clock_gettime, 0, (sy_call_t *)compat_50_sys_clock_gettime }, | | 207 | { SYS_compat_50_clock_gettime, 0, (sy_call_t *)compat_50_sys_clock_gettime }, |
207 | { SYS_compat_50_clock_settime, 0, (sy_call_t *)compat_50_sys_clock_settime }, | | 208 | { SYS_compat_50_clock_settime, 0, (sy_call_t *)compat_50_sys_clock_settime }, |
208 | { SYS_compat_50_clock_getres, 0, (sy_call_t *)compat_50_sys_clock_getres }, | | 209 | { SYS_compat_50_clock_getres, 0, (sy_call_t *)compat_50_sys_clock_getres }, |
209 | { SYS_compat_50_timer_settime, 0, (sy_call_t *)compat_50_sys_timer_settime }, | | 210 | { SYS_compat_50_timer_settime, 0, (sy_call_t *)compat_50_sys_timer_settime }, |
210 | { SYS_compat_50_timer_gettime, 0, (sy_call_t *)compat_50_sys_timer_gettime }, | | 211 | { SYS_compat_50_timer_gettime, 0, (sy_call_t *)compat_50_sys_timer_gettime }, |
211 | { SYS_compat_50_nanosleep, 0, (sy_call_t *)compat_50_sys_nanosleep }, | | 212 | { SYS_compat_50_nanosleep, 0, (sy_call_t *)compat_50_sys_nanosleep }, |
212 | { SYS_compat_50___sigtimedwait, 0, (sy_call_t *)compat_50_sys___sigtimedwait }, | | 213 | { SYS_compat_50___sigtimedwait, 0, (sy_call_t *)compat_50_sys___sigtimedwait }, |
213 | { SYS_compat_50_mq_timedsend, 0, (sy_call_t *)compat_50_sys_mq_timedsend }, | | 214 | { SYS_compat_50_mq_timedsend, 0, (sy_call_t *)compat_50_sys_mq_timedsend }, |
214 | { SYS_compat_50_mq_timedreceive, 0, (sy_call_t *)compat_50_sys_mq_timedreceive }, | | 215 | { SYS_compat_50_mq_timedreceive, 0, (sy_call_t *)compat_50_sys_mq_timedreceive }, |
215 | { SYS_compat_50_lutimes, 0, (sy_call_t *)compat_50_sys_lutimes }, | | 216 | { SYS_compat_50_lutimes, 0, (sy_call_t *)compat_50_sys_lutimes }, |
216 | # if defined(SYSVSEM) | | 217 | # if defined(SYSVSEM) |
217 | { SYS_compat_50_____semctl13, 0, (sy_call_t *)compat_50_sys_____semctl13 }, | | 218 | { SYS_compat_50_____semctl13, 0, (sy_call_t *)compat_50_sys_____semctl13 }, |
218 | # endif | | 219 | # endif |
219 | # if defined(SYSVMSG) | | 220 | # if defined(SYSVMSG) |
220 | { SYS_compat_50___msgctl13, 0, (sy_call_t *)compat_50_sys___msgctl13 }, | | 221 | { SYS_compat_50___msgctl13, 0, (sy_call_t *)compat_50_sys___msgctl13 }, |
221 | # endif | | 222 | # endif |
222 | # if defined(SYSVSHM) | | 223 | # if defined(SYSVSHM) |
223 | { SYS_compat_50___shmctl13, 0, (sy_call_t *)compat_50_sys___shmctl13 }, | | 224 | { SYS_compat_50___shmctl13, 0, (sy_call_t *)compat_50_sys___shmctl13 }, |
224 | # endif | | 225 | # endif |
225 | { SYS_compat_50__lwp_park, 0, (sy_call_t *)compat_50_sys__lwp_park }, | | 226 | { SYS_compat_50__lwp_park, 0, (sy_call_t *)compat_50_sys__lwp_park }, |
226 | { SYS_compat_50_kevent, 0, (sy_call_t *)compat_50_sys_kevent }, | | 227 | { SYS_compat_50_kevent, 0, (sy_call_t *)compat_50_sys_kevent }, |
227 | { SYS_compat_50_pselect, 0, (sy_call_t *)compat_50_sys_pselect }, | | 228 | { SYS_compat_50_pselect, 0, (sy_call_t *)compat_50_sys_pselect }, |
228 | { SYS_compat_50_pollts, 0, (sy_call_t *)compat_50_sys_pollts }, | | 229 | { SYS_compat_50_pollts, 0, (sy_call_t *)compat_50_sys_pollts }, |
229 | { SYS_compat_50___stat30, 0, (sy_call_t *)compat_50_sys___stat30 }, | | 230 | { SYS_compat_50___stat30, 0, (sy_call_t *)compat_50_sys___stat30 }, |
230 | { SYS_compat_50___fstat30, 0, (sy_call_t *)compat_50_sys___fstat30 }, | | 231 | { SYS_compat_50___fstat30, 0, (sy_call_t *)compat_50_sys___fstat30 }, |
231 | { SYS_compat_50___lstat30, 0, (sy_call_t *)compat_50_sys___lstat30 }, | | 232 | { SYS_compat_50___lstat30, 0, (sy_call_t *)compat_50_sys___lstat30 }, |
232 | # if defined(NTP) | | 233 | # if defined(NTP) |
233 | { SYS_compat_50___ntp_gettime30, 0, (sy_call_t *)compat_50_sys___ntp_gettime30 }, | | 234 | { SYS_compat_50___ntp_gettime30, 0, (sy_call_t *)compat_50_sys___ntp_gettime30 }, |
234 | # endif | | 235 | # endif |
235 | { SYS_compat_50___fhstat40, 0, (sy_call_t *)compat_50_sys___fhstat40 }, | | 236 | { SYS_compat_50___fhstat40, 0, (sy_call_t *)compat_50_sys___fhstat40 }, |
236 | { SYS_compat_50_aio_suspend, 0, (sy_call_t *)compat_50_sys_aio_suspend }, | | 237 | { SYS_compat_50_aio_suspend, 0, (sy_call_t *)compat_50_sys_aio_suspend }, |
237 | { SYS_compat_50_quotactl, 0, (sy_call_t *)compat_50_sys_quotactl }, | | 238 | { SYS_compat_50_quotactl, 0, (sy_call_t *)compat_50_sys_quotactl }, |
238 | #endif | | 239 | #endif |
239 | { 0, 0, NULL }, | | 240 | { 0, 0, NULL }, |
240 | }; | | 241 | }; |
241 | | | 242 | |
242 | static int | | 243 | static int |
243 | compat_modcmd(modcmd_t cmd, void *arg) | | 244 | compat_modcmd(modcmd_t cmd, void *arg) |
244 | { | | 245 | { |
245 | #ifdef COMPAT_16 | | 246 | #ifdef COMPAT_16 |
246 | proc_t *p; | | 247 | proc_t *p; |
247 | #endif | | 248 | #endif |
248 | int error; | | 249 | int error; |
249 | | | 250 | |
250 | switch (cmd) { | | 251 | switch (cmd) { |
251 | case MODULE_CMD_INIT: | | 252 | case MODULE_CMD_INIT: |
252 | error = syscall_establish(NULL, compat_syscalls); | | 253 | error = syscall_establish(NULL, compat_syscalls); |
253 | if (error != 0) { | | 254 | if (error != 0) { |
254 | return error; | | 255 | return error; |
255 | } | | 256 | } |
256 | #ifdef COMPAT_43 | | 257 | #ifdef COMPAT_43 |
257 | KASSERT(ttcompatvec == NULL); | | 258 | KASSERT(ttcompatvec == NULL); |
258 | ttcompatvec = ttcompat; | | 259 | ttcompatvec = ttcompat; |
259 | #endif | | 260 | #endif |
260 | #ifdef COMPAT_16 | | 261 | #ifdef COMPAT_16 |
261 | #if !(defined(__amd64__) && !defined(COMPAT_NETBSD32)) | | 262 | #if defined(COMPAT_SIGCONTEXT) |
262 | KASSERT(emul_netbsd.e_sigobject == NULL); | | 263 | KASSERT(emul_netbsd.e_sigobject == NULL); |
263 | rw_enter(&exec_lock, RW_WRITER); | | 264 | rw_enter(&exec_lock, RW_WRITER); |
264 | emul_netbsd.e_sigcode = sigcode; | | 265 | emul_netbsd.e_sigcode = sigcode; |
265 | emul_netbsd.e_esigcode = esigcode; | | 266 | emul_netbsd.e_esigcode = esigcode; |
266 | emul_netbsd.e_sigobject = &emul_netbsd_object; | | 267 | emul_netbsd.e_sigobject = &emul_netbsd_object; |
267 | rw_exit(&exec_lock); | | 268 | rw_exit(&exec_lock); |
268 | KASSERT(sendsig_sigcontext_vec == NULL); | | 269 | KASSERT(sendsig_sigcontext_vec == NULL); |
269 | sendsig_sigcontext_vec = sendsig_sigcontext; | | 270 | sendsig_sigcontext_vec = sendsig_sigcontext; |
270 | #endif | | 271 | #endif |
271 | #endif | | 272 | #endif |
272 | #if defined(COMPAT_09) || defined(COMPAT_43) | | 273 | #if defined(COMPAT_09) || defined(COMPAT_43) |
273 | compat_sysctl_init(); | | 274 | compat_sysctl_init(); |
274 | #endif | | 275 | #endif |
275 | return 0; | | 276 | return 0; |
276 | | | 277 | |
277 | case MODULE_CMD_FINI: | | 278 | case MODULE_CMD_FINI: |
278 | #ifdef COMPAT_16 | | 279 | #ifdef COMPAT_16 |
279 | /* | | 280 | /* |
280 | * Ensure sendsig_sigcontext() is not being used. | | 281 | * Ensure sendsig_sigcontext() is not being used. |
281 | * module_lock prevents the flag being set on any | | 282 | * module_lock prevents the flag being set on any |
282 | * further processes while we are here. See | | 283 | * further processes while we are here. See |
283 | * sigaction1() for the opposing half. | | 284 | * sigaction1() for the opposing half. |
284 | */ | | 285 | */ |
285 | mutex_enter(proc_lock); | | 286 | mutex_enter(proc_lock); |
286 | PROCLIST_FOREACH(p, &allproc) { | | 287 | PROCLIST_FOREACH(p, &allproc) { |
287 | if ((p->p_lflag & PL_SIGCOMPAT) != 0) { | | 288 | if ((p->p_lflag & PL_SIGCOMPAT) != 0) { |
288 | break; | | 289 | break; |
289 | } | | 290 | } |
290 | } | | 291 | } |
291 | mutex_exit(proc_lock); | | 292 | mutex_exit(proc_lock); |
292 | if (p != NULL) { | | 293 | if (p != NULL) { |
293 | return EBUSY; | | 294 | return EBUSY; |
294 | } | | 295 | } |
295 | sendsig_sigcontext_vec = NULL; | | 296 | sendsig_sigcontext_vec = NULL; |
296 | #endif | | 297 | #endif |
297 | /* Unlink the system calls. */ | | 298 | /* Unlink the system calls. */ |
298 | error = syscall_disestablish(NULL, compat_syscalls); | | 299 | error = syscall_disestablish(NULL, compat_syscalls); |
299 | if (error != 0) { | | 300 | if (error != 0) { |
300 | return error; | | 301 | return error; |
301 | } | | 302 | } |
302 | #ifdef COMPAT_43 | | 303 | #ifdef COMPAT_43 |
303 | /* Unlink ttcompatvec. */ | | 304 | /* Unlink ttcompatvec. */ |
304 | if (rw_tryenter(&ttcompat_lock, RW_WRITER)) { | | 305 | if (rw_tryenter(&ttcompat_lock, RW_WRITER)) { |
305 | ttcompatvec = NULL; | | 306 | ttcompatvec = NULL; |
306 | rw_exit(&ttcompat_lock); | | 307 | rw_exit(&ttcompat_lock); |
307 | } else { | | 308 | } else { |
308 | error = syscall_establish(NULL, compat_syscalls); | | 309 | error = syscall_establish(NULL, compat_syscalls); |
309 | KASSERT(error == 0); | | 310 | KASSERT(error == 0); |
310 | return EBUSY; | | 311 | return EBUSY; |
311 | } | | 312 | } |
312 | #endif | | 313 | #endif |
313 | #ifdef COMPAT_16 | | 314 | #ifdef COMPAT_16 |
314 | #if !(defined(__amd64__) && !defined(COMPAT_NETBSD32)) | | 315 | #if defined(COMPAT_SIGCONTEXT) |
315 | /* | | 316 | /* |
316 | * The sigobject may persist if still in use, but | | 317 | * The sigobject may persist if still in use, but |
317 | * is reference counted so will die eventually. | | 318 | * is reference counted so will die eventually. |
318 | */ | | 319 | */ |
319 | rw_enter(&exec_lock, RW_WRITER); | | 320 | rw_enter(&exec_lock, RW_WRITER); |
320 | if (emul_netbsd_object != NULL) { | | 321 | if (emul_netbsd_object != NULL) { |
321 | (*emul_netbsd_object->pgops->pgo_detach) | | 322 | (*emul_netbsd_object->pgops->pgo_detach) |
322 | (emul_netbsd_object); | | 323 | (emul_netbsd_object); |
323 | } | | 324 | } |
324 | emul_netbsd_object = NULL; | | 325 | emul_netbsd_object = NULL; |
325 | emul_netbsd.e_sigcode = NULL; | | 326 | emul_netbsd.e_sigcode = NULL; |
326 | emul_netbsd.e_esigcode = NULL; | | 327 | emul_netbsd.e_esigcode = NULL; |
327 | emul_netbsd.e_sigobject = NULL; | | 328 | emul_netbsd.e_sigobject = NULL; |
328 | rw_exit(&exec_lock); | | 329 | rw_exit(&exec_lock); |
329 | #endif | | 330 | #endif |
330 | #endif /* COMPAT_16 */ | | 331 | #endif /* COMPAT_16 */ |
331 | #if defined(COMPAT_09) || defined(COMPAT_43) | | 332 | #if defined(COMPAT_09) || defined(COMPAT_43) |
332 | compat_sysctl_fini(); | | 333 | compat_sysctl_fini(); |
333 | #endif | | 334 | #endif |
334 | return 0; | | 335 | return 0; |
335 | | | 336 | |
336 | default: | | 337 | default: |
337 | return ENOTTY; | | 338 | return ENOTTY; |
338 | } | | 339 | } |
339 | } | | 340 | } |