1 1.56 rin /* $NetBSD: netbsd32_compat_50.c,v 1.56 2023/07/29 13:40:51 rin Exp $ */ 2 1.2 christos 3 1.2 christos /*- 4 1.45 ad * Copyright (c) 2008, 2020 The NetBSD Foundation, Inc. 5 1.2 christos * All rights reserved. 6 1.2 christos * 7 1.2 christos * This code is derived from software contributed to The NetBSD Foundation 8 1.2 christos * by Christos Zoulas. 9 1.2 christos * 10 1.2 christos * Redistribution and use in source and binary forms, with or without 11 1.2 christos * modification, are permitted provided that the following conditions 12 1.2 christos * are met: 13 1.2 christos * 1. Redistributions of source code must retain the above copyright 14 1.2 christos * notice, this list of conditions and the following disclaimer. 15 1.2 christos * 2. Redistributions in binary form must reproduce the above copyright 16 1.2 christos * notice, this list of conditions and the following disclaimer in the 17 1.2 christos * documentation and/or other materials provided with the distribution. 18 1.2 christos * 19 1.2 christos * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.2 christos * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.2 christos * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.2 christos * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.2 christos * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.2 christos * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.2 christos * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.2 christos * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.2 christos * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.2 christos * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.2 christos * POSSIBILITY OF SUCH DAMAGE. 30 1.2 christos */ 31 1.2 christos #include <sys/cdefs.h> 32 1.56 rin __KERNEL_RCSID(0, "$NetBSD: netbsd32_compat_50.c,v 1.56 2023/07/29 13:40:51 rin Exp $"); 33 1.2 christos 34 1.2 christos #if defined(_KERNEL_OPT) 35 1.32 pgoyette #include "opt_compat_netbsd.h" 36 1.39 christos #include "opt_compat_netbsd32.h" 37 1.37 christos #include "opt_ntp.h" 38 1.37 christos #include "opt_quota.h" 39 1.8 njoly #endif 40 1.2 christos 41 1.34 pgoyette 42 1.2 christos #include <sys/param.h> 43 1.2 christos #include <sys/systm.h> 44 1.34 pgoyette #include <sys/module.h> 45 1.2 christos #include <sys/mount.h> 46 1.2 christos #include <sys/socket.h> 47 1.2 christos #include <sys/socketvar.h> 48 1.2 christos #include <sys/stat.h> 49 1.2 christos #include <sys/time.h> 50 1.53 riastrad #include <sys/timevar.h> 51 1.53 riastrad #include <sys/timex.h> 52 1.2 christos #include <sys/ktrace.h> 53 1.2 christos #include <sys/eventvar.h> 54 1.2 christos #include <sys/resourcevar.h> 55 1.2 christos #include <sys/vnode.h> 56 1.2 christos #include <sys/file.h> 57 1.2 christos #include <sys/filedesc.h> 58 1.2 christos #include <sys/poll.h> 59 1.2 christos #include <sys/namei.h> 60 1.2 christos #include <sys/statvfs.h> 61 1.2 christos #include <sys/syscallargs.h> 62 1.34 pgoyette #include <sys/syscallvar.h> 63 1.2 christos #include <sys/proc.h> 64 1.2 christos #include <sys/dirent.h> 65 1.2 christos #include <sys/kauth.h> 66 1.2 christos #include <sys/vfs_syscalls.h> 67 1.34 pgoyette #include <sys/compat_stub.h> 68 1.34 pgoyette #include <sys/module_hook.h> 69 1.2 christos 70 1.2 christos #include <compat/netbsd32/netbsd32.h> 71 1.34 pgoyette #include <compat/netbsd32/netbsd32_syscall.h> 72 1.2 christos #include <compat/netbsd32/netbsd32_syscallargs.h> 73 1.2 christos #include <compat/netbsd32/netbsd32_conv.h> 74 1.54 rin #include <compat/netbsd32/netbsd32_event.h> 75 1.2 christos #include <compat/sys/mount.h> 76 1.2 christos #include <compat/sys/time.h> 77 1.34 pgoyette #include <compat/sys/rnd.h> 78 1.2 christos 79 1.32 pgoyette #if defined(COMPAT_50) 80 1.2 christos 81 1.2 christos /* 82 1.2 christos * Common routine to set access and modification times given a vnode. 83 1.2 christos */ 84 1.2 christos static int 85 1.2 christos get_utimes32(const netbsd32_timeval50p_t *tptr, struct timeval *tv, 86 1.2 christos struct timeval **tvp) 87 1.2 christos { 88 1.2 christos int error; 89 1.2 christos struct netbsd32_timeval50 tv32[2]; 90 1.2 christos 91 1.2 christos if (tptr == NULL) { 92 1.2 christos *tvp = NULL; 93 1.2 christos return 0; 94 1.2 christos } 95 1.2 christos 96 1.2 christos error = copyin(tptr, tv32, sizeof(tv32)); 97 1.2 christos if (error) 98 1.2 christos return error; 99 1.2 christos netbsd32_to_timeval50(&tv32[0], &tv[0]); 100 1.2 christos netbsd32_to_timeval50(&tv32[1], &tv[1]); 101 1.2 christos 102 1.2 christos *tvp = tv; 103 1.2 christos return 0; 104 1.2 christos } 105 1.2 christos 106 1.2 christos int 107 1.2 christos compat_50_netbsd32_mknod(struct lwp *l, 108 1.2 christos const struct compat_50_netbsd32_mknod_args *uap, register_t *retval) 109 1.2 christos { 110 1.2 christos /* { 111 1.2 christos syscallarg(netbsd32_charp) path; 112 1.2 christos syscallarg(mode_t) mode; 113 1.2 christos syscallarg(uint32_t) dev; 114 1.2 christos } */ 115 1.2 christos return do_sys_mknod(l, SCARG_P32(uap, path), SCARG(uap, mode), 116 1.38 kamil SCARG(uap, dev), UIO_USERSPACE); 117 1.2 christos } 118 1.2 christos 119 1.2 christos int 120 1.2 christos compat_50_netbsd32_select(struct lwp *l, 121 1.2 christos const struct compat_50_netbsd32_select_args *uap, register_t *retval) 122 1.2 christos { 123 1.2 christos /* { 124 1.2 christos syscallarg(int) nd; 125 1.2 christos syscallarg(netbsd32_fd_setp_t) in; 126 1.2 christos syscallarg(netbsd32_fd_setp_t) ou; 127 1.2 christos syscallarg(netbsd32_fd_setp_t) ex; 128 1.2 christos syscallarg(netbsd32_timeval50p_t) tv; 129 1.2 christos } */ 130 1.2 christos int error; 131 1.2 christos struct netbsd32_timeval50 tv32; 132 1.4 christos struct timespec ats, *ts = NULL; 133 1.2 christos 134 1.2 christos if (SCARG_P32(uap, tv)) { 135 1.2 christos error = copyin(SCARG_P32(uap, tv), &tv32, sizeof(tv32)); 136 1.2 christos if (error != 0) 137 1.2 christos return error; 138 1.40 kamil 139 1.40 kamil if (tv32.tv_usec < 0 || tv32.tv_usec >= 1000000) 140 1.40 kamil return EINVAL; 141 1.40 kamil 142 1.4 christos ats.tv_sec = tv32.tv_sec; 143 1.4 christos ats.tv_nsec = tv32.tv_usec * 1000; 144 1.4 christos ts = &ats; 145 1.2 christos } 146 1.2 christos 147 1.7 rmind return selcommon(retval, SCARG(uap, nd), SCARG_P32(uap, in), 148 1.4 christos SCARG_P32(uap, ou), SCARG_P32(uap, ex), ts, NULL); 149 1.2 christos } 150 1.2 christos 151 1.2 christos int 152 1.2 christos compat_50_netbsd32_gettimeofday(struct lwp *l, 153 1.2 christos const struct compat_50_netbsd32_gettimeofday_args *uap, register_t *retval) 154 1.2 christos { 155 1.2 christos /* { 156 1.2 christos syscallarg(netbsd32_timeval50p_t) tp; 157 1.2 christos syscallarg(netbsd32_timezonep_t) tzp; 158 1.2 christos } */ 159 1.2 christos struct timeval atv; 160 1.2 christos struct netbsd32_timeval50 tv32; 161 1.2 christos int error = 0; 162 1.2 christos struct netbsd32_timezone tzfake; 163 1.2 christos 164 1.2 christos if (SCARG_P32(uap, tp)) { 165 1.2 christos microtime(&atv); 166 1.2 christos netbsd32_from_timeval50(&atv, &tv32); 167 1.2 christos error = copyout(&tv32, SCARG_P32(uap, tp), sizeof(tv32)); 168 1.2 christos if (error) 169 1.2 christos return error; 170 1.2 christos } 171 1.2 christos if (SCARG_P32(uap, tzp)) { 172 1.2 christos /* 173 1.2 christos * NetBSD has no kernel notion of time zone, so we just 174 1.2 christos * fake up a timezone struct and return it if demanded. 175 1.2 christos */ 176 1.52 riastrad memset(&tzfake, 0, sizeof(tzfake)); 177 1.2 christos tzfake.tz_minuteswest = 0; 178 1.2 christos tzfake.tz_dsttime = 0; 179 1.2 christos error = copyout(&tzfake, SCARG_P32(uap, tzp), sizeof(tzfake)); 180 1.2 christos } 181 1.2 christos return error; 182 1.2 christos } 183 1.2 christos 184 1.2 christos int 185 1.2 christos compat_50_netbsd32_settimeofday(struct lwp *l, 186 1.2 christos const struct compat_50_netbsd32_settimeofday_args *uap, register_t *retval) 187 1.2 christos { 188 1.2 christos /* { 189 1.2 christos syscallarg(const netbsd32_timeval50p_t) tv; 190 1.2 christos syscallarg(const netbsd32_timezonep_t) tzp; 191 1.2 christos } */ 192 1.2 christos struct netbsd32_timeval50 atv32; 193 1.2 christos struct timeval atv; 194 1.2 christos struct timespec ats; 195 1.2 christos int error; 196 1.2 christos struct proc *p = l->l_proc; 197 1.2 christos 198 1.2 christos /* Verify all parameters before changing time. */ 199 1.2 christos 200 1.2 christos /* 201 1.2 christos * NetBSD has no kernel notion of time zone, and only an 202 1.2 christos * obsolete program would try to set it, so we log a warning. 203 1.2 christos */ 204 1.2 christos if (SCARG_P32(uap, tzp)) 205 1.2 christos printf("pid %d attempted to set the " 206 1.2 christos "(obsolete) kernel time zone\n", p->p_pid); 207 1.2 christos 208 1.2 christos if (SCARG_P32(uap, tv) == 0) 209 1.2 christos return 0; 210 1.2 christos 211 1.2 christos if ((error = copyin(SCARG_P32(uap, tv), &atv32, sizeof(atv32))) != 0) 212 1.2 christos return error; 213 1.2 christos 214 1.2 christos netbsd32_to_timeval50(&atv32, &atv); 215 1.41 kamil 216 1.41 kamil if (atv.tv_usec < 0 || atv.tv_usec >= 1000000) 217 1.41 kamil return EINVAL; 218 1.41 kamil 219 1.2 christos TIMEVAL_TO_TIMESPEC(&atv, &ats); 220 1.2 christos return settime(p, &ats); 221 1.2 christos } 222 1.2 christos 223 1.2 christos int 224 1.2 christos compat_50_netbsd32_utimes(struct lwp *l, 225 1.2 christos const struct compat_50_netbsd32_utimes_args *uap, register_t *retval) 226 1.2 christos { 227 1.2 christos /* { 228 1.2 christos syscallarg(const netbsd32_charp) path; 229 1.2 christos syscallarg(const netbsd32_timeval50p_t) tptr; 230 1.2 christos } */ 231 1.2 christos int error; 232 1.2 christos struct timeval tv[2], *tvp; 233 1.2 christos 234 1.2 christos error = get_utimes32(SCARG_P32(uap, tptr), tv, &tvp); 235 1.2 christos if (error != 0) 236 1.2 christos return error; 237 1.2 christos 238 1.2 christos return do_sys_utimes(l, NULL, SCARG_P32(uap, path), FOLLOW, 239 1.2 christos tvp, UIO_SYSSPACE); 240 1.2 christos } 241 1.2 christos 242 1.2 christos int 243 1.2 christos compat_50_netbsd32_adjtime(struct lwp *l, 244 1.2 christos const struct compat_50_netbsd32_adjtime_args *uap, register_t *retval) 245 1.2 christos { 246 1.2 christos /* { 247 1.2 christos syscallarg(const netbsd32_timeval50p_t) delta; 248 1.2 christos syscallarg(netbsd32_timeval50p_t) olddelta; 249 1.2 christos } */ 250 1.2 christos struct netbsd32_timeval50 atv; 251 1.2 christos int error; 252 1.2 christos 253 1.2 christos if ((error = kauth_authorize_system(l->l_cred, 254 1.2 christos KAUTH_SYSTEM_TIME, KAUTH_REQ_SYSTEM_TIME_ADJTIME, NULL, NULL, 255 1.2 christos NULL)) != 0) 256 1.50 simonb return error; 257 1.2 christos 258 1.2 christos if (SCARG_P32(uap, olddelta)) { 259 1.52 riastrad memset(&atv, 0, sizeof(atv)); 260 1.52 riastrad 261 1.28 christos mutex_spin_enter(&timecounter_lock); 262 1.2 christos atv.tv_sec = time_adjtime / 1000000; 263 1.2 christos atv.tv_usec = time_adjtime % 1000000; 264 1.2 christos if (atv.tv_usec < 0) { 265 1.2 christos atv.tv_usec += 1000000; 266 1.2 christos atv.tv_sec--; 267 1.2 christos } 268 1.28 christos mutex_spin_exit(&timecounter_lock); 269 1.28 christos 270 1.28 christos error = copyout(&atv, SCARG_P32(uap, olddelta), sizeof(atv)); 271 1.2 christos if (error) 272 1.50 simonb return error; 273 1.2 christos } 274 1.2 christos 275 1.2 christos if (SCARG_P32(uap, delta)) { 276 1.28 christos error = copyin(SCARG_P32(uap, delta), &atv, sizeof(atv)); 277 1.2 christos if (error) 278 1.50 simonb return error; 279 1.2 christos 280 1.28 christos mutex_spin_enter(&timecounter_lock); 281 1.2 christos time_adjtime = (int64_t)atv.tv_sec * 1000000 + atv.tv_usec; 282 1.2 christos if (time_adjtime) 283 1.2 christos /* We need to save the system time during shutdown */ 284 1.2 christos time_adjusted |= 1; 285 1.28 christos mutex_spin_exit(&timecounter_lock); 286 1.2 christos } 287 1.2 christos 288 1.2 christos return 0; 289 1.2 christos } 290 1.2 christos 291 1.2 christos int 292 1.2 christos compat_50_netbsd32_futimes(struct lwp *l, 293 1.2 christos const struct compat_50_netbsd32_futimes_args *uap, register_t *retval) 294 1.2 christos { 295 1.2 christos /* { 296 1.2 christos syscallarg(int) fd; 297 1.2 christos syscallarg(const netbsd32_timeval50p_t) tptr; 298 1.2 christos } */ 299 1.2 christos int error; 300 1.2 christos file_t *fp; 301 1.2 christos struct timeval tv[2], *tvp; 302 1.2 christos 303 1.2 christos error = get_utimes32(SCARG_P32(uap, tptr), tv, &tvp); 304 1.2 christos if (error != 0) 305 1.2 christos return error; 306 1.2 christos 307 1.2 christos /* fd_getvnode() will use the descriptor for us */ 308 1.2 christos if ((error = fd_getvnode(SCARG(uap, fd), &fp)) != 0) 309 1.2 christos return error; 310 1.2 christos 311 1.27 matt error = do_sys_utimes(l, fp->f_vnode, NULL, 0, tvp, UIO_SYSSPACE); 312 1.2 christos 313 1.2 christos fd_putfile(SCARG(uap, fd)); 314 1.2 christos return error; 315 1.2 christos } 316 1.2 christos 317 1.2 christos int 318 1.2 christos compat_50_netbsd32_clock_gettime(struct lwp *l, 319 1.2 christos const struct compat_50_netbsd32_clock_gettime_args *uap, register_t *retval) 320 1.2 christos { 321 1.2 christos /* { 322 1.2 christos syscallarg(netbsd32_clockid_t) clock_id; 323 1.2 christos syscallarg(netbsd32_timespec50p_t) tp; 324 1.2 christos } */ 325 1.15 njoly int error; 326 1.2 christos struct timespec ats; 327 1.2 christos struct netbsd32_timespec50 ts32; 328 1.2 christos 329 1.15 njoly error = clock_gettime1(SCARG(uap, clock_id), &ats); 330 1.15 njoly if (error != 0) 331 1.15 njoly return error; 332 1.2 christos 333 1.2 christos netbsd32_from_timespec50(&ats, &ts32); 334 1.2 christos return copyout(&ts32, SCARG_P32(uap, tp), sizeof(ts32)); 335 1.2 christos } 336 1.2 christos 337 1.2 christos int 338 1.2 christos compat_50_netbsd32_clock_settime(struct lwp *l, 339 1.2 christos const struct compat_50_netbsd32_clock_settime_args *uap, register_t *retval) 340 1.2 christos { 341 1.2 christos /* { 342 1.2 christos syscallarg(netbsd32_clockid_t) clock_id; 343 1.2 christos syscallarg(const netbsd32_timespec50p_t) tp; 344 1.2 christos } */ 345 1.2 christos struct netbsd32_timespec50 ts32; 346 1.2 christos struct timespec ats; 347 1.2 christos int error; 348 1.2 christos 349 1.2 christos if ((error = copyin(SCARG_P32(uap, tp), &ts32, sizeof(ts32))) != 0) 350 1.50 simonb return error; 351 1.2 christos 352 1.2 christos netbsd32_to_timespec50(&ts32, &ats); 353 1.13 njoly return clock_settime1(l->l_proc, SCARG(uap, clock_id), &ats, true); 354 1.2 christos } 355 1.2 christos 356 1.2 christos int 357 1.2 christos compat_50_netbsd32_clock_getres(struct lwp *l, 358 1.2 christos const struct compat_50_netbsd32_clock_getres_args *uap, register_t *retval) 359 1.2 christos { 360 1.2 christos /* { 361 1.2 christos syscallarg(netbsd32_clockid_t) clock_id; 362 1.2 christos syscallarg(netbsd32_timespec50p_t) tp; 363 1.2 christos } */ 364 1.2 christos struct netbsd32_timespec50 ts32; 365 1.2 christos struct timespec ts; 366 1.30 maxv int error; 367 1.2 christos 368 1.14 njoly error = clock_getres1(SCARG(uap, clock_id), &ts); 369 1.14 njoly if (error != 0) 370 1.14 njoly return error; 371 1.2 christos 372 1.2 christos if (SCARG_P32(uap, tp)) { 373 1.2 christos netbsd32_from_timespec50(&ts, &ts32); 374 1.12 njoly error = copyout(&ts32, SCARG_P32(uap, tp), sizeof(ts32)); 375 1.2 christos } 376 1.2 christos 377 1.2 christos return error; 378 1.2 christos } 379 1.2 christos 380 1.2 christos int 381 1.2 christos compat_50_netbsd32_timer_settime(struct lwp *l, 382 1.2 christos const struct compat_50_netbsd32_timer_settime_args *uap, register_t *retval) 383 1.2 christos { 384 1.2 christos /* { 385 1.2 christos syscallarg(netbsd32_timer_t) timerid; 386 1.2 christos syscallarg(int) flags; 387 1.2 christos syscallarg(const netbsd32_itimerspec50p_t) value; 388 1.2 christos syscallarg(netbsd32_itimerspec50p_t) ovalue; 389 1.2 christos } */ 390 1.2 christos int error; 391 1.2 christos struct itimerspec value, ovalue, *ovp = NULL; 392 1.2 christos struct netbsd32_itimerspec50 its32; 393 1.2 christos 394 1.2 christos if ((error = copyin(SCARG_P32(uap, value), &its32, sizeof(its32))) != 0) 395 1.50 simonb return error; 396 1.2 christos netbsd32_to_timespec50(&its32.it_interval, &value.it_interval); 397 1.2 christos netbsd32_to_timespec50(&its32.it_value, &value.it_value); 398 1.2 christos 399 1.2 christos if (SCARG_P32(uap, ovalue)) 400 1.2 christos ovp = &ovalue; 401 1.2 christos 402 1.2 christos if ((error = dotimer_settime(SCARG(uap, timerid), &value, ovp, 403 1.2 christos SCARG(uap, flags), l->l_proc)) != 0) 404 1.2 christos return error; 405 1.2 christos 406 1.2 christos if (ovp) { 407 1.52 riastrad memset(&its32, 0, sizeof(its32)); 408 1.2 christos netbsd32_from_timespec50(&ovp->it_interval, &its32.it_interval); 409 1.2 christos netbsd32_from_timespec50(&ovp->it_value, &its32.it_value); 410 1.2 christos return copyout(&its32, SCARG_P32(uap, ovalue), sizeof(its32)); 411 1.2 christos } 412 1.2 christos return 0; 413 1.2 christos } 414 1.2 christos 415 1.2 christos int 416 1.2 christos compat_50_netbsd32_timer_gettime(struct lwp *l, const struct compat_50_netbsd32_timer_gettime_args *uap, register_t *retval) 417 1.2 christos { 418 1.2 christos /* { 419 1.2 christos syscallarg(netbsd32_timer_t) timerid; 420 1.2 christos syscallarg(netbsd32_itimerspec50p_t) value; 421 1.2 christos } */ 422 1.2 christos int error; 423 1.2 christos struct itimerspec its; 424 1.2 christos struct netbsd32_itimerspec50 its32; 425 1.2 christos 426 1.2 christos if ((error = dotimer_gettime(SCARG(uap, timerid), l->l_proc, 427 1.2 christos &its)) != 0) 428 1.2 christos return error; 429 1.2 christos 430 1.52 riastrad memset(&its32, 0, sizeof(its32)); 431 1.52 riastrad 432 1.2 christos netbsd32_from_timespec50(&its.it_interval, &its32.it_interval); 433 1.2 christos netbsd32_from_timespec50(&its.it_value, &its32.it_value); 434 1.2 christos 435 1.2 christos return copyout(&its32, SCARG_P32(uap, value), sizeof(its32)); 436 1.2 christos } 437 1.2 christos 438 1.2 christos int 439 1.2 christos compat_50_netbsd32_nanosleep(struct lwp *l, 440 1.2 christos const struct compat_50_netbsd32_nanosleep_args *uap, register_t *retval) 441 1.2 christos { 442 1.2 christos /* { 443 1.2 christos syscallarg(const netbsd32_timespec50p_t) rqtp; 444 1.2 christos syscallarg(netbsd32_timespecp_t) rmtp; 445 1.2 christos } */ 446 1.2 christos struct netbsd32_timespec50 ts32; 447 1.11 njoly struct timespec rqt, rmt; 448 1.11 njoly int error, error1; 449 1.2 christos 450 1.2 christos error = copyin(SCARG_P32(uap, rqtp), &ts32, sizeof(ts32)); 451 1.2 christos if (error) 452 1.50 simonb return error; 453 1.2 christos netbsd32_to_timespec50(&ts32, &rqt); 454 1.2 christos 455 1.21 christos error = nanosleep1(l, CLOCK_MONOTONIC, 0, &rqt, 456 1.21 christos SCARG_P32(uap, rmtp) ? &rmt : NULL); 457 1.11 njoly if (SCARG_P32(uap, rmtp) == NULL || (error != 0 && error != EINTR)) 458 1.11 njoly return error; 459 1.2 christos 460 1.11 njoly netbsd32_from_timespec50(&rmt, &ts32); 461 1.11 njoly error1 = copyout(&ts32, SCARG_P32(uap,rmtp), sizeof(ts32)); 462 1.11 njoly return error1 ? error1 : error; 463 1.2 christos } 464 1.2 christos 465 1.2 christos static int 466 1.2 christos compat_50_netbsd32_sigtimedwait_put_info(const void *src, void *dst, size_t size) 467 1.2 christos { 468 1.2 christos const siginfo_t *info = src; 469 1.2 christos siginfo32_t info32; 470 1.2 christos 471 1.2 christos netbsd32_si_to_si32(&info32, info); 472 1.2 christos 473 1.2 christos return copyout(&info32, dst, sizeof(info32)); 474 1.2 christos } 475 1.2 christos 476 1.2 christos static int 477 1.2 christos compat_50_netbsd32_sigtimedwait_fetch_timeout(const void *src, void *dst, size_t size) 478 1.2 christos { 479 1.2 christos struct timespec *ts = dst; 480 1.2 christos struct netbsd32_timespec50 ts32; 481 1.2 christos int error; 482 1.2 christos 483 1.2 christos error = copyin(src, &ts32, sizeof(ts32)); 484 1.2 christos if (error) 485 1.2 christos return error; 486 1.2 christos 487 1.2 christos netbsd32_to_timespec50(&ts32, ts); 488 1.2 christos return 0; 489 1.2 christos } 490 1.2 christos 491 1.2 christos static int 492 1.2 christos compat_50_netbsd32_sigtimedwait_put_timeout(const void *src, void *dst, size_t size) 493 1.2 christos { 494 1.2 christos const struct timespec *ts = src; 495 1.2 christos struct netbsd32_timespec50 ts32; 496 1.2 christos 497 1.2 christos netbsd32_from_timespec50(ts, &ts32); 498 1.2 christos 499 1.2 christos return copyout(&ts32, dst, sizeof(ts32)); 500 1.2 christos } 501 1.2 christos 502 1.2 christos int 503 1.2 christos compat_50_netbsd32___sigtimedwait(struct lwp *l, 504 1.2 christos const struct compat_50_netbsd32___sigtimedwait_args *uap, register_t *retval) 505 1.2 christos { 506 1.2 christos /* { 507 1.2 christos syscallarg(netbsd32_sigsetp_t) set; 508 1.2 christos syscallarg(netbsd32_siginfop_t) info; 509 1.2 christos syscallarg(netbsd32_timespec50p_t) timeout; 510 1.2 christos } */ 511 1.2 christos struct sys_____sigtimedwait50_args ua; 512 1.17 drochner int res; 513 1.2 christos 514 1.2 christos NETBSD32TOP_UAP(set, const sigset_t); 515 1.2 christos NETBSD32TOP_UAP(info, siginfo_t); 516 1.2 christos NETBSD32TOP_UAP(timeout, struct timespec); 517 1.2 christos 518 1.17 drochner res = sigtimedwait1(l, &ua, retval, 519 1.20 christos copyin, 520 1.2 christos compat_50_netbsd32_sigtimedwait_put_info, 521 1.2 christos compat_50_netbsd32_sigtimedwait_fetch_timeout, 522 1.2 christos compat_50_netbsd32_sigtimedwait_put_timeout); 523 1.17 drochner if (!res) 524 1.33 mrg *retval = 0; /* NetBSD<=5 was not POSIX compliant */ 525 1.17 drochner return res; 526 1.2 christos } 527 1.2 christos 528 1.2 christos int 529 1.2 christos compat_50_netbsd32_lutimes(struct lwp *l, 530 1.2 christos const struct compat_50_netbsd32_lutimes_args *uap, register_t *retval) 531 1.2 christos { 532 1.2 christos /* { 533 1.2 christos syscallarg(const netbsd32_charp) path; 534 1.2 christos syscallarg(const netbsd32_timeval50p_t) tptr; 535 1.2 christos } */ 536 1.2 christos int error; 537 1.2 christos struct timeval tv[2], *tvp; 538 1.2 christos 539 1.2 christos error = get_utimes32(SCARG_P32(uap, tptr), tv, &tvp); 540 1.2 christos if (error != 0) 541 1.2 christos return error; 542 1.2 christos 543 1.2 christos return do_sys_utimes(l, NULL, SCARG_P32(uap, path), NOFOLLOW, 544 1.2 christos tvp, UIO_SYSSPACE); 545 1.2 christos } 546 1.2 christos 547 1.2 christos int 548 1.2 christos compat_50_netbsd32__lwp_park(struct lwp *l, 549 1.2 christos const struct compat_50_netbsd32__lwp_park_args *uap, register_t *retval) 550 1.2 christos { 551 1.2 christos /* { 552 1.2 christos syscallarg(const netbsd32_timespec50p) ts; 553 1.2 christos syscallarg(lwpid_t) unpark; 554 1.2 christos syscallarg(netbsd32_voidp) hint; 555 1.2 christos syscallarg(netbsd32_voidp) unparkhint; 556 1.2 christos } */ 557 1.2 christos struct timespec ts, *tsp; 558 1.2 christos struct netbsd32_timespec50 ts32; 559 1.2 christos int error; 560 1.2 christos 561 1.2 christos if (SCARG_P32(uap, ts) == NULL) 562 1.2 christos tsp = NULL; 563 1.2 christos else { 564 1.2 christos error = copyin(SCARG_P32(uap, ts), &ts32, sizeof ts32); 565 1.2 christos if (error != 0) 566 1.2 christos return error; 567 1.2 christos netbsd32_to_timespec50(&ts32, &ts); 568 1.2 christos tsp = &ts; 569 1.2 christos } 570 1.2 christos 571 1.2 christos if (SCARG(uap, unpark) != 0) { 572 1.45 ad error = lwp_unpark(&SCARG(uap, unpark), 1); 573 1.2 christos if (error != 0) 574 1.2 christos return error; 575 1.2 christos } 576 1.2 christos 577 1.45 ad return lwp_park(CLOCK_REALTIME, TIMER_ABSTIME, tsp); 578 1.2 christos } 579 1.2 christos 580 1.2 christos static int 581 1.54 rin compat_50_netbsd32_kevent_fetch_timeout(const void *src, void *dest, 582 1.54 rin size_t length) 583 1.2 christos { 584 1.2 christos struct netbsd32_timespec50 ts32; 585 1.2 christos int error; 586 1.2 christos 587 1.2 christos KASSERT(length == sizeof(struct timespec50)); 588 1.2 christos 589 1.2 christos error = copyin(src, &ts32, sizeof(ts32)); 590 1.2 christos if (error) 591 1.2 christos return error; 592 1.2 christos netbsd32_to_timespec50(&ts32, (struct timespec *)dest); 593 1.2 christos return 0; 594 1.2 christos } 595 1.2 christos 596 1.2 christos int 597 1.2 christos compat_50_netbsd32_kevent(struct lwp *l, 598 1.2 christos const struct compat_50_netbsd32_kevent_args *uap, register_t *retval) 599 1.2 christos { 600 1.2 christos /* { 601 1.2 christos syscallarg(int) fd; 602 1.54 rin syscallarg(netbsd32_kevent100p_t) changelist; 603 1.2 christos syscallarg(netbsd32_size_t) nchanges; 604 1.54 rin syscallarg(netbsd32_kevent100p_t) eventlist; 605 1.2 christos syscallarg(netbsd32_size_t) nevents; 606 1.2 christos syscallarg(netbsd32_timespec50p_t) timeout; 607 1.2 christos } */ 608 1.54 rin struct kevent_ops kops = { 609 1.54 rin .keo_fetch_timeout = compat_50_netbsd32_kevent_fetch_timeout, 610 1.54 rin .keo_fetch_changes = compat_100_netbsd32_kevent_fetch_changes, 611 1.54 rin .keo_put_events = compat_100_netbsd32_kevent_put_events, 612 1.2 christos }; 613 1.2 christos 614 1.54 rin return netbsd32_kevent1(retval, SCARG(uap, fd), 615 1.54 rin (netbsd32_keventp_t)SCARG(uap, changelist), SCARG(uap, nchanges), 616 1.54 rin (netbsd32_keventp_t)SCARG(uap, eventlist), SCARG(uap, nevents), 617 1.54 rin (netbsd32_timespecp_t)SCARG(uap, timeout), &kops); 618 1.2 christos } 619 1.2 christos 620 1.2 christos int 621 1.2 christos compat_50_netbsd32_pselect(struct lwp *l, 622 1.2 christos const struct compat_50_netbsd32_pselect_args *uap, register_t *retval) 623 1.2 christos { 624 1.2 christos /* { 625 1.2 christos syscallarg(int) nd; 626 1.2 christos syscallarg(netbsd32_fd_setp_t) in; 627 1.2 christos syscallarg(netbsd32_fd_setp_t) ou; 628 1.2 christos syscallarg(netbsd32_fd_setp_t) ex; 629 1.2 christos syscallarg(const netbsd32_timespec50p_t) ts; 630 1.2 christos syscallarg(const netbsd32_sigsetp_t) mask; 631 1.2 christos } */ 632 1.2 christos int error; 633 1.2 christos struct netbsd32_timespec50 ts32; 634 1.4 christos struct timespec ats, *ts = NULL; 635 1.2 christos sigset_t amask, *mask = NULL; 636 1.2 christos 637 1.2 christos if (SCARG_P32(uap, ts)) { 638 1.2 christos error = copyin(SCARG_P32(uap, ts), &ts32, sizeof(ts32)); 639 1.2 christos if (error != 0) 640 1.2 christos return error; 641 1.4 christos netbsd32_to_timespec50(&ts32, &ats); 642 1.4 christos ts = &ats; 643 1.2 christos } 644 1.2 christos if (SCARG_P32(uap, mask)) { 645 1.2 christos error = copyin(SCARG_P32(uap, mask), &amask, sizeof(amask)); 646 1.2 christos if (error != 0) 647 1.2 christos return error; 648 1.2 christos mask = &amask; 649 1.2 christos } 650 1.2 christos 651 1.7 rmind return selcommon(retval, SCARG(uap, nd), SCARG_P32(uap, in), 652 1.4 christos SCARG_P32(uap, ou), SCARG_P32(uap, ex), ts, mask); 653 1.2 christos } 654 1.2 christos 655 1.2 christos int 656 1.2 christos compat_50_netbsd32_pollts(struct lwp *l, 657 1.2 christos const struct compat_50_netbsd32_pollts_args *uap, register_t *retval) 658 1.2 christos { 659 1.2 christos /* { 660 1.2 christos syscallarg(struct netbsd32_pollfdp_t) fds; 661 1.2 christos syscallarg(u_int) nfds; 662 1.2 christos syscallarg(const netbsd32_timespec50p_t) ts; 663 1.2 christos syscallarg(const netbsd32_sigsetp_t) mask; 664 1.2 christos } */ 665 1.2 christos int error; 666 1.2 christos struct netbsd32_timespec50 ts32; 667 1.4 christos struct timespec ats, *ts = NULL; 668 1.2 christos sigset_t amask, *mask = NULL; 669 1.2 christos 670 1.2 christos if (SCARG_P32(uap, ts)) { 671 1.2 christos error = copyin(SCARG_P32(uap, ts), &ts32, sizeof(ts32)); 672 1.2 christos if (error != 0) 673 1.2 christos return error; 674 1.4 christos netbsd32_to_timespec50(&ts32, &ats); 675 1.4 christos ts = &ats; 676 1.2 christos } 677 1.2 christos if (NETBSD32PTR64( SCARG(uap, mask))) { 678 1.2 christos error = copyin(SCARG_P32(uap, mask), &amask, sizeof(amask)); 679 1.2 christos if (error != 0) 680 1.2 christos return error; 681 1.2 christos mask = &amask; 682 1.2 christos } 683 1.2 christos 684 1.7 rmind return pollcommon(retval, SCARG_P32(uap, fds), 685 1.4 christos SCARG(uap, nfds), ts, mask); 686 1.2 christos } 687 1.2 christos 688 1.2 christos int 689 1.2 christos compat_50_netbsd32___stat30(struct lwp *l, 690 1.2 christos const struct compat_50_netbsd32___stat30_args *uap, register_t *retval) 691 1.2 christos { 692 1.2 christos /* { 693 1.2 christos syscallarg(const netbsd32_charp) path; 694 1.2 christos syscallarg(netbsd32_stat50p_t) ub; 695 1.2 christos } */ 696 1.2 christos struct netbsd32_stat50 sb32; 697 1.2 christos struct stat sb; 698 1.2 christos int error; 699 1.2 christos const char *path; 700 1.2 christos 701 1.2 christos path = SCARG_P32(uap, path); 702 1.2 christos 703 1.2 christos error = do_sys_stat(path, FOLLOW, &sb); 704 1.2 christos if (error) 705 1.2 christos return error; 706 1.2 christos netbsd32_from___stat50(&sb, &sb32); 707 1.2 christos error = copyout(&sb32, SCARG_P32(uap, ub), sizeof(sb32)); 708 1.2 christos return error; 709 1.2 christos } 710 1.2 christos 711 1.2 christos int 712 1.2 christos compat_50_netbsd32___fstat30(struct lwp *l, 713 1.2 christos const struct compat_50_netbsd32___fstat30_args *uap, register_t *retval) 714 1.2 christos { 715 1.2 christos /* { 716 1.2 christos syscallarg(int) fd; 717 1.2 christos syscallarg(netbsd32_stat50p_t) sb; 718 1.2 christos } */ 719 1.2 christos struct netbsd32_stat50 sb32; 720 1.2 christos struct stat ub; 721 1.3 njoly int error; 722 1.2 christos 723 1.3 njoly error = do_sys_fstat(SCARG(uap, fd), &ub); 724 1.2 christos if (error == 0) { 725 1.2 christos netbsd32_from___stat50(&ub, &sb32); 726 1.2 christos error = copyout(&sb32, SCARG_P32(uap, sb), sizeof(sb32)); 727 1.2 christos } 728 1.2 christos return error; 729 1.2 christos } 730 1.2 christos 731 1.2 christos int 732 1.2 christos compat_50_netbsd32___lstat30(struct lwp *l, 733 1.2 christos const struct compat_50_netbsd32___lstat30_args *uap, register_t *retval) 734 1.2 christos { 735 1.2 christos /* { 736 1.2 christos syscallarg(const netbsd32_charp) path; 737 1.2 christos syscallarg(netbsd32_stat50p_t) ub; 738 1.2 christos } */ 739 1.2 christos struct netbsd32_stat50 sb32; 740 1.2 christos struct stat sb; 741 1.2 christos int error; 742 1.2 christos const char *path; 743 1.2 christos 744 1.2 christos path = SCARG_P32(uap, path); 745 1.2 christos 746 1.2 christos error = do_sys_stat(path, NOFOLLOW, &sb); 747 1.2 christos if (error) 748 1.2 christos return error; 749 1.2 christos netbsd32_from___stat50(&sb, &sb32); 750 1.2 christos error = copyout(&sb32, SCARG_P32(uap, ub), sizeof(sb32)); 751 1.2 christos return error; 752 1.2 christos } 753 1.2 christos 754 1.2 christos int 755 1.2 christos compat_50_netbsd32___fhstat40(struct lwp *l, const struct compat_50_netbsd32___fhstat40_args *uap, register_t *retval) 756 1.2 christos { 757 1.2 christos /* { 758 1.2 christos syscallarg(const netbsd32_pointer_t) fhp; 759 1.2 christos syscallarg(netbsd32_size_t) fh_size; 760 1.2 christos syscallarg(netbsd32_stat50p_t) sb; 761 1.2 christos } */ 762 1.2 christos struct stat sb; 763 1.2 christos struct netbsd32_stat50 sb32; 764 1.2 christos int error; 765 1.2 christos 766 1.2 christos error = do_fhstat(l, SCARG_P32(uap, fhp), SCARG(uap, fh_size), &sb); 767 1.44 maxv if (error == 0) { 768 1.2 christos netbsd32_from___stat50(&sb, &sb32); 769 1.44 maxv error = copyout(&sb32, SCARG_P32(uap, sb), sizeof(sb32)); 770 1.2 christos } 771 1.2 christos return error; 772 1.2 christos } 773 1.2 christos 774 1.2 christos int 775 1.2 christos compat_50_netbsd32_wait4(struct lwp *l, const struct compat_50_netbsd32_wait4_args *uap, register_t *retval) 776 1.2 christos { 777 1.2 christos /* { 778 1.2 christos syscallarg(int) pid; 779 1.2 christos syscallarg(netbsd32_intp) status; 780 1.2 christos syscallarg(int) options; 781 1.2 christos syscallarg(netbsd32_rusage50p_t) rusage; 782 1.2 christos } */ 783 1.6 rmind int error, status, pid = SCARG(uap, pid); 784 1.6 rmind struct netbsd32_rusage50 ru32; 785 1.6 rmind struct rusage ru; 786 1.2 christos 787 1.6 rmind error = do_sys_wait(&pid, &status, SCARG(uap, options), 788 1.6 rmind SCARG_P32(uap, rusage) != NULL ? &ru : NULL); 789 1.2 christos 790 1.2 christos retval[0] = pid; 791 1.2 christos if (pid == 0) 792 1.2 christos return error; 793 1.2 christos 794 1.2 christos if (SCARG_P32(uap, rusage)) { 795 1.2 christos netbsd32_from_rusage50(&ru, &ru32); 796 1.2 christos error = copyout(&ru32, SCARG_P32(uap, rusage), sizeof(ru32)); 797 1.2 christos } 798 1.2 christos 799 1.2 christos if (error == 0 && SCARG_P32(uap, status)) 800 1.2 christos error = copyout(&status, SCARG_P32(uap, status), sizeof(status)); 801 1.2 christos 802 1.2 christos return error; 803 1.2 christos } 804 1.2 christos 805 1.2 christos 806 1.2 christos int 807 1.2 christos compat_50_netbsd32_getrusage(struct lwp *l, const struct compat_50_netbsd32_getrusage_args *uap, register_t *retval) 808 1.2 christos { 809 1.2 christos /* { 810 1.2 christos syscallarg(int) who; 811 1.2 christos syscallarg(netbsd32_rusage50p_t) rusage; 812 1.2 christos } */ 813 1.22 njoly int error; 814 1.2 christos struct proc *p = l->l_proc; 815 1.22 njoly struct rusage ru; 816 1.22 njoly struct netbsd32_rusage50 ru32; 817 1.2 christos 818 1.22 njoly error = getrusage1(p, SCARG(uap, who), &ru); 819 1.22 njoly if (error != 0) 820 1.22 njoly return error; 821 1.2 christos 822 1.22 njoly netbsd32_from_rusage50(&ru, &ru32); 823 1.22 njoly return copyout(&ru32, SCARG_P32(uap, rusage), sizeof(ru32)); 824 1.2 christos } 825 1.2 christos 826 1.2 christos int 827 1.2 christos compat_50_netbsd32_setitimer(struct lwp *l, 828 1.2 christos const struct compat_50_netbsd32_setitimer_args *uap, register_t *retval) 829 1.2 christos { 830 1.2 christos /* { 831 1.2 christos syscallarg(int) which; 832 1.2 christos syscallarg(const netbsd32_itimerval50p_t) itv; 833 1.2 christos syscallarg(netbsd32_itimerval50p_t) oitv; 834 1.2 christos } */ 835 1.2 christos struct proc *p = l->l_proc; 836 1.2 christos struct netbsd32_itimerval50 s32it, *itv32; 837 1.2 christos int which = SCARG(uap, which); 838 1.2 christos struct compat_50_netbsd32_getitimer_args getargs; 839 1.2 christos struct itimerval aitv; 840 1.2 christos int error; 841 1.2 christos 842 1.2 christos itv32 = SCARG_P32(uap, itv); 843 1.2 christos if (itv32) { 844 1.2 christos if ((error = copyin(itv32, &s32it, sizeof(s32it)))) 845 1.50 simonb return error; 846 1.2 christos netbsd32_to_itimerval50(&s32it, &aitv); 847 1.2 christos } 848 1.2 christos if (SCARG_P32(uap, oitv) != 0) { 849 1.2 christos SCARG(&getargs, which) = which; 850 1.2 christos SCARG(&getargs, itv) = SCARG(uap, oitv); 851 1.2 christos if ((error = compat_50_netbsd32_getitimer(l, &getargs, retval)) != 0) 852 1.50 simonb return error; 853 1.2 christos } 854 1.2 christos if (itv32 == 0) 855 1.2 christos return 0; 856 1.2 christos 857 1.2 christos return dosetitimer(p, which, &aitv); 858 1.2 christos } 859 1.2 christos 860 1.2 christos int 861 1.2 christos compat_50_netbsd32_getitimer(struct lwp *l, const struct compat_50_netbsd32_getitimer_args *uap, register_t *retval) 862 1.2 christos { 863 1.2 christos /* { 864 1.2 christos syscallarg(int) which; 865 1.2 christos syscallarg(netbsd32_itimerval50p_t) itv; 866 1.2 christos } */ 867 1.2 christos struct proc *p = l->l_proc; 868 1.2 christos struct netbsd32_itimerval50 s32it; 869 1.2 christos struct itimerval aitv; 870 1.2 christos int error; 871 1.2 christos 872 1.2 christos error = dogetitimer(p, SCARG(uap, which), &aitv); 873 1.2 christos if (error) 874 1.2 christos return error; 875 1.2 christos 876 1.2 christos netbsd32_from_itimerval50(&aitv, &s32it); 877 1.2 christos return copyout(&s32it, SCARG_P32(uap, itv), sizeof(s32it)); 878 1.2 christos } 879 1.2 christos 880 1.34 pgoyette #ifdef NTP 881 1.34 pgoyette int 882 1.34 pgoyette compat_50_netbsd32_ntp_gettime(struct lwp *l, 883 1.34 pgoyette const struct compat_50_netbsd32_ntp_gettime_args *uap, register_t *retval) 884 1.34 pgoyette { 885 1.34 pgoyette /* { 886 1.34 pgoyette syscallarg(netbsd32_ntptimeval50p_t) ntvp; 887 1.34 pgoyette } */ 888 1.34 pgoyette struct netbsd32_ntptimeval50 ntv32; 889 1.34 pgoyette struct ntptimeval ntv; 890 1.34 pgoyette int error = 0; 891 1.34 pgoyette 892 1.34 pgoyette if (vec_ntp_gettime == NULL) 893 1.34 pgoyette return EINVAL; 894 1.34 pgoyette 895 1.34 pgoyette if (SCARG_P32(uap, ntvp)) { 896 1.34 pgoyette (*vec_ntp_gettime)(&ntv); 897 1.34 pgoyette 898 1.34 pgoyette memset(&ntv32, 0, sizeof(ntv32)); 899 1.34 pgoyette ntv32.time.tv_sec = (int32_t)ntv.time.tv_sec; 900 1.34 pgoyette ntv32.time.tv_nsec = ntv.time.tv_nsec; 901 1.34 pgoyette ntv32.maxerror = (netbsd32_long)ntv.maxerror; 902 1.34 pgoyette ntv32.esterror = (netbsd32_long)ntv.esterror; 903 1.34 pgoyette ntv32.tai = (netbsd32_long)ntv.tai; 904 1.34 pgoyette ntv32.time_state = ntv.time_state; 905 1.34 pgoyette error = copyout(&ntv32, SCARG_P32(uap, ntvp), sizeof(ntv32)); 906 1.34 pgoyette } 907 1.34 pgoyette if (!error) { 908 1.34 pgoyette *retval = (*vec_ntp_timestatus)(); 909 1.34 pgoyette } 910 1.34 pgoyette 911 1.50 simonb return error; 912 1.34 pgoyette } 913 1.34 pgoyette #endif 914 1.34 pgoyette 915 1.34 pgoyette static struct syscall_package compat_netbsd32_50_syscalls[] = { 916 1.34 pgoyette { NETBSD32_SYS_compat_50_netbsd32_mknod, 0, 917 1.34 pgoyette (sy_call_t *)compat_50_netbsd32_mknod }, 918 1.34 pgoyette { NETBSD32_SYS_compat_50_netbsd32_select, 0, 919 1.34 pgoyette (sy_call_t *)compat_50_netbsd32_select }, 920 1.34 pgoyette { NETBSD32_SYS_compat_50_netbsd32_gettimeofday, 0, 921 1.34 pgoyette (sy_call_t *)compat_50_netbsd32_gettimeofday }, 922 1.34 pgoyette { NETBSD32_SYS_compat_50_netbsd32_settimeofday, 0, 923 1.34 pgoyette (sy_call_t *)compat_50_netbsd32_settimeofday }, 924 1.34 pgoyette { NETBSD32_SYS_compat_50_netbsd32_utimes, 0, 925 1.34 pgoyette (sy_call_t *)compat_50_netbsd32_utimes }, 926 1.34 pgoyette { NETBSD32_SYS_compat_50_netbsd32_futimes, 0, 927 1.34 pgoyette (sy_call_t *)compat_50_netbsd32_futimes }, 928 1.34 pgoyette { NETBSD32_SYS_compat_50_netbsd32_adjtime, 0, 929 1.34 pgoyette (sy_call_t *)compat_50_netbsd32_adjtime }, 930 1.34 pgoyette { NETBSD32_SYS_compat_50_netbsd32_clock_gettime, 0, 931 1.34 pgoyette (sy_call_t *)compat_50_netbsd32_clock_gettime }, 932 1.34 pgoyette { NETBSD32_SYS_compat_50_netbsd32_clock_settime, 0, 933 1.34 pgoyette (sy_call_t *)compat_50_netbsd32_clock_settime }, 934 1.34 pgoyette { NETBSD32_SYS_compat_50_netbsd32_clock_getres, 0, 935 1.34 pgoyette (sy_call_t *)compat_50_netbsd32_clock_getres }, 936 1.34 pgoyette { NETBSD32_SYS_compat_50_netbsd32_timer_settime, 0, 937 1.34 pgoyette (sy_call_t *)compat_50_netbsd32_timer_settime }, 938 1.34 pgoyette { NETBSD32_SYS_compat_50_netbsd32_timer_gettime, 0, 939 1.34 pgoyette (sy_call_t *)compat_50_netbsd32_timer_gettime }, 940 1.34 pgoyette { NETBSD32_SYS_compat_50_netbsd32_nanosleep, 0, 941 1.34 pgoyette (sy_call_t *)compat_50_netbsd32_nanosleep }, 942 1.34 pgoyette { NETBSD32_SYS_compat_50_netbsd32___sigtimedwait, 0, 943 1.34 pgoyette (sy_call_t *)compat_50_netbsd32___sigtimedwait }, 944 1.34 pgoyette { NETBSD32_SYS_compat_50_netbsd32_lutimes, 0, 945 1.34 pgoyette (sy_call_t *)compat_50_netbsd32_lutimes }, 946 1.34 pgoyette { NETBSD32_SYS_compat_50_netbsd32__lwp_park, 0, 947 1.34 pgoyette (sy_call_t *)compat_50_netbsd32__lwp_park }, 948 1.34 pgoyette { NETBSD32_SYS_compat_50_netbsd32_kevent, 0, 949 1.34 pgoyette (sy_call_t *)compat_50_netbsd32_kevent }, 950 1.34 pgoyette { NETBSD32_SYS_compat_50_netbsd32_pselect, 0, 951 1.34 pgoyette (sy_call_t *)compat_50_netbsd32_pselect }, 952 1.34 pgoyette { NETBSD32_SYS_compat_50_netbsd32_pollts, 0, 953 1.34 pgoyette (sy_call_t *)compat_50_netbsd32_pollts }, 954 1.34 pgoyette { NETBSD32_SYS_compat_50_netbsd32___stat30, 0, 955 1.34 pgoyette (sy_call_t *)compat_50_netbsd32___stat30 }, 956 1.34 pgoyette { NETBSD32_SYS_compat_50_netbsd32___fstat30, 0, 957 1.34 pgoyette (sy_call_t *)compat_50_netbsd32___fstat30 }, 958 1.34 pgoyette { NETBSD32_SYS_compat_50_netbsd32___lstat30, 0, 959 1.34 pgoyette (sy_call_t *)compat_50_netbsd32___lstat30 }, 960 1.34 pgoyette { NETBSD32_SYS_compat_50_netbsd32___fhstat40, 0, 961 1.34 pgoyette (sy_call_t *)compat_50_netbsd32___fhstat40 }, 962 1.34 pgoyette { NETBSD32_SYS_compat_50_netbsd32_wait4, 0, 963 1.34 pgoyette (sy_call_t *)compat_50_netbsd32_wait4 }, 964 1.34 pgoyette { NETBSD32_SYS_compat_50_netbsd32_getrusage, 0, 965 1.34 pgoyette (sy_call_t *)compat_50_netbsd32_getrusage }, 966 1.34 pgoyette { NETBSD32_SYS_compat_50_netbsd32_setitimer, 0, 967 1.34 pgoyette (sy_call_t *)compat_50_netbsd32_setitimer }, 968 1.34 pgoyette { NETBSD32_SYS_compat_50_netbsd32_getitimer, 0, 969 1.34 pgoyette (sy_call_t *)compat_50_netbsd32_getitimer }, 970 1.34 pgoyette #ifdef NTP 971 1.34 pgoyette { NETBSD32_SYS_compat_50_netbsd32_ntp_gettime, 0, 972 1.34 pgoyette (sy_call_t *)compat_50_netbsd32_ntp_gettime }, 973 1.34 pgoyette #endif 974 1.34 pgoyette { 0, 0, NULL } 975 1.34 pgoyette }; 976 1.34 pgoyette 977 1.56 rin MODULE(MODULE_CLASS_EXEC, compat_netbsd32_50, "compat_netbsd32_60,compat_50"); 978 1.34 pgoyette 979 1.34 pgoyette static int 980 1.34 pgoyette compat_netbsd32_50_modcmd(modcmd_t cmd, void *arg) 981 1.34 pgoyette { 982 1.34 pgoyette int ret; 983 1.34 pgoyette 984 1.34 pgoyette switch (cmd) { 985 1.34 pgoyette case MODULE_CMD_INIT: 986 1.34 pgoyette ret = syscall_establish(&emul_netbsd32, 987 1.34 pgoyette compat_netbsd32_50_syscalls); 988 1.34 pgoyette if (ret == 0) 989 1.42 pgoyette MODULE_HOOK_SET(rnd_ioctl32_50_hook, 990 1.34 pgoyette compat32_50_rnd_ioctl); 991 1.34 pgoyette return ret; 992 1.34 pgoyette 993 1.34 pgoyette case MODULE_CMD_FINI: 994 1.34 pgoyette ret = syscall_disestablish(&emul_netbsd32, 995 1.34 pgoyette compat_netbsd32_50_syscalls); 996 1.34 pgoyette if (ret == 0) 997 1.36 pgoyette MODULE_HOOK_UNSET(rnd_ioctl32_50_hook); 998 1.34 pgoyette return ret; 999 1.34 pgoyette 1000 1.34 pgoyette default: 1001 1.34 pgoyette return ENOTTY; 1002 1.34 pgoyette } 1003 1.34 pgoyette } 1004 1.32 pgoyette #endif /* COMPAT_50 */ 1005