1 1.65 mlelstv /* $NetBSD: netbsd32_compat_43.c,v 1.65 2024/12/20 16:12:31 mlelstv Exp $ */ 2 1.1 mrg 3 1.1 mrg /* 4 1.19 mrg * Copyright (c) 1998, 2001 Matthew R. Green 5 1.1 mrg * All rights reserved. 6 1.1 mrg * 7 1.1 mrg * Redistribution and use in source and binary forms, with or without 8 1.1 mrg * modification, are permitted provided that the following conditions 9 1.1 mrg * are met: 10 1.1 mrg * 1. Redistributions of source code must retain the above copyright 11 1.1 mrg * notice, this list of conditions and the following disclaimer. 12 1.1 mrg * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 mrg * notice, this list of conditions and the following disclaimer in the 14 1.1 mrg * documentation and/or other materials provided with the distribution. 15 1.1 mrg * 16 1.1 mrg * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 1.1 mrg * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 1.1 mrg * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 1.1 mrg * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20 1.7 mrg * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21 1.1 mrg * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22 1.1 mrg * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23 1.1 mrg * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 1.7 mrg * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 1.1 mrg * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 1.1 mrg * SUCH DAMAGE. 27 1.1 mrg */ 28 1.20 lukem 29 1.20 lukem #include <sys/cdefs.h> 30 1.65 mlelstv __KERNEL_RCSID(0, "$NetBSD: netbsd32_compat_43.c,v 1.65 2024/12/20 16:12:31 mlelstv Exp $"); 31 1.13 fvdl 32 1.17 mrg #if defined(_KERNEL_OPT) 33 1.13 fvdl #include "opt_compat_43.h" 34 1.13 fvdl #endif 35 1.1 mrg 36 1.1 mrg #include <sys/param.h> 37 1.1 mrg #include <sys/systm.h> 38 1.57 pgoyette #include <sys/module.h> 39 1.1 mrg #include <sys/fcntl.h> 40 1.41 dsl #include <sys/filedesc.h> 41 1.44 dsl #include <sys/mbuf.h> 42 1.1 mrg #include <sys/mount.h> 43 1.41 dsl #include <sys/namei.h> 44 1.32 chs #include <sys/socket.h> 45 1.1 mrg #include <sys/proc.h> 46 1.44 dsl #include <sys/socket.h> 47 1.44 dsl #include <sys/socketvar.h> 48 1.1 mrg #include <sys/stat.h> 49 1.57 pgoyette #include <sys/syscallvar.h> 50 1.1 mrg #include <sys/syscallargs.h> 51 1.1 mrg #include <sys/time.h> 52 1.1 mrg #include <sys/ucred.h> 53 1.41 dsl #include <sys/vfs_syscalls.h> 54 1.10 mrg #include <uvm/uvm_extern.h> 55 1.1 mrg #include <sys/sysctl.h> 56 1.3 mrg #include <sys/swap.h> 57 1.1 mrg 58 1.5 mrg #include <compat/netbsd32/netbsd32.h> 59 1.57 pgoyette #include <compat/netbsd32/netbsd32_syscall.h> 60 1.5 mrg #include <compat/netbsd32/netbsd32_syscallargs.h> 61 1.1 mrg 62 1.31 christos #include <compat/sys/stat.h> 63 1.31 christos #include <compat/sys/signal.h> 64 1.31 christos #include <compat/sys/signalvar.h> 65 1.33 christos #include <compat/sys/socket.h> 66 1.31 christos 67 1.47 dsl #define SYS_DEF(foo) struct foo##_args; \ 68 1.47 dsl int foo(struct lwp *, const struct foo##_args *, register_t *) 69 1.47 dsl 70 1.47 dsl SYS_DEF(compat_43_netbsd32_sethostid); 71 1.47 dsl SYS_DEF(compat_43_netbsd32_killpg); 72 1.47 dsl SYS_DEF(compat_43_netbsd32_sigblock); 73 1.47 dsl SYS_DEF(compat_43_netbsd32_sigsetmask); 74 1.47 dsl #undef SYS_DEF 75 1.9 eeh 76 1.41 dsl static void 77 1.41 dsl netbsd32_from_stat(const struct stat *sb, struct netbsd32_stat43 *sp32) 78 1.41 dsl { 79 1.41 dsl 80 1.58 maxv memset(sp32, 0, sizeof(*sp32)); 81 1.41 dsl sp32->st_dev = sb->st_dev; 82 1.41 dsl sp32->st_ino = sb->st_ino; 83 1.41 dsl sp32->st_mode = sb->st_mode; 84 1.41 dsl sp32->st_nlink = sb->st_nlink; 85 1.41 dsl sp32->st_uid = sb->st_uid; 86 1.41 dsl sp32->st_gid = sb->st_gid; 87 1.41 dsl sp32->st_rdev = sb->st_rdev; 88 1.41 dsl sp32->st_size = sb->st_size < (quad_t)1 << 32 ? sb->st_size : -2; 89 1.41 dsl sp32->st_atimespec.tv_sec = sb->st_atimespec.tv_sec; 90 1.41 dsl sp32->st_atimespec.tv_nsec = sb->st_atimespec.tv_nsec; 91 1.41 dsl sp32->st_mtimespec.tv_sec = sb->st_mtimespec.tv_sec; 92 1.41 dsl sp32->st_mtimespec.tv_nsec = sb->st_mtimespec.tv_nsec; 93 1.41 dsl sp32->st_ctimespec.tv_sec = sb->st_ctimespec.tv_sec; 94 1.41 dsl sp32->st_ctimespec.tv_nsec = sb->st_ctimespec.tv_nsec; 95 1.41 dsl sp32->st_blksize = sb->st_blksize; 96 1.41 dsl sp32->st_blocks = sb->st_blocks; 97 1.41 dsl sp32->st_flags = sb->st_flags; 98 1.41 dsl sp32->st_gen = sb->st_gen; 99 1.1 mrg } 100 1.1 mrg 101 1.1 mrg /* file system syscalls */ 102 1.1 mrg int 103 1.47 dsl compat_43_netbsd32_ocreat(struct lwp *l, const struct compat_43_netbsd32_ocreat_args *uap, register_t *retval) 104 1.1 mrg { 105 1.47 dsl /* { 106 1.5 mrg syscallarg(const netbsd32_charp) path; 107 1.1 mrg syscallarg(mode_t) mode; 108 1.47 dsl } */ 109 1.1 mrg struct sys_open_args ua; 110 1.1 mrg 111 1.6 mrg NETBSD32TOP_UAP(path, const char); 112 1.6 mrg NETBSD32TO64_UAP(mode); 113 1.1 mrg SCARG(&ua, flags) = O_WRONLY | O_CREAT | O_TRUNC; 114 1.1 mrg 115 1.61 simonb return sys_open(l, &ua, retval); 116 1.1 mrg } 117 1.1 mrg 118 1.1 mrg int 119 1.47 dsl compat_43_netbsd32_olseek(struct lwp *l, const struct compat_43_netbsd32_olseek_args *uap, register_t *retval) 120 1.1 mrg { 121 1.47 dsl /* { 122 1.1 mrg syscallarg(int) fd; 123 1.5 mrg syscallarg(netbsd32_long) offset; 124 1.1 mrg syscallarg(int) whence; 125 1.47 dsl } */ 126 1.1 mrg struct sys_lseek_args ua; 127 1.1 mrg 128 1.1 mrg SCARG(&ua, fd) = SCARG(uap, fd); 129 1.6 mrg NETBSD32TOX_UAP(offset, long); 130 1.6 mrg NETBSD32TO64_UAP(whence); 131 1.48 dsl /* Maybe offsets > 2^32 should generate an error ? */ 132 1.48 dsl return sys_lseek(l, &ua, retval); 133 1.1 mrg } 134 1.1 mrg 135 1.1 mrg int 136 1.47 dsl compat_43_netbsd32_stat43(struct lwp *l, const struct compat_43_netbsd32_stat43_args *uap, register_t *retval) 137 1.1 mrg { 138 1.47 dsl /* { 139 1.5 mrg syscallarg(const netbsd32_charp) path; 140 1.5 mrg syscallarg(netbsd32_stat43p_t) ub; 141 1.47 dsl } */ 142 1.41 dsl struct stat sb; 143 1.15 mrg struct netbsd32_stat43 sb32; 144 1.41 dsl int error; 145 1.1 mrg 146 1.49 ad error = do_sys_stat(SCARG_P32(uap, path), FOLLOW, &sb); 147 1.41 dsl if (error == 0) { 148 1.41 dsl netbsd32_from_stat(&sb, &sb32); 149 1.41 dsl error = copyout(&sb32, SCARG_P32(uap, ub), sizeof(sb32)); 150 1.41 dsl } 151 1.41 dsl return error; 152 1.1 mrg } 153 1.1 mrg 154 1.1 mrg int 155 1.47 dsl compat_43_netbsd32_lstat43(struct lwp *l, const struct compat_43_netbsd32_lstat43_args *uap, register_t *retval) 156 1.1 mrg { 157 1.47 dsl /* { 158 1.5 mrg syscallarg(const netbsd32_charp) path; 159 1.5 mrg syscallarg(netbsd32_stat43p_t) ub; 160 1.47 dsl } */ 161 1.41 dsl struct stat sb; 162 1.15 mrg struct netbsd32_stat43 sb32; 163 1.41 dsl int error; 164 1.1 mrg 165 1.49 ad error = do_sys_stat(SCARG_P32(uap, path), NOFOLLOW, &sb); 166 1.41 dsl if (error == 0) { 167 1.41 dsl netbsd32_from_stat(&sb, &sb32); 168 1.41 dsl error = copyout(&sb32, SCARG_P32(uap, ub), sizeof(sb32)); 169 1.41 dsl } 170 1.41 dsl return error; 171 1.1 mrg } 172 1.1 mrg 173 1.1 mrg int 174 1.47 dsl compat_43_netbsd32_fstat43(struct lwp *l, const struct compat_43_netbsd32_fstat43_args *uap, register_t *retval) 175 1.1 mrg { 176 1.47 dsl /* { 177 1.1 mrg syscallarg(int) fd; 178 1.5 mrg syscallarg(netbsd32_stat43p_t) sb; 179 1.47 dsl } */ 180 1.41 dsl struct stat sb; 181 1.15 mrg struct netbsd32_stat43 sb32; 182 1.41 dsl int error; 183 1.1 mrg 184 1.49 ad error = do_sys_fstat(SCARG(uap, fd), &sb); 185 1.41 dsl if (error == 0) { 186 1.41 dsl netbsd32_from_stat(&sb, &sb32); 187 1.41 dsl error = copyout(&sb32, SCARG_P32(uap, sb), sizeof(sb32)); 188 1.41 dsl } 189 1.41 dsl return error; 190 1.1 mrg } 191 1.1 mrg 192 1.1 mrg int 193 1.47 dsl compat_43_netbsd32_otruncate(struct lwp *l, const struct compat_43_netbsd32_otruncate_args *uap, register_t *retval) 194 1.1 mrg { 195 1.47 dsl /* { 196 1.5 mrg syscallarg(const netbsd32_charp) path; 197 1.5 mrg syscallarg(netbsd32_long) length; 198 1.47 dsl } */ 199 1.1 mrg struct sys_truncate_args ua; 200 1.1 mrg 201 1.6 mrg NETBSD32TOP_UAP(path, const char); 202 1.6 mrg NETBSD32TO64_UAP(length); 203 1.61 simonb return sys_truncate(l, &ua, retval); 204 1.1 mrg } 205 1.1 mrg 206 1.1 mrg int 207 1.47 dsl compat_43_netbsd32_oftruncate(struct lwp *l, const struct compat_43_netbsd32_oftruncate_args *uap, register_t *retval) 208 1.1 mrg { 209 1.47 dsl /* { 210 1.1 mrg syscallarg(int) fd; 211 1.5 mrg syscallarg(netbsd32_long) length; 212 1.47 dsl } */ 213 1.1 mrg struct sys_ftruncate_args ua; 214 1.1 mrg 215 1.6 mrg NETBSD32TO64_UAP(fd); 216 1.6 mrg NETBSD32TO64_UAP(length); 217 1.61 simonb return sys_ftruncate(l, &ua, retval); 218 1.1 mrg } 219 1.1 mrg 220 1.1 mrg int 221 1.47 dsl compat_43_netbsd32_ogetdirentries(struct lwp *l, const struct compat_43_netbsd32_ogetdirentries_args *uap, register_t *retval) 222 1.1 mrg { 223 1.47 dsl /* { 224 1.1 mrg syscallarg(int) fd; 225 1.5 mrg syscallarg(netbsd32_charp) buf; 226 1.1 mrg syscallarg(u_int) count; 227 1.5 mrg syscallarg(netbsd32_longp) basep; 228 1.47 dsl } */ 229 1.1 mrg struct compat_43_sys_getdirentries_args ua; 230 1.1 mrg 231 1.6 mrg NETBSD32TO64_UAP(fd); 232 1.6 mrg NETBSD32TOP_UAP(buf, char); 233 1.6 mrg NETBSD32TO64_UAP(count); 234 1.6 mrg NETBSD32TOP_UAP(basep, long); 235 1.61 simonb return compat_43_sys_getdirentries(l, &ua, retval); 236 1.1 mrg } 237 1.1 mrg 238 1.1 mrg /* kernel syscalls */ 239 1.1 mrg int 240 1.47 dsl compat_43_netbsd32_ogetkerninfo(struct lwp *l, const struct compat_43_netbsd32_ogetkerninfo_args *uap, register_t *retval) 241 1.1 mrg { 242 1.47 dsl /* { 243 1.1 mrg syscallarg(int) op; 244 1.5 mrg syscallarg(netbsd32_charp) where; 245 1.5 mrg syscallarg(netbsd32_intp) size; 246 1.1 mrg syscallarg(int) arg; 247 1.47 dsl } */ 248 1.1 mrg struct compat_43_sys_getkerninfo_args ua; 249 1.1 mrg 250 1.6 mrg NETBSD32TO64_UAP(op); 251 1.6 mrg NETBSD32TOP_UAP(where, char); 252 1.6 mrg NETBSD32TOP_UAP(size, int); 253 1.6 mrg NETBSD32TO64_UAP(arg); 254 1.61 simonb return compat_43_sys_getkerninfo(l, &ua, retval); 255 1.1 mrg } 256 1.1 mrg 257 1.1 mrg int 258 1.47 dsl compat_43_netbsd32_ogethostname(struct lwp *l, const struct compat_43_netbsd32_ogethostname_args *uap, register_t *retval) 259 1.1 mrg { 260 1.47 dsl /* { 261 1.5 mrg syscallarg(netbsd32_charp) hostname; 262 1.1 mrg syscallarg(u_int) len; 263 1.47 dsl } */ 264 1.29 atatat int name[2]; 265 1.1 mrg size_t sz; 266 1.1 mrg 267 1.29 atatat name[0] = CTL_KERN; 268 1.29 atatat name[1] = KERN_HOSTNAME; 269 1.1 mrg sz = SCARG(uap, len); 270 1.61 simonb return old_sysctl(&name[0], 2, 271 1.61 simonb SCARG_P32(uap, hostname), &sz, 0, 0, l); 272 1.1 mrg } 273 1.1 mrg 274 1.1 mrg int 275 1.47 dsl compat_43_netbsd32_osethostname(struct lwp *l, const struct compat_43_netbsd32_osethostname_args *uap, register_t *retval) 276 1.1 mrg { 277 1.47 dsl /* { 278 1.5 mrg syscallarg(netbsd32_charp) hostname; 279 1.1 mrg syscallarg(u_int) len; 280 1.47 dsl } */ 281 1.29 atatat int name[2]; 282 1.1 mrg 283 1.29 atatat name[0] = CTL_KERN; 284 1.29 atatat name[1] = KERN_HOSTNAME; 285 1.39 dsl return old_sysctl(&name[0], 2, 0, 0, (char *)SCARG_P32(uap, 286 1.39 dsl hostname), SCARG(uap, len), l); 287 1.1 mrg } 288 1.1 mrg 289 1.1 mrg int 290 1.47 dsl compat_43_netbsd32_sethostid(struct lwp *l, const struct compat_43_netbsd32_sethostid_args *uap, register_t *retval) 291 1.4 eeh { 292 1.47 dsl /* { 293 1.4 eeh syscallarg(int32_t) hostid; 294 1.47 dsl } */ 295 1.4 eeh struct compat_43_sys_sethostid_args ua; 296 1.4 eeh 297 1.6 mrg NETBSD32TO64_UAP(hostid); 298 1.61 simonb return compat_43_sys_sethostid(l, &ua, retval); 299 1.4 eeh } 300 1.4 eeh 301 1.4 eeh int 302 1.47 dsl compat_43_netbsd32_ogetrlimit(struct lwp *l, const struct compat_43_netbsd32_ogetrlimit_args *uap, register_t *retval) 303 1.1 mrg { 304 1.47 dsl /* { 305 1.1 mrg syscallarg(int) which; 306 1.5 mrg syscallarg(netbsd32_orlimitp_t) rlp; 307 1.47 dsl } */ 308 1.1 mrg struct compat_43_sys_getrlimit_args ua; 309 1.1 mrg 310 1.6 mrg NETBSD32TO64_UAP(which); 311 1.6 mrg NETBSD32TOP_UAP(rlp, struct orlimit); 312 1.61 simonb return compat_43_sys_getrlimit(l, &ua, retval); 313 1.1 mrg } 314 1.1 mrg 315 1.1 mrg int 316 1.47 dsl compat_43_netbsd32_osetrlimit(struct lwp *l, const struct compat_43_netbsd32_osetrlimit_args *uap, register_t *retval) 317 1.1 mrg { 318 1.47 dsl /* { 319 1.1 mrg syscallarg(int) which; 320 1.5 mrg syscallarg(netbsd32_orlimitp_t) rlp; 321 1.47 dsl } */ 322 1.1 mrg struct compat_43_sys_setrlimit_args ua; 323 1.1 mrg 324 1.6 mrg NETBSD32TO64_UAP(which); 325 1.6 mrg NETBSD32TOP_UAP(rlp, struct orlimit); 326 1.61 simonb return compat_43_sys_setrlimit(l, &ua, retval); 327 1.1 mrg } 328 1.1 mrg 329 1.4 eeh int 330 1.47 dsl compat_43_netbsd32_killpg(struct lwp *l, const struct compat_43_netbsd32_killpg_args *uap, register_t *retval) 331 1.4 eeh { 332 1.47 dsl /* { 333 1.4 eeh syscallarg(int) pgid; 334 1.4 eeh syscallarg(int) signum; 335 1.47 dsl } */ 336 1.4 eeh struct compat_43_sys_killpg_args ua; 337 1.4 eeh 338 1.6 mrg NETBSD32TO64_UAP(pgid); 339 1.6 mrg NETBSD32TO64_UAP(signum); 340 1.61 simonb return compat_43_sys_killpg(l, &ua, retval); 341 1.4 eeh } 342 1.4 eeh 343 1.1 mrg /* virtual memory syscalls */ 344 1.1 mrg int 345 1.47 dsl compat_43_netbsd32_ommap(struct lwp *l, const struct compat_43_netbsd32_ommap_args *uap, register_t *retval) 346 1.1 mrg { 347 1.47 dsl /* { 348 1.51 njoly syscallarg(netbsd32_voidp) addr; 349 1.5 mrg syscallarg(netbsd32_size_t) len; 350 1.1 mrg syscallarg(int) prot; 351 1.1 mrg syscallarg(int) flags; 352 1.1 mrg syscallarg(int) fd; 353 1.5 mrg syscallarg(netbsd32_long) pos; 354 1.47 dsl } */ 355 1.1 mrg struct compat_43_sys_mmap_args ua; 356 1.1 mrg 357 1.38 dsl NETBSD32TOP_UAP(addr, void *); 358 1.6 mrg NETBSD32TOX_UAP(len, size_t); 359 1.6 mrg NETBSD32TO64_UAP(prot); 360 1.6 mrg NETBSD32TO64_UAP(flags); 361 1.6 mrg NETBSD32TO64_UAP(fd); 362 1.6 mrg NETBSD32TOX_UAP(pos, long); 363 1.61 simonb return compat_43_sys_mmap(l, &ua, retval); 364 1.4 eeh } 365 1.4 eeh 366 1.1 mrg /* network syscalls */ 367 1.1 mrg int 368 1.47 dsl compat_43_netbsd32_oaccept(struct lwp *l, const struct compat_43_netbsd32_oaccept_args *uap, register_t *retval) 369 1.1 mrg { 370 1.47 dsl /* { 371 1.1 mrg syscallarg(int) s; 372 1.51 njoly syscallarg(netbsd32_voidp) name; 373 1.5 mrg syscallarg(netbsd32_intp) anamelen; 374 1.47 dsl } */ 375 1.1 mrg struct compat_43_sys_accept_args ua; 376 1.1 mrg 377 1.6 mrg NETBSD32TOX_UAP(s, int); 378 1.38 dsl NETBSD32TOP_UAP(name, void *); 379 1.6 mrg NETBSD32TOP_UAP(anamelen, int); 380 1.61 simonb return compat_43_sys_accept(l, &ua, retval); 381 1.1 mrg } 382 1.1 mrg 383 1.1 mrg int 384 1.47 dsl compat_43_netbsd32_osend(struct lwp *l, const struct compat_43_netbsd32_osend_args *uap, register_t *retval) 385 1.1 mrg { 386 1.47 dsl /* { 387 1.1 mrg syscallarg(int) s; 388 1.51 njoly syscallarg(netbsd32_voidp) buf; 389 1.1 mrg syscallarg(int) len; 390 1.1 mrg syscallarg(int) flags; 391 1.47 dsl } */ 392 1.1 mrg struct compat_43_sys_send_args ua; 393 1.1 mrg 394 1.6 mrg NETBSD32TO64_UAP(s); 395 1.38 dsl NETBSD32TOP_UAP(buf, void *); 396 1.6 mrg NETBSD32TO64_UAP(len); 397 1.6 mrg NETBSD32TO64_UAP(flags); 398 1.61 simonb return compat_43_sys_send(l, &ua, retval); 399 1.1 mrg } 400 1.1 mrg 401 1.1 mrg int 402 1.47 dsl compat_43_netbsd32_orecv(struct lwp *l, const struct compat_43_netbsd32_orecv_args *uap, register_t *retval) 403 1.1 mrg { 404 1.47 dsl /* { 405 1.1 mrg syscallarg(int) s; 406 1.51 njoly syscallarg(netbsd32_voidp) buf; 407 1.1 mrg syscallarg(int) len; 408 1.1 mrg syscallarg(int) flags; 409 1.47 dsl } */ 410 1.1 mrg struct compat_43_sys_recv_args ua; 411 1.1 mrg 412 1.6 mrg NETBSD32TO64_UAP(s); 413 1.38 dsl NETBSD32TOP_UAP(buf, void *); 414 1.6 mrg NETBSD32TO64_UAP(len); 415 1.6 mrg NETBSD32TO64_UAP(flags); 416 1.61 simonb return compat_43_sys_recv(l, &ua, retval); 417 1.1 mrg } 418 1.1 mrg 419 1.1 mrg /* 420 1.44 dsl * This is a brutal clone of compat_43_sys_recvmsg(). 421 1.1 mrg */ 422 1.1 mrg int 423 1.47 dsl compat_43_netbsd32_orecvmsg(struct lwp *l, const struct compat_43_netbsd32_orecvmsg_args *uap, register_t *retval) 424 1.1 mrg { 425 1.47 dsl /* { 426 1.1 mrg syscallarg(int) s; 427 1.5 mrg syscallarg(netbsd32_omsghdrp_t) msg; 428 1.1 mrg syscallarg(int) flags; 429 1.47 dsl } */ 430 1.44 dsl struct netbsd32_omsghdr omsg; 431 1.44 dsl struct msghdr msg; 432 1.44 dsl struct mbuf *from, *control; 433 1.44 dsl struct iovec *iov, aiov[UIO_SMALLIOV]; 434 1.44 dsl int error; 435 1.44 dsl 436 1.59 maxv error = copyin(SCARG_P32(uap, msg), &omsg, sizeof(omsg)); 437 1.44 dsl if (error) 438 1.61 simonb return error; 439 1.1 mrg 440 1.44 dsl if (NETBSD32PTR64(omsg.msg_accrights) == NULL) 441 1.44 dsl omsg.msg_accrightslen = 0; 442 1.44 dsl /* it was this way in 4.4BSD */ 443 1.44 dsl if (omsg.msg_accrightslen > MLEN) 444 1.44 dsl return EINVAL; 445 1.44 dsl 446 1.44 dsl iov = netbsd32_get_iov(NETBSD32PTR64(omsg.msg_iov), omsg.msg_iovlen, 447 1.44 dsl aiov, __arraycount(aiov)); 448 1.44 dsl if (iov == NULL) 449 1.44 dsl return EFAULT; 450 1.44 dsl 451 1.44 dsl msg.msg_name = NETBSD32PTR64(omsg.msg_name); 452 1.44 dsl msg.msg_namelen = omsg.msg_namelen; 453 1.44 dsl msg.msg_iovlen = omsg.msg_iovlen; 454 1.44 dsl msg.msg_iov = iov; 455 1.44 dsl msg.msg_flags = SCARG(uap, flags) & MSG_USERFLAGS; 456 1.44 dsl 457 1.56 christos error = do_sys_recvmsg(l, SCARG(uap, s), &msg, &from, 458 1.44 dsl NETBSD32PTR64(omsg.msg_accrights) != NULL ? &control : NULL, 459 1.44 dsl retval); 460 1.44 dsl if (error != 0) 461 1.52 rmind goto out; 462 1.1 mrg 463 1.16 mrg /* 464 1.44 dsl * If there is any control information and it's SCM_RIGHTS, 465 1.44 dsl * pass it back to the program. 466 1.44 dsl * XXX: maybe there can be more than one chunk of control data? 467 1.16 mrg */ 468 1.44 dsl if (NETBSD32PTR64(omsg.msg_accrights) != NULL && control != NULL) { 469 1.44 dsl struct cmsghdr *cmsg = mtod(control, void *); 470 1.16 mrg 471 1.44 dsl if (cmsg->cmsg_level == SOL_SOCKET 472 1.44 dsl && cmsg->cmsg_type == SCM_RIGHTS 473 1.44 dsl && cmsg->cmsg_len < omsg.msg_accrightslen 474 1.44 dsl && copyout(CMSG_DATA(cmsg), 475 1.44 dsl NETBSD32PTR64(omsg.msg_accrights), 476 1.44 dsl cmsg->cmsg_len) == 0) { 477 1.44 dsl omsg.msg_accrightslen = cmsg->cmsg_len; 478 1.44 dsl free_control_mbuf(l, control, control->m_next); 479 1.44 dsl } else { 480 1.44 dsl omsg.msg_accrightslen = 0; 481 1.44 dsl free_control_mbuf(l, control, control); 482 1.44 dsl } 483 1.44 dsl } else 484 1.44 dsl omsg.msg_accrightslen = 0; 485 1.1 mrg 486 1.44 dsl if (from != NULL) 487 1.44 dsl /* convert from sockaddr sa_family to osockaddr one here */ 488 1.44 dsl mtod(from, struct osockaddr *)->sa_family = 489 1.44 dsl mtod(from, struct sockaddr *)->sa_family; 490 1.44 dsl 491 1.44 dsl error = copyout_sockname(NETBSD32PTR64(omsg.msg_name), 492 1.44 dsl &omsg.msg_namelen, 0, from); 493 1.44 dsl if (from != NULL) 494 1.44 dsl m_free(from); 495 1.1 mrg 496 1.44 dsl if (error != 0) 497 1.44 dsl error = copyout(&omsg, SCARG_P32(uap, msg), sizeof(omsg)); 498 1.52 rmind out: 499 1.52 rmind if (iov != aiov) { 500 1.53 joerg kmem_free(iov, omsg.msg_iovlen * sizeof(*iov)); 501 1.52 rmind } 502 1.44 dsl return error; 503 1.1 mrg } 504 1.1 mrg 505 1.1 mrg int 506 1.47 dsl compat_43_netbsd32_osendmsg(struct lwp *l, const struct compat_43_netbsd32_osendmsg_args *uap, register_t *retval) 507 1.1 mrg { 508 1.47 dsl /* { 509 1.1 mrg syscallarg(int) s; 510 1.51 njoly syscallarg(netbsd32_voidp) msg; 511 1.1 mrg syscallarg(int) flags; 512 1.47 dsl } */ 513 1.44 dsl struct iovec *iov, aiov[UIO_SMALLIOV]; 514 1.44 dsl struct netbsd32_omsghdr omsg; 515 1.44 dsl struct msghdr msg; 516 1.44 dsl struct mbuf *nam; 517 1.44 dsl struct osockaddr *osa; 518 1.44 dsl struct sockaddr *sa; 519 1.52 rmind int error; 520 1.1 mrg 521 1.59 maxv error = copyin(SCARG_P32(uap, msg), &omsg, sizeof(omsg)); 522 1.44 dsl if (error != 0) 523 1.61 simonb return error; 524 1.16 mrg 525 1.44 dsl iov = netbsd32_get_iov(NETBSD32PTR64(omsg.msg_iov), omsg.msg_iovlen, 526 1.44 dsl aiov, __arraycount(aiov)); 527 1.44 dsl if (iov == NULL) 528 1.44 dsl return EFAULT; 529 1.44 dsl 530 1.44 dsl msg.msg_iovlen = omsg.msg_iovlen; 531 1.44 dsl msg.msg_iov = iov; 532 1.44 dsl msg.msg_flags = MSG_NAMEMBUF; 533 1.44 dsl 534 1.44 dsl error = sockargs(&nam, NETBSD32PTR64(omsg.msg_name), omsg.msg_namelen, 535 1.55 christos UIO_USERSPACE, MT_SONAME); 536 1.44 dsl if (error != 0) 537 1.44 dsl goto out; 538 1.44 dsl 539 1.44 dsl sa = mtod(nam, void *); 540 1.44 dsl osa = mtod(nam, void *); 541 1.44 dsl sa->sa_family = osa->sa_family; 542 1.44 dsl sa->sa_len = omsg.msg_namelen; 543 1.44 dsl 544 1.44 dsl msg.msg_name = nam; 545 1.44 dsl msg.msg_namelen = omsg.msg_namelen; 546 1.44 dsl error = compat43_set_accrights(&msg, NETBSD32PTR64(omsg.msg_accrights), 547 1.44 dsl omsg.msg_accrightslen); 548 1.44 dsl if (error != 0) { 549 1.44 dsl m_free(nam); 550 1.44 dsl goto out; 551 1.1 mrg } 552 1.1 mrg 553 1.54 martin error = do_sys_sendmsg(l, SCARG(uap, s), &msg, SCARG(uap, flags), 554 1.56 christos retval); 555 1.44 dsl 556 1.44 dsl out: 557 1.44 dsl if (iov != aiov) 558 1.53 joerg kmem_free(iov, omsg.msg_iovlen * sizeof(*iov)); 559 1.61 simonb return error; 560 1.1 mrg } 561 1.1 mrg 562 1.1 mrg int 563 1.47 dsl compat_43_netbsd32_orecvfrom(struct lwp *l, const struct compat_43_netbsd32_orecvfrom_args *uap, register_t *retval) 564 1.1 mrg { 565 1.47 dsl /* { 566 1.1 mrg syscallarg(int) s; 567 1.51 njoly syscallarg(netbsd32_voidp) buf; 568 1.5 mrg syscallarg(netbsd32_size_t) len; 569 1.1 mrg syscallarg(int) flags; 570 1.51 njoly syscallarg(netbsd32_voidp) from; 571 1.5 mrg syscallarg(netbsd32_intp) fromlenaddr; 572 1.47 dsl } */ 573 1.1 mrg struct compat_43_sys_recvfrom_args ua; 574 1.1 mrg 575 1.6 mrg NETBSD32TO64_UAP(s); 576 1.38 dsl NETBSD32TOP_UAP(buf, void *); 577 1.6 mrg NETBSD32TOX_UAP(len, size_t); 578 1.6 mrg NETBSD32TO64_UAP(flags); 579 1.38 dsl NETBSD32TOP_UAP(from, void *); 580 1.6 mrg NETBSD32TOP_UAP(fromlenaddr, int); 581 1.61 simonb return compat_43_sys_recvfrom(l, &ua, retval); 582 1.1 mrg } 583 1.1 mrg 584 1.1 mrg int 585 1.47 dsl compat_43_netbsd32_ogetsockname(struct lwp *l, const struct compat_43_netbsd32_ogetsockname_args *uap, register_t *retval) 586 1.1 mrg { 587 1.47 dsl /* { 588 1.1 mrg syscallarg(int) fdec; 589 1.51 njoly syscallarg(netbsd32_voidp) asa; 590 1.5 mrg syscallarg(netbsd32_intp) alen; 591 1.47 dsl } */ 592 1.1 mrg struct compat_43_sys_getsockname_args ua; 593 1.1 mrg 594 1.6 mrg NETBSD32TO64_UAP(fdec); 595 1.38 dsl NETBSD32TOP_UAP(asa, void *); 596 1.38 dsl NETBSD32TOP_UAP(alen, int *); 597 1.61 simonb return compat_43_sys_getsockname(l, &ua, retval); 598 1.1 mrg } 599 1.1 mrg 600 1.1 mrg int 601 1.47 dsl compat_43_netbsd32_ogetpeername(struct lwp *l, const struct compat_43_netbsd32_ogetpeername_args *uap, register_t *retval) 602 1.1 mrg { 603 1.47 dsl /* { 604 1.1 mrg syscallarg(int) fdes; 605 1.51 njoly syscallarg(netbsd32_voidp) asa; 606 1.5 mrg syscallarg(netbsd32_intp) alen; 607 1.47 dsl } */ 608 1.1 mrg struct compat_43_sys_getpeername_args ua; 609 1.1 mrg 610 1.6 mrg NETBSD32TO64_UAP(fdes); 611 1.38 dsl NETBSD32TOP_UAP(asa, void *); 612 1.38 dsl NETBSD32TOP_UAP(alen, int *); 613 1.61 simonb return compat_43_sys_getpeername(l, &ua, retval); 614 1.1 mrg } 615 1.1 mrg 616 1.1 mrg /* signal syscalls */ 617 1.1 mrg int 618 1.47 dsl compat_43_netbsd32_osigvec(struct lwp *l, const struct compat_43_netbsd32_osigvec_args *uap, register_t *retval) 619 1.1 mrg { 620 1.47 dsl /* { 621 1.1 mrg syscallarg(int) signum; 622 1.5 mrg syscallarg(netbsd32_sigvecp_t) nsv; 623 1.5 mrg syscallarg(netbsd32_sigvecp_t) osv; 624 1.47 dsl } */ 625 1.16 mrg struct netbsd32_sigvec sv32; 626 1.43 dsl struct sigaction nsa, osa; 627 1.43 dsl int error; 628 1.43 dsl 629 1.43 dsl if (SCARG(uap, signum) >= 32) 630 1.43 dsl return EINVAL; 631 1.1 mrg 632 1.39 dsl if (SCARG_P32(uap, nsv)) { 633 1.39 dsl error = copyin(SCARG_P32(uap, nsv), &sv32, sizeof(sv32)); 634 1.16 mrg if (error) 635 1.43 dsl return error; 636 1.43 dsl nsa.sa_handler = NETBSD32PTR64(sv32.sv_handler); 637 1.43 dsl nsa.sa_mask.__bits[0] = sv32.sv_mask; 638 1.43 dsl nsa.sa_mask.__bits[1] = 0; 639 1.43 dsl nsa.sa_mask.__bits[2] = 0; 640 1.43 dsl nsa.sa_mask.__bits[3] = 0; 641 1.43 dsl nsa.sa_flags = sv32.sv_flags ^ SA_RESTART; 642 1.43 dsl error = sigaction1(l, SCARG(uap, signum), &nsa, &osa, NULL, 0); 643 1.1 mrg } else 644 1.43 dsl error = sigaction1(l, SCARG(uap, signum), NULL, &osa, NULL, 0); 645 1.43 dsl if (error) 646 1.43 dsl return error; 647 1.1 mrg 648 1.39 dsl if (SCARG_P32(uap, osv)) { 649 1.62 riastrad memset(&sv32, 0, sizeof(sv32)); 650 1.43 dsl NETBSD32PTR32(sv32.sv_handler, osa.sa_handler); 651 1.43 dsl sv32.sv_mask = osa.sa_mask.__bits[0]; 652 1.43 dsl sv32.sv_flags = osa.sa_flags ^ SA_RESTART; 653 1.39 dsl error = copyout(&sv32, SCARG_P32(uap, osv), sizeof(sv32)); 654 1.1 mrg } 655 1.1 mrg 656 1.43 dsl return error; 657 1.4 eeh } 658 1.4 eeh 659 1.4 eeh int 660 1.47 dsl compat_43_netbsd32_sigblock(struct lwp *l, const struct compat_43_netbsd32_sigblock_args *uap, register_t *retval) 661 1.4 eeh { 662 1.47 dsl /* { 663 1.4 eeh syscallarg(int) mask; 664 1.47 dsl } */ 665 1.4 eeh struct compat_43_sys_sigblock_args ua; 666 1.4 eeh 667 1.6 mrg NETBSD32TO64_UAP(mask); 668 1.61 simonb return compat_43_sys_sigblock(l, &ua, retval); 669 1.4 eeh } 670 1.4 eeh 671 1.4 eeh int 672 1.47 dsl compat_43_netbsd32_sigsetmask(struct lwp *l, const struct compat_43_netbsd32_sigsetmask_args *uap, register_t *retval) 673 1.4 eeh { 674 1.47 dsl /* { 675 1.4 eeh syscallarg(int) mask; 676 1.47 dsl } */ 677 1.4 eeh struct compat_43_sys_sigsetmask_args ua; 678 1.4 eeh 679 1.6 mrg NETBSD32TO64_UAP(mask); 680 1.61 simonb return compat_43_sys_sigsetmask(l, &ua, retval); 681 1.1 mrg } 682 1.1 mrg 683 1.1 mrg int 684 1.47 dsl compat_43_netbsd32_osigstack(struct lwp *l, const struct compat_43_netbsd32_osigstack_args *uap, register_t *retval) 685 1.1 mrg { 686 1.47 dsl /* { 687 1.5 mrg syscallarg(netbsd32_sigstackp_t) nss; 688 1.5 mrg syscallarg(netbsd32_sigstackp_t) oss; 689 1.47 dsl } */ 690 1.16 mrg struct netbsd32_sigstack ss32; 691 1.63 thorpej stack_t nsa, osa; 692 1.43 dsl int error; 693 1.1 mrg 694 1.39 dsl if (SCARG_P32(uap, nss)) { 695 1.39 dsl error = copyin(SCARG_P32(uap, nss), &ss32, sizeof(ss32)); 696 1.16 mrg if (error) 697 1.43 dsl return error; 698 1.43 dsl nsa.ss_sp = NETBSD32PTR64(ss32.ss_sp); 699 1.43 dsl nsa.ss_size = SIGSTKSZ; /* Use the recommended size */ 700 1.43 dsl nsa.ss_flags = ss32.ss_onstack ? SS_ONSTACK : 0; 701 1.43 dsl error = sigaltstack1(l, &nsa, &osa); 702 1.1 mrg } else 703 1.43 dsl error = sigaltstack1(l, NULL, &osa); 704 1.43 dsl if (error) 705 1.43 dsl return error; 706 1.1 mrg 707 1.39 dsl if (SCARG_P32(uap, oss)) { 708 1.62 riastrad memset(&ss32, 0, sizeof(ss32)); 709 1.43 dsl NETBSD32PTR32(ss32.ss_sp, osa.ss_sp); 710 1.43 dsl ss32.ss_onstack = (osa.ss_flags & SS_ONSTACK) != 0; 711 1.39 dsl error = copyout(&ss32, SCARG_P32(uap, oss), sizeof(ss32)); 712 1.1 mrg } 713 1.1 mrg 714 1.43 dsl return error; 715 1.1 mrg } 716 1.57 pgoyette 717 1.57 pgoyette static struct syscall_package compat_netbsd32_43_syscalls[] = { 718 1.57 pgoyette { NETBSD32_SYS_compat_43_netbsd32_ocreat, 0, 719 1.57 pgoyette (sy_call_t *)compat_43_netbsd32_ocreat }, 720 1.57 pgoyette { NETBSD32_SYS_compat_43_netbsd32_olseek, 0, 721 1.57 pgoyette (sy_call_t *)compat_43_netbsd32_olseek }, 722 1.57 pgoyette { NETBSD32_SYS_compat_43_netbsd32_stat43, 0, 723 1.57 pgoyette (sy_call_t *)compat_43_netbsd32_stat43 }, 724 1.57 pgoyette { NETBSD32_SYS_compat_43_netbsd32_lstat43, 0, 725 1.57 pgoyette (sy_call_t *)compat_43_netbsd32_lstat43 }, 726 1.57 pgoyette { NETBSD32_SYS_compat_43_netbsd32_fstat43, 0, 727 1.57 pgoyette (sy_call_t *)compat_43_netbsd32_fstat43 }, 728 1.57 pgoyette { NETBSD32_SYS_compat_43_netbsd32_otruncate, 0, 729 1.57 pgoyette (sy_call_t *)compat_43_netbsd32_otruncate }, 730 1.57 pgoyette { NETBSD32_SYS_compat_43_netbsd32_oftruncate, 0, 731 1.57 pgoyette (sy_call_t *)compat_43_netbsd32_oftruncate }, 732 1.57 pgoyette { NETBSD32_SYS_compat_43_netbsd32_ogetdirentries, 0, 733 1.57 pgoyette (sy_call_t *)compat_43_netbsd32_ogetdirentries }, 734 1.57 pgoyette { NETBSD32_SYS_compat_43_netbsd32_ogetkerninfo, 0, 735 1.57 pgoyette (sy_call_t *)compat_43_netbsd32_ogetkerninfo }, 736 1.57 pgoyette { NETBSD32_SYS_compat_43_netbsd32_ogethostname, 0, 737 1.57 pgoyette (sy_call_t *)compat_43_netbsd32_ogethostname }, 738 1.57 pgoyette { NETBSD32_SYS_compat_43_netbsd32_osethostname, 0, 739 1.57 pgoyette (sy_call_t *)compat_43_netbsd32_osethostname }, 740 1.57 pgoyette { NETBSD32_SYS_compat_43_netbsd32_sethostid, 0, 741 1.57 pgoyette (sy_call_t *)compat_43_netbsd32_sethostid }, 742 1.57 pgoyette { NETBSD32_SYS_compat_43_netbsd32_ogetrlimit, 0, 743 1.57 pgoyette (sy_call_t *)compat_43_netbsd32_ogetrlimit }, 744 1.57 pgoyette { NETBSD32_SYS_compat_43_netbsd32_osetrlimit, 0, 745 1.57 pgoyette (sy_call_t *)compat_43_netbsd32_osetrlimit }, 746 1.57 pgoyette { NETBSD32_SYS_compat_43_netbsd32_killpg, 0, 747 1.57 pgoyette (sy_call_t *)compat_43_netbsd32_killpg }, 748 1.57 pgoyette { NETBSD32_SYS_compat_43_netbsd32_ommap, 0, 749 1.57 pgoyette (sy_call_t *)compat_43_netbsd32_ommap }, 750 1.57 pgoyette { NETBSD32_SYS_compat_43_netbsd32_oaccept, 0, 751 1.57 pgoyette (sy_call_t *)compat_43_netbsd32_oaccept }, 752 1.57 pgoyette { NETBSD32_SYS_compat_43_netbsd32_osend, 0, 753 1.57 pgoyette (sy_call_t *)compat_43_netbsd32_osend }, 754 1.57 pgoyette { NETBSD32_SYS_compat_43_netbsd32_orecv, 0, 755 1.57 pgoyette (sy_call_t *)compat_43_netbsd32_orecv }, 756 1.57 pgoyette { NETBSD32_SYS_compat_43_netbsd32_orecvmsg, 0, 757 1.57 pgoyette (sy_call_t *)compat_43_netbsd32_orecvmsg }, 758 1.57 pgoyette { NETBSD32_SYS_compat_43_netbsd32_osendmsg, 0, 759 1.57 pgoyette (sy_call_t *)compat_43_netbsd32_osendmsg }, 760 1.57 pgoyette { NETBSD32_SYS_compat_43_netbsd32_orecvfrom, 0, 761 1.57 pgoyette (sy_call_t *)compat_43_netbsd32_orecvfrom }, 762 1.57 pgoyette { NETBSD32_SYS_compat_43_netbsd32_ogetsockname, 0, 763 1.57 pgoyette (sy_call_t *)compat_43_netbsd32_ogetsockname }, 764 1.57 pgoyette { NETBSD32_SYS_compat_43_netbsd32_ogetpeername, 0, 765 1.57 pgoyette (sy_call_t *)compat_43_netbsd32_ogetpeername }, 766 1.57 pgoyette { NETBSD32_SYS_compat_43_netbsd32_osigvec, 0, 767 1.57 pgoyette (sy_call_t *)compat_43_netbsd32_osigvec }, 768 1.57 pgoyette { NETBSD32_SYS_compat_43_netbsd32_sigblock, 0, 769 1.57 pgoyette (sy_call_t *)compat_43_netbsd32_sigblock }, 770 1.57 pgoyette { NETBSD32_SYS_compat_43_netbsd32_sigsetmask, 0, 771 1.57 pgoyette (sy_call_t *)compat_43_netbsd32_sigsetmask }, 772 1.57 pgoyette { NETBSD32_SYS_compat_43_netbsd32_osigstack, 0, 773 1.57 pgoyette (sy_call_t *)compat_43_netbsd32_osigstack }, 774 1.60 pgoyette /* 775 1.60 pgoyette * These syscalls are provided by emul_netbsd compat_43 code, but their 776 1.60 pgoyette * entry points must still be loaded in the emul_netbsd32 disatch table 777 1.60 pgoyette */ 778 1.60 pgoyette { NETBSD32_SYS_compat_43_ogetpagesize, 0, 779 1.60 pgoyette (sy_call_t *)compat_43_sys_getpagesize }, 780 1.60 pgoyette { NETBSD32_SYS_compat_43_ogetdtablesize, 0, 781 1.60 pgoyette (sy_call_t *)compat_43_sys_getdtablesize}, 782 1.60 pgoyette { NETBSD32_SYS_compat_43_ogethostid, 0, 783 1.60 pgoyette (sy_call_t *)compat_43_sys_gethostid }, 784 1.60 pgoyette { NETBSD32_SYS_compat_43_owait, 0, 785 1.60 pgoyette (sy_call_t *)compat_43_sys_wait }, 786 1.60 pgoyette /* 787 1.60 pgoyette * Skip oquota since it isn't part of compat_43 788 1.60 pgoyette * { NETBSD32_SYS_compat_43_oquota, 0, 789 1.60 pgoyette * (sy_call_t *)compat_43_sys_quota }, 790 1.60 pgoyette */ 791 1.60 pgoyette 792 1.60 pgoyette /* End of compat_43 syscalls */ 793 1.60 pgoyette 794 1.57 pgoyette { 0, 0, NULL } 795 1.57 pgoyette }; 796 1.57 pgoyette 797 1.57 pgoyette MODULE(MODULE_CLASS_EXEC, compat_netbsd32_43, "compat_netbsd32,compat_43"); 798 1.57 pgoyette 799 1.57 pgoyette static int 800 1.57 pgoyette compat_netbsd32_43_modcmd(modcmd_t cmd, void *arg) 801 1.57 pgoyette { 802 1.57 pgoyette 803 1.57 pgoyette switch (cmd) { 804 1.57 pgoyette case MODULE_CMD_INIT: 805 1.57 pgoyette return syscall_establish(&emul_netbsd32, 806 1.57 pgoyette compat_netbsd32_43_syscalls); 807 1.57 pgoyette 808 1.57 pgoyette case MODULE_CMD_FINI: 809 1.57 pgoyette return syscall_disestablish(&emul_netbsd32, 810 1.57 pgoyette compat_netbsd32_43_syscalls); 811 1.57 pgoyette 812 1.57 pgoyette default: 813 1.57 pgoyette return ENOTTY; 814 1.57 pgoyette } 815 1.57 pgoyette } 816