xref: /netbsd-src/sys/compat/netbsd32/netbsd32_netbsd.c (revision dc306354b0b29af51801a7632f1e95265a68cd81)
1 /*	$NetBSD: netbsd32_netbsd.c,v 1.7 1998/12/18 13:18:43 drochner Exp $	*/
2 
3 /*
4  * Copyright (c) 1998 Matthew R. Green
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. The name of the author may not be used to endorse or promote products
16  *    derived from this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
23  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28  * SUCH DAMAGE.
29  */
30 
31 #include "opt_ktrace.h"
32 #include "opt_ntp.h"
33 #include "opt_compat_freebsd.h"
34 #include "opt_compat_linux.h"
35 #include "opt_compat_sunos.h"
36 #include "opt_compat_43.h"
37 #if defined(COMPAT_43) || defined(COMPAT_SUNOS) || defined(COMPAT_LINUX) || \
38     defined(COMPAT_FREEBSD)
39 #define COMPAT_OLDSOCK /* used by <sys/socket.h> */
40 #endif
41 
42 #include "fs_lfs.h"
43 #include "fs_nfs.h"
44 
45 #include <sys/param.h>
46 #include <sys/systm.h>
47 #include <sys/kernel.h>
48 #include <sys/ipc.h>
49 #include <sys/msg.h>
50 #include <sys/sem.h>
51 #include <sys/shm.h>
52 #include <sys/malloc.h>
53 #include <sys/mount.h>
54 #include <sys/socket.h>
55 #include <sys/sockio.h>
56 #include <sys/socketvar.h>
57 #include <sys/mbuf.h>
58 #include <sys/stat.h>
59 #include <sys/time.h>
60 #include <sys/timex.h>
61 #include <sys/signalvar.h>
62 #include <sys/wait.h>
63 #include <sys/ptrace.h>
64 #include <sys/ktrace.h>
65 #include <sys/trace.h>
66 #include <sys/resourcevar.h>
67 #include <sys/pool.h>
68 #include <sys/vnode.h>
69 #include <sys/file.h>
70 #include <sys/filedesc.h>
71 #include <sys/namei.h>
72 
73 #include <vm/vm.h>
74 #include <sys/syscallargs.h>
75 #include <sys/proc.h>
76 #include <sys/sysctl.h>
77 
78 #include <net/if.h>
79 
80 #include <compat/sparc32/sparc32.h>
81 #include <compat/sparc32/sparc32_syscallargs.h>
82 
83 #include <machine/frame.h>
84 
85 static __inline void sparc32_from_timeval __P((struct timeval *, struct sparc32_timeval *));
86 static __inline void sparc32_to_timeval __P((struct sparc32_timeval *, struct timeval *));
87 static __inline void sparc32_from_itimerval __P((struct itimerval *, struct sparc32_itimerval *));
88 static __inline void sparc32_to_itimerval __P((struct sparc32_itimerval *, struct itimerval *));
89 static __inline void sparc32_to_timespec __P((struct sparc32_timespec *, struct timespec *));
90 static __inline void sparc32_from_timespec __P((struct timespec *, struct sparc32_timespec *));
91 static __inline void sparc32_from_rusage __P((struct rusage *, struct sparc32_rusage *));
92 static __inline void sparc32_to_rusage __P((struct sparc32_rusage *, struct rusage *));
93 static __inline int sparc32_to_iovecin __P((struct sparc32_iovec *, struct iovec *, int));
94 static __inline void sparc32_to_msghdr __P((struct sparc32_msghdr *, struct msghdr *));
95 static __inline void sparc32_from_msghdr __P((struct sparc32_msghdr *, struct msghdr *));
96 static __inline void sparc32_from_statfs __P((struct statfs *, struct sparc32_statfs *));
97 static __inline void sparc32_from_timex __P((struct timex *, struct sparc32_timex *));
98 static __inline void sparc32_to_timex __P((struct sparc32_timex *, struct timex *));
99 static __inline void sparc32_from___stat13 __P((struct stat *, struct sparc32_stat *));
100 static __inline void sparc32_to_ipc_perm __P((struct sparc32_ipc_perm *, struct ipc_perm *));
101 static __inline void sparc32_from_ipc_perm __P((struct ipc_perm *, struct sparc32_ipc_perm *));
102 static __inline void sparc32_to_msg __P((struct sparc32_msg *, struct msg *));
103 static __inline void sparc32_from_msg __P((struct msg *, struct sparc32_msg *));
104 static __inline void sparc32_to_msqid_ds __P((struct sparc32_msqid_ds *, struct msqid_ds *));
105 static __inline void sparc32_from_msqid_ds __P((struct msqid_ds *, struct sparc32_msqid_ds *));
106 static __inline void sparc32_to_shmid_ds __P((struct sparc32_shmid_ds *, struct shmid_ds *));
107 static __inline void sparc32_from_shmid_ds __P((struct shmid_ds *, struct sparc32_shmid_ds *));
108 static __inline void sparc32_to_semid_ds __P((struct  sparc32_semid_ds *, struct  semid_ds *));
109 static __inline void sparc32_from_semid_ds __P((struct  semid_ds *, struct  sparc32_semid_ds *));
110 
111 
112 static int recvit32 __P((struct proc *, int, struct sparc32_msghdr *, struct iovec *, caddr_t,
113 			 register_t *));
114 static int dofilereadv32 __P((struct proc *, int, struct file *, struct sparc32_iovec *,
115 			      int, off_t *, int, register_t *));
116 static int dofilewritev32 __P((struct proc *, int, struct file *, struct sparc32_iovec *,
117 			       int,  off_t *, int, register_t *));
118 static int change_utimes32 __P((struct vnode *, struct timeval *, struct proc *));
119 
120 /* converters for structures that we need */
121 static __inline void
122 sparc32_from_timeval(tv, tv32)
123 	struct timeval *tv;
124 	struct sparc32_timeval *tv32;
125 {
126 
127 	tv32->tv_sec = (sparc32_long)tv->tv_sec;
128 	tv32->tv_usec = (sparc32_long)tv->tv_usec;
129 }
130 
131 static __inline void
132 sparc32_to_timeval(tv32, tv)
133 	struct sparc32_timeval *tv32;
134 	struct timeval *tv;
135 {
136 
137 	tv->tv_sec = (long)tv32->tv_sec;
138 	tv->tv_usec = (long)tv32->tv_usec;
139 }
140 
141 static __inline void
142 sparc32_from_itimerval(itv, itv32)
143 	struct itimerval *itv;
144 	struct sparc32_itimerval *itv32;
145 {
146 
147 	sparc32_from_timeval(&itv->it_interval,
148 			     &itv32->it_interval);
149 	sparc32_from_timeval(&itv->it_value,
150 			     &itv32->it_value);
151 }
152 
153 static __inline void
154 sparc32_to_itimerval(itv32, itv)
155 	struct sparc32_itimerval *itv32;
156 	struct itimerval *itv;
157 {
158 
159 	sparc32_to_timeval(&itv32->it_interval, &itv->it_interval);
160 	sparc32_to_timeval(&itv32->it_value, &itv->it_value);
161 }
162 
163 static __inline void
164 sparc32_to_timespec(s32p, p)
165 	struct sparc32_timespec *s32p;
166 	struct timespec *p;
167 {
168 
169 	p->tv_sec = s32p->tv_sec;
170 	p->tv_nsec = (long)s32p->tv_nsec;
171 }
172 
173 static __inline void
174 sparc32_from_timespec(p, s32p)
175 	struct timespec *p;
176 	struct sparc32_timespec *s32p;
177 {
178 
179 	s32p->tv_sec = p->tv_sec;
180 	s32p->tv_nsec = (sparc32_long)p->tv_nsec;
181 }
182 
183 static __inline void
184 sparc32_from_rusage(rup, ru32p)
185 	struct rusage *rup;
186 	struct sparc32_rusage *ru32p;
187 {
188 
189 	sparc32_from_timeval(&rup->ru_utime, &ru32p->ru_utime);
190 	sparc32_from_timeval(&rup->ru_stime, &ru32p->ru_stime);
191 #define C(var)	ru32p->var = (sparc32_long)rup->var
192 	C(ru_maxrss);
193 	C(ru_ixrss);
194 	C(ru_idrss);
195 	C(ru_isrss);
196 	C(ru_minflt);
197 	C(ru_majflt);
198 	C(ru_nswap);
199 	C(ru_inblock);
200 	C(ru_oublock);
201 	C(ru_msgsnd);
202 	C(ru_msgrcv);
203 	C(ru_nsignals);
204 	C(ru_nvcsw);
205 	C(ru_nivcsw);
206 #undef C
207 }
208 
209 static __inline void
210 sparc32_to_rusage(ru32p, rup)
211 	struct sparc32_rusage *ru32p;
212 	struct rusage *rup;
213 {
214 
215 	sparc32_to_timeval(&ru32p->ru_utime, &rup->ru_utime);
216 	sparc32_to_timeval(&ru32p->ru_stime, &rup->ru_stime);
217 #define C(var)	rup->var = (long)ru32p->var
218 	C(ru_maxrss);
219 	C(ru_ixrss);
220 	C(ru_idrss);
221 	C(ru_isrss);
222 	C(ru_minflt);
223 	C(ru_majflt);
224 	C(ru_nswap);
225 	C(ru_inblock);
226 	C(ru_oublock);
227 	C(ru_msgsnd);
228 	C(ru_msgrcv);
229 	C(ru_nsignals);
230 	C(ru_nvcsw);
231 	C(ru_nivcsw);
232 #undef C
233 }
234 
235 static __inline int
236 sparc32_to_iovecin(iov32p, iovp, len)
237 	struct sparc32_iovec *iov32p;
238 	struct iovec *iovp;
239 	int len;
240 {
241 	int i, error=0;
242 	u_int32_t iov_base;
243 	u_int32_t iov_len;
244 	/*
245 	 * We could allocate an iov32p, do a copyin, and translate
246 	 * each field and then free it all up, or we could copyin
247 	 * each field separately.  I'm doing the latter to reduce
248 	 * the number of MALLOC()s.
249 	 */
250 printf("converting iovec at %p len %lx to %p\n", iov32p, len, iovp);
251 	for (i = 0; i < len; i++, iovp++, iov32p++) {
252 		if ((error = copyin((caddr_t)&iov32p->iov_base, &iov_base, sizeof(iov_base))))
253 		    return (error);
254 		if ((error = copyin((caddr_t)&iov32p->iov_len, &iov_len, sizeof(iov_len))))
255 		    return (error);
256 		iovp->iov_base = (void *)(u_long)iov_base;
257 		iovp->iov_len = (size_t)iov_len;
258 printf("iovec slot %d base %p len %lx\n", i, iovp->iov_base, iovp->iov_len);
259 	}
260 }
261 
262 /* msg_iov must be done separately */
263 static __inline void
264 sparc32_to_msghdr(mhp32, mhp)
265 	struct sparc32_msghdr *mhp32;
266 	struct msghdr *mhp;
267 {
268 
269 	mhp->msg_name = (caddr_t)(u_long)mhp32->msg_name;
270 	mhp->msg_namelen = mhp32->msg_namelen;
271 	mhp->msg_iovlen = (size_t)mhp32->msg_iovlen;
272 	mhp->msg_control = (caddr_t)(u_long)mhp32->msg_control;
273 	mhp->msg_controllen = mhp32->msg_controllen;
274 	mhp->msg_flags = mhp32->msg_flags;
275 }
276 
277 /* msg_iov must be done separately */
278 static __inline void
279 sparc32_from_msghdr(mhp32, mhp)
280 	struct sparc32_msghdr *mhp32;
281 	struct msghdr *mhp;
282 {
283 
284 	mhp32->msg_name = mhp32->msg_name;
285 	mhp32->msg_namelen = mhp32->msg_namelen;
286 	mhp32->msg_iovlen = mhp32->msg_iovlen;
287 	mhp32->msg_control = mhp32->msg_control;
288 	mhp32->msg_controllen = mhp->msg_controllen;
289 	mhp32->msg_flags = mhp->msg_flags;
290 }
291 
292 static __inline void
293 sparc32_from_statfs(sbp, sb32p)
294 	struct statfs *sbp;
295 	struct sparc32_statfs *sb32p;
296 {
297 
298 	sb32p->f_type = sbp->f_type;
299 	sb32p->f_flags = sbp->f_flags;
300 	sb32p->f_bsize = (sparc32_long)sbp->f_bsize;
301 	sb32p->f_iosize = (sparc32_long)sbp->f_iosize;
302 	sb32p->f_blocks = (sparc32_long)sbp->f_blocks;
303 	sb32p->f_bfree = (sparc32_long)sbp->f_bfree;
304 	sb32p->f_bavail = (sparc32_long)sbp->f_bavail;
305 	sb32p->f_files = (sparc32_long)sbp->f_files;
306 	sb32p->f_ffree = (sparc32_long)sbp->f_ffree;
307 	sb32p->f_fsid = sbp->f_fsid;
308 	sb32p->f_owner = sbp->f_owner;
309 	sb32p->f_spare[0] = 0;
310 	sb32p->f_spare[1] = 0;
311 	sb32p->f_spare[2] = 0;
312 	sb32p->f_spare[3] = 0;
313 #if 1
314 	/* May as well do the whole batch in one go */
315 	memcpy(sb32p->f_fstypename, sbp->f_fstypename, MFSNAMELEN+MNAMELEN+MNAMELEN);
316 #else
317 	/* If we want to be careful */
318 	memcpy(sb32p->f_fstypename, sbp->f_fstypename, MFSNAMELEN);
319 	memcpy(sb32p->f_mntonname, sbp->f_mntonname, MNAMELEN);
320 	memcpy(sb32p->f_mntfromname, sbp->f_mntfromname, MNAMELEN);
321 #endif
322 }
323 
324 static __inline void
325 sparc32_from_timex(txp, tx32p)
326 	struct timex *txp;
327 	struct sparc32_timex *tx32p;
328 {
329 
330 	tx32p->modes = txp->modes;
331 	tx32p->offset = (sparc32_long)txp->offset;
332 	tx32p->freq = (sparc32_long)txp->freq;
333 	tx32p->maxerror = (sparc32_long)txp->maxerror;
334 	tx32p->esterror = (sparc32_long)txp->esterror;
335 	tx32p->status = txp->status;
336 	tx32p->constant = (sparc32_long)txp->constant;
337 	tx32p->precision = (sparc32_long)txp->precision;
338 	tx32p->tolerance = (sparc32_long)txp->tolerance;
339 	tx32p->ppsfreq = (sparc32_long)txp->ppsfreq;
340 	tx32p->jitter = (sparc32_long)txp->jitter;
341 	tx32p->shift = txp->shift;
342 	tx32p->stabil = (sparc32_long)txp->stabil;
343 	tx32p->jitcnt = (sparc32_long)txp->jitcnt;
344 	tx32p->calcnt = (sparc32_long)txp->calcnt;
345 	tx32p->errcnt = (sparc32_long)txp->errcnt;
346 	tx32p->stbcnt = (sparc32_long)txp->stbcnt;
347 }
348 
349 static __inline void
350 sparc32_to_timex(tx32p, txp)
351 	struct sparc32_timex *tx32p;
352 	struct timex *txp;
353 {
354 
355 	txp->modes = tx32p->modes;
356 	txp->offset = (long)tx32p->offset;
357 	txp->freq = (long)tx32p->freq;
358 	txp->maxerror = (long)tx32p->maxerror;
359 	txp->esterror = (long)tx32p->esterror;
360 	txp->status = tx32p->status;
361 	txp->constant = (long)tx32p->constant;
362 	txp->precision = (long)tx32p->precision;
363 	txp->tolerance = (long)tx32p->tolerance;
364 	txp->ppsfreq = (long)tx32p->ppsfreq;
365 	txp->jitter = (long)tx32p->jitter;
366 	txp->shift = tx32p->shift;
367 	txp->stabil = (long)tx32p->stabil;
368 	txp->jitcnt = (long)tx32p->jitcnt;
369 	txp->calcnt = (long)tx32p->calcnt;
370 	txp->errcnt = (long)tx32p->errcnt;
371 	txp->stbcnt = (long)tx32p->stbcnt;
372 }
373 
374 static __inline void
375 sparc32_from___stat13(sbp, sb32p)
376 	struct stat *sbp;
377 	struct sparc32_stat *sb32p;
378 {
379 	sb32p->st_dev = sbp->st_dev;
380 	sb32p->st_ino = sbp->st_ino;
381 	sb32p->st_mode = sbp->st_mode;
382 	sb32p->st_nlink = sbp->st_nlink;
383 	sb32p->st_uid = sbp->st_uid;
384 	sb32p->st_gid = sbp->st_gid;
385 	sb32p->st_rdev = sbp->st_rdev;
386 	if (sbp->st_size < (quad_t)1 << 32)
387 		sb32p->st_size = sbp->st_size;
388 	else
389 		sb32p->st_size = -2;
390 	sb32p->st_atimespec.tv_sec = sbp->st_atimespec.tv_sec;
391 	sb32p->st_atimespec.tv_nsec = (sparc32_long)sbp->st_atimespec.tv_nsec;
392 	sb32p->st_mtimespec.tv_sec = sbp->st_mtimespec.tv_sec;
393 	sb32p->st_mtimespec.tv_nsec = (sparc32_long)sbp->st_mtimespec.tv_nsec;
394 	sb32p->st_ctimespec.tv_sec = sbp->st_ctimespec.tv_sec;
395 	sb32p->st_ctimespec.tv_nsec = (sparc32_long)sbp->st_ctimespec.tv_nsec;
396 	sb32p->st_blksize = sbp->st_blksize;
397 	sb32p->st_blocks = sbp->st_blocks;
398 	sb32p->st_flags = sbp->st_flags;
399 	sb32p->st_gen = sbp->st_gen;
400 }
401 
402 static __inline void
403 sparc32_to_ipc_perm(ip32p, ipp)
404 	struct sparc32_ipc_perm *ip32p;
405 	struct ipc_perm *ipp;
406 {
407 
408 	ipp->cuid = ip32p->cuid;
409 	ipp->cgid = ip32p->cgid;
410 	ipp->uid = ip32p->uid;
411 	ipp->gid = ip32p->gid;
412 	ipp->mode = ip32p->mode;
413 	ipp->seq = ip32p->seq;
414 	ipp->key = (key_t)ip32p->key;
415 }
416 
417 static __inline void
418 sparc32_from_ipc_perm(ipp, ip32p)
419 	struct ipc_perm *ipp;
420 	struct sparc32_ipc_perm *ip32p;
421 {
422 
423 	ip32p->cuid = ipp->cuid;
424 	ip32p->cgid = ipp->cgid;
425 	ip32p->uid = ipp->uid;
426 	ip32p->gid = ipp->gid;
427 	ip32p->mode = ipp->mode;
428 	ip32p->seq = ipp->seq;
429 	ip32p->key = (sparc32_key_t)ipp->key;
430 }
431 
432 static __inline void
433 sparc32_to_msg(m32p, mp)
434 	struct sparc32_msg *m32p;
435 	struct msg *mp;
436 {
437 
438 	mp->msg_next = (struct msg *)(u_long)m32p->msg_next;
439 	mp->msg_type = (long)m32p->msg_type;
440 	mp->msg_ts = m32p->msg_ts;
441 	mp->msg_spot = m32p->msg_spot;
442 }
443 
444 static __inline void
445 sparc32_from_msg(mp, m32p)
446 	struct msg *mp;
447 	struct sparc32_msg *m32p;
448 {
449 
450 	m32p->msg_next = (sparc32_msgp_t)(u_long)mp->msg_next;
451 	m32p->msg_type = (sparc32_long)mp->msg_type;
452 	m32p->msg_ts = mp->msg_ts;
453 	m32p->msg_spot = mp->msg_spot;
454 }
455 
456 static __inline void
457 sparc32_to_msqid_ds(ds32p, dsp)
458 	struct sparc32_msqid_ds *ds32p;
459 	struct msqid_ds *dsp;
460 {
461 
462 	sparc32_to_ipc_perm(&ds32p->msg_perm, &dsp->msg_perm);
463 	sparc32_to_msg((struct sparc32_msg *)(u_long)ds32p->msg_first, dsp->msg_first);
464 	sparc32_to_msg((struct sparc32_msg *)(u_long)ds32p->msg_last, dsp->msg_last);
465 	dsp->msg_cbytes = (u_long)ds32p->msg_cbytes;
466 	dsp->msg_qnum = (u_long)ds32p->msg_qnum;
467 	dsp->msg_qbytes = (u_long)ds32p->msg_qbytes;
468 	dsp->msg_lspid = ds32p->msg_lspid;
469 	dsp->msg_lrpid = ds32p->msg_lrpid;
470 	dsp->msg_rtime = (time_t)ds32p->msg_rtime;
471 	dsp->msg_stime = (time_t)ds32p->msg_stime;
472 	dsp->msg_ctime = (time_t)ds32p->msg_ctime;
473 }
474 
475 static __inline void
476 sparc32_from_msqid_ds(dsp, ds32p)
477 	struct msqid_ds *dsp;
478 	struct sparc32_msqid_ds *ds32p;
479 {
480 
481 	sparc32_from_ipc_perm(&dsp->msg_perm, &ds32p->msg_perm);
482 	sparc32_from_msg(dsp->msg_first, (struct sparc32_msg *)(u_long)ds32p->msg_first);
483 	sparc32_from_msg(dsp->msg_last, (struct sparc32_msg *)(u_long)ds32p->msg_last);
484 	ds32p->msg_cbytes = (sparc32_u_long)dsp->msg_cbytes;
485 	ds32p->msg_qnum = (sparc32_u_long)dsp->msg_qnum;
486 	ds32p->msg_qbytes = (sparc32_u_long)dsp->msg_qbytes;
487 	ds32p->msg_lspid = dsp->msg_lspid;
488 	ds32p->msg_lrpid = dsp->msg_lrpid;
489 	ds32p->msg_rtime = dsp->msg_rtime;
490 	ds32p->msg_stime = dsp->msg_stime;
491 	ds32p->msg_ctime = dsp->msg_ctime;
492 }
493 
494 static __inline void
495 sparc32_to_shmid_ds(ds32p, dsp)
496 	struct sparc32_shmid_ds *ds32p;
497 	struct shmid_ds *dsp;
498 {
499 
500 	sparc32_to_ipc_perm(&ds32p->shm_perm, &dsp->shm_perm);
501 	dsp->shm_segsz = ds32p->shm_segsz;
502 	dsp->shm_lpid = ds32p->shm_lpid;
503 	dsp->shm_cpid = ds32p->shm_cpid;
504 	dsp->shm_nattch = ds32p->shm_nattch;
505 	dsp->shm_atime = (long)ds32p->shm_atime;
506 	dsp->shm_dtime = (long)ds32p->shm_dtime;
507 	dsp->shm_ctime = (long)ds32p->shm_ctime;
508 	dsp->shm_internal = (void *)(u_long)ds32p->shm_internal;
509 }
510 
511 static __inline void
512 sparc32_from_shmid_ds(dsp, ds32p)
513 	struct shmid_ds *dsp;
514 	struct sparc32_shmid_ds *ds32p;
515 {
516 
517 	sparc32_from_ipc_perm(&dsp->shm_perm, &ds32p->shm_perm);
518 	ds32p->shm_segsz = dsp->shm_segsz;
519 	ds32p->shm_lpid = dsp->shm_lpid;
520 	ds32p->shm_cpid = dsp->shm_cpid;
521 	ds32p->shm_nattch = dsp->shm_nattch;
522 	ds32p->shm_atime = (sparc32_long)dsp->shm_atime;
523 	ds32p->shm_dtime = (sparc32_long)dsp->shm_dtime;
524 	ds32p->shm_ctime = (sparc32_long)dsp->shm_ctime;
525 	ds32p->shm_internal = (sparc32_voidp)(u_long)dsp->shm_internal;
526 }
527 
528 static __inline void
529 sparc32_to_semid_ds(s32dsp, dsp)
530 	struct  sparc32_semid_ds *s32dsp;
531 	struct  semid_ds *dsp;
532 {
533 
534 	sparc32_from_ipc_perm(&dsp->sem_perm, &s32dsp->sem_perm);
535 	dsp->sem_base = (struct sem *)(u_long)s32dsp->sem_base;
536 	dsp->sem_nsems = s32dsp->sem_nsems;
537 	dsp->sem_otime = s32dsp->sem_otime;
538 	dsp->sem_ctime = s32dsp->sem_ctime;
539 }
540 
541 static __inline void
542 sparc32_from_semid_ds(dsp, s32dsp)
543 	struct  semid_ds *dsp;
544 	struct  sparc32_semid_ds *s32dsp;
545 {
546 
547 	sparc32_to_ipc_perm(&s32dsp->sem_perm, &dsp->sem_perm);
548 	s32dsp->sem_base = (sparc32_semp_t)(u_long)dsp->sem_base;
549 	s32dsp->sem_nsems = dsp->sem_nsems;
550 	s32dsp->sem_otime = dsp->sem_otime;
551 	s32dsp->sem_ctime = dsp->sem_ctime;
552 }
553 
554 /*
555  * below are all the standard NetBSD system calls, in the 32bit
556  * environment, witht he necessary conversions to 64bit before
557  * calling the real syscall.
558  */
559 
560 
561 int
562 compat_sparc32_exit(p, v, retval)
563 	struct proc *p;
564 	void *v;
565 	register_t *retval;
566 {
567 	struct compat_sparc32_exit_args /* {
568 		syscallarg(int) rval;
569 	} */ *uap = v;
570 	struct sys_exit_args ua;
571 
572 	SPARC32TO64_UAP(rval);
573 	sys_exit(p, &ua, retval);
574 }
575 
576 int
577 compat_sparc32_read(p, v, retval)
578 	struct proc *p;
579 	void *v;
580 	register_t *retval;
581 {
582 	struct compat_sparc32_read_args /* {
583 		syscallarg(int) fd;
584 		syscallarg(sparc32_voidp) buf;
585 		syscallarg(sparc32_size_t) nbyte;
586 	} */ *uap = v;
587 	struct sys_read_args ua;
588 
589 	SPARC32TO64_UAP(fd);
590 	SPARC32TOP_UAP(buf, void *);
591 	SPARC32TOX_UAP(nbyte, size_t);
592 	return sys_read(p, &ua, retval);
593 }
594 
595 int
596 compat_sparc32_write(p, v, retval)
597 	struct proc *p;
598 	void *v;
599 	register_t *retval;
600 {
601 	struct compat_sparc32_write_args /* {
602 		syscallarg(int) fd;
603 		syscallarg(const sparc32_voidp) buf;
604 		syscallarg(sparc32_size_t) nbyte;
605 	} */ *uap = v;
606 	struct sys_write_args ua;
607 
608 	SPARC32TO64_UAP(fd);
609 	SPARC32TOP_UAP(buf, void *);
610 	SPARC32TOX_UAP(nbyte, size_t);
611 	return sys_write(p, &ua, retval);
612 }
613 
614 int
615 compat_sparc32_close(p, v, retval)
616 	struct proc *p;
617 	void *v;
618 	register_t *retval;
619 {
620 	struct compat_sparc32_close_args /* {
621 		syscallarg(int) fd;
622 	} */ *uap = v;
623 	struct sys_close_args ua;
624 
625 	SPARC32TO64_UAP(fd);
626 	return sys_write(p, &ua, retval);
627 }
628 
629 int
630 compat_sparc32_open(p, v, retval)
631 	struct proc *p;
632 	void *v;
633 	register_t *retval;
634 {
635 	struct compat_sparc32_open_args /* {
636 		syscallarg(const sparc32_charp) path;
637 		syscallarg(int) flags;
638 		syscallarg(mode_t) mode;
639 	} */ *uap = v;
640 	struct sys_open_args ua;
641 	caddr_t sg;
642 
643 	SPARC32TOP_UAP(path, const char);
644 	SPARC32TO64_UAP(flags);
645 	SPARC32TO64_UAP(mode);
646 	sg = stackgap_init(p->p_emul);
647 	SPARC32_CHECK_ALT_EXIST(p, &sg, SCARG(&ua, path));
648 
649 	return (sys_open(p, &ua, retval));
650 }
651 
652 int
653 compat_sparc32_wait4(q, v, retval)
654 	struct proc *q;
655 	void *v;
656 	register_t *retval;
657 {
658 	struct compat_sparc32_wait4_args /* {
659 		syscallarg(int) pid;
660 		syscallarg(sparc32_intp) status;
661 		syscallarg(int) options;
662 		syscallarg(sparc32_rusagep_t) rusage;
663 	} */ *uap = v;
664 	struct sparc32_rusage ru32;
665 	register int nfound;
666 	register struct proc *p, *t;
667 	int status, error;
668 
669 	if (SCARG(uap, pid) == 0)
670 		SCARG(uap, pid) = -q->p_pgid;
671 	if (SCARG(uap, options) &~ (WUNTRACED|WNOHANG))
672 		return (EINVAL);
673 
674 loop:
675 	nfound = 0;
676 	for (p = q->p_children.lh_first; p != 0; p = p->p_sibling.le_next) {
677 		if (SCARG(uap, pid) != WAIT_ANY &&
678 		    p->p_pid != SCARG(uap, pid) &&
679 		    p->p_pgid != -SCARG(uap, pid))
680 			continue;
681 		nfound++;
682 		if (p->p_stat == SZOMB) {
683 			retval[0] = p->p_pid;
684 
685 			if (SCARG(uap, status)) {
686 				status = p->p_xstat;	/* convert to int */
687 				error = copyout((caddr_t)&status,
688 						(caddr_t)(u_long)SCARG(uap, status),
689 						sizeof(status));
690 				if (error)
691 					return (error);
692 			}
693 			if (SCARG(uap, rusage)) {
694 				sparc32_from_rusage(p->p_ru, &ru32);
695 				if ((error = copyout((caddr_t)&ru32,
696 						     (caddr_t)(u_long)SCARG(uap, rusage),
697 						     sizeof(struct sparc32_rusage))))
698 					return (error);
699 			}
700 			/*
701 			 * If we got the child via ptrace(2) or procfs, and
702 			 * the parent is different (meaning the process was
703 			 * attached, rather than run as a child), then we need
704 			 * to give it back to the old parent, and send the
705 			 * parent a SIGCHLD.  The rest of the cleanup will be
706 			 * done when the old parent waits on the child.
707 			 */
708 			if ((p->p_flag & P_TRACED) &&
709 			    p->p_oppid != p->p_pptr->p_pid) {
710 				t = pfind(p->p_oppid);
711 				proc_reparent(p, t ? t : initproc);
712 				p->p_oppid = 0;
713 				p->p_flag &= ~(P_TRACED|P_WAITED|P_FSTRACE);
714 				psignal(p->p_pptr, SIGCHLD);
715 				wakeup((caddr_t)p->p_pptr);
716 				return (0);
717 			}
718 			p->p_xstat = 0;
719 			ruadd(&q->p_stats->p_cru, p->p_ru);
720 			pool_put(&rusage_pool, p->p_ru);
721 
722 			/*
723 			 * Finally finished with old proc entry.
724 			 * Unlink it from its process group and free it.
725 			 */
726 			leavepgrp(p);
727 
728 			LIST_REMOVE(p, p_list);	/* off zombproc */
729 
730 			LIST_REMOVE(p, p_sibling);
731 
732 			/*
733 			 * Decrement the count of procs running with this uid.
734 			 */
735 			(void)chgproccnt(p->p_cred->p_ruid, -1);
736 
737 			/*
738 			 * Free up credentials.
739 			 */
740 			if (--p->p_cred->p_refcnt == 0) {
741 				crfree(p->p_cred->pc_ucred);
742 				pool_put(&pcred_pool, p->p_cred);
743 			}
744 
745 			/*
746 			 * Release reference to text vnode
747 			 */
748 			if (p->p_textvp)
749 				vrele(p->p_textvp);
750 
751 			/*
752 			 * Give machine-dependent layer a chance
753 			 * to free anything that cpu_exit couldn't
754 			 * release while still running in process context.
755 			 */
756 			cpu_wait(p);
757 			pool_put(&proc_pool, p);
758 			nprocs--;
759 			return (0);
760 		}
761 		if (p->p_stat == SSTOP && (p->p_flag & P_WAITED) == 0 &&
762 		    (p->p_flag & P_TRACED || SCARG(uap, options) & WUNTRACED)) {
763 			p->p_flag |= P_WAITED;
764 			retval[0] = p->p_pid;
765 
766 			if (SCARG(uap, status)) {
767 				status = W_STOPCODE(p->p_xstat);
768 				error = copyout((caddr_t)&status,
769 				    (caddr_t)(u_long)SCARG(uap, status),
770 				    sizeof(status));
771 			} else
772 				error = 0;
773 			return (error);
774 		}
775 	}
776 	if (nfound == 0)
777 		return (ECHILD);
778 	if (SCARG(uap, options) & WNOHANG) {
779 		retval[0] = 0;
780 		return (0);
781 	}
782 	if ((error = tsleep((caddr_t)q, PWAIT | PCATCH, "wait", 0)) != 0)
783 		return (error);
784 	goto loop;
785 }
786 
787 int
788 compat_sparc32_link(p, v, retval)
789 	struct proc *p;
790 	void *v;
791 	register_t *retval;
792 {
793 	struct compat_sparc32_link_args /* {
794 		syscallarg(const sparc32_charp) path;
795 		syscallarg(const sparc32_charp) link;
796 	} */ *uap = v;
797 	struct sys_link_args ua;
798 
799 	SPARC32TOP_UAP(path, const char);
800 	SPARC32TOP_UAP(link, const char);
801 	return (sys_link(p, &ua, retval));
802 }
803 
804 int
805 compat_sparc32_unlink(p, v, retval)
806 	struct proc *p;
807 	void *v;
808 	register_t *retval;
809 {
810 	struct compat_sparc32_unlink_args /* {
811 		syscallarg(const sparc32_charp) path;
812 	} */ *uap = v;
813 	struct sys_unlink_args ua;
814 
815 	SPARC32TOP_UAP(path, const char);
816 
817 	return (sys_unlink(p, &ua, retval));
818 }
819 
820 int
821 compat_sparc32_chdir(p, v, retval)
822 	struct proc *p;
823 	void *v;
824 	register_t *retval;
825 {
826 	struct compat_sparc32_chdir_args /* {
827 		syscallarg(const sparc32_charp) path;
828 	} */ *uap = v;
829 	struct sys_chdir_args ua;
830 
831 	SPARC32TOP_UAP(path, const char);
832 
833 	return (sys_chdir(p, &ua, retval));
834 }
835 
836 int
837 compat_sparc32_fchdir(p, v, retval)
838 	struct proc *p;
839 	void *v;
840 	register_t *retval;
841 {
842 	struct compat_sparc32_fchdir_args /* {
843 		syscallarg(int) fd;
844 	} */ *uap = v;
845 	struct sys_fchdir_args ua;
846 
847 	SPARC32TO64_UAP(fd);
848 
849 	return (sys_fchdir(p, &ua, retval));
850 }
851 
852 int
853 compat_sparc32_mknod(p, v, retval)
854 	struct proc *p;
855 	void *v;
856 	register_t *retval;
857 {
858 	struct compat_sparc32_mknod_args /* {
859 		syscallarg(const sparc32_charp) path;
860 		syscallarg(mode_t) mode;
861 		syscallarg(dev_t) dev;
862 	} */ *uap = v;
863 	struct sys_mknod_args ua;
864 
865 	SPARC32TOP_UAP(path, const char);
866 	SPARC32TO64_UAP(dev);
867 	SPARC32TO64_UAP(mode);
868 
869 	return (sys_mknod(p, &ua, retval));
870 }
871 
872 int
873 compat_sparc32_chmod(p, v, retval)
874 	struct proc *p;
875 	void *v;
876 	register_t *retval;
877 {
878 	struct compat_sparc32_chmod_args /* {
879 		syscallarg(const sparc32_charp) path;
880 		syscallarg(mode_t) mode;
881 	} */ *uap = v;
882 	struct sys_chmod_args ua;
883 
884 	SPARC32TOP_UAP(path, const char);
885 	SPARC32TO64_UAP(mode);
886 
887 	return (sys_chmod(p, &ua, retval));
888 }
889 
890 int
891 compat_sparc32_chown(p, v, retval)
892 	struct proc *p;
893 	void *v;
894 	register_t *retval;
895 {
896 	struct compat_sparc32_chown_args /* {
897 		syscallarg(const sparc32_charp) path;
898 		syscallarg(uid_t) uid;
899 		syscallarg(gid_t) gid;
900 	} */ *uap = v;
901 	struct sys_chown_args ua;
902 
903 	SPARC32TOP_UAP(path, const char);
904 	SPARC32TO64_UAP(uid);
905 	SPARC32TO64_UAP(gid);
906 
907 	return (sys_chown(p, &ua, retval));
908 }
909 
910 int
911 compat_sparc32_break(p, v, retval)
912 	struct proc *p;
913 	void *v;
914 	register_t *retval;
915 {
916 	struct compat_sparc32_break_args /* {
917 		syscallarg(sparc32_charp) nsize;
918 	} */ *uap = v;
919 	struct sys_obreak_args ua;
920 
921 	SCARG(&ua, nsize) = (char *)(u_long)SCARG(uap, nsize);
922 	SPARC32TOP_UAP(nsize, char);
923 	return (sys_obreak(p, &ua, retval));
924 }
925 
926 int
927 compat_sparc32_getfsstat(p, v, retval)
928 	struct proc *p;
929 	void *v;
930 	register_t *retval;
931 {
932 	struct compat_sparc32_getfsstat_args /* {
933 		syscallarg(sparc32_statfsp_t) buf;
934 		syscallarg(sparc32_long) bufsize;
935 		syscallarg(int) flags;
936 	} */ *uap = v;
937 	struct sys_getfsstat_args ua;
938 	struct statfs sb;
939 	struct sparc32_statfs *sb32p;
940 	int error;
941 
942 	sb32p = (struct sparc32_statfs *)(u_long)SCARG(uap, buf);
943 	if (sb32p)
944 		SCARG(&ua, buf) = &sb;
945 	else
946 		SCARG(&ua, buf) = NULL;
947 	SPARC32TOX_UAP(bufsize, long);
948 	SPARC32TO64_UAP(flags);
949 	error = sys_getfsstat(p, &ua, retval);
950 	if (error)
951 		return (error);
952 
953 	if (sb32p) {
954 		struct sparc32_statfs sb32;
955 		sparc32_from_statfs(&sb, &sb32);
956 		if (copyout(&sb32, sb32p, sizeof(sb32)))
957 			return EFAULT;
958 	}
959 	return (0);
960 }
961 
962 int
963 compat_sparc32_mount(p, v, retval)
964 	struct proc *p;
965 	void *v;
966 	register_t *retval;
967 {
968 	struct compat_sparc32_mount_args /* {
969 		syscallarg(const sparc32_charp) type;
970 		syscallarg(const sparc32_charp) path;
971 		syscallarg(int) flags;
972 		syscallarg(sparc32_voidp) data;
973 	} */ *uap = v;
974 	struct sys_mount_args ua;
975 
976 	SPARC32TOP_UAP(type, const char);
977 	SPARC32TOP_UAP(path, const char);
978 	SPARC32TO64_UAP(flags);
979 	SPARC32TOP_UAP(data, void);
980 	return (sys_mount(p, &ua, retval));
981 }
982 
983 int
984 compat_sparc32_unmount(p, v, retval)
985 	struct proc *p;
986 	void *v;
987 	register_t *retval;
988 {
989 	struct compat_sparc32_unmount_args /* {
990 		syscallarg(const sparc32_charp) path;
991 		syscallarg(int) flags;
992 	} */ *uap = v;
993 	struct sys_unmount_args ua;
994 
995 	SPARC32TOP_UAP(path, const char);
996 	SPARC32TO64_UAP(flags);
997 	return (sys_unmount(p, &ua, retval));
998 }
999 
1000 int
1001 compat_sparc32_setuid(p, v, retval)
1002 	struct proc *p;
1003 	void *v;
1004 	register_t *retval;
1005 {
1006 	struct compat_sparc32_setuid_args /* {
1007 		syscallarg(uid_t) uid;
1008 	} */ *uap = v;
1009 	struct sys_setuid_args ua;
1010 
1011 	SPARC32TO64_UAP(uid);
1012 	return (sys_setuid(p, &ua, retval));
1013 }
1014 
1015 int
1016 compat_sparc32_ptrace(p, v, retval)
1017 	struct proc *p;
1018 	void *v;
1019 	register_t *retval;
1020 {
1021 	struct compat_sparc32_ptrace_args /* {
1022 		syscallarg(int) req;
1023 		syscallarg(pid_t) pid;
1024 		syscallarg(sparc32_caddr_t) addr;
1025 		syscallarg(int) data;
1026 	} */ *uap = v;
1027 	struct sys_ptrace_args ua;
1028 
1029 	SPARC32TO64_UAP(req);
1030 	SPARC32TO64_UAP(pid);
1031 	SPARC32TOX64_UAP(addr, caddr_t);
1032 	SPARC32TO64_UAP(data);
1033 	return (sys_ptrace(p, &ua, retval));
1034 }
1035 
1036 int
1037 compat_sparc32_recvmsg(p, v, retval)
1038 	struct proc *p;
1039 	void *v;
1040 	register_t *retval;
1041 {
1042 	struct compat_sparc32_recvmsg_args /* {
1043 		syscallarg(int) s;
1044 		syscallarg(sparc32_msghdrp_t) msg;
1045 		syscallarg(int) flags;
1046 	} */ *uap = v;
1047 	struct sparc32_msghdr msg;
1048 	struct iovec aiov[UIO_SMALLIOV], *uiov, *iov;
1049 	register int error;
1050 
1051 	error = copyin((caddr_t)(u_long)SCARG(uap, msg), (caddr_t)&msg,
1052 		       sizeof(msg));
1053 		/* sparc32_msghdr needs the iov pre-allocated */
1054 	if (error)
1055 		return (error);
1056 	if ((u_int)msg.msg_iovlen > UIO_SMALLIOV) {
1057 		if ((u_int)msg.msg_iovlen > IOV_MAX)
1058 			return (EMSGSIZE);
1059 		MALLOC(iov, struct iovec *,
1060 		       sizeof(struct iovec) * (u_int)msg.msg_iovlen, M_IOV,
1061 		       M_WAITOK);
1062 	} else if ((u_int)msg.msg_iovlen > 0)
1063 		iov = aiov;
1064 	else
1065 		return (EMSGSIZE);
1066 #ifdef COMPAT_OLDSOCK
1067 	msg.msg_flags = SCARG(uap, flags) &~ MSG_COMPAT;
1068 #else
1069 	msg.msg_flags = SCARG(uap, flags);
1070 #endif
1071 	uiov = (struct iovec *)(u_long)msg.msg_iov;
1072 	error = sparc32_to_iovecin((struct sparc32_iovec *)uiov,
1073 				   iov, msg.msg_iovlen);
1074 	if (error)
1075 		goto done;
1076 	if ((error = recvit32(p, SCARG(uap, s), &msg, iov, (caddr_t)0, retval)) == 0) {
1077 		error = copyout((caddr_t)&msg, (caddr_t)(u_long)SCARG(uap, msg),
1078 		    sizeof(msg));
1079 	}
1080 done:
1081 	if (iov != aiov)
1082 		FREE(iov, M_IOV);
1083 	return (error);
1084 }
1085 
1086 int
1087 recvit32(p, s, mp, iov, namelenp, retsize)
1088 	struct proc *p;
1089 	int s;
1090 	struct sparc32_msghdr *mp;
1091 	struct iovec *iov;
1092 	caddr_t namelenp;
1093 	register_t *retsize;
1094 {
1095 	struct file *fp;
1096 	struct uio auio;
1097 	register int i;
1098 	int len, error;
1099 	struct mbuf *from = 0, *control = 0;
1100 	struct socket *so;
1101 #ifdef KTRACE
1102 	struct iovec *ktriov = NULL;
1103 #endif
1104 
1105 	if ((error = getsock(p->p_fd, s, &fp)) != 0)
1106 		return (error);
1107 	auio.uio_iov = (struct iovec *)(u_long)mp->msg_iov;
1108 	auio.uio_iovcnt = mp->msg_iovlen;
1109 	auio.uio_segflg = UIO_USERSPACE;
1110 	auio.uio_rw = UIO_READ;
1111 	auio.uio_procp = p;
1112 	auio.uio_offset = 0;			/* XXX */
1113 	auio.uio_resid = 0;
1114 	for (i = 0; i < mp->msg_iovlen; i++, iov++) {
1115 #if 0
1116 		/* cannot happen iov_len is unsigned */
1117 		if (iov->iov_len < 0)
1118 			return (EINVAL);
1119 #endif
1120 		/*
1121 		 * Reads return ssize_t because -1 is returned on error.
1122 		 * Therefore we must restrict the length to SSIZE_MAX to
1123 		 * avoid garbage return values.
1124 		 */
1125 		auio.uio_resid += iov->iov_len;
1126 		if (iov->iov_len > SSIZE_MAX || auio.uio_resid > SSIZE_MAX)
1127 			return (EINVAL);
1128 	}
1129 #ifdef KTRACE
1130 	if (KTRPOINT(p, KTR_GENIO)) {
1131 		int iovlen = auio.uio_iovcnt * sizeof(struct iovec);
1132 
1133 		MALLOC(ktriov, struct iovec *, iovlen, M_TEMP, M_WAITOK);
1134 		memcpy((caddr_t)ktriov, (caddr_t)auio.uio_iov, iovlen);
1135 	}
1136 #endif
1137 	len = auio.uio_resid;
1138 	so = (struct socket *)fp->f_data;
1139 	error = (*so->so_receive)(so, &from, &auio, NULL,
1140 			  mp->msg_control ? &control : NULL, &mp->msg_flags);
1141 	if (error) {
1142 		if (auio.uio_resid != len && (error == ERESTART ||
1143 		    error == EINTR || error == EWOULDBLOCK))
1144 			error = 0;
1145 	}
1146 #ifdef KTRACE
1147 	if (ktriov != NULL) {
1148 		if (error == 0)
1149 			ktrgenio(p->p_tracep, s, UIO_READ,
1150 				ktriov, len - auio.uio_resid, error);
1151 		FREE(ktriov, M_TEMP);
1152 	}
1153 #endif
1154 	if (error)
1155 		goto out;
1156 	*retsize = len - auio.uio_resid;
1157 	if (mp->msg_name) {
1158 		len = mp->msg_namelen;
1159 		if (len <= 0 || from == 0)
1160 			len = 0;
1161 		else {
1162 #ifdef COMPAT_OLDSOCK
1163 			if (mp->msg_flags & MSG_COMPAT)
1164 				mtod(from, struct osockaddr *)->sa_family =
1165 				    mtod(from, struct sockaddr *)->sa_family;
1166 #endif
1167 			if (len > from->m_len)
1168 				len = from->m_len;
1169 			/* else if len < from->m_len ??? */
1170 			error = copyout(mtod(from, caddr_t),
1171 					(caddr_t)(u_long)mp->msg_name, (unsigned)len);
1172 			if (error)
1173 				goto out;
1174 		}
1175 		mp->msg_namelen = len;
1176 		if (namelenp &&
1177 		    (error = copyout((caddr_t)&len, namelenp, sizeof(int)))) {
1178 #ifdef COMPAT_OLDSOCK
1179 			if (mp->msg_flags & MSG_COMPAT)
1180 				error = 0;	/* old recvfrom didn't check */
1181 			else
1182 #endif
1183 			goto out;
1184 		}
1185 	}
1186 	if (mp->msg_control) {
1187 #ifdef COMPAT_OLDSOCK
1188 		/*
1189 		 * We assume that old recvmsg calls won't receive access
1190 		 * rights and other control info, esp. as control info
1191 		 * is always optional and those options didn't exist in 4.3.
1192 		 * If we receive rights, trim the cmsghdr; anything else
1193 		 * is tossed.
1194 		 */
1195 		if (control && mp->msg_flags & MSG_COMPAT) {
1196 			if (mtod(control, struct cmsghdr *)->cmsg_level !=
1197 			    SOL_SOCKET ||
1198 			    mtod(control, struct cmsghdr *)->cmsg_type !=
1199 			    SCM_RIGHTS) {
1200 				mp->msg_controllen = 0;
1201 				goto out;
1202 			}
1203 			control->m_len -= sizeof(struct cmsghdr);
1204 			control->m_data += sizeof(struct cmsghdr);
1205 		}
1206 #endif
1207 		len = mp->msg_controllen;
1208 		if (len <= 0 || control == 0)
1209 			len = 0;
1210 		else {
1211 			struct mbuf *m = control;
1212 			caddr_t p = (caddr_t)(u_long)mp->msg_control;
1213 
1214 			do {
1215 				i = m->m_len;
1216 				if (len < i) {
1217 					mp->msg_flags |= MSG_CTRUNC;
1218 					i = len;
1219 				}
1220 				error = copyout(mtod(m, caddr_t), p,
1221 				    (unsigned)i);
1222 				if (m->m_next)
1223 					i = ALIGN(i);
1224 				p += i;
1225 				len -= i;
1226 				if (error != 0 || len <= 0)
1227 					break;
1228 			} while ((m = m->m_next) != NULL);
1229 			len = p - (caddr_t)(u_long)mp->msg_control;
1230 		}
1231 		mp->msg_controllen = len;
1232 	}
1233 out:
1234 	if (from)
1235 		m_freem(from);
1236 	if (control)
1237 		m_freem(control);
1238 	return (error);
1239 }
1240 
1241 
1242 int
1243 compat_sparc32_sendmsg(p, v, retval)
1244 	struct proc *p;
1245 	void *v;
1246 	register_t *retval;
1247 {
1248 	struct compat_sparc32_sendmsg_args /* {
1249 		syscallarg(int) s;
1250 		syscallarg(const sparc32_msghdrp_t) msg;
1251 		syscallarg(int) flags;
1252 	} */ *uap = v;
1253 	struct msghdr msg;
1254 	struct sparc32_msghdr msg32;
1255 	struct iovec aiov[UIO_SMALLIOV], *iov;
1256 	int error;
1257 
1258 	error = copyin((caddr_t)(u_long)SCARG(uap, msg),
1259 		       (caddr_t)&msg32, sizeof(msg32));
1260 	if (error)
1261 		return (error);
1262 	sparc32_to_msghdr(&msg32, &msg);
1263 	if ((u_int)msg.msg_iovlen > UIO_SMALLIOV) {
1264 		if ((u_int)msg.msg_iovlen > IOV_MAX)
1265 			return (EMSGSIZE);
1266 		MALLOC(iov, struct iovec *,
1267 		       sizeof(struct iovec) * (u_int)msg.msg_iovlen, M_IOV,
1268 		       M_WAITOK);
1269 	} else if ((u_int)msg.msg_iovlen > 0)
1270 		iov = aiov;
1271 	else
1272 		return (EMSGSIZE);
1273 	error = sparc32_to_iovecin((struct sparc32_iovec *)msg.msg_iov,
1274 				   iov, msg.msg_iovlen);
1275 	if (error)
1276 		goto done;
1277 	msg.msg_iov = iov;
1278 #ifdef COMPAT_OLDSOCK
1279 	msg.msg_flags = 0;
1280 #endif
1281 	/* Luckily we can use this directly */
1282 	error = sendit(p, SCARG(uap, s), &msg, SCARG(uap, flags), retval);
1283 done:
1284 	if (iov != aiov)
1285 		FREE(iov, M_IOV);
1286 	return (error);
1287 }
1288 
1289 int
1290 compat_sparc32_recvfrom(p, v, retval)
1291 	struct proc *p;
1292 	void *v;
1293 	register_t *retval;
1294 {
1295 	struct compat_sparc32_recvfrom_args /* {
1296 		syscallarg(int) s;
1297 		syscallarg(sparc32_voidp) buf;
1298 		syscallarg(sparc32_size_t) len;
1299 		syscallarg(int) flags;
1300 		syscallarg(sparc32_sockaddrp_t) from;
1301 		syscallarg(sparc32_intp) fromlenaddr;
1302 	} */ *uap = v;
1303 	struct sparc32_msghdr msg;
1304 	struct iovec aiov;
1305 	int error;
1306 
1307 	if (SCARG(uap, fromlenaddr)) {
1308 		error = copyin((caddr_t)(u_long)SCARG(uap, fromlenaddr),
1309 			       (caddr_t)&msg.msg_namelen,
1310 			       sizeof(msg.msg_namelen));
1311 		if (error)
1312 			return (error);
1313 	} else
1314 		msg.msg_namelen = 0;
1315 	msg.msg_name = SCARG(uap, from);
1316 	msg.msg_iov = NULL; /* We can't store a real pointer here */
1317 	msg.msg_iovlen = 1;
1318 	aiov.iov_base = (caddr_t)(u_long)SCARG(uap, buf);
1319 	aiov.iov_len = (u_long)SCARG(uap, len);
1320 	msg.msg_control = 0;
1321 	msg.msg_flags = SCARG(uap, flags);
1322 	return (recvit32(p, SCARG(uap, s), &msg, &aiov,
1323 		       (caddr_t)(u_long)SCARG(uap, fromlenaddr), retval));
1324 }
1325 
1326 int
1327 compat_sparc32_sendto(p, v, retval)
1328 	struct proc *p;
1329 	void *v;
1330 	register_t *retval;
1331 {
1332 	struct compat_sparc32_sendto_args /* {
1333 		syscallarg(int) s;
1334 		syscallarg(const sparc32_voidp) buf;
1335 		syscallarg(sparc32_size_t) len;
1336 		syscallarg(int) flags;
1337 		syscallarg(const sparc32_sockaddrp_t) to;
1338 		syscallarg(int) tolen;
1339 	} */ *uap = v;
1340 	struct msghdr msg;
1341 	struct iovec aiov;
1342 
1343 	msg.msg_name = (caddr_t)(u_long)SCARG(uap, to);		/* XXX kills const */
1344 	msg.msg_namelen = SCARG(uap, tolen);
1345 	msg.msg_iov = &aiov;
1346 	msg.msg_iovlen = 1;
1347 	msg.msg_control = 0;
1348 #ifdef COMPAT_OLDSOCK
1349 	msg.msg_flags = 0;
1350 #endif
1351 	aiov.iov_base = (char *)(u_long)SCARG(uap, buf);	/* XXX kills const */
1352 	aiov.iov_len = SCARG(uap, len);
1353 	return (sendit(p, SCARG(uap, s), &msg, SCARG(uap, flags), retval));
1354 }
1355 
1356 int
1357 compat_sparc32_accept(p, v, retval)
1358 	struct proc *p;
1359 	void *v;
1360 	register_t *retval;
1361 {
1362 	struct compat_sparc32_accept_args /* {
1363 		syscallarg(int) s;
1364 		syscallarg(sparc32_sockaddrp_t) name;
1365 		syscallarg(sparc32_intp) anamelen;
1366 	} */ *uap = v;
1367 	struct sys_accept_args ua;
1368 
1369 	SPARC32TO64_UAP(s);
1370 	SPARC32TOP_UAP(name, struct sockaddr);
1371 	SPARC32TOP_UAP(anamelen, int);
1372 	return (sys_accept(p, &ua, retval));
1373 }
1374 
1375 int
1376 compat_sparc32_getpeername(p, v, retval)
1377 	struct proc *p;
1378 	void *v;
1379 	register_t *retval;
1380 {
1381 	struct compat_sparc32_getpeername_args /* {
1382 		syscallarg(int) fdes;
1383 		syscallarg(sparc32_sockaddrp_t) asa;
1384 		syscallarg(sparc32_intp) alen;
1385 	} */ *uap = v;
1386 	struct sys_getpeername_args ua;
1387 
1388 	SPARC32TO64_UAP(fdes);
1389 	SPARC32TOP_UAP(asa, struct sockaddr);
1390 	SPARC32TOP_UAP(alen, int);
1391 /* NB: do the protocol specific sockaddrs need to be converted? */
1392 	return (sys_getpeername(p, &ua, retval));
1393 }
1394 
1395 int
1396 compat_sparc32_getsockname(p, v, retval)
1397 	struct proc *p;
1398 	void *v;
1399 	register_t *retval;
1400 {
1401 	struct compat_sparc32_getsockname_args /* {
1402 		syscallarg(int) fdes;
1403 		syscallarg(sparc32_sockaddrp_t) asa;
1404 		syscallarg(sparc32_intp) alen;
1405 	} */ *uap = v;
1406 	struct sys_getsockname_args ua;
1407 
1408 	SPARC32TO64_UAP(fdes);
1409 	SPARC32TOP_UAP(asa, struct sockaddr);
1410 	SPARC32TOP_UAP(alen, int);
1411 	return (sys_getsockname(p, &ua, retval));
1412 }
1413 
1414 int
1415 compat_sparc32_access(p, v, retval)
1416 	struct proc *p;
1417 	void *v;
1418 	register_t *retval;
1419 {
1420 	struct compat_sparc32_access_args /* {
1421 		syscallarg(const sparc32_charp) path;
1422 		syscallarg(int) flags;
1423 	} */ *uap = v;
1424 	struct sys_access_args ua;
1425 	caddr_t sg;
1426 
1427 	SPARC32TOP_UAP(path, const char);
1428 	SPARC32TO64_UAP(flags);
1429 	sg = stackgap_init(p->p_emul);
1430 	SPARC32_CHECK_ALT_EXIST(p, &sg, SCARG(&ua, path));
1431 
1432 	return (sys_access(p, &ua, retval));
1433 }
1434 
1435 int
1436 compat_sparc32_chflags(p, v, retval)
1437 	struct proc *p;
1438 	void *v;
1439 	register_t *retval;
1440 {
1441 	struct compat_sparc32_chflags_args /* {
1442 		syscallarg(const sparc32_charp) path;
1443 		syscallarg(sparc32_u_long) flags;
1444 	} */ *uap = v;
1445 	struct sys_chflags_args ua;
1446 
1447 	SPARC32TOP_UAP(path, const char);
1448 	SPARC32TO64_UAP(flags);
1449 
1450 	return (sys_chflags(p, &ua, retval));
1451 }
1452 
1453 int
1454 compat_sparc32_fchflags(p, v, retval)
1455 	struct proc *p;
1456 	void *v;
1457 	register_t *retval;
1458 {
1459 	struct compat_sparc32_fchflags_args /* {
1460 		syscallarg(int) fd;
1461 		syscallarg(sparc32_u_long) flags;
1462 	} */ *uap = v;
1463 	struct sys_fchflags_args ua;
1464 
1465 	SPARC32TO64_UAP(fd);
1466 	SPARC32TO64_UAP(flags);
1467 
1468 	return (sys_fchflags(p, &ua, retval));
1469 }
1470 
1471 int
1472 compat_sparc32_kill(p, v, retval)
1473 	struct proc *p;
1474 	void *v;
1475 	register_t *retval;
1476 {
1477 	struct compat_sparc32_kill_args /* {
1478 		syscallarg(int) pid;
1479 		syscallarg(int) signum;
1480 	} */ *uap = v;
1481 	struct sys_kill_args ua;
1482 
1483 	SPARC32TO64_UAP(pid);
1484 	SPARC32TO64_UAP(signum);
1485 
1486 	return (sys_kill(p, &ua, retval));
1487 }
1488 
1489 int
1490 compat_sparc32_dup(p, v, retval)
1491 	struct proc *p;
1492 	void *v;
1493 	register_t *retval;
1494 {
1495 	struct compat_sparc32_dup_args /* {
1496 		syscallarg(int) fd;
1497 	} */ *uap = v;
1498 	struct sys_dup_args ua;
1499 
1500 	SPARC32TO64_UAP(fd);
1501 
1502 	return (sys_dup(p, &ua, retval));
1503 }
1504 
1505 int
1506 compat_sparc32_profil(p, v, retval)
1507 	struct proc *p;
1508 	void *v;
1509 	register_t *retval;
1510 {
1511 	struct compat_sparc32_profil_args /* {
1512 		syscallarg(sparc32_caddr_t) samples;
1513 		syscallarg(sparc32_size_t) size;
1514 		syscallarg(sparc32_u_long) offset;
1515 		syscallarg(u_int) scale;
1516 	} */ *uap = v;
1517 	struct sys_profil_args ua;
1518 
1519 	SPARC32TOX64_UAP(samples, caddr_t);
1520 	SPARC32TOX_UAP(size, size_t);
1521 	SPARC32TOX_UAP(offset, u_long);
1522 	SPARC32TO64_UAP(scale);
1523 	return (sys_profil(p, &ua, retval));
1524 }
1525 
1526 int
1527 compat_sparc32_ktrace(p, v, retval)
1528 	struct proc *p;
1529 	void *v;
1530 	register_t *retval;
1531 {
1532 	struct compat_sparc32_ktrace_args /* {
1533 		syscallarg(const sparc32_charp) fname;
1534 		syscallarg(int) ops;
1535 		syscallarg(int) facs;
1536 		syscallarg(int) pid;
1537 	} */ *uap = v;
1538 	struct sys_ktrace_args ua;
1539 
1540 	SPARC32TOP_UAP(fname, const char);
1541 	SPARC32TO64_UAP(ops);
1542 	SPARC32TO64_UAP(facs);
1543 	SPARC32TO64_UAP(pid);
1544 	return (sys_ktrace(p, &ua, retval));
1545 }
1546 
1547 int
1548 compat_sparc32_sigaction(p, v, retval)
1549 	struct proc *p;
1550 	void *v;
1551 	register_t *retval;
1552 {
1553 	struct compat_sparc32_sigaction_args /* {
1554 		syscallarg(int) signum;
1555 		syscallarg(const sparc32_sigactionp_t) nsa;
1556 		syscallarg(sparc32_sigactionp_t) osa;
1557 	} */ *uap = v;
1558 	struct sigaction nsa, osa;
1559 	struct sparc32_sigaction *sa32p, sa32;
1560 	int error;
1561 
1562 	if (SCARG(uap, nsa)) {
1563 		sa32p = (struct sparc32_sigaction *)(u_long)SCARG(uap, nsa);
1564 		if (copyin(sa32p, &sa32, sizeof(sa32)))
1565 			return EFAULT;
1566 		nsa.sa_handler = (void *)(u_long)sa32.sa_handler;
1567 		nsa.sa_mask = sa32.sa_mask;
1568 		nsa.sa_flags = sa32.sa_flags;
1569 	}
1570 	error = sigaction1(p, SCARG(uap, signum),
1571 			   SCARG(uap, nsa) ? &nsa : 0,
1572 			   SCARG(uap, osa) ? &osa : 0);
1573 
1574 	if (error)
1575 		return (error);
1576 
1577 	if (SCARG(uap, osa)) {
1578 		sa32.sa_handler = (sparc32_sigactionp_t)(u_long)osa.sa_handler;
1579 		sa32.sa_mask = osa.sa_mask;
1580 		sa32.sa_flags = osa.sa_flags;
1581 		sa32p = (struct sparc32_sigaction *)(u_long)SCARG(uap, osa);
1582 		if (copyout(&sa32, sa32p, sizeof(sa32)))
1583 			return EFAULT;
1584 	}
1585 
1586 	return (0);
1587 }
1588 
1589 int
1590 compat_sparc32___getlogin(p, v, retval)
1591 	struct proc *p;
1592 	void *v;
1593 	register_t *retval;
1594 {
1595 	struct compat_sparc32___getlogin_args /* {
1596 		syscallarg(sparc32_charp) namebuf;
1597 		syscallarg(u_int) namelen;
1598 	} */ *uap = v;
1599 	struct sys___getlogin_args ua;
1600 
1601 	SPARC32TOP_UAP(namebuf, char);
1602 	SPARC32TO64_UAP(namelen);
1603 	return (sys___getlogin(p, &ua, retval));
1604 }
1605 
1606 int
1607 compat_sparc32_setlogin(p, v, retval)
1608 	struct proc *p;
1609 	void *v;
1610 	register_t *retval;
1611 {
1612 	struct compat_sparc32_setlogin_args /* {
1613 		syscallarg(const sparc32_charp) namebuf;
1614 	} */ *uap = v;
1615 	struct sys_setlogin_args ua;
1616 
1617 	SPARC32TOP_UAP(namebuf, char);
1618 	return (sys_setlogin(p, &ua, retval));
1619 }
1620 
1621 int
1622 compat_sparc32_acct(p, v, retval)
1623 	struct proc *p;
1624 	void *v;
1625 	register_t *retval;
1626 {
1627 	struct compat_sparc32_acct_args /* {
1628 		syscallarg(const sparc32_charp) path;
1629 	} */ *uap = v;
1630 	struct sys_acct_args ua;
1631 
1632 	SPARC32TOP_UAP(path, const char);
1633 	return (sys_acct(p, &ua, retval));
1634 }
1635 
1636 int
1637 compat_sparc32_revoke(p, v, retval)
1638 	struct proc *p;
1639 	void *v;
1640 	register_t *retval;
1641 {
1642 	struct compat_sparc32_revoke_args /* {
1643 		syscallarg(const sparc32_charp) path;
1644 	} */ *uap = v;
1645 	struct sys_revoke_args ua;
1646 	caddr_t sg;
1647 
1648 	SPARC32TOP_UAP(path, const char);
1649 	sg = stackgap_init(p->p_emul);
1650 	SPARC32_CHECK_ALT_EXIST(p, &sg, SCARG(&ua, path));
1651 
1652 	return (sys_revoke(p, &ua, retval));
1653 }
1654 
1655 int
1656 compat_sparc32_symlink(p, v, retval)
1657 	struct proc *p;
1658 	void *v;
1659 	register_t *retval;
1660 {
1661 	struct compat_sparc32_symlink_args /* {
1662 		syscallarg(const sparc32_charp) path;
1663 		syscallarg(const sparc32_charp) link;
1664 	} */ *uap = v;
1665 	struct sys_symlink_args ua;
1666 
1667 	SPARC32TOP_UAP(path, const char);
1668 	SPARC32TOP_UAP(link, const char);
1669 
1670 	return (sys_symlink(p, &ua, retval));
1671 }
1672 
1673 int
1674 compat_sparc32_readlink(p, v, retval)
1675 	struct proc *p;
1676 	void *v;
1677 	register_t *retval;
1678 {
1679 	struct compat_sparc32_readlink_args /* {
1680 		syscallarg(const sparc32_charp) path;
1681 		syscallarg(sparc32_charp) buf;
1682 		syscallarg(sparc32_size_t) count;
1683 	} */ *uap = v;
1684 	struct sys_readlink_args ua;
1685 	caddr_t sg;
1686 
1687 	SPARC32TOP_UAP(path, const char);
1688 	SPARC32TOP_UAP(buf, char);
1689 	SPARC32TOX_UAP(count, size_t);
1690 	sg = stackgap_init(p->p_emul);
1691 	SPARC32_CHECK_ALT_EXIST(p, &sg, SCARG(&ua, path));
1692 
1693 	return (sys_readlink(p, &ua, retval));
1694 }
1695 
1696 int
1697 compat_sparc32_execve(p, v, retval)
1698 	struct proc *p;
1699 	void *v;
1700 	register_t *retval;
1701 {
1702 	struct compat_sparc32_execve_args /* {
1703 		syscallarg(const sparc32_charp) path;
1704 		syscallarg(sparc32_charpp) argp;
1705 		syscallarg(sparc32_charpp) envp;
1706 	} */ *uap = v;
1707 	struct sys_execve_args ua;
1708 	caddr_t sg;
1709 
1710 	SPARC32TOP_UAP(path, const char);
1711 	SPARC32TOP_UAP(argp, char *);
1712 	SPARC32TOP_UAP(envp, char *);
1713 	sg = stackgap_init(p->p_emul);
1714 	SPARC32_CHECK_ALT_EXIST(p, &sg, SCARG(&ua, path));
1715 
1716 	return (sys_execve(p, &ua, retval));
1717 }
1718 
1719 int
1720 compat_sparc32_umask(p, v, retval)
1721 	struct proc *p;
1722 	void *v;
1723 	register_t *retval;
1724 {
1725 	struct compat_sparc32_umask_args /* {
1726 		syscallarg(mode_t) newmask;
1727 	} */ *uap = v;
1728 	struct sys_umask_args ua;
1729 
1730 	SPARC32TO64_UAP(newmask);
1731 	return (sys_umask(p, &ua, retval));
1732 }
1733 
1734 int
1735 compat_sparc32_chroot(p, v, retval)
1736 	struct proc *p;
1737 	void *v;
1738 	register_t *retval;
1739 {
1740 	struct compat_sparc32_chroot_args /* {
1741 		syscallarg(const sparc32_charp) path;
1742 	} */ *uap = v;
1743 	struct sys_chroot_args ua;
1744 
1745 	SPARC32TOP_UAP(path, const char);
1746 	return (sys_chroot(p, &ua, retval));
1747 }
1748 
1749 int
1750 compat_sparc32_sbrk(p, v, retval)
1751 	struct proc *p;
1752 	void *v;
1753 	register_t *retval;
1754 {
1755 	struct compat_sparc32_sbrk_args /* {
1756 		syscallarg(int) incr;
1757 	} */ *uap = v;
1758 	struct sys_sbrk_args ua;
1759 
1760 	SPARC32TO64_UAP(incr);
1761 	return (sys_sbrk(p, &ua, retval));
1762 }
1763 
1764 int
1765 compat_sparc32_sstk(p, v, retval)
1766 	struct proc *p;
1767 	void *v;
1768 	register_t *retval;
1769 {
1770 	struct compat_sparc32_sstk_args /* {
1771 		syscallarg(int) incr;
1772 	} */ *uap = v;
1773 	struct sys_sstk_args ua;
1774 
1775 	SPARC32TO64_UAP(incr);
1776 	return (sys_sstk(p, &ua, retval));
1777 }
1778 
1779 int
1780 compat_sparc32_munmap(p, v, retval)
1781 	struct proc *p;
1782 	void *v;
1783 	register_t *retval;
1784 {
1785 	struct compat_sparc32_munmap_args /* {
1786 		syscallarg(sparc32_voidp) addr;
1787 		syscallarg(sparc32_size_t) len;
1788 	} */ *uap = v;
1789 	struct sys_munmap_args ua;
1790 
1791 	SPARC32TOP_UAP(addr, void);
1792 	SPARC32TOX_UAP(len, size_t);
1793 	return (sys_munmap(p, &ua, retval));
1794 }
1795 
1796 int
1797 compat_sparc32_mprotect(p, v, retval)
1798 	struct proc *p;
1799 	void *v;
1800 	register_t *retval;
1801 {
1802 	struct compat_sparc32_mprotect_args /* {
1803 		syscallarg(sparc32_voidp) addr;
1804 		syscallarg(sparc32_size_t) len;
1805 		syscallarg(int) prot;
1806 	} */ *uap = v;
1807 	struct sys_mprotect_args ua;
1808 
1809 	SPARC32TOP_UAP(addr, void);
1810 	SPARC32TOX_UAP(len, size_t);
1811 	SPARC32TO64_UAP(prot);
1812 	return (sys_mprotect(p, &ua, retval));
1813 }
1814 
1815 int
1816 compat_sparc32_madvise(p, v, retval)
1817 	struct proc *p;
1818 	void *v;
1819 	register_t *retval;
1820 {
1821 	struct compat_sparc32_madvise_args /* {
1822 		syscallarg(sparc32_voidp) addr;
1823 		syscallarg(sparc32_size_t) len;
1824 		syscallarg(int) behav;
1825 	} */ *uap = v;
1826 	struct sys_madvise_args ua;
1827 
1828 	SPARC32TOP_UAP(addr, void);
1829 	SPARC32TOX_UAP(len, size_t);
1830 	SPARC32TO64_UAP(behav);
1831 	return (sys_madvise(p, &ua, retval));
1832 }
1833 
1834 int
1835 compat_sparc32_mincore(p, v, retval)
1836 	struct proc *p;
1837 	void *v;
1838 	register_t *retval;
1839 {
1840 	struct compat_sparc32_mincore_args /* {
1841 		syscallarg(sparc32_caddr_t) addr;
1842 		syscallarg(sparc32_size_t) len;
1843 		syscallarg(sparc32_charp) vec;
1844 	} */ *uap = v;
1845 	struct sys_mincore_args ua;
1846 
1847 	SPARC32TOX64_UAP(addr, caddr_t);
1848 	SPARC32TOX_UAP(len, size_t);
1849 	SPARC32TOP_UAP(vec, char);
1850 	return (sys_mincore(p, &ua, retval));
1851 }
1852 
1853 int
1854 compat_sparc32_getgroups(p, v, retval)
1855 	struct proc *p;
1856 	void *v;
1857 	register_t *retval;
1858 {
1859 	struct compat_sparc32_getgroups_args /* {
1860 		syscallarg(int) gidsetsize;
1861 		syscallarg(sparc32_gid_tp) gidset;
1862 	} */ *uap = v;
1863 	register struct pcred *pc = p->p_cred;
1864 	register int ngrp;
1865 	int error;
1866 
1867 	ngrp = SCARG(uap, gidsetsize);
1868 	if (ngrp == 0) {
1869 		*retval = pc->pc_ucred->cr_ngroups;
1870 		return (0);
1871 	}
1872 	if (ngrp < pc->pc_ucred->cr_ngroups)
1873 		return (EINVAL);
1874 	ngrp = pc->pc_ucred->cr_ngroups;
1875 	/* Should convert gid_t to sparc32_gid_t, but they're the same */
1876 	error = copyout((caddr_t)pc->pc_ucred->cr_groups,
1877 			(caddr_t)(u_long)SCARG(uap, gidset),
1878 			ngrp * sizeof(gid_t));
1879 	if (error)
1880 		return (error);
1881 	*retval = ngrp;
1882 	return (0);
1883 }
1884 
1885 int
1886 compat_sparc32_setgroups(p, v, retval)
1887 	struct proc *p;
1888 	void *v;
1889 	register_t *retval;
1890 {
1891 	struct compat_sparc32_setgroups_args /* {
1892 		syscallarg(int) gidsetsize;
1893 		syscallarg(const sparc32_gid_tp) gidset;
1894 	} */ *uap = v;
1895 	struct sys_setgroups_args ua;
1896 
1897 	SPARC32TO64_UAP(gidsetsize);
1898 	SPARC32TOP_UAP(gidset, gid_t);
1899 	return (sys_setgroups(p, &ua, retval));
1900 }
1901 
1902 int
1903 compat_sparc32_setpgid(p, v, retval)
1904 	struct proc *p;
1905 	void *v;
1906 	register_t *retval;
1907 {
1908 	struct compat_sparc32_setpgid_args /* {
1909 		syscallarg(int) pid;
1910 		syscallarg(int) pgid;
1911 	} */ *uap = v;
1912 	struct sys_setpgid_args ua;
1913 
1914 	SPARC32TO64_UAP(pid);
1915 	SPARC32TO64_UAP(pgid);
1916 	return (sys_setpgid(p, &ua, retval));
1917 }
1918 
1919 int
1920 compat_sparc32_setitimer(p, v, retval)
1921 	struct proc *p;
1922 	void *v;
1923 	register_t *retval;
1924 {
1925 	struct compat_sparc32_setitimer_args /* {
1926 		syscallarg(int) which;
1927 		syscallarg(const sparc32_itimervalp_t) itv;
1928 		syscallarg(sparc32_itimervalp_t) oitv;
1929 	} */ *uap = v;
1930 	struct sparc32_itimerval s32it, *itvp;
1931 	int which = SCARG(uap, which);
1932 	struct compat_sparc32_getitimer_args getargs;
1933 	struct itimerval aitv;
1934 	int s, error;
1935 
1936 	if ((u_int)which > ITIMER_PROF)
1937 		return (EINVAL);
1938 	itvp = (struct sparc32_itimerval *)(u_long)SCARG(uap, itv);
1939 	if (itvp && (error = copyin(itvp, &s32it, sizeof(s32it))))
1940 		return (error);
1941 	sparc32_to_itimerval(&s32it, &aitv);
1942 	if (SCARG(uap, oitv) != NULL) {
1943 		SCARG(&getargs, which) = which;
1944 		SCARG(&getargs, itv) = SCARG(uap, oitv);
1945 		if ((error = compat_sparc32_getitimer(p, &getargs, retval)) != 0)
1946 			return (error);
1947 	}
1948 	if (itvp == 0)
1949 		return (0);
1950 	if (itimerfix(&aitv.it_value) || itimerfix(&aitv.it_interval))
1951 		return (EINVAL);
1952 	s = splclock();
1953 	if (which == ITIMER_REAL) {
1954 		untimeout(realitexpire, p);
1955 		if (timerisset(&aitv.it_value)) {
1956 			timeradd(&aitv.it_value, &time, &aitv.it_value);
1957 			timeout(realitexpire, p, hzto(&aitv.it_value));
1958 		}
1959 		p->p_realtimer = aitv;
1960 	} else
1961 		p->p_stats->p_timer[which] = aitv;
1962 	splx(s);
1963 	return (0);
1964 }
1965 
1966 int
1967 compat_sparc32_getitimer(p, v, retval)
1968 	struct proc *p;
1969 	void *v;
1970 	register_t *retval;
1971 {
1972 	struct compat_sparc32_getitimer_args /* {
1973 		syscallarg(int) which;
1974 		syscallarg(sparc32_itimervalp_t) itv;
1975 	} */ *uap = v;
1976 	int which = SCARG(uap, which);
1977 	struct sparc32_itimerval s32it;
1978 	struct itimerval aitv;
1979 	int s;
1980 
1981 	if ((u_int)which > ITIMER_PROF)
1982 		return (EINVAL);
1983 	s = splclock();
1984 	if (which == ITIMER_REAL) {
1985 		/*
1986 		 * Convert from absolute to relative time in .it_value
1987 		 * part of real time timer.  If time for real time timer
1988 		 * has passed return 0, else return difference between
1989 		 * current time and time for the timer to go off.
1990 		 */
1991 		aitv = p->p_realtimer;
1992 		if (timerisset(&aitv.it_value)) {
1993 			if (timercmp(&aitv.it_value, &time, <))
1994 				timerclear(&aitv.it_value);
1995 			else
1996 				timersub(&aitv.it_value, &time, &aitv.it_value);
1997 		}
1998 	} else
1999 		aitv = p->p_stats->p_timer[which];
2000 	splx(s);
2001 	sparc32_from_itimerval(&aitv, &s32it);
2002 	return (copyout(&s32it, (caddr_t)(u_long)SCARG(uap, itv), sizeof(s32it)));
2003 }
2004 
2005 int
2006 compat_sparc32_fcntl(p, v, retval)
2007 	struct proc *p;
2008 	void *v;
2009 	register_t *retval;
2010 {
2011 	struct compat_sparc32_fcntl_args /* {
2012 		syscallarg(int) fd;
2013 		syscallarg(int) cmd;
2014 		syscallarg(sparc32_voidp) arg;
2015 	} */ *uap = v;
2016 	struct sys_fcntl_args ua;
2017 
2018 	SPARC32TO64_UAP(fd);
2019 	SPARC32TO64_UAP(cmd);
2020 	SPARC32TOP_UAP(arg, void);
2021 	/* XXXX we can do this 'cause flock doesn't change */
2022 	return (sys_fcntl(p, &ua, retval));
2023 }
2024 
2025 int
2026 compat_sparc32_dup2(p, v, retval)
2027 	struct proc *p;
2028 	void *v;
2029 	register_t *retval;
2030 {
2031 	struct compat_sparc32_dup2_args /* {
2032 		syscallarg(int) from;
2033 		syscallarg(int) to;
2034 	} */ *uap = v;
2035 	struct sys_dup2_args ua;
2036 
2037 	SPARC32TO64_UAP(from);
2038 	SPARC32TO64_UAP(to);
2039 	return (sys_dup2(p, &ua, retval));
2040 }
2041 
2042 int
2043 compat_sparc32_select(p, v, retval)
2044 	struct proc *p;
2045 	void *v;
2046 	register_t *retval;
2047 {
2048 	struct compat_sparc32_select_args /* {
2049 		syscallarg(int) nd;
2050 		syscallarg(sparc32_fd_setp_t) in;
2051 		syscallarg(sparc32_fd_setp_t) ou;
2052 		syscallarg(sparc32_fd_setp_t) ex;
2053 		syscallarg(sparc32_timevalp_t) tv;
2054 	} */ *uap = v;
2055 /* This one must be done in-line 'cause of the timeval */
2056 	struct sparc32_timeval tv32;
2057 	caddr_t bits;
2058 	char smallbits[howmany(FD_SETSIZE, NFDBITS) * sizeof(fd_mask) * 6];
2059 	struct timeval atv;
2060 	int s, ncoll, error = 0, timo;
2061 	size_t ni;
2062 	extern int	selwait, nselcoll;
2063 	extern int selscan __P((struct proc *, fd_mask *, fd_mask *, int, register_t *));
2064 
2065 	if (SCARG(uap, nd) < 0)
2066 		return (EINVAL);
2067 	if (SCARG(uap, nd) > p->p_fd->fd_nfiles) {
2068 		/* forgiving; slightly wrong */
2069 		SCARG(uap, nd) = p->p_fd->fd_nfiles;
2070 	}
2071 	ni = howmany(SCARG(uap, nd), NFDBITS) * sizeof(fd_mask);
2072 	if (ni * 6 > sizeof(smallbits))
2073 		bits = malloc(ni * 6, M_TEMP, M_WAITOK);
2074 	else
2075 		bits = smallbits;
2076 
2077 #define	getbits(name, x) \
2078 	if (SCARG(uap, name)) { \
2079 		error = copyin((caddr_t)(u_long)SCARG(uap, name), bits + ni * x, ni); \
2080 		if (error) \
2081 			goto done; \
2082 	} else \
2083 		memset(bits + ni * x, 0, ni);
2084 	getbits(in, 0);
2085 	getbits(ou, 1);
2086 	getbits(ex, 2);
2087 #undef	getbits
2088 
2089 	if (SCARG(uap, tv)) {
2090 		error = copyin((caddr_t)(u_long)SCARG(uap, tv), (caddr_t)&tv32,
2091 			sizeof(tv32));
2092 		if (error)
2093 			goto done;
2094 		sparc32_to_timeval(&tv32, &atv);
2095 		if (itimerfix(&atv)) {
2096 			error = EINVAL;
2097 			goto done;
2098 		}
2099 		s = splclock();
2100 		timeradd(&atv, &time, &atv);
2101 		timo = hzto(&atv);
2102 		/*
2103 		 * Avoid inadvertently sleeping forever.
2104 		 */
2105 		if (timo == 0)
2106 			timo = 1;
2107 		splx(s);
2108 	} else
2109 		timo = 0;
2110 retry:
2111 	ncoll = nselcoll;
2112 	p->p_flag |= P_SELECT;
2113 	error = selscan(p, (fd_mask *)(bits + ni * 0),
2114 			   (fd_mask *)(bits + ni * 3), SCARG(uap, nd), retval);
2115 	if (error || *retval)
2116 		goto done;
2117 	s = splhigh();
2118 	if (timo && timercmp(&time, &atv, >=)) {
2119 		splx(s);
2120 		goto done;
2121 	}
2122 	if ((p->p_flag & P_SELECT) == 0 || nselcoll != ncoll) {
2123 		splx(s);
2124 		goto retry;
2125 	}
2126 	p->p_flag &= ~P_SELECT;
2127 	error = tsleep((caddr_t)&selwait, PSOCK | PCATCH, "select", timo);
2128 	splx(s);
2129 	if (error == 0)
2130 		goto retry;
2131 done:
2132 	p->p_flag &= ~P_SELECT;
2133 	/* select is not restarted after signals... */
2134 	if (error == ERESTART)
2135 		error = EINTR;
2136 	if (error == EWOULDBLOCK)
2137 		error = 0;
2138 	if (error == 0) {
2139 #define	putbits(name, x) \
2140 		if (SCARG(uap, name)) { \
2141 			error = copyout(bits + ni * x, (caddr_t)(u_long)SCARG(uap, name), ni); \
2142 			if (error) \
2143 				goto out; \
2144 		}
2145 		putbits(in, 3);
2146 		putbits(ou, 4);
2147 		putbits(ex, 5);
2148 #undef putbits
2149 	}
2150 out:
2151 	if (ni * 6 > sizeof(smallbits))
2152 		free(bits, M_TEMP);
2153 	return (error);
2154 }
2155 
2156 int
2157 compat_sparc32_fsync(p, v, retval)
2158 	struct proc *p;
2159 	void *v;
2160 	register_t *retval;
2161 {
2162 	struct compat_sparc32_fsync_args /* {
2163 		syscallarg(int) fd;
2164 	} */ *uap = v;
2165 	struct sys_fsync_args ua;
2166 
2167 	SPARC32TO64_UAP(fd);
2168 	return (sys_fsync(p, &ua, retval));
2169 }
2170 
2171 int
2172 compat_sparc32_setpriority(p, v, retval)
2173 	struct proc *p;
2174 	void *v;
2175 	register_t *retval;
2176 {
2177 	struct compat_sparc32_setpriority_args /* {
2178 		syscallarg(int) which;
2179 		syscallarg(int) who;
2180 		syscallarg(int) prio;
2181 	} */ *uap = v;
2182 	struct sys_setpriority_args ua;
2183 
2184 	SPARC32TO64_UAP(which);
2185 	SPARC32TO64_UAP(who);
2186 	SPARC32TO64_UAP(prio);
2187 	return (sys_setpriority(p, &ua, retval));
2188 }
2189 
2190 int
2191 compat_sparc32_socket(p, v, retval)
2192 	struct proc *p;
2193 	void *v;
2194 	register_t *retval;
2195 {
2196 	struct compat_sparc32_socket_args /* {
2197 		syscallarg(int) domain;
2198 		syscallarg(int) type;
2199 		syscallarg(int) protocol;
2200 	} */ *uap = v;
2201 	struct sys_socket_args ua;
2202 
2203 	SPARC32TO64_UAP(domain);
2204 	SPARC32TO64_UAP(type);
2205 	SPARC32TO64_UAP(protocol);
2206 	return (sys_socket(p, &ua, retval));
2207 }
2208 
2209 int
2210 compat_sparc32_connect(p, v, retval)
2211 	struct proc *p;
2212 	void *v;
2213 	register_t *retval;
2214 {
2215 	struct compat_sparc32_connect_args /* {
2216 		syscallarg(int) s;
2217 		syscallarg(const sparc32_sockaddrp_t) name;
2218 		syscallarg(int) namelen;
2219 	} */ *uap = v;
2220 	struct sys_connect_args ua;
2221 
2222 	SPARC32TO64_UAP(s);
2223 	SPARC32TOP_UAP(name, struct sockaddr);
2224 	SPARC32TO64_UAP(namelen);
2225 	return (sys_connect(p, &ua, retval));
2226 }
2227 
2228 int
2229 compat_sparc32_getpriority(p, v, retval)
2230 	struct proc *p;
2231 	void *v;
2232 	register_t *retval;
2233 {
2234 	struct compat_sparc32_getpriority_args /* {
2235 		syscallarg(int) which;
2236 		syscallarg(int) who;
2237 	} */ *uap = v;
2238 	struct sys_getpriority_args ua;
2239 
2240 	SPARC32TO64_UAP(which);
2241 	SPARC32TO64_UAP(who);
2242 	return (sys_getpriority(p, &ua, retval));
2243 }
2244 
2245 #undef DEBUG
2246 int
2247 compat_sparc32_sigreturn(p, v, retval)
2248 	struct proc *p;
2249 	void *v;
2250 	register_t *retval;
2251 {
2252 	struct compat_sparc32_sigreturn_args /* {
2253 		syscallarg(struct sparc32_sigcontext *) sigcntxp;
2254 	} */ *uap = v;
2255 	struct sparc32_sigcontext *scp;
2256 	struct sparc32_sigcontext sc;
2257 	register struct trapframe *tf;
2258 	struct rwindow32 *rwstack, *kstack;
2259 	sigset_t mask;
2260 
2261 	/* First ensure consistent stack state (see sendsig). */
2262 	write_user_windows();
2263 	if (rwindow_save(p)) {
2264 #ifdef DEBUG
2265 		printf("sigreturn: rwindow_save(%p) failed, sending SIGILL\n", p);
2266 		Debugger();
2267 #endif
2268 		sigexit(p, SIGILL);
2269 	}
2270 #ifdef DEBUG
2271 	if (sigdebug & SDB_FOLLOW) {
2272 		printf("sigreturn: %s[%d], sigcntxp %p\n",
2273 		    p->p_comm, p->p_pid, SCARG(uap, sigcntxp));
2274 		if (sigdebug & SDB_DDB) Debugger();
2275 	}
2276 #endif
2277 	scp = (struct sparc32_sigcontext *)(u_long)SCARG(uap, sigcntxp);
2278  	if ((vaddr_t)scp & 3 || (copyin((caddr_t)scp, &sc, sizeof sc) != 0))
2279 #ifdef DEBUG
2280 	{
2281 		printf("sigreturn: copyin failed\n");
2282 		Debugger();
2283 		return (EINVAL);
2284 	}
2285 #else
2286 		return (EINVAL);
2287 #endif
2288 	tf = p->p_md.md_tf;
2289 	/*
2290 	 * Only the icc bits in the psr are used, so it need not be
2291 	 * verified.  pc and npc must be multiples of 4.  This is all
2292 	 * that is required; if it holds, just do it.
2293 	 */
2294 	if (((sc.sc_pc | sc.sc_npc) & 3) != 0)
2295 #ifdef DEBUG
2296 	{
2297 		printf("sigreturn: pc %p or npc %p invalid\n", sc.sc_pc, sc.sc_npc);
2298 		Debugger();
2299 		return (EINVAL);
2300 	}
2301 #else
2302 		return (EINVAL);
2303 #endif
2304 	/* take only psr ICC field */
2305 	tf->tf_tstate = (int64_t)(tf->tf_tstate & ~TSTATE_CCR) | PSRCC_TO_TSTATE(sc.sc_psr);
2306 	tf->tf_pc = (int64_t)sc.sc_pc;
2307 	tf->tf_npc = (int64_t)sc.sc_npc;
2308 	tf->tf_global[1] = (int64_t)sc.sc_g1;
2309 	tf->tf_out[0] = (int64_t)sc.sc_o0;
2310 	tf->tf_out[6] = (int64_t)sc.sc_sp;
2311 	rwstack = (struct rwindow32 *)tf->tf_out[6];
2312 	kstack = (struct rwindow32 *)(((caddr_t)tf)-CCFSZ);
2313 #ifdef DEBUG
2314 	if (sigdebug & SDB_FOLLOW) {
2315 		printf("sys_sigreturn: return trapframe pc=%p sp=%p tstate=%x\n",
2316 		       (int)tf->tf_pc, (int)tf->tf_out[6], (int)tf->tf_tstate);
2317 		if (sigdebug & SDB_DDB) Debugger();
2318 	}
2319 #endif
2320 	if (scp->sc_onstack & SS_ONSTACK)
2321 		p->p_sigacts->ps_sigstk.ss_flags |= SS_ONSTACK;
2322 	else
2323 		p->p_sigacts->ps_sigstk.ss_flags &= ~SS_ONSTACK;
2324 
2325 	/* Restore signal mask */
2326 	native_sigset13_to_sigset(&scp->sc_mask, &mask);
2327 	(void) sigprocmask1(p, SIG_SETMASK, &mask, 0);
2328 	return (EJUSTRETURN);
2329 }
2330 
2331 
2332 int
2333 compat_sparc32_bind(p, v, retval)
2334 	struct proc *p;
2335 	void *v;
2336 	register_t *retval;
2337 {
2338 	struct compat_sparc32_bind_args /* {
2339 		syscallarg(int) s;
2340 		syscallarg(const sparc32_sockaddrp_t) name;
2341 		syscallarg(int) namelen;
2342 	} */ *uap = v;
2343 	struct sys_bind_args ua;
2344 
2345 	SPARC32TO64_UAP(s);
2346 	SPARC32TOP_UAP(name, struct sockaddr);
2347 	SPARC32TO64_UAP(namelen);
2348 	return (sys_bind(p, &ua, retval));
2349 }
2350 
2351 int
2352 compat_sparc32_setsockopt(p, v, retval)
2353 	struct proc *p;
2354 	void *v;
2355 	register_t *retval;
2356 {
2357 	struct compat_sparc32_setsockopt_args /* {
2358 		syscallarg(int) s;
2359 		syscallarg(int) level;
2360 		syscallarg(int) name;
2361 		syscallarg(const sparc32_voidp) val;
2362 		syscallarg(int) valsize;
2363 	} */ *uap = v;
2364 	struct sys_setsockopt_args ua;
2365 
2366 	SPARC32TO64_UAP(s);
2367 	SPARC32TO64_UAP(level);
2368 	SPARC32TO64_UAP(name);
2369 	SPARC32TOP_UAP(val, void);
2370 	SPARC32TO64_UAP(valsize);
2371 	/* may be more efficient to do this inline. */
2372 	return (sys_setsockopt(p, &ua, retval));
2373 }
2374 
2375 int
2376 compat_sparc32_listen(p, v, retval)
2377 	struct proc *p;
2378 	void *v;
2379 	register_t *retval;
2380 {
2381 	struct compat_sparc32_listen_args /* {
2382 		syscallarg(int) s;
2383 		syscallarg(int) backlog;
2384 	} */ *uap = v;
2385 	struct sys_listen_args ua;
2386 
2387 	SPARC32TO64_UAP(s);
2388 	SPARC32TO64_UAP(backlog);
2389 	return (sys_listen(p, &ua, retval));
2390 }
2391 
2392 int
2393 compat_sparc32_vtrace(p, v, retval)
2394 	struct proc *p;
2395 	void *v;
2396 	register_t *retval;
2397 {
2398 #ifdef TRACE
2399 	struct compat_sparc32_vtrace_args /* {
2400 		syscallarg(int) request;
2401 		syscallarg(int) value;
2402 	} */ *uap = v;
2403 	struct sys_vtrace_args ua;
2404 
2405 	SPARC32TO64_UAP(request);
2406 	SPARC32TO64_UAP(value);
2407 	return (vtrace(p, &ua, retval));
2408 #else
2409 	return (ENOSYS);
2410 #endif
2411 }
2412 
2413 int
2414 compat_sparc32_gettimeofday(p, v, retval)
2415 	struct proc *p;
2416 	void *v;
2417 	register_t *retval;
2418 {
2419 	struct compat_sparc32_gettimeofday_args /* {
2420 		syscallarg(sparc32_timevalp_t) tp;
2421 		syscallarg(sparc32_timezonep_t) tzp;
2422 	} */ *uap = v;
2423 	struct timeval atv;
2424 	struct sparc32_timeval tv32;
2425 	int error = 0;
2426 	struct sparc32_timezone tzfake;
2427 
2428 	if (SCARG(uap, tp)) {
2429 		microtime(&atv);
2430 		sparc32_from_timeval(&atv, &tv32);
2431 		error = copyout(&tv32, (caddr_t)(u_long)SCARG(uap, tp), sizeof(tv32));
2432 		if (error)
2433 			return (error);
2434 	}
2435 	if (SCARG(uap, tzp)) {
2436 		/*
2437 		 * NetBSD has no kernel notion of time zone, so we just
2438 		 * fake up a timezone struct and return it if demanded.
2439 		 */
2440 		tzfake.tz_minuteswest = 0;
2441 		tzfake.tz_dsttime = 0;
2442 		error = copyout(&tzfake, (caddr_t)(u_long)SCARG(uap, tzp), sizeof(tzfake));
2443 	}
2444 	return (error);
2445 }
2446 
2447 static int settime __P((struct timeval *));
2448 /* This function is used by clock_settime and settimeofday */
2449 static int
2450 settime(tv)
2451 	struct timeval *tv;
2452 {
2453 	struct timeval delta;
2454 	int s;
2455 
2456 	/* WHAT DO WE DO ABOUT PENDING REAL-TIME TIMEOUTS??? */
2457 	s = splclock();
2458 	timersub(tv, &time, &delta);
2459 	if ((delta.tv_sec < 0 || delta.tv_usec < 0) && securelevel > 1)
2460 		return (EPERM);
2461 #ifdef notyet
2462 	if ((delta.tv_sec < 86400) && securelevel > 0)
2463 		return (EPERM);
2464 #endif
2465 	time = *tv;
2466 	(void) splsoftclock();
2467 	timeradd(&boottime, &delta, &boottime);
2468 	timeradd(&runtime, &delta, &runtime);
2469 #	if defined(NFS) || defined(NFSSERVER)
2470 		nqnfs_lease_updatetime(delta.tv_sec);
2471 #	endif
2472 	splx(s);
2473 	resettodr();
2474 	return (0);
2475 }
2476 
2477 
2478 int
2479 compat_sparc32_settimeofday(p, v, retval)
2480 	struct proc *p;
2481 	void *v;
2482 	register_t *retval;
2483 {
2484 	struct compat_sparc32_settimeofday_args /* {
2485 		syscallarg(const sparc32_timevalp_t) tv;
2486 		syscallarg(const sparc32_timezonep_t) tzp;
2487 	} */ *uap = v;
2488 	struct sparc32_timeval atv32;
2489 	struct timeval atv;
2490 	struct sparc32_timezone atz;
2491 	int error;
2492 
2493 	if ((error = suser(p->p_ucred, &p->p_acflag)) != 0)
2494 		return (error);
2495 	/* Verify all parameters before changing time. */
2496 	if (SCARG(uap, tv) && (error = copyin((caddr_t)(u_long)SCARG(uap, tv),
2497 	    &atv32, sizeof(atv32))))
2498 		return (error);
2499 	sparc32_to_timeval(&atv32, &atv);
2500 	/* XXX since we don't use tz, probably no point in doing copyin. */
2501 	if (SCARG(uap, tzp) && (error = copyin((caddr_t)(u_long)SCARG(uap, tzp),
2502 	    &atz, sizeof(atz))))
2503 		return (error);
2504 	if (SCARG(uap, tv))
2505 		if ((error = settime(&atv)))
2506 			return (error);
2507 	/*
2508 	 * NetBSD has no kernel notion of time zone, and only an
2509 	 * obsolete program would try to set it, so we log a warning.
2510 	 */
2511 	if (SCARG(uap, tzp))
2512 		printf("pid %d attempted to set the "
2513 		    "(obsolete) kernel time zone\n", p->p_pid);
2514 	return (0);
2515 }
2516 
2517 int
2518 compat_sparc32_fchown(p, v, retval)
2519 	struct proc *p;
2520 	void *v;
2521 	register_t *retval;
2522 {
2523 	struct compat_sparc32_fchown_args /* {
2524 		syscallarg(int) fd;
2525 		syscallarg(uid_t) uid;
2526 		syscallarg(gid_t) gid;
2527 	} */ *uap = v;
2528 	struct sys_fchown_args ua;
2529 
2530 	SPARC32TO64_UAP(fd);
2531 	SPARC32TO64_UAP(uid);
2532 	SPARC32TO64_UAP(gid);
2533 	return (sys_fchown(p, &ua, retval));
2534 }
2535 
2536 int
2537 compat_sparc32_fchmod(p, v, retval)
2538 	struct proc *p;
2539 	void *v;
2540 	register_t *retval;
2541 {
2542 	struct compat_sparc32_fchmod_args /* {
2543 		syscallarg(int) fd;
2544 		syscallarg(mode_t) mode;
2545 	} */ *uap = v;
2546 	struct sys_fchmod_args ua;
2547 
2548 	SPARC32TO64_UAP(fd);
2549 	SPARC32TO64_UAP(mode);
2550 	return (sys_fchmod(p, &ua, retval));
2551 }
2552 
2553 int
2554 compat_sparc32_setreuid(p, v, retval)
2555 	struct proc *p;
2556 	void *v;
2557 	register_t *retval;
2558 {
2559 	struct compat_sparc32_setreuid_args /* {
2560 		syscallarg(uid_t) ruid;
2561 		syscallarg(uid_t) euid;
2562 	} */ *uap = v;
2563 	struct sys_setreuid_args ua;
2564 
2565 	SPARC32TO64_UAP(ruid);
2566 	SPARC32TO64_UAP(euid);
2567 	return (sys_setreuid(p, &ua, retval));
2568 }
2569 
2570 int
2571 compat_sparc32_setregid(p, v, retval)
2572 	struct proc *p;
2573 	void *v;
2574 	register_t *retval;
2575 {
2576 	struct compat_sparc32_setregid_args /* {
2577 		syscallarg(gid_t) rgid;
2578 		syscallarg(gid_t) egid;
2579 	} */ *uap = v;
2580 	struct sys_setregid_args ua;
2581 
2582 	SPARC32TO64_UAP(rgid);
2583 	SPARC32TO64_UAP(egid);
2584 	return (sys_setregid(p, &ua, retval));
2585 }
2586 
2587 int
2588 compat_sparc32_getrusage(p, v, retval)
2589 	struct proc *p;
2590 	void *v;
2591 	register_t *retval;
2592 {
2593 	struct compat_sparc32_getrusage_args /* {
2594 		syscallarg(int) who;
2595 		syscallarg(sparc32_rusagep_t) rusage;
2596 	} */ *uap = v;
2597 	struct rusage *rup;
2598 	struct sparc32_rusage ru;
2599 
2600 	switch (SCARG(uap, who)) {
2601 
2602 	case RUSAGE_SELF:
2603 		rup = &p->p_stats->p_ru;
2604 		calcru(p, &rup->ru_utime, &rup->ru_stime, NULL);
2605 		break;
2606 
2607 	case RUSAGE_CHILDREN:
2608 		rup = &p->p_stats->p_cru;
2609 		break;
2610 
2611 	default:
2612 		return (EINVAL);
2613 	}
2614 	sparc32_from_rusage(rup, &ru);
2615 	return (copyout(&ru, (caddr_t)(u_long)SCARG(uap, rusage), sizeof(ru)));
2616 }
2617 
2618 int
2619 compat_sparc32_getsockopt(p, v, retval)
2620 	struct proc *p;
2621 	void *v;
2622 	register_t *retval;
2623 {
2624 	struct compat_sparc32_getsockopt_args /* {
2625 		syscallarg(int) s;
2626 		syscallarg(int) level;
2627 		syscallarg(int) name;
2628 		syscallarg(sparc32_voidp) val;
2629 		syscallarg(sparc32_intp) avalsize;
2630 	} */ *uap = v;
2631 	struct sys_getsockopt_args ua;
2632 
2633 	SPARC32TO64_UAP(s);
2634 	SPARC32TO64_UAP(level);
2635 	SPARC32TO64_UAP(name);
2636 	SPARC32TOP_UAP(val, void);
2637 	SPARC32TOP_UAP(avalsize, int);
2638 	return (sys_getsockopt(p, &ua, retval));
2639 }
2640 
2641 int
2642 compat_sparc32_readv(p, v, retval)
2643 	struct proc *p;
2644 	void *v;
2645 	register_t *retval;
2646 {
2647 	struct compat_sparc32_readv_args /* {
2648 		syscallarg(int) fd;
2649 		syscallarg(const sparc32_iovecp_t) iovp;
2650 		syscallarg(int) iovcnt;
2651 	} */ *uap = v;
2652 	int fd = SCARG(uap, fd);
2653 	register struct file *fp;
2654 	register struct filedesc *fdp = p->p_fd;
2655 
2656 	if ((u_int)fd >= fdp->fd_nfiles ||
2657 	    (fp = fdp->fd_ofiles[fd]) == NULL ||
2658 	    (fp->f_flag & FREAD) == 0)
2659 		return (EBADF);
2660 
2661 	return (dofilereadv32(p, fd, fp, (struct sparc32_iovec *)(u_long)SCARG(uap, iovp),
2662 			      SCARG(uap, iovcnt), &fp->f_offset, FOF_UPDATE_OFFSET, retval));
2663 }
2664 
2665 /* Damn thing copies in the iovec! */
2666 int
2667 dofilereadv32(p, fd, fp, iovp, iovcnt, offset, flags, retval)
2668 	struct proc *p;
2669 	int fd;
2670 	struct file *fp;
2671 	struct sparc32_iovec *iovp;
2672 	int iovcnt;
2673 	off_t *offset;
2674 	int flags;
2675 	register_t *retval;
2676 {
2677 	struct uio auio;
2678 	register struct iovec *iov;
2679 	struct iovec *needfree;
2680 	struct iovec aiov[UIO_SMALLIOV];
2681 	long i, cnt, error = 0;
2682 	u_int iovlen;
2683 #ifdef KTRACE
2684 	struct iovec *ktriov = NULL;
2685 #endif
2686 
2687 	/* note: can't use iovlen until iovcnt is validated */
2688 	iovlen = iovcnt * sizeof(struct iovec);
2689 	if ((u_int)iovcnt > UIO_SMALLIOV) {
2690 		if ((u_int)iovcnt > IOV_MAX)
2691 			return (EINVAL);
2692 		MALLOC(iov, struct iovec *, iovlen, M_IOV, M_WAITOK);
2693 		needfree = iov;
2694 	} else if ((u_int)iovcnt > 0) {
2695 		iov = aiov;
2696 		needfree = NULL;
2697 	} else
2698 		return (EINVAL);
2699 
2700 	auio.uio_iov = iov;
2701 	auio.uio_iovcnt = iovcnt;
2702 	auio.uio_rw = UIO_READ;
2703 	auio.uio_segflg = UIO_USERSPACE;
2704 	auio.uio_procp = p;
2705 	error = sparc32_to_iovecin(iovp, iov, iovcnt);
2706 	if (error)
2707 		goto done;
2708 	auio.uio_resid = 0;
2709 	for (i = 0; i < iovcnt; i++) {
2710 		auio.uio_resid += iov->iov_len;
2711 		/*
2712 		 * Reads return ssize_t because -1 is returned on error.
2713 		 * Therefore we must restrict the length to SSIZE_MAX to
2714 		 * avoid garbage return values.
2715 		 */
2716 		if (iov->iov_len > SSIZE_MAX || auio.uio_resid > SSIZE_MAX) {
2717 			error = EINVAL;
2718 			goto done;
2719 		}
2720 		iov++;
2721 	}
2722 #ifdef KTRACE
2723 	/*
2724 	 * if tracing, save a copy of iovec
2725 	 */
2726 	if (KTRPOINT(p, KTR_GENIO))  {
2727 		MALLOC(ktriov, struct iovec *, iovlen, M_TEMP, M_WAITOK);
2728 		memcpy((caddr_t)ktriov, (caddr_t)auio.uio_iov, iovlen);
2729 	}
2730 #endif
2731 	cnt = auio.uio_resid;
2732 	error = (*fp->f_ops->fo_read)(fp, offset, &auio, fp->f_cred, flags);
2733 	if (error)
2734 		if (auio.uio_resid != cnt && (error == ERESTART ||
2735 		    error == EINTR || error == EWOULDBLOCK))
2736 			error = 0;
2737 	cnt -= auio.uio_resid;
2738 #ifdef KTRACE
2739 	if (KTRPOINT(p, KTR_GENIO))
2740 		if (error == 0) {
2741 			ktrgenio(p->p_tracep, fd, UIO_READ, ktriov, cnt,
2742 			    error);
2743 		FREE(ktriov, M_TEMP);
2744 	}
2745 #endif
2746 	*retval = cnt;
2747 done:
2748 	if (needfree)
2749 		FREE(needfree, M_IOV);
2750 	return (error);
2751 }
2752 
2753 
2754 int
2755 compat_sparc32_writev(p, v, retval)
2756 	struct proc *p;
2757 	void *v;
2758 	register_t *retval;
2759 {
2760 	struct compat_sparc32_writev_args /* {
2761 		syscallarg(int) fd;
2762 		syscallarg(const sparc32_iovecp_t) iovp;
2763 		syscallarg(int) iovcnt;
2764 	} */ *uap = v;
2765 	int fd = SCARG(uap, fd);
2766 	register struct file *fp;
2767 	register struct filedesc *fdp = p->p_fd;
2768 
2769 	if ((u_int)fd >= fdp->fd_nfiles ||
2770 	    (fp = fdp->fd_ofiles[fd]) == NULL ||
2771 	    (fp->f_flag & FWRITE) == 0)
2772 		return (EBADF);
2773 
2774 	return (dofilewritev32(p, fd, fp, (struct sparc32_iovec *)(u_long)SCARG(uap, iovp),
2775 			       SCARG(uap, iovcnt), &fp->f_offset, FOF_UPDATE_OFFSET, retval));
2776 }
2777 
2778 int
2779 dofilewritev32(p, fd, fp, iovp, iovcnt, offset, flags, retval)
2780 	struct proc *p;
2781 	int fd;
2782 	struct file *fp;
2783 	struct sparc32_iovec *iovp;
2784 	int iovcnt;
2785 	off_t *offset;
2786 	int flags;
2787 	register_t *retval;
2788 {
2789 	struct uio auio;
2790 	register struct iovec *iov;
2791 	struct iovec *needfree;
2792 	struct iovec aiov[UIO_SMALLIOV];
2793 	long i, cnt, error = 0;
2794 	u_int iovlen;
2795 #ifdef KTRACE
2796 	struct iovec *ktriov = NULL;
2797 #endif
2798 
2799 	/* note: can't use iovlen until iovcnt is validated */
2800 	iovlen = iovcnt * sizeof(struct iovec);
2801 	if ((u_int)iovcnt > UIO_SMALLIOV) {
2802 		if ((u_int)iovcnt > IOV_MAX)
2803 			return (EINVAL);
2804 		MALLOC(iov, struct iovec *, iovlen, M_IOV, M_WAITOK);
2805 		needfree = iov;
2806 	} else if ((u_int)iovcnt > 0) {
2807 		iov = aiov;
2808 		needfree = NULL;
2809 	} else
2810 		return (EINVAL);
2811 
2812 	auio.uio_iov = iov;
2813 	auio.uio_iovcnt = iovcnt;
2814 	auio.uio_rw = UIO_WRITE;
2815 	auio.uio_segflg = UIO_USERSPACE;
2816 	auio.uio_procp = p;
2817 	error = sparc32_to_iovecin(iovp, iov, iovcnt);
2818 	if (error)
2819 		goto done;
2820 	auio.uio_resid = 0;
2821 	for (i = 0; i < iovcnt; i++) {
2822 		auio.uio_resid += iov->iov_len;
2823 		/*
2824 		 * Writes return ssize_t because -1 is returned on error.
2825 		 * Therefore we must restrict the length to SSIZE_MAX to
2826 		 * avoid garbage return values.
2827 		 */
2828 		if (iov->iov_len > SSIZE_MAX || auio.uio_resid > SSIZE_MAX) {
2829 			error = EINVAL;
2830 			goto done;
2831 		}
2832 		iov++;
2833 	}
2834 #ifdef KTRACE
2835 	/*
2836 	 * if tracing, save a copy of iovec
2837 	 */
2838 	if (KTRPOINT(p, KTR_GENIO))  {
2839 		MALLOC(ktriov, struct iovec *, iovlen, M_TEMP, M_WAITOK);
2840 		memcpy((caddr_t)ktriov, (caddr_t)auio.uio_iov, iovlen);
2841 	}
2842 #endif
2843 	cnt = auio.uio_resid;
2844 	error = (*fp->f_ops->fo_write)(fp, offset, &auio, fp->f_cred, flags);
2845 	if (error) {
2846 		if (auio.uio_resid != cnt && (error == ERESTART ||
2847 		    error == EINTR || error == EWOULDBLOCK))
2848 			error = 0;
2849 		if (error == EPIPE)
2850 			psignal(p, SIGPIPE);
2851 	}
2852 	cnt -= auio.uio_resid;
2853 #ifdef KTRACE
2854 	if (KTRPOINT(p, KTR_GENIO))
2855 		if (error == 0) {
2856 			ktrgenio(p->p_tracep, fd, UIO_WRITE, ktriov, cnt,
2857 			    error);
2858 		FREE(ktriov, M_TEMP);
2859 	}
2860 #endif
2861 	*retval = cnt;
2862 done:
2863 	if (needfree)
2864 		FREE(needfree, M_IOV);
2865 	return (error);
2866 }
2867 
2868 
2869 int
2870 compat_sparc32_rename(p, v, retval)
2871 	struct proc *p;
2872 	void *v;
2873 	register_t *retval;
2874 {
2875 	struct compat_sparc32_rename_args /* {
2876 		syscallarg(const sparc32_charp) from;
2877 		syscallarg(const sparc32_charp) to;
2878 	} */ *uap = v;
2879 	struct sys_rename_args ua;
2880 
2881 	SPARC32TOP_UAP(from, const char *);
2882 	SPARC32TOP_UAP(to, const char *)
2883 
2884 	return (sys_rename(p, &ua, retval));
2885 }
2886 
2887 int
2888 compat_sparc32_flock(p, v, retval)
2889 	struct proc *p;
2890 	void *v;
2891 	register_t *retval;
2892 {
2893 	struct compat_sparc32_flock_args /* {
2894 		syscallarg(int) fd;
2895 		syscallarg(int) how;
2896 	} */ *uap = v;
2897 	struct sys_flock_args ua;
2898 
2899 	SPARC32TO64_UAP(fd);
2900 	SPARC32TO64_UAP(how)
2901 
2902 	return (sys_flock(p, &ua, retval));
2903 }
2904 
2905 int
2906 compat_sparc32_mkfifo(p, v, retval)
2907 	struct proc *p;
2908 	void *v;
2909 	register_t *retval;
2910 {
2911 	struct compat_sparc32_mkfifo_args /* {
2912 		syscallarg(const sparc32_charp) path;
2913 		syscallarg(mode_t) mode;
2914 	} */ *uap = v;
2915 	struct sys_mkfifo_args ua;
2916 
2917 	SPARC32TOP_UAP(path, const char)
2918 	SPARC32TO64_UAP(mode);
2919 	return (sys_mkfifo(p, &ua, retval));
2920 }
2921 
2922 int
2923 compat_sparc32_shutdown(p, v, retval)
2924 	struct proc *p;
2925 	void *v;
2926 	register_t *retval;
2927 {
2928 	struct compat_sparc32_shutdown_args /* {
2929 		syscallarg(int) s;
2930 		syscallarg(int) how;
2931 	} */ *uap = v;
2932 	struct sys_shutdown_args ua;
2933 
2934 	SPARC32TO64_UAP(s)
2935 	SPARC32TO64_UAP(how);
2936 	return (sys_shutdown(p, &ua, retval));
2937 }
2938 
2939 int
2940 compat_sparc32_socketpair(p, v, retval)
2941 	struct proc *p;
2942 	void *v;
2943 	register_t *retval;
2944 {
2945 	struct compat_sparc32_socketpair_args /* {
2946 		syscallarg(int) domain;
2947 		syscallarg(int) type;
2948 		syscallarg(int) protocol;
2949 		syscallarg(sparc32_intp) rsv;
2950 	} */ *uap = v;
2951 	struct sys_socketpair_args ua;
2952 
2953 	SPARC32TO64_UAP(domain);
2954 	SPARC32TO64_UAP(type);
2955 	SPARC32TO64_UAP(protocol);
2956 	SPARC32TOP_UAP(rsv, int);
2957 	/* Since we're just copying out two `int's we can do this */
2958 	return (sys_socketpair(p, &ua, retval));
2959 }
2960 
2961 int
2962 compat_sparc32_mkdir(p, v, retval)
2963 	struct proc *p;
2964 	void *v;
2965 	register_t *retval;
2966 {
2967 	struct compat_sparc32_mkdir_args /* {
2968 		syscallarg(const sparc32_charp) path;
2969 		syscallarg(mode_t) mode;
2970 	} */ *uap = v;
2971 	struct sys_mkdir_args ua;
2972 
2973 	SPARC32TOP_UAP(path, const char)
2974 	SPARC32TO64_UAP(mode);
2975 	return (sys_mkdir(p, &ua, retval));
2976 }
2977 
2978 int
2979 compat_sparc32_rmdir(p, v, retval)
2980 	struct proc *p;
2981 	void *v;
2982 	register_t *retval;
2983 {
2984 	struct compat_sparc32_rmdir_args /* {
2985 		syscallarg(const sparc32_charp) path;
2986 	} */ *uap = v;
2987 	struct sys_rmdir_args ua;
2988 
2989 	SPARC32TOP_UAP(path, const char);
2990 	return (sys_rmdir(p, &ua, retval));
2991 }
2992 
2993 int
2994 compat_sparc32_utimes(p, v, retval)
2995 	struct proc *p;
2996 	void *v;
2997 	register_t *retval;
2998 {
2999 	struct compat_sparc32_utimes_args /* {
3000 		syscallarg(const sparc32_charp) path;
3001 		syscallarg(const sparc32_timevalp_t) tptr;
3002 	} */ *uap = v;
3003 	int error;
3004 	struct nameidata nd;
3005 
3006 	NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, (char *)(u_long)SCARG(uap, path), p);
3007 	if ((error = namei(&nd)) != 0)
3008 		return (error);
3009 
3010 	error = change_utimes32(nd.ni_vp, (struct timeval *)(u_long)SCARG(uap, tptr), p);
3011 
3012 	vrele(nd.ni_vp);
3013 	return (error);
3014 }
3015 
3016 /*
3017  * Common routine to set access and modification times given a vnode.
3018  */
3019 static int
3020 change_utimes32(vp, tptr, p)
3021 	struct vnode *vp;
3022 	struct timeval *tptr;
3023 	struct proc *p;
3024 {
3025 	struct sparc32_timeval tv32[2];
3026 	struct timeval tv[2];
3027 	struct vattr vattr;
3028 	int error;
3029 
3030 	VATTR_NULL(&vattr);
3031 	if (tptr == NULL) {
3032 		microtime(&tv[0]);
3033 		tv[1] = tv[0];
3034 		vattr.va_vaflags |= VA_UTIMES_NULL;
3035 	} else {
3036 		error = copyin(tptr, tv, sizeof(tv));
3037 		if (error)
3038 			return (error);
3039 	}
3040 	sparc32_to_timeval(&tv32[0], &tv[0]);
3041 	sparc32_to_timeval(&tv32[1], &tv[1]);
3042 	VOP_LEASE(vp, p, p->p_ucred, LEASE_WRITE);
3043 	vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
3044 	vattr.va_atime.tv_sec = tv[0].tv_sec;
3045 	vattr.va_atime.tv_nsec = tv[0].tv_usec * 1000;
3046 	vattr.va_mtime.tv_sec = tv[1].tv_sec;
3047 	vattr.va_mtime.tv_nsec = tv[1].tv_usec * 1000;
3048 	error = VOP_SETATTR(vp, &vattr, p->p_ucred, p);
3049 	VOP_UNLOCK(vp, 0);
3050 	return (error);
3051 }
3052 
3053 int
3054 compat_sparc32_adjtime(p, v, retval)
3055 	struct proc *p;
3056 	void *v;
3057 	register_t *retval;
3058 {
3059 	struct compat_sparc32_adjtime_args /* {
3060 		syscallarg(const sparc32_timevalp_t) delta;
3061 		syscallarg(sparc32_timevalp_t) olddelta;
3062 	} */ *uap = v;
3063 	struct sparc32_timeval atv;
3064 	int32_t ndelta, ntickdelta, odelta;
3065 	int s, error;
3066 	extern long bigadj, timedelta;
3067 	extern int tickdelta;
3068 
3069 	if ((error = suser(p->p_ucred, &p->p_acflag)) != 0)
3070 		return (error);
3071 
3072 	error = copyin((caddr_t)(u_long)SCARG(uap, delta), &atv, sizeof(struct timeval));
3073 	if (error)
3074 		return (error);
3075 	/*
3076 	 * Compute the total correction and the rate at which to apply it.
3077 	 * Round the adjustment down to a whole multiple of the per-tick
3078 	 * delta, so that after some number of incremental changes in
3079 	 * hardclock(), tickdelta will become zero, lest the correction
3080 	 * overshoot and start taking us away from the desired final time.
3081 	 */
3082 	ndelta = atv.tv_sec * 1000000 + atv.tv_usec;
3083 	if (ndelta > bigadj)
3084 		ntickdelta = 10 * tickadj;
3085 	else
3086 		ntickdelta = tickadj;
3087 	if (ndelta % ntickdelta)
3088 		ndelta = ndelta / ntickdelta * ntickdelta;
3089 
3090 	/*
3091 	 * To make hardclock()'s job easier, make the per-tick delta negative
3092 	 * if we want time to run slower; then hardclock can simply compute
3093 	 * tick + tickdelta, and subtract tickdelta from timedelta.
3094 	 */
3095 	if (ndelta < 0)
3096 		ntickdelta = -ntickdelta;
3097 	s = splclock();
3098 	odelta = timedelta;
3099 	timedelta = ndelta;
3100 	tickdelta = ntickdelta;
3101 	splx(s);
3102 
3103 	if (SCARG(uap, olddelta)) {
3104 		atv.tv_sec = odelta / 1000000;
3105 		atv.tv_usec = odelta % 1000000;
3106 		(void) copyout(&atv, (caddr_t)(u_long)SCARG(uap, olddelta),
3107 		    sizeof(struct timeval));
3108 	}
3109 	return (0);
3110 }
3111 
3112 int
3113 compat_sparc32_quotactl(p, v, retval)
3114 	struct proc *p;
3115 	void *v;
3116 	register_t *retval;
3117 {
3118 	struct compat_sparc32_quotactl_args /* {
3119 		syscallarg(const sparc32_charp) path;
3120 		syscallarg(int) cmd;
3121 		syscallarg(int) uid;
3122 		syscallarg(sparc32_caddr_t) arg;
3123 	} */ *uap = v;
3124 	struct sys_quotactl_args ua;
3125 
3126 	SPARC32TOP_UAP(path, const char);
3127 	SPARC32TO64_UAP(cmd);
3128 	SPARC32TO64_UAP(uid);
3129 	SPARC32TOX64_UAP(arg, caddr_t);
3130 	return (sys_quotactl(p, &ua, retval));
3131 }
3132 
3133 #if defined(NFS) || defined(NFSSERVER)
3134 int
3135 compat_sparc32_nfssvc(p, v, retval)
3136 	struct proc *p;
3137 	void *v;
3138 	register_t *retval;
3139 {
3140 #if 0
3141 	struct compat_sparc32_nfssvc_args /* {
3142 		syscallarg(int) flag;
3143 		syscallarg(sparc32_voidp) argp;
3144 	} */ *uap = v;
3145 	struct sys_nfssvc_args ua;
3146 
3147 	SPARC32TO64_UAP(flag);
3148 	SPARC32TOP_UAP(argp, void);
3149 	return (sys_nfssvc(p, &ua, retval));
3150 #else
3151 	/* Why would we want to support a 32-bit nfsd? */
3152 	return (ENOSYS);
3153 #endif
3154 }
3155 #endif
3156 
3157 int
3158 compat_sparc32_statfs(p, v, retval)
3159 	struct proc *p;
3160 	void *v;
3161 	register_t *retval;
3162 {
3163 	struct compat_sparc32_statfs_args /* {
3164 		syscallarg(const sparc32_charp) path;
3165 		syscallarg(sparc32_statfsp_t) buf;
3166 	} */ *uap = v;
3167 	register struct mount *mp;
3168 	register struct statfs *sp;
3169 	struct sparc32_statfs s32;
3170 	int error;
3171 	struct nameidata nd;
3172 
3173 	NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, (char *)(u_long)SCARG(uap, path), p);
3174 	if ((error = namei(&nd)) != 0)
3175 		return (error);
3176 	mp = nd.ni_vp->v_mount;
3177 	sp = &mp->mnt_stat;
3178 	vrele(nd.ni_vp);
3179 	if ((error = VFS_STATFS(mp, sp, p)) != 0)
3180 		return (error);
3181 	sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
3182 	sparc32_from_statfs(sp, &s32);
3183 	return (copyout(&s32, (caddr_t)(u_long)SCARG(uap, buf), sizeof(s32)));
3184 }
3185 
3186 int
3187 compat_sparc32_fstatfs(p, v, retval)
3188 	struct proc *p;
3189 	void *v;
3190 	register_t *retval;
3191 {
3192 	struct compat_sparc32_fstatfs_args /* {
3193 		syscallarg(int) fd;
3194 		syscallarg(sparc32_statfsp_t) buf;
3195 	} */ *uap = v;
3196 	struct file *fp;
3197 	register struct mount *mp;
3198 	register struct statfs *sp;
3199 	struct sparc32_statfs s32;
3200 	int error;
3201 
3202 	if ((error = getvnode(p->p_fd, SCARG(uap, fd), &fp)) != 0)
3203 		return (error);
3204 	mp = ((struct vnode *)fp->f_data)->v_mount;
3205 	sp = &mp->mnt_stat;
3206 	if ((error = VFS_STATFS(mp, sp, p)) != 0)
3207 		return (error);
3208 	sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
3209 	sparc32_from_statfs(sp, &s32);
3210 	return (copyout(&s32, (caddr_t)(u_long)SCARG(uap, buf), sizeof(s32)));
3211 }
3212 
3213 #if defined(NFS) || defined(NFSSERVER)
3214 int
3215 compat_sparc32_getfh(p, v, retval)
3216 	struct proc *p;
3217 	void *v;
3218 	register_t *retval;
3219 {
3220 	struct compat_sparc32_getfh_args /* {
3221 		syscallarg(const sparc32_charp) fname;
3222 		syscallarg(sparc32_fhandlep_t) fhp;
3223 	} */ *uap = v;
3224 	struct sys_getfh_args ua;
3225 
3226 	SPARC32TOP_UAP(fname, const char);
3227 	SPARC32TOP_UAP(fhp, struct fhandle);
3228 	/* Lucky for us a fhandlep_t doesn't change sizes */
3229 	return (sys_getfh(p, &ua, retval));
3230 }
3231 #endif
3232 
3233 int
3234 compat_sparc32_sysarch(p, v, retval)
3235 	struct proc *p;
3236 	void *v;
3237 	register_t *retval;
3238 {
3239 	struct compat_sparc32_sysarch_args /* {
3240 		syscallarg(int) op;
3241 		syscallarg(sparc32_voidp) parms;
3242 	} */ *uap = v;
3243 
3244 	switch (SCARG(uap, op)) {
3245 	default:
3246 		printf("(sparc64) compat_sparc32_sysarch(%d)\n", SCARG(uap, op));
3247 		return EINVAL;
3248 	}
3249 }
3250 
3251 int
3252 compat_sparc32_pread(p, v, retval)
3253 	struct proc *p;
3254 	void *v;
3255 	register_t *retval;
3256 {
3257 	struct compat_sparc32_pread_args /* {
3258 		syscallarg(int) fd;
3259 		syscallarg(sparc32_voidp) buf;
3260 		syscallarg(sparc32_size_t) nbyte;
3261 		syscallarg(int) pad;
3262 		syscallarg(off_t) offset;
3263 	} */ *uap = v;
3264 	struct sys_pread_args ua;
3265 	ssize_t rt;
3266 	int error;
3267 
3268 	SPARC32TO64_UAP(fd);
3269 	SPARC32TOP_UAP(buf, void);
3270 	SPARC32TOX_UAP(nbyte, size_t);
3271 	SPARC32TO64_UAP(pad);
3272 	SPARC32TO64_UAP(offset);
3273 	error = sys_pread(p, &ua, (register_t *)&rt);
3274 	*(sparc32_ssize_t *)retval = rt;
3275 	return (error);
3276 }
3277 
3278 int
3279 compat_sparc32_pwrite(p, v, retval)
3280 	struct proc *p;
3281 	void *v;
3282 	register_t *retval;
3283 {
3284 	struct compat_sparc32_pwrite_args /* {
3285 		syscallarg(int) fd;
3286 		syscallarg(const sparc32_voidp) buf;
3287 		syscallarg(sparc32_size_t) nbyte;
3288 		syscallarg(int) pad;
3289 		syscallarg(off_t) offset;
3290 	} */ *uap = v;
3291 	struct sys_pwrite_args ua;
3292 	ssize_t rt;
3293 	int error;
3294 
3295 	SPARC32TO64_UAP(fd);
3296 	SPARC32TOP_UAP(buf, void);
3297 	SPARC32TOX_UAP(nbyte, size_t);
3298 	SPARC32TO64_UAP(pad);
3299 	SPARC32TO64_UAP(offset);
3300 	error = sys_pwrite(p, &ua, (register_t *)&rt);
3301 	*(sparc32_ssize_t *)retval = rt;
3302 	return (error);
3303 }
3304 
3305 #ifdef NTP
3306 int
3307 compat_sparc32_ntp_gettime(p, v, retval)
3308 	struct proc *p;
3309 	void *v;
3310 	register_t *retval;
3311 {
3312 	struct compat_sparc32_ntp_gettime_args /* {
3313 		syscallarg(sparc32_ntptimevalp_t) ntvp;
3314 	} */ *uap = v;
3315 	struct sparc32_ntptimeval ntv32;
3316 	struct timeval atv;
3317 	struct ntptimeval ntv;
3318 	int error = 0;
3319 	int s;
3320 
3321 	/* The following are NTP variables */
3322 	extern long time_maxerror;
3323 	extern long time_esterror;
3324 	extern int time_status;
3325 	extern int time_state;	/* clock state */
3326 	extern int time_status;	/* clock status bits */
3327 
3328 	if (SCARG(uap, ntvp)) {
3329 		s = splclock();
3330 #ifdef EXT_CLOCK
3331 		/*
3332 		 * The microtime() external clock routine returns a
3333 		 * status code. If less than zero, we declare an error
3334 		 * in the clock status word and return the kernel
3335 		 * (software) time variable. While there are other
3336 		 * places that call microtime(), this is the only place
3337 		 * that matters from an application point of view.
3338 		 */
3339 		if (microtime(&atv) < 0) {
3340 			time_status |= STA_CLOCKERR;
3341 			ntv.time = time;
3342 		} else
3343 			time_status &= ~STA_CLOCKERR;
3344 #else /* EXT_CLOCK */
3345 		microtime(&atv);
3346 #endif /* EXT_CLOCK */
3347 		ntv.time = atv;
3348 		ntv.maxerror = time_maxerror;
3349 		ntv.esterror = time_esterror;
3350 		(void) splx(s);
3351 
3352 		sparc32_from_timeval(&ntv.time, &ntv32.time);
3353 		ntv32.maxerror = (sparc32_long)ntv.maxerror;
3354 		ntv32.esterror = (sparc32_long)ntv.esterror;
3355 		error = copyout((caddr_t)&ntv32, (caddr_t)(u_long)SCARG(uap, ntvp),
3356 		    sizeof(ntv32));
3357 	}
3358 	if (!error) {
3359 
3360 		/*
3361 		 * Status word error decode. If any of these conditions
3362 		 * occur, an error is returned, instead of the status
3363 		 * word. Most applications will care only about the fact
3364 		 * the system clock may not be trusted, not about the
3365 		 * details.
3366 		 *
3367 		 * Hardware or software error
3368 		 */
3369 		if ((time_status & (STA_UNSYNC | STA_CLOCKERR)) ||
3370 
3371 		/*
3372 		 * PPS signal lost when either time or frequency
3373 		 * synchronization requested
3374 		 */
3375 		    (time_status & (STA_PPSFREQ | STA_PPSTIME) &&
3376 		    !(time_status & STA_PPSSIGNAL)) ||
3377 
3378 		/*
3379 		 * PPS jitter exceeded when time synchronization
3380 		 * requested
3381 		 */
3382 		    (time_status & STA_PPSTIME &&
3383 		    time_status & STA_PPSJITTER) ||
3384 
3385 		/*
3386 		 * PPS wander exceeded or calibration error when
3387 		 * frequency synchronization requested
3388 		 */
3389 		    (time_status & STA_PPSFREQ &&
3390 		    time_status & (STA_PPSWANDER | STA_PPSERROR)))
3391 			*retval = TIME_ERROR;
3392 		else
3393 			*retval = (register_t)time_state;
3394 	}
3395 	return(error);
3396 }
3397 
3398 int
3399 compat_sparc32_ntp_adjtime(p, v, retval)
3400 	struct proc *p;
3401 	void *v;
3402 	register_t *retval;
3403 {
3404 	struct compat_sparc32_ntp_adjtime_args /* {
3405 		syscallarg(sparc32_timexp_t) tp;
3406 	} */ *uap = v;
3407 	struct sparc32_timex ntv32;
3408 	struct timex ntv;
3409 	int error = 0;
3410 	int modes;
3411 	int s;
3412 	extern long time_freq;		/* frequency offset (scaled ppm) */
3413 	extern long time_maxerror;
3414 	extern long time_esterror;
3415 	extern int time_state;	/* clock state */
3416 	extern int time_status;	/* clock status bits */
3417 	extern long time_constant;		/* pll time constant */
3418 	extern long time_offset;		/* time offset (us) */
3419 	extern long time_tolerance;	/* frequency tolerance (scaled ppm) */
3420 	extern long time_precision;	/* clock precision (us) */
3421 
3422 	if ((error = copyin((caddr_t)(u_long)SCARG(uap, tp), (caddr_t)&ntv32,
3423 			sizeof(ntv32))))
3424 		return (error);
3425 	sparc32_to_timex(&ntv32, &ntv);
3426 
3427 	/*
3428 	 * Update selected clock variables - only the superuser can
3429 	 * change anything. Note that there is no error checking here on
3430 	 * the assumption the superuser should know what it is doing.
3431 	 */
3432 	modes = ntv.modes;
3433 	if (modes != 0 && (error = suser(p->p_ucred, &p->p_acflag)))
3434 		return (error);
3435 
3436 	s = splclock();
3437 	if (modes & MOD_FREQUENCY)
3438 #ifdef PPS_SYNC
3439 		time_freq = ntv.freq - pps_freq;
3440 #else /* PPS_SYNC */
3441 		time_freq = ntv.freq;
3442 #endif /* PPS_SYNC */
3443 	if (modes & MOD_MAXERROR)
3444 		time_maxerror = ntv.maxerror;
3445 	if (modes & MOD_ESTERROR)
3446 		time_esterror = ntv.esterror;
3447 	if (modes & MOD_STATUS) {
3448 		time_status &= STA_RONLY;
3449 		time_status |= ntv.status & ~STA_RONLY;
3450 	}
3451 	if (modes & MOD_TIMECONST)
3452 		time_constant = ntv.constant;
3453 	if (modes & MOD_OFFSET)
3454 		hardupdate(ntv.offset);
3455 
3456 	/*
3457 	 * Retrieve all clock variables
3458 	 */
3459 	if (time_offset < 0)
3460 		ntv.offset = -(-time_offset >> SHIFT_UPDATE);
3461 	else
3462 		ntv.offset = time_offset >> SHIFT_UPDATE;
3463 #ifdef PPS_SYNC
3464 	ntv.freq = time_freq + pps_freq;
3465 #else /* PPS_SYNC */
3466 	ntv.freq = time_freq;
3467 #endif /* PPS_SYNC */
3468 	ntv.maxerror = time_maxerror;
3469 	ntv.esterror = time_esterror;
3470 	ntv.status = time_status;
3471 	ntv.constant = time_constant;
3472 	ntv.precision = time_precision;
3473 	ntv.tolerance = time_tolerance;
3474 #ifdef PPS_SYNC
3475 	ntv.shift = pps_shift;
3476 	ntv.ppsfreq = pps_freq;
3477 	ntv.jitter = pps_jitter >> PPS_AVG;
3478 	ntv.stabil = pps_stabil;
3479 	ntv.calcnt = pps_calcnt;
3480 	ntv.errcnt = pps_errcnt;
3481 	ntv.jitcnt = pps_jitcnt;
3482 	ntv.stbcnt = pps_stbcnt;
3483 #endif /* PPS_SYNC */
3484 	(void)splx(s);
3485 
3486 	sparc32_from_timeval(&ntv, &ntv32);
3487 	error = copyout((caddr_t)&ntv32, (caddr_t)SCARG(uap, tp), sizeof(ntv32));
3488 	if (!error) {
3489 
3490 		/*
3491 		 * Status word error decode. See comments in
3492 		 * ntp_gettime() routine.
3493 		 */
3494 		if ((time_status & (STA_UNSYNC | STA_CLOCKERR)) ||
3495 		    (time_status & (STA_PPSFREQ | STA_PPSTIME) &&
3496 		    !(time_status & STA_PPSSIGNAL)) ||
3497 		    (time_status & STA_PPSTIME &&
3498 		    time_status & STA_PPSJITTER) ||
3499 		    (time_status & STA_PPSFREQ &&
3500 		    time_status & (STA_PPSWANDER | STA_PPSERROR)))
3501 			*retval = TIME_ERROR;
3502 		else
3503 			*retval = (register_t)time_state;
3504 	}
3505 	return error;
3506 }
3507 #endif
3508 
3509 int
3510 compat_sparc32_setgid(p, v, retval)
3511 	struct proc *p;
3512 	void *v;
3513 	register_t *retval;
3514 {
3515 	struct compat_sparc32_setgid_args /* {
3516 		syscallarg(gid_t) gid;
3517 	} */ *uap = v;
3518 	struct sys_setgid_args ua;
3519 
3520 	SPARC32TO64_UAP(gid);
3521 	return (sys_setgid(p, v, retval));
3522 }
3523 
3524 int
3525 compat_sparc32_setegid(p, v, retval)
3526 	struct proc *p;
3527 	void *v;
3528 	register_t *retval;
3529 {
3530 	struct compat_sparc32_setegid_args /* {
3531 		syscallarg(gid_t) egid;
3532 	} */ *uap = v;
3533 	struct sys_setegid_args ua;
3534 
3535 	SPARC32TO64_UAP(egid);
3536 	return (sys_setegid(p, v, retval));
3537 }
3538 
3539 int
3540 compat_sparc32_seteuid(p, v, retval)
3541 	struct proc *p;
3542 	void *v;
3543 	register_t *retval;
3544 {
3545 	struct compat_sparc32_seteuid_args /* {
3546 		syscallarg(gid_t) euid;
3547 	} */ *uap = v;
3548 	struct sys_seteuid_args ua;
3549 
3550 	SPARC32TO64_UAP(euid);
3551 	return (sys_seteuid(p, v, retval));
3552 }
3553 
3554 #ifdef LFS
3555 int
3556 compat_sparc32_lfs_bmapv(p, v, retval)
3557 	struct proc *p;
3558 	void *v;
3559 	register_t *retval;
3560 {
3561 #if 0
3562 	struct compat_sparc32_lfs_bmapv_args /* {
3563 		syscallarg(sparc32_fsid_tp_t) fsidp;
3564 		syscallarg(sparc32_block_infop_t) blkiov;
3565 		syscallarg(int) blkcnt;
3566 	} */ *uap = v;
3567 	struct sys_lfs_bmapv_args ua;
3568 
3569 	SPARC32TOP_UAP(fdidp, struct fsid);
3570 	SPARC32TO64_UAP(blkcnt);
3571 	/* XXX finish me */
3572 #else
3573 
3574 	return (ENOSYS);	/* XXX */
3575 #endif
3576 }
3577 
3578 int
3579 compat_sparc32_lfs_markv(p, v, retval)
3580 	struct proc *p;
3581 	void *v;
3582 	register_t *retval;
3583 {
3584 	struct compat_sparc32_lfs_markv_args /* {
3585 		syscallarg(sparc32_fsid_tp_t) fsidp;
3586 		syscallarg(sparc32_block_infop_t) blkiov;
3587 		syscallarg(int) blkcnt;
3588 	} */ *uap = v;
3589 
3590 	return (ENOSYS);	/* XXX */
3591 }
3592 
3593 int
3594 compat_sparc32_lfs_segclean(p, v, retval)
3595 	struct proc *p;
3596 	void *v;
3597 	register_t *retval;
3598 {
3599 	struct compat_sparc32_lfs_segclean_args /* {
3600 		syscallarg(sparc32_fsid_tp_t) fsidp;
3601 		syscallarg(sparc32_u_long) segment;
3602 	} */ *uap = v;
3603 	return (ENOSYS);	/* XXX */
3604 }
3605 
3606 int
3607 compat_sparc32_lfs_segwait(p, v, retval)
3608 	struct proc *p;
3609 	void *v;
3610 	register_t *retval;
3611 {
3612 	struct compat_sparc32_lfs_segwait_args /* {
3613 		syscallarg(sparc32_fsid_tp_t) fsidp;
3614 		syscallarg(sparc32_timevalp_t) tv;
3615 	} */ *uap = v;
3616 	return (ENOSYS);	/* XXX */
3617 }
3618 #endif
3619 
3620 int
3621 compat_sparc32_pathconf(p, v, retval)
3622 	struct proc *p;
3623 	void *v;
3624 	register_t *retval;
3625 {
3626 	struct compat_sparc32_pathconf_args /* {
3627 		syscallarg(int) fd;
3628 		syscallarg(int) name;
3629 	} */ *uap = v;
3630 	struct sys_pathconf_args ua;
3631 	long rt;
3632 	int error;
3633 
3634 	SPARC32TOP_UAP(path, const char);
3635 	SPARC32TO64_UAP(name);
3636 	error = sys_pathconf(p, &ua, (register_t *)&rt);
3637 	*(sparc32_long *)retval = (sparc32_long)rt;
3638 	return (error);
3639 }
3640 
3641 int
3642 compat_sparc32_fpathconf(p, v, retval)
3643 	struct proc *p;
3644 	void *v;
3645 	register_t *retval;
3646 {
3647 	struct compat_sparc32_fpathconf_args /* {
3648 		syscallarg(int) fd;
3649 		syscallarg(int) name;
3650 	} */ *uap = v;
3651 	struct sys_fpathconf_args ua;
3652 	long rt;
3653 	int error;
3654 
3655 	SPARC32TO64_UAP(fd);
3656 	SPARC32TO64_UAP(name);
3657 	error = sys_fpathconf(p, &ua, (register_t *)&rt);
3658 	*(sparc32_long *)retval = (sparc32_long)rt;
3659 	return (error);
3660 }
3661 
3662 int
3663 compat_sparc32_getrlimit(p, v, retval)
3664 	struct proc *p;
3665 	void *v;
3666 	register_t *retval;
3667 {
3668 	struct compat_sparc32_getrlimit_args /* {
3669 		syscallarg(int) which;
3670 		syscallarg(sparc32_rlimitp_t) rlp;
3671 	} */ *uap = v;
3672 	int which = SCARG(uap, which);
3673 
3674 	if ((u_int)which >= RLIM_NLIMITS)
3675 		return (EINVAL);
3676 	return (copyout(&p->p_rlimit[which], (caddr_t)(u_long)SCARG(uap, rlp),
3677 	    sizeof(struct rlimit)));
3678 }
3679 
3680 int
3681 compat_sparc32_setrlimit(p, v, retval)
3682 	struct proc *p;
3683 	void *v;
3684 	register_t *retval;
3685 {
3686 	struct compat_sparc32_setrlimit_args /* {
3687 		syscallarg(int) which;
3688 		syscallarg(const sparc32_rlimitp_t) rlp;
3689 	} */ *uap = v;
3690 		int which = SCARG(uap, which);
3691 	struct rlimit alim;
3692 	int error;
3693 
3694 	error = copyin((caddr_t)(u_long)SCARG(uap, rlp), &alim, sizeof(struct rlimit));
3695 	if (error)
3696 		return (error);
3697 	return (dosetrlimit(p, which, &alim));
3698 }
3699 
3700 int
3701 compat_sparc32_mmap(p, v, retval)
3702 	struct proc *p;
3703 	void *v;
3704 	register_t *retval;
3705 {
3706 	struct compat_sparc32_mmap_args /* {
3707 		syscallarg(sparc32_voidp) addr;
3708 		syscallarg(sparc32_size_t) len;
3709 		syscallarg(int) prot;
3710 		syscallarg(int) flags;
3711 		syscallarg(int) fd;
3712 		syscallarg(sparc32_long) pad;
3713 		syscallarg(off_t) pos;
3714 	} */ *uap = v;
3715 	struct sys_mmap_args ua;
3716 	void *rt;
3717 	int error;
3718 
3719 	SPARC32TOP_UAP(addr, void);
3720 	SPARC32TOX_UAP(len, size_t);
3721 	SPARC32TO64_UAP(prot);
3722 	SPARC32TO64_UAP(flags);
3723 	SPARC32TO64_UAP(fd);
3724 	SPARC32TOX_UAP(pad, long);
3725 	SPARC32TOX_UAP(pos, off_t);
3726 	error = sys_mmap(p, &ua, (register_t *)&rt);
3727 	if ((long)rt > (long)UINT_MAX)
3728 		printf("compat_sparc32_mmap: retval out of range: 0x%qx",
3729 		    rt);
3730 	*retval = (sparc32_voidp)(u_long)rt;
3731 	return (error);
3732 }
3733 
3734 int
3735 compat_sparc32_lseek(p, v, retval)
3736 	struct proc *p;
3737 	void *v;
3738 	register_t *retval;
3739 {
3740 	struct compat_sparc32_lseek_args /* {
3741 		syscallarg(int) fd;
3742 		syscallarg(int) pad;
3743 		syscallarg(off_t) offset;
3744 		syscallarg(int) whence;
3745 	} */ *uap = v;
3746 	struct sys_lseek_args ua;
3747 
3748 	SPARC32TO64_UAP(fd);
3749 	SPARC32TO64_UAP(pad);
3750 	SPARC32TO64_UAP(offset);
3751 	SPARC32TO64_UAP(whence);
3752 	return (sys_lseek(p, &ua, retval));
3753 }
3754 
3755 int
3756 compat_sparc32_truncate(p, v, retval)
3757 	struct proc *p;
3758 	void *v;
3759 	register_t *retval;
3760 {
3761 	struct compat_sparc32_truncate_args /* {
3762 		syscallarg(const sparc32_charp) path;
3763 		syscallarg(int) pad;
3764 		syscallarg(off_t) length;
3765 	} */ *uap = v;
3766 	struct sys_truncate_args ua;
3767 
3768 	SPARC32TOP_UAP(path, const char);
3769 	SPARC32TO64_UAP(pad);
3770 	SPARC32TO64_UAP(length);
3771 	return (sys_truncate(p, &ua, retval));
3772 }
3773 
3774 int
3775 compat_sparc32_ftruncate(p, v, retval)
3776 	struct proc *p;
3777 	void *v;
3778 	register_t *retval;
3779 {
3780 	struct compat_sparc32_ftruncate_args /* {
3781 		syscallarg(int) fd;
3782 		syscallarg(int) pad;
3783 		syscallarg(off_t) length;
3784 	} */ *uap = v;
3785 	struct sys_ftruncate_args ua;
3786 
3787 	SPARC32TO64_UAP(fd);
3788 	SPARC32TO64_UAP(pad);
3789 	SPARC32TO64_UAP(length);
3790 	return (sys_ftruncate(p, &ua, retval));
3791 }
3792 
3793 int
3794 compat_sparc32___sysctl(p, v, retval)
3795 	struct proc *p;
3796 	void *v;
3797 	register_t *retval;
3798 {
3799 	struct compat_sparc32___sysctl_args /* {
3800 		syscallarg(sparc32_intp) name;
3801 		syscallarg(u_int) namelen;
3802 		syscallarg(sparc32_voidp) old;
3803 		syscallarg(sparc32_size_tp) oldlenp;
3804 		syscallarg(sparc32_voidp) new;
3805 		syscallarg(sparc32_size_t) newlen;
3806 	} */ *uap = v;
3807 	int error, dolock = 1;
3808 	sparc32_size_t savelen = 0;
3809 	size_t oldlen = 0;
3810 	sysctlfn *fn;
3811 	int name[CTL_MAXNAME];
3812 
3813 /*
3814  * Some of these sysctl functions do their own copyin/copyout.
3815  * We need to disable or emulate the ones that need their
3816  * arguments converted.
3817  */
3818 
3819 	if (SCARG(uap, new) != NULL &&
3820 	    (error = suser(p->p_ucred, &p->p_acflag)))
3821 		return (error);
3822 	/*
3823 	 * all top-level sysctl names are non-terminal
3824 	 */
3825 	if (SCARG(uap, namelen) > CTL_MAXNAME || SCARG(uap, namelen) < 2)
3826 		return (EINVAL);
3827 	error = copyin((caddr_t)(u_long)SCARG(uap, name), &name,
3828 		       SCARG(uap, namelen) * sizeof(int));
3829 	if (error)
3830 		return (error);
3831 
3832 	switch (name[0]) {
3833 	case CTL_KERN:
3834 		fn = kern_sysctl;
3835 		if (name[2] != KERN_VNODE)	/* XXX */
3836 			dolock = 0;
3837 		break;
3838 	case CTL_HW:
3839 		fn = hw_sysctl;
3840 		break;
3841 	case CTL_VM:
3842 #if defined(UVM)
3843 		fn = uvm_sysctl;
3844 #else
3845 		fn = vm_sysctl;
3846 #endif
3847 		break;
3848 	case CTL_NET:
3849 		fn = net_sysctl;
3850 		break;
3851 	case CTL_VFS:
3852 		fn = vfs_sysctl;
3853 		break;
3854 	case CTL_MACHDEP:
3855 		fn = cpu_sysctl;
3856 		break;
3857 #ifdef DEBUG
3858 	case CTL_DEBUG:
3859 		fn = debug_sysctl;
3860 		break;
3861 #endif
3862 #ifdef DDB
3863 	case CTL_DDB:
3864 		fn = ddb_sysctl;
3865 		break;
3866 #endif
3867 	default:
3868 		return (EOPNOTSUPP);
3869 	}
3870 
3871 	if (SCARG(uap, oldlenp) &&
3872 	    (error = copyin((caddr_t)(u_long)SCARG(uap, oldlenp), &savelen, sizeof(savelen))))
3873 		return (error);
3874 	if (SCARG(uap, old) != NULL) {
3875 #if defined(UVM)
3876 		if (!uvm_useracc((caddr_t)(u_long)SCARG(uap, old), savelen, B_WRITE))
3877 #else
3878 		if (!useracc(SCARG(uap, old), savelen, B_WRITE))
3879 #endif
3880 			return (EFAULT);
3881 #if 0 /* XXXXXXXX */
3882 		while (memlock.sl_lock) {
3883 			memlock.sl_want = 1;
3884 			sleep((caddr_t)&memlock, PRIBIO+1);
3885 			memlock.sl_locked++;
3886 		}
3887 		memlock.sl_lock = 1;
3888 #endif /* XXXXXXXX */
3889 		if (dolock)
3890 #if defined(UVM)
3891 			uvm_vslock(p, SCARG(uap, old), savelen);
3892 #else
3893 			vslock(p, SCARG(uap, old), savelen);
3894 #endif
3895 		oldlen = savelen;
3896 	}
3897 	error = (*fn)(name + 1, SCARG(uap, namelen) - 1, SCARG(uap, old),
3898 	    &oldlen, SCARG(uap, new), SCARG(uap, newlen), p);
3899 	if (SCARG(uap, old) != NULL) {
3900 		if (dolock)
3901 #if defined(UVM)
3902 			uvm_vsunlock(p, SCARG(uap, old), savelen);
3903 #else
3904 			vsunlock(p, SCARG(uap, old), savelen);
3905 #endif
3906 #if 0 /* XXXXXXXXXXX */
3907 		memlock.sl_lock = 0;
3908 		if (memlock.sl_want) {
3909 			memlock.sl_want = 0;
3910 			wakeup((caddr_t)&memlock);
3911 		}
3912 #endif /* XXXXXXXXX */
3913 	}
3914 	savelen = oldlen;
3915 	if (error)
3916 		return (error);
3917 	if (SCARG(uap, oldlenp))
3918 		error = copyout(&savelen, (caddr_t)(u_long)SCARG(uap, oldlenp), sizeof(savelen));
3919 	return (error);
3920 }
3921 
3922 int
3923 compat_sparc32_mlock(p, v, retval)
3924 	struct proc *p;
3925 	void *v;
3926 	register_t *retval;
3927 {
3928 	struct compat_sparc32_mlock_args /* {
3929 		syscallarg(const sparc32_voidp) addr;
3930 		syscallarg(sparc32_size_t) len;
3931 	} */ *uap = v;
3932 	struct sys_mlock_args ua;
3933 
3934 	SPARC32TOP_UAP(addr, const void);
3935 	SPARC32TO64_UAP(len);
3936 	return (sys_mlock(p, &ua, retval));
3937 }
3938 
3939 int
3940 compat_sparc32_munlock(p, v, retval)
3941 	struct proc *p;
3942 	void *v;
3943 	register_t *retval;
3944 {
3945 	struct compat_sparc32_munlock_args /* {
3946 		syscallarg(const sparc32_voidp) addr;
3947 		syscallarg(sparc32_size_t) len;
3948 	} */ *uap = v;
3949 	struct sys_munlock_args ua;
3950 
3951 	SPARC32TOP_UAP(addr, const void);
3952 	SPARC32TO64_UAP(len);
3953 	return (sys_munlock(p, &ua, retval));
3954 }
3955 
3956 int
3957 compat_sparc32_undelete(p, v, retval)
3958 	struct proc *p;
3959 	void *v;
3960 	register_t *retval;
3961 {
3962 	struct compat_sparc32_undelete_args /* {
3963 		syscallarg(const sparc32_charp) path;
3964 	} */ *uap = v;
3965 	struct sys_undelete_args ua;
3966 
3967 	SPARC32TOP_UAP(path, const char);
3968 	return (sys_undelete(p, &ua, retval));
3969 }
3970 
3971 int
3972 compat_sparc32_futimes(p, v, retval)
3973 	struct proc *p;
3974 	void *v;
3975 	register_t *retval;
3976 {
3977 	struct compat_sparc32_futimes_args /* {
3978 		syscallarg(int) fd;
3979 		syscallarg(const sparc32_timevalp_t) tptr;
3980 	} */ *uap = v;
3981 	int error;
3982 	struct file *fp;
3983 
3984 	if ((error = getvnode(p->p_fd, SCARG(uap, fd), &fp)) != 0)
3985 		return (error);
3986 
3987 	return (change_utimes32((struct vnode *)fp->f_data,
3988 				(struct timeval *)(u_long)SCARG(uap, tptr), p));
3989 }
3990 
3991 int
3992 compat_sparc32_getpgid(p, v, retval)
3993 	struct proc *p;
3994 	void *v;
3995 	register_t *retval;
3996 {
3997 	struct compat_sparc32_getpgid_args /* {
3998 		syscallarg(pid_t) pid;
3999 	} */ *uap = v;
4000 	struct sys_getpgid_args ua;
4001 
4002 	SPARC32TO64_UAP(pid);
4003 	return (sys_getpgid(p, &ua, retval));
4004 }
4005 
4006 int
4007 compat_sparc32_reboot(p, v, retval)
4008 	struct proc *p;
4009 	void *v;
4010 	register_t *retval;
4011 {
4012 	struct compat_sparc32_reboot_args /* {
4013 		syscallarg(int) opt;
4014 		syscallarg(sparc32_charp) bootstr;
4015 	} */ *uap = v;
4016 	struct sys_reboot_args ua;
4017 
4018 	SPARC32TO64_UAP(opt);
4019 	SPARC32TOP_UAP(bootstr, char);
4020 	return (sys_reboot(p, &ua, retval));
4021 }
4022 
4023 int
4024 compat_sparc32_poll(p, v, retval)
4025 	struct proc *p;
4026 	void *v;
4027 	register_t *retval;
4028 {
4029 	struct compat_sparc32_poll_args /* {
4030 		syscallarg(sparc32_pollfdp_t) fds;
4031 		syscallarg(u_int) nfds;
4032 		syscallarg(int) timeout;
4033 	} */ *uap = v;
4034 	struct sys_poll_args ua;
4035 
4036 	SPARC32TOP_UAP(fds, struct pollfd);
4037 	SPARC32TO64_UAP(nfds);
4038 	SPARC32TO64_UAP(timeout);
4039 	return (sys_poll(p, &ua, retval));
4040 }
4041 
4042 /*
4043  * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
4044  *
4045  * This is BSD.  We won't support System V IPC.
4046  * Too much work.
4047  *
4048  * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
4049  */
4050 int
4051 compat_sparc32___semctl(p, v, retval)
4052 	struct proc *p;
4053 	void *v;
4054 	register_t *retval;
4055 {
4056 #if 0
4057 	struct compat_sparc32___semctl_args /* {
4058 		syscallarg(int) semid;
4059 		syscallarg(int) semnum;
4060 		syscallarg(int) cmd;
4061 		syscallarg(sparc32_semunu_t) arg;
4062 	} */ *uap = v;
4063 	union sparc32_semun sem32;
4064 	int semid = SCARG(uap, semid);
4065 	int semnum = SCARG(uap, semnum);
4066 	int cmd = SCARG(uap, cmd);
4067 	union sparc32_semun *arg = (void*)(u_long)SCARG(uap, arg);
4068 	union sparc32_semun real_arg;
4069 	struct ucred *cred = p->p_ucred;
4070 	int i, rval, eval;
4071 	struct sparc32_semid_ds sbuf;
4072 	register struct semid_ds *semaptr;
4073 
4074 	semlock(p);
4075 
4076 	semid = IPCID_TO_IX(semid);
4077 	if (semid < 0 || semid >= seminfo.semmsl)
4078 		return(EINVAL);
4079 
4080 	semaptr = &sema[semid];
4081 	if ((semaptr->sem_perm.mode & SEM_ALLOC) == 0 ||
4082 	    semaptr->sem_perm.seq != IPCID_TO_SEQ(SCARG(uap, semid)))
4083 		return(EINVAL);
4084 
4085 	eval = 0;
4086 	rval = 0;
4087 
4088 	switch (cmd) {
4089 	case IPC_RMID:
4090 		if ((eval = ipcperm(cred, &semaptr->sem_perm, IPC_M)) != 0)
4091 			return(eval);
4092 		semaptr->sem_perm.cuid = cred->cr_uid;
4093 		semaptr->sem_perm.uid = cred->cr_uid;
4094 		semtot -= semaptr->sem_nsems;
4095 		for (i = semaptr->sem_base - sem; i < semtot; i++)
4096 			sem[i] = sem[i + semaptr->sem_nsems];
4097 		for (i = 0; i < seminfo.semmni; i++) {
4098 			if ((sema[i].sem_perm.mode & SEM_ALLOC) &&
4099 			    sema[i].sem_base > semaptr->sem_base)
4100 				sema[i].sem_base -= semaptr->sem_nsems;
4101 		}
4102 		semaptr->sem_perm.mode = 0;
4103 		semundo_clear(semid, -1);
4104 		wakeup((caddr_t)semaptr);
4105 		break;
4106 
4107 	case IPC_SET:
4108 		if ((eval = ipcperm(cred, &semaptr->sem_perm, IPC_M)))
4109 			return(eval);
4110 		if ((eval = copyin(arg, &real_arg, sizeof(real_arg))) != 0)
4111 			return(eval);
4112 		if ((eval = copyin((caddr_t)(u_long)real_arg.buf, (caddr_t)&sbuf,
4113 		    sizeof(sbuf))) != 0)
4114 			return(eval);
4115 		semaptr->sem_perm.uid = sbuf.sem_perm.uid;
4116 		semaptr->sem_perm.gid = sbuf.sem_perm.gid;
4117 		semaptr->sem_perm.mode = (semaptr->sem_perm.mode & ~0777) |
4118 		    (sbuf.sem_perm.mode & 0777);
4119 		semaptr->sem_ctime = time.tv_sec;
4120 		break;
4121 
4122 	case IPC_STAT:
4123 		if ((eval = ipcperm(cred, &semaptr->sem_perm, IPC_R)))
4124 			return(eval);
4125 		if ((eval = copyin(arg, &real_arg, sizeof(real_arg))) != 0)
4126 			return(eval);
4127 		eval = copyout((caddr_t)semaptr, (caddr_t)(u_long)real_arg.buf,
4128 		    sizeof(struct semid_ds));
4129 		break;
4130 
4131 	case GETNCNT:
4132 		if ((eval = ipcperm(cred, &semaptr->sem_perm, IPC_R)))
4133 			return(eval);
4134 		if (semnum < 0 || semnum >= semaptr->sem_nsems)
4135 			return(EINVAL);
4136 		rval = semaptr->sem_base[semnum].semncnt;
4137 		break;
4138 
4139 	case GETPID:
4140 		if ((eval = ipcperm(cred, &semaptr->sem_perm, IPC_R)))
4141 			return(eval);
4142 		if (semnum < 0 || semnum >= semaptr->sem_nsems)
4143 			return(EINVAL);
4144 		rval = semaptr->sem_base[semnum].sempid;
4145 		break;
4146 
4147 	case GETVAL:
4148 		if ((eval = ipcperm(cred, &semaptr->sem_perm, IPC_R)))
4149 			return(eval);
4150 		if (semnum < 0 || semnum >= semaptr->sem_nsems)
4151 			return(EINVAL);
4152 		rval = semaptr->sem_base[semnum].semval;
4153 		break;
4154 
4155 	case GETALL:
4156 		if ((eval = ipcperm(cred, &semaptr->sem_perm, IPC_R)))
4157 			return(eval);
4158 		if ((eval = copyin(arg, &real_arg, sizeof(real_arg))) != 0)
4159 			return(eval);
4160 		for (i = 0; i < semaptr->sem_nsems; i++) {
4161 			eval = copyout((caddr_t)&semaptr->sem_base[i].semval,
4162 			    &real_arg.array[i], sizeof(real_arg.array[0]));
4163 			if (eval != 0)
4164 				break;
4165 		}
4166 		break;
4167 
4168 	case GETZCNT:
4169 		if ((eval = ipcperm(cred, &semaptr->sem_perm, IPC_R)))
4170 			return(eval);
4171 		if (semnum < 0 || semnum >= semaptr->sem_nsems)
4172 			return(EINVAL);
4173 		rval = semaptr->sem_base[semnum].semzcnt;
4174 		break;
4175 
4176 	case SETVAL:
4177 		if ((eval = ipcperm(cred, &semaptr->sem_perm, IPC_W)))
4178 			return(eval);
4179 		if (semnum < 0 || semnum >= semaptr->sem_nsems)
4180 			return(EINVAL);
4181 		if ((eval = copyin(arg, &real_arg, sizeof(real_arg))) != 0)
4182 			return(eval);
4183 		semaptr->sem_base[semnum].semval = real_arg.val;
4184 		semundo_clear(semid, semnum);
4185 		wakeup((caddr_t)semaptr);
4186 		break;
4187 
4188 	case SETALL:
4189 		if ((eval = ipcperm(cred, &semaptr->sem_perm, IPC_W)))
4190 			return(eval);
4191 		if ((eval = copyin(arg, &real_arg, sizeof(real_arg))) != 0)
4192 			return(eval);
4193 		for (i = 0; i < semaptr->sem_nsems; i++) {
4194 			eval = copyin(&real_arg.array[i],
4195 			    (caddr_t)&semaptr->sem_base[i].semval,
4196 			    sizeof(real_arg.array[0]));
4197 			if (eval != 0)
4198 				break;
4199 		}
4200 		semundo_clear(semid, -1);
4201 		wakeup((caddr_t)semaptr);
4202 		break;
4203 
4204 	default:
4205 		return(EINVAL);
4206 	}
4207 
4208 	if (eval == 0)
4209 		*retval = rval;
4210 	return(eval);
4211 #else
4212 	return (ENOSYS);
4213 #endif
4214 }
4215 
4216 int
4217 compat_sparc32_semget(p, v, retval)
4218 	struct proc *p;
4219 	void *v;
4220 	register_t *retval;
4221 {
4222 	struct compat_sparc32_semget_args /* {
4223 		syscallarg(sparc32_key_t) key;
4224 		syscallarg(int) nsems;
4225 		syscallarg(int) semflg;
4226 	} */ *uap = v;
4227 	struct sys_semget_args ua;
4228 
4229 	SPARC32TOX_UAP(key, key_t);
4230 	SPARC32TO64_UAP(nsems);
4231 	SPARC32TO64_UAP(semflg);
4232 	return (sys_semget(p, &ua, retval));
4233 }
4234 
4235 int
4236 compat_sparc32_semop(p, v, retval)
4237 	struct proc *p;
4238 	void *v;
4239 	register_t *retval;
4240 {
4241 	struct compat_sparc32_semop_args /* {
4242 		syscallarg(int) semid;
4243 		syscallarg(sparc32_sembufp_t) sops;
4244 		syscallarg(sparc32_size_t) nsops;
4245 	} */ *uap = v;
4246 	struct sys_semop_args ua;
4247 
4248 	SPARC32TO64_UAP(semid);
4249 	SPARC32TOP_UAP(sops, struct sembuf);
4250 	SPARC32TOX_UAP(nsops, size_t);
4251 	return (sys_semop(p, &ua, retval));
4252 }
4253 
4254 int
4255 compat_sparc32_semconfig(p, v, retval)
4256 	struct proc *p;
4257 	void *v;
4258 	register_t *retval;
4259 {
4260 	struct compat_sparc32_semconfig_args /* {
4261 		syscallarg(int) flag;
4262 	} */ *uap = v;
4263 	struct sys_semconfig_args ua;
4264 
4265 	SPARC32TO64_UAP(flag);
4266 	return (sys_semconfig(p, &ua, retval));
4267 }
4268 
4269 int
4270 compat_sparc32_msgctl(p, v, retval)
4271 	struct proc *p;
4272 	void *v;
4273 	register_t *retval;
4274 {
4275 #if 0
4276 	struct compat_sparc32_msgctl_args /* {
4277 		syscallarg(int) msqid;
4278 		syscallarg(int) cmd;
4279 		syscallarg(sparc32_msqid_dsp_t) buf;
4280 	} */ *uap = v;
4281 	struct sys_msgctl_args ua;
4282 	struct msqid_ds ds;
4283 	struct sparc32_msqid_ds *ds32p;
4284 	int error;
4285 
4286 	SPARC32TO64_UAP(msqid);
4287 	SPARC32TO64_UAP(cmd);
4288 	ds32p = (struct sparc32_msqid_ds *)(u_long)SCARG(uap, buf);
4289 	if (ds32p) {
4290 		SCARG(&ua, buf) = NULL;
4291 		sparc32_to_msqid_ds(ds32p, &ds);
4292 	} else
4293 		SCARG(&ua, buf) = NULL;
4294 	error = sys_msgctl(p, &ua, retval);
4295 	if (error)
4296 		return (error);
4297 
4298 	if (ds32p)
4299 		sparc32_from_msqid_ds(&ds, ds32p);
4300 	return (0);
4301 #else
4302 	return (ENOSYS);
4303 #endif
4304 }
4305 
4306 int
4307 compat_sparc32_msgget(p, v, retval)
4308 	struct proc *p;
4309 	void *v;
4310 	register_t *retval;
4311 {
4312 #if 0
4313 	struct compat_sparc32_msgget_args /* {
4314 		syscallarg(sparc32_key_t) key;
4315 		syscallarg(int) msgflg;
4316 	} */ *uap = v;
4317 	struct sys_msgget_args ua;
4318 
4319 	SPARC32TOX_UAP(key, key_t);
4320 	SPARC32TO64_UAP(msgflg);
4321 	return (sys_msgget(p, &ua, retval));
4322 #else
4323 	return (ENOSYS);
4324 #endif
4325 }
4326 
4327 int
4328 compat_sparc32_msgsnd(p, v, retval)
4329 	struct proc *p;
4330 	void *v;
4331 	register_t *retval;
4332 {
4333 #if 0
4334 	struct compat_sparc32_msgsnd_args /* {
4335 		syscallarg(int) msqid;
4336 		syscallarg(const sparc32_voidp) msgp;
4337 		syscallarg(sparc32_size_t) msgsz;
4338 		syscallarg(int) msgflg;
4339 	} */ *uap = v;
4340 	struct sys_msgsnd_args ua;
4341 
4342 	SPARC32TO64_UAP(msqid);
4343 	SPARC32TOP_UAP(msgp, void);
4344 	SPARC32TOX_UAP(msgsz, size_t);
4345 	SPARC32TO64_UAP(msgflg);
4346 	return (sys_msgsnd(p, &ua, retval));
4347 #else
4348 	return (ENOSYS);
4349 #endif
4350 }
4351 
4352 int
4353 compat_sparc32_msgrcv(p, v, retval)
4354 	struct proc *p;
4355 	void *v;
4356 	register_t *retval;
4357 {
4358 #if 0
4359 	struct compat_sparc32_msgrcv_args /* {
4360 		syscallarg(int) msqid;
4361 		syscallarg(sparc32_voidp) msgp;
4362 		syscallarg(sparc32_size_t) msgsz;
4363 		syscallarg(sparc32_long) msgtyp;
4364 		syscallarg(int) msgflg;
4365 	} */ *uap = v;
4366 	struct sys_msgrcv_args ua;
4367 	ssize_t rt;
4368 	int error;
4369 
4370 	SPARC32TO64_UAP(msqid);
4371 	SPARC32TOP_UAP(msgp, void);
4372 	SPARC32TOX_UAP(msgsz, size_t);
4373 	SPARC32TOX_UAP(msgtyp, long);
4374 	SPARC32TO64_UAP(msgflg);
4375 	error = sys_msgrcv(p, &ua, (register_t *)&rt);
4376 	*(sparc32_ssize_t *)retval = rt;
4377 	return (error);
4378 #else
4379 	return (ENOSYS);
4380 #endif
4381 }
4382 
4383 int
4384 compat_sparc32_shmat(p, v, retval)
4385 	struct proc *p;
4386 	void *v;
4387 	register_t *retval;
4388 {
4389 #if 0
4390 	struct compat_sparc32_shmat_args /* {
4391 		syscallarg(int) shmid;
4392 		syscallarg(const sparc32_voidp) shmaddr;
4393 		syscallarg(int) shmflg;
4394 	} */ *uap = v;
4395 	struct sys_shmat_args ua;
4396 	void *rt;
4397 	int error;
4398 
4399 	SPARC32TO64_UAP(shmid);
4400 	SPARC32TOP_UAP(shmaddr, void);
4401 	SPARC32TO64_UAP(shmflg);
4402 	error = sys_shmat(p, &ua, (register_t *)&rt);
4403 	*retval = (sparc32_voidp)(u_long)rt;
4404 	return (error);
4405 #else
4406 	return (ENOSYS);
4407 #endif
4408 }
4409 
4410 int
4411 compat_sparc32_shmctl(p, v, retval)
4412 	struct proc *p;
4413 	void *v;
4414 	register_t *retval;
4415 {
4416 #if 0
4417 	struct compat_sparc32_shmctl_args /* {
4418 		syscallarg(int) shmid;
4419 		syscallarg(int) cmd;
4420 		syscallarg(sparc32_shmid_dsp_t) buf;
4421 	} */ *uap = v;
4422 	struct sys_shmctl_args ua;
4423 	struct shmid_ds ds;
4424 	struct sparc32_shmid_ds *ds32p;
4425 	int error;
4426 
4427 	SPARC32TO64_UAP(shmid);
4428 	SPARC32TO64_UAP(cmd);
4429 	ds32p = (struct sparc32_shmid_ds *)(u_long)SCARG(uap, buf);
4430 	if (ds32p) {
4431 		SCARG(&ua, buf) = NULL;
4432 		sparc32_to_shmid_ds(ds32p, &ds);
4433 	} else
4434 		SCARG(&ua, buf) = NULL;
4435 	error = sys_shmctl(p, &ua, retval);
4436 	if (error)
4437 		return (error);
4438 
4439 	if (ds32p)
4440 		sparc32_from_shmid_ds(&ds, ds32p);
4441 	return (0);
4442 #else
4443 	return (ENOSYS);
4444 #endif
4445 }
4446 
4447 int
4448 compat_sparc32_shmdt(p, v, retval)
4449 	struct proc *p;
4450 	void *v;
4451 	register_t *retval;
4452 {
4453 #if 0
4454 	struct compat_sparc32_shmdt_args /* {
4455 		syscallarg(const sparc32_voidp) shmaddr;
4456 	} */ *uap = v;
4457 	struct sys_shmdt_args ua;
4458 
4459 	SPARC32TOP_UAP(shmaddr, const char);
4460 	return (sys_shmdt(p, &ua, retval));
4461 #else
4462 	return (ENOSYS);
4463 #endif
4464 }
4465 
4466 int
4467 compat_sparc32_shmget(p, v, retval)
4468 	struct proc *p;
4469 	void *v;
4470 	register_t *retval;
4471 {
4472 #if 0
4473 	struct compat_sparc32_shmget_args /* {
4474 		syscallarg(sparc32_key_t) key;
4475 		syscallarg(sparc32_size_t) size;
4476 		syscallarg(int) shmflg;
4477 	} */ *uap = v;
4478 	struct sys_shmget_args ua;
4479 
4480 	SPARC32TOX_UAP(key, key_t)
4481 	SPARC32TOX_UAP(size, size_t)
4482 	SPARC32TO64_UAP(shmflg);
4483 	return (sys_shmget(p, &ua, retval));
4484 #else
4485 	return (ENOSYS);
4486 #endif
4487 }
4488 
4489 int
4490 compat_sparc32_clock_gettime(p, v, retval)
4491 	struct proc *p;
4492 	void *v;
4493 	register_t *retval;
4494 {
4495 	struct compat_sparc32_clock_gettime_args /* {
4496 		syscallarg(sparc32_clockid_t) clock_id;
4497 		syscallarg(sparc32_timespecp_t) tp;
4498 	} */ *uap = v;
4499 	clockid_t clock_id;
4500 	struct timeval atv;
4501 	struct timespec ats;
4502 	struct sparc32_timespec ts32;
4503 
4504 	clock_id = SCARG(uap, clock_id);
4505 	if (clock_id != CLOCK_REALTIME)
4506 		return (EINVAL);
4507 
4508 	microtime(&atv);
4509 	TIMEVAL_TO_TIMESPEC(&atv,&ats);
4510 	sparc32_from_timespec(&ats, &ts32);
4511 
4512 	return copyout(&ts32, (caddr_t)(u_long)SCARG(uap, tp), sizeof(ts32));
4513 }
4514 
4515 int
4516 compat_sparc32_clock_settime(p, v, retval)
4517 	struct proc *p;
4518 	void *v;
4519 	register_t *retval;
4520 {
4521 	struct compat_sparc32_clock_settime_args /* {
4522 		syscallarg(sparc32_clockid_t) clock_id;
4523 		syscallarg(const sparc32_timespecp_t) tp;
4524 	} */ *uap = v;
4525 	struct sparc32_timespec ts32;
4526 	clockid_t clock_id;
4527 	struct timeval atv;
4528 	struct timespec ats;
4529 	int error;
4530 
4531 	if ((error = suser(p->p_ucred, &p->p_acflag)) != 0)
4532 		return (error);
4533 
4534 	clock_id = SCARG(uap, clock_id);
4535 	if (clock_id != CLOCK_REALTIME)
4536 		return (EINVAL);
4537 
4538 	if ((error = copyin((caddr_t)(u_long)SCARG(uap, tp), &ts32, sizeof(ts32))) != 0)
4539 		return (error);
4540 
4541 	sparc32_to_timespec(&ts32, &ats);
4542 	TIMESPEC_TO_TIMEVAL(&atv,&ats);
4543 	if ((error = settime(&atv)))
4544 		return (error);
4545 
4546 	return 0;
4547 }
4548 
4549 int
4550 compat_sparc32_clock_getres(p, v, retval)
4551 	struct proc *p;
4552 	void *v;
4553 	register_t *retval;
4554 {
4555 	struct compat_sparc32_clock_getres_args /* {
4556 		syscallarg(sparc32_clockid_t) clock_id;
4557 		syscallarg(sparc32_timespecp_t) tp;
4558 	} */ *uap = v;
4559 	struct sparc32_timespec ts32;
4560 	clockid_t clock_id;
4561 	struct timespec ts;
4562 	int error = 0;
4563 
4564 	clock_id = SCARG(uap, clock_id);
4565 	if (clock_id != CLOCK_REALTIME)
4566 		return (EINVAL);
4567 
4568 	if (SCARG(uap, tp)) {
4569 		ts.tv_sec = 0;
4570 		ts.tv_nsec = 1000000000 / hz;
4571 
4572 		sparc32_from_timespec(&ts, &ts32);
4573 		error = copyout(&ts, (caddr_t)(u_long)SCARG(uap, tp), sizeof(ts));
4574 	}
4575 
4576 	return error;
4577 }
4578 
4579 int
4580 compat_sparc32_nanosleep(p, v, retval)
4581 	struct proc *p;
4582 	void *v;
4583 	register_t *retval;
4584 {
4585 	struct compat_sparc32_nanosleep_args /* {
4586 		syscallarg(const sparc32_timespecp_t) rqtp;
4587 		syscallarg(sparc32_timespecp_t) rmtp;
4588 	} */ *uap = v;
4589 	static int nanowait;
4590 	struct sparc32_timespec ts32;
4591 	struct timespec rqt;
4592 	struct timespec rmt;
4593 	struct timeval atv, utv;
4594 	int error, s, timo;
4595 
4596 	error = copyin((caddr_t)(u_long)SCARG(uap, rqtp), (caddr_t)&ts32,
4597 		       sizeof(ts32));
4598 	if (error)
4599 		return (error);
4600 
4601 	sparc32_to_timespec(&ts32, &rqt);
4602 	TIMESPEC_TO_TIMEVAL(&atv,&rqt)
4603 	if (itimerfix(&atv))
4604 		return (EINVAL);
4605 
4606 	s = splclock();
4607 	timeradd(&atv,&time,&atv);
4608 	timo = hzto(&atv);
4609 	/*
4610 	 * Avoid inadvertantly sleeping forever
4611 	 */
4612 	if (timo == 0)
4613 		timo = 1;
4614 	splx(s);
4615 
4616 	error = tsleep(&nanowait, PWAIT | PCATCH, "nanosleep", timo);
4617 	if (error == ERESTART)
4618 		error = EINTR;
4619 	if (error == EWOULDBLOCK)
4620 		error = 0;
4621 
4622 	if (SCARG(uap, rmtp)) {
4623 		int error;
4624 
4625 		s = splclock();
4626 		utv = time;
4627 		splx(s);
4628 
4629 		timersub(&atv, &utv, &utv);
4630 		if (utv.tv_sec < 0)
4631 			timerclear(&utv);
4632 
4633 		TIMEVAL_TO_TIMESPEC(&utv,&rmt);
4634 		sparc32_from_timespec(&rmt, &ts32);
4635 		error = copyout((caddr_t)&ts32, (caddr_t)(u_long)SCARG(uap,rmtp),
4636 			sizeof(ts32));
4637 		if (error)
4638 			return (error);
4639 	}
4640 
4641 	return error;
4642 }
4643 
4644 int
4645 compat_sparc32_fdatasync(p, v, retval)
4646 	struct proc *p;
4647 	void *v;
4648 	register_t *retval;
4649 {
4650 	struct compat_sparc32_fdatasync_args /* {
4651 		syscallarg(int) fd;
4652 	} */ *uap = v;
4653 	struct sys_fdatasync_args ua;
4654 
4655 	SPARC32TO64_UAP(fd);
4656 
4657 	return (sys_fdatasync(p, &ua, retval));
4658 }
4659 
4660 int
4661 compat_sparc32___posix_rename(p, v, retval)
4662 	struct proc *p;
4663 	void *v;
4664 	register_t *retval;
4665 {
4666 	struct compat_sparc32___posix_rename_args /* {
4667 		syscallarg(const sparc32_charp) from;
4668 		syscallarg(const sparc32_charp) to;
4669 	} */ *uap = v;
4670 	struct sys___posix_rename_args ua;
4671 
4672 	SPARC32TOP_UAP(from, const char *);
4673 	SPARC32TOP_UAP(to, const char *);
4674 
4675 	return (sys___posix_rename(p, &ua, retval));
4676 }
4677 
4678 int
4679 compat_sparc32_swapctl(p, v, retval)
4680 	struct proc *p;
4681 	void *v;
4682 	register_t *retval;
4683 {
4684 	struct compat_sparc32_swapctl_args /* {
4685 		syscallarg(int) cmd;
4686 		syscallarg(const sparc32_voidp) arg;
4687 		syscallarg(int) misc;
4688 	} */ *uap = v;
4689 	struct sys_swapctl_args ua;
4690 
4691 	SPARC32TO64_UAP(cmd);
4692 	SPARC32TOP_UAP(arg, const void);
4693 	SPARC32TO64_UAP(misc);
4694 	return (sys_swapctl(p, &ua, retval));
4695 }
4696 
4697 int
4698 compat_sparc32_getdents(p, v, retval)
4699 	struct proc *p;
4700 	void *v;
4701 	register_t *retval;
4702 {
4703 	struct compat_sparc32_getdents_args /* {
4704 		syscallarg(int) fd;
4705 		syscallarg(sparc32_charp) buf;
4706 		syscallarg(sparc32_size_t) count;
4707 	} */ *uap = v;
4708 	struct file *fp;
4709 	int error, done;
4710 
4711 	if ((error = getvnode(p->p_fd, SCARG(uap, fd), &fp)) != 0)
4712 		return (error);
4713 	if ((fp->f_flag & FREAD) == 0)
4714 		return (EBADF);
4715 	error = vn_readdir(fp, (caddr_t)(u_long)SCARG(uap, buf), UIO_USERSPACE,
4716 			SCARG(uap, count), &done, p, 0, 0);
4717 	*retval = done;
4718 	return (error);
4719 }
4720 
4721 
4722 int
4723 compat_sparc32_minherit(p, v, retval)
4724 	struct proc *p;
4725 	void *v;
4726 	register_t *retval;
4727 {
4728 	struct compat_sparc32_minherit_args /* {
4729 		syscallarg(sparc32_voidp) addr;
4730 		syscallarg(sparc32_size_t) len;
4731 		syscallarg(int) inherit;
4732 	} */ *uap = v;
4733 	struct sys_minherit_args ua;
4734 
4735 	SPARC32TOP_UAP(addr, void);
4736 	SPARC32TOX_UAP(len, size_t);
4737 	SPARC32TO64_UAP(inherit);
4738 	return (sys_minherit(p, &ua, retval));
4739 }
4740 
4741 int
4742 compat_sparc32_lchmod(p, v, retval)
4743 	struct proc *p;
4744 	void *v;
4745 	register_t *retval;
4746 {
4747 	struct compat_sparc32_lchmod_args /* {
4748 		syscallarg(const sparc32_charp) path;
4749 		syscallarg(mode_t) mode;
4750 	} */ *uap = v;
4751 	struct sys_lchmod_args ua;
4752 
4753 	SPARC32TOP_UAP(path, const char);
4754 	SPARC32TO64_UAP(mode);
4755 	return (sys_lchmod(p, &ua, retval));
4756 }
4757 
4758 int
4759 compat_sparc32_lchown(p, v, retval)
4760 	struct proc *p;
4761 	void *v;
4762 	register_t *retval;
4763 {
4764 	struct compat_sparc32_lchown_args /* {
4765 		syscallarg(const sparc32_charp) path;
4766 		syscallarg(uid_t) uid;
4767 		syscallarg(gid_t) gid;
4768 	} */ *uap = v;
4769 	struct sys_lchown_args ua;
4770 
4771 	SPARC32TOP_UAP(path, const char);
4772 	SPARC32TO64_UAP(uid);
4773 	SPARC32TO64_UAP(gid);
4774 	return (sys_lchown(p, &ua, retval));
4775 }
4776 
4777 int
4778 compat_sparc32_lutimes(p, v, retval)
4779 	struct proc *p;
4780 	void *v;
4781 	register_t *retval;
4782 {
4783 	struct compat_sparc32_lutimes_args /* {
4784 		syscallarg(const sparc32_charp) path;
4785 		syscallarg(const sparc32_timevalp_t) tptr;
4786 	} */ *uap = v;
4787 	int error;
4788 	struct nameidata nd;
4789 
4790 	NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_USERSPACE, (caddr_t)(u_long)SCARG(uap, path), p);
4791 	if ((error = namei(&nd)) != 0)
4792 		return (error);
4793 
4794 	error = change_utimes32(nd.ni_vp, (struct timeval *)(u_long)SCARG(uap, tptr), p);
4795 
4796 	vrele(nd.ni_vp);
4797 	return (error);
4798 }
4799 
4800 
4801 int
4802 compat_sparc32___msync13(p, v, retval)
4803 	struct proc *p;
4804 	void *v;
4805 	register_t *retval;
4806 {
4807 	struct compat_sparc32___msync13_args /* {
4808 		syscallarg(sparc32_voidp) addr;
4809 		syscallarg(sparc32_size_t) len;
4810 		syscallarg(int) flags;
4811 	} */ *uap = v;
4812 	struct sys___msync13_args ua;
4813 
4814 	SPARC32TOP_UAP(addr, void);
4815 	SPARC32TOX_UAP(len, size_t);
4816 	SPARC32TO64_UAP(flags);
4817 	return (sys___msync13(p, &ua, retval));
4818 }
4819 
4820 int
4821 compat_sparc32___stat13(p, v, retval)
4822 	struct proc *p;
4823 	void *v;
4824 	register_t *retval;
4825 {
4826 	struct compat_sparc32___stat13_args /* {
4827 		syscallarg(const sparc32_charp) path;
4828 		syscallarg(sparc32_statp_t) ub;
4829 	} */ *uap = v;
4830 	struct sparc32_stat sb32;
4831 	struct stat sb;
4832 	int error;
4833 	struct nameidata nd;
4834 
4835 	NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_USERSPACE,
4836 	    (caddr_t)(u_long)SCARG(uap, path), p);
4837 	if ((error = namei(&nd)) != 0)
4838 		return (error);
4839 	error = vn_stat(nd.ni_vp, &sb, p);
4840 	vput(nd.ni_vp);
4841 	if (error)
4842 		return (error);
4843 	sparc32_from___stat13(&sb, &sb32);
4844 	error = copyout(&sb32, (caddr_t)(u_long)SCARG(uap, ub), sizeof(sb32));
4845 	return (error);
4846 }
4847 
4848 int
4849 compat_sparc32___fstat13(p, v, retval)
4850 	struct proc *p;
4851 	void *v;
4852 	register_t *retval;
4853 {
4854 	struct compat_sparc32___fstat13_args /* {
4855 		syscallarg(int) fd;
4856 		syscallarg(sparc32_statp_t) sb;
4857 	} */ *uap = v;
4858 	int fd = SCARG(uap, fd);
4859 	register struct filedesc *fdp = p->p_fd;
4860 	register struct file *fp;
4861 	struct sparc32_stat sb32;
4862 	struct stat ub;
4863 	int error = 0;
4864 
4865 	if ((u_int)fd >= fdp->fd_nfiles ||
4866 	    (fp = fdp->fd_ofiles[fd]) == NULL)
4867 		return (EBADF);
4868 	switch (fp->f_type) {
4869 
4870 	case DTYPE_VNODE:
4871 		error = vn_stat((struct vnode *)fp->f_data, &ub, p);
4872 		break;
4873 
4874 	case DTYPE_SOCKET:
4875 		error = soo_stat((struct socket *)fp->f_data, &ub);
4876 		break;
4877 
4878 	default:
4879 		panic("fstat");
4880 		/*NOTREACHED*/
4881 	}
4882 	if (error == 0) {
4883 		sparc32_from___stat13(&ub, &sb32);
4884 		error = copyout(&sb32, (caddr_t)(u_long)SCARG(uap, sb), sizeof(sb32));
4885 	}
4886 	return (error);
4887 }
4888 
4889 int
4890 compat_sparc32___lstat13(p, v, retval)
4891 	struct proc *p;
4892 	void *v;
4893 	register_t *retval;
4894 {
4895 	struct compat_sparc32___lstat13_args /* {
4896 		syscallarg(const sparc32_charp) path;
4897 		syscallarg(sparc32_statp_t) ub;
4898 	} */ *uap = v;
4899 	struct sparc32_stat sb32;
4900 	struct stat sb;
4901 	int error;
4902 	struct nameidata nd;
4903 
4904 	NDINIT(&nd, LOOKUP, NOFOLLOW | LOCKLEAF, UIO_USERSPACE,
4905 	    (caddr_t)(u_long)SCARG(uap, path), p);
4906 	if ((error = namei(&nd)) != 0)
4907 		return (error);
4908 	error = vn_stat(nd.ni_vp, &sb, p);
4909 	vput(nd.ni_vp);
4910 	if (error)
4911 		return (error);
4912 	sparc32_from___stat13(&sb, &sb32);
4913 	error = copyout(&sb32, (caddr_t)(u_long)SCARG(uap, ub), sizeof(sb32));
4914 	return (error);
4915 }
4916 
4917 int
4918 compat_sparc32___sigaltstack14(p, v, retval)
4919 	struct proc *p;
4920 	void *v;
4921 	register_t *retval;
4922 {
4923 	struct compat_sparc32___sigaltstack14_args /* {
4924 		syscallarg(const sparc32_sigaltstackp_t) nss;
4925 		syscallarg(sparc32_sigaltstackp_t) oss;
4926 	} */ *uap = v;
4927 	struct sparc32_sigaltstack s32;
4928 	struct sigaltstack nss, oss;
4929 	int error;
4930 
4931 	if (SCARG(uap, nss)) {
4932 		error = copyin((caddr_t)(u_long)SCARG(uap, nss), &s32, sizeof(s32));
4933 		if (error)
4934 			return (error);
4935 		nss.ss_sp = (void *)(u_long)s32.ss_sp;
4936 		nss.ss_size = (size_t)s32.ss_size;
4937 		nss.ss_flags = s32.ss_flags;
4938 	}
4939 	error = sigaltstack1(p,
4940 	    SCARG(uap, nss) ? &nss : 0, SCARG(uap, oss) ? &oss : 0);
4941 	if (error)
4942 		return (error);
4943 	if (SCARG(uap, oss)) {
4944 		s32.ss_sp = (sparc32_voidp)(u_long)oss.ss_sp;
4945 		s32.ss_size = (sparc32_size_t)oss.ss_size;
4946 		s32.ss_flags = oss.ss_flags;
4947 		error = copyout(&s32, (caddr_t)(u_long)SCARG(uap, oss), sizeof(s32));
4948 		if (error)
4949 			return (error);
4950 	}
4951 	return (0);
4952 }
4953 
4954 int
4955 compat_sparc32___posix_chown(p, v, retval)
4956 	struct proc *p;
4957 	void *v;
4958 	register_t *retval;
4959 {
4960 	struct compat_sparc32___posix_chown_args /* {
4961 		syscallarg(const sparc32_charp) path;
4962 		syscallarg(uid_t) uid;
4963 		syscallarg(gid_t) gid;
4964 	} */ *uap = v;
4965 	struct sys___posix_chown_args ua;
4966 
4967 	SPARC32TOP_UAP(path, const char);
4968 	SPARC32TO64_UAP(uid);
4969 	SPARC32TO64_UAP(gid);
4970 	return (sys___posix_chown(p, &ua, retval));
4971 }
4972 
4973 int
4974 compat_sparc32___posix_fchown(p, v, retval)
4975 	struct proc *p;
4976 	void *v;
4977 	register_t *retval;
4978 {
4979 	struct compat_sparc32___posix_fchown_args /* {
4980 		syscallarg(int) fd;
4981 		syscallarg(uid_t) uid;
4982 		syscallarg(gid_t) gid;
4983 	} */ *uap = v;
4984 	struct sys___posix_fchown_args ua;
4985 
4986 	SPARC32TO64_UAP(fd);
4987 	SPARC32TO64_UAP(uid);
4988 	SPARC32TO64_UAP(gid);
4989 	return (sys___posix_fchown(p, &ua, retval));
4990 }
4991 
4992 int
4993 compat_sparc32___posix_lchown(p, v, retval)
4994 	struct proc *p;
4995 	void *v;
4996 	register_t *retval;
4997 {
4998 	struct compat_sparc32___posix_lchown_args /* {
4999 		syscallarg(const sparc32_charp) path;
5000 		syscallarg(uid_t) uid;
5001 		syscallarg(gid_t) gid;
5002 	} */ *uap = v;
5003 	struct sys___posix_lchown_args ua;
5004 
5005 	SPARC32TOP_UAP(path, const char);
5006 	SPARC32TO64_UAP(uid);
5007 	SPARC32TO64_UAP(gid);
5008 	return (sys___posix_lchown(p, &ua, retval));
5009 }
5010 
5011 int
5012 compat_sparc32_getsid(p, v, retval)
5013 	struct proc *p;
5014 	void *v;
5015 	register_t *retval;
5016 {
5017 	struct compat_sparc32_getsid_args /* {
5018 		syscallarg(pid_t) pid;
5019 	} */ *uap = v;
5020 	struct sys_getsid_args ua;
5021 
5022 	SPARC32TO64_UAP(pid);
5023 	return (sys_getsid(p, &ua, retval));
5024 }
5025 
5026 int
5027 compat_sparc32_fktrace(p, v, retval)
5028 	struct proc *p;
5029 	void *v;
5030 	register_t *retval;
5031 {
5032 	struct compat_sparc32_fktrace_args /* {
5033 		syscallarg(const int) fd;
5034 		syscallarg(int) ops;
5035 		syscallarg(int) facs;
5036 		syscallarg(int) pid;
5037 	} */ *uap = v;
5038 	struct sys_fktrace_args ua;
5039 
5040 	SPARC32TO64_UAP(fd);
5041 	SPARC32TO64_UAP(ops);
5042 	SPARC32TO64_UAP(facs);
5043 	SPARC32TO64_UAP(pid);
5044 	return (sys_fktrace(p, &ua, retval));
5045 }
5046 
5047 int
5048 compat_sparc32_preadv(p, v, retval)
5049 	struct proc *p;
5050 	void *v;
5051 	register_t *retval;
5052 {
5053 	struct compat_sparc32_preadv_args /* {
5054 		syscallarg(int) fd;
5055 		syscallarg(const sparc32_iovecp_t) iovp;
5056 		syscallarg(int) iovcnt;
5057 		syscallarg(int) pad;
5058 		syscallarg(off_t) offset;
5059 	} */ *uap = v;
5060 	struct filedesc *fdp = p->p_fd;
5061 	struct file *fp;
5062 	struct vnode *vp;
5063 	off_t offset;
5064 	int error, fd = SCARG(uap, fd);
5065 
5066 	if ((u_int)fd >= fdp->fd_nfiles ||
5067 	    (fp = fdp->fd_ofiles[fd]) == NULL ||
5068 	    (fp->f_flag & FREAD) == 0)
5069 		return (EBADF);
5070 
5071 	vp = (struct vnode *)fp->f_data;
5072 	if (fp->f_type != DTYPE_VNODE
5073 	    || vp->v_type == VFIFO)
5074 		return (ESPIPE);
5075 
5076 	offset = SCARG(uap, offset);
5077 
5078 	/*
5079 	 * XXX This works because no file systems actually
5080 	 * XXX take any action on the seek operation.
5081 	 */
5082 	if ((error = VOP_SEEK(vp, fp->f_offset, offset, fp->f_cred)) != 0)
5083 		return (error);
5084 
5085 	return (dofilereadv32(p, fd, fp, (struct sparc32_iovec *)(u_long)SCARG(uap, iovp), SCARG(uap, iovcnt),
5086 	    &offset, 0, retval));
5087 }
5088 
5089 int
5090 compat_sparc32_pwritev(p, v, retval)
5091 	struct proc *p;
5092 	void *v;
5093 	register_t *retval;
5094 {
5095 	struct compat_sparc32_pwritev_args /* {
5096 		syscallarg(int) fd;
5097 		syscallarg(const sparc32_iovecp_t) iovp;
5098 		syscallarg(int) iovcnt;
5099 		syscallarg(int) pad;
5100 		syscallarg(off_t) offset;
5101 	} */ *uap = v;
5102 	struct filedesc *fdp = p->p_fd;
5103 	struct file *fp;
5104 	struct vnode *vp;
5105 	off_t offset;
5106 	int error, fd = SCARG(uap, fd);
5107 
5108 	if ((u_int)fd >= fdp->fd_nfiles ||
5109 	    (fp = fdp->fd_ofiles[fd]) == NULL ||
5110 	    (fp->f_flag & FWRITE) == 0)
5111 		return (EBADF);
5112 
5113 	vp = (struct vnode *)fp->f_data;
5114 	if (fp->f_type != DTYPE_VNODE
5115 	    || vp->v_type == VFIFO)
5116 		return (ESPIPE);
5117 
5118 	offset = SCARG(uap, offset);
5119 
5120 	/*
5121 	 * XXX This works because no file systems actually
5122 	 * XXX take any action on the seek operation.
5123 	 */
5124 	if ((error = VOP_SEEK(vp, fp->f_offset, offset, fp->f_cred)) != 0)
5125 		return (error);
5126 
5127 	return (dofilewritev32(p, fd, fp, (struct sparc32_iovec *)(u_long)SCARG(uap, iovp), SCARG(uap, iovcnt),
5128 	    &offset, 0, retval));
5129 }
5130 
5131 
5132 
5133 int
5134 compat_13_compat_sparc32_sigprocmask(p, v, retval)
5135 	register struct proc *p;
5136 	void *v;
5137 	register_t *retval;
5138 {
5139 	struct compat_13_compat_sparc32_sigprocmask_args /* {
5140 		syscallarg(int) how;
5141 		syscallarg(int) mask;
5142 	} */ *uap = v;
5143 	sigset13_t ness, oess;
5144 	sigset_t nbss, obss;
5145 	int error;
5146 
5147 	ness = SCARG(uap, mask);
5148 	native_sigset13_to_sigset(&ness, &nbss);
5149 	error = sigprocmask1(p, SCARG(uap, how), &nbss, &obss);
5150 	if (error)
5151 		return (error);
5152 	native_sigset_to_sigset13(&obss, &oess);
5153 	*retval = oess;
5154 	return (0);
5155 }
5156 
5157 
5158 int
5159 compat_13_compat_sparc32_sigsuspend(p, v, retval)
5160 	register struct proc *p;
5161 	void *v;
5162 	register_t *retval;
5163 {
5164 	struct compat_13_compat_sparc32_sigsuspend_args /* {
5165 		syscallarg(sigset13_t) mask;
5166 	} */ *uap = v;
5167 	sigset13_t ess;
5168 	sigset_t bss;
5169 
5170 	ess = SCARG(uap, mask);
5171 	native_sigset13_to_sigset(&ess, &bss);
5172 	return (sigsuspend1(p, &bss));
5173 }
5174