/* $NetBSD: sparc32_netbsd.c,v 1.5 1998/09/11 00:01:57 eeh Exp $ */ /* * Copyright (c) 1998 Matthew R. Green * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include "opt_ktrace.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static __inline void sparc32_from_timeval __P((struct timeval *, struct sparc32_timeval *)); static __inline void sparc32_to_timeval __P((struct sparc32_timeval *, struct timeval *)); static __inline void sparc32_from_itimerval __P((struct itimerval *, struct sparc32_itimerval *)); static __inline void sparc32_to_itimerval __P((struct sparc32_itimerval *, struct itimerval *)); static __inline void sparc32_to_timespec __P((struct sparc32_timespec *, struct timespec *)); static __inline void sparc32_from_timespec __P((struct timespec *, struct sparc32_timespec *)); static __inline void sparc32_from_rusage __P((struct rusage *, struct sparc32_rusage *)); static __inline void sparc32_to_rusage __P((struct sparc32_rusage *, struct rusage *)); static __inline void sparc32_to_iovec __P((struct sparc32_iovec *, struct iovec *, int)); static __inline void sparc32_to_msghdr __P((struct sparc32_msghdr *, struct msghdr *)); static __inline void sparc32_from_statfs __P((struct statfs *, struct sparc32_statfs *)); static __inline void sparc32_from_timex __P((struct timex *, struct sparc32_timex *)); static __inline void sparc32_to_timex __P((struct sparc32_timex *, struct timex *)); static __inline void sparc32_from___stat13 __P((struct stat *, struct sparc32_stat *)); static __inline void sparc32_to_ipc_perm __P((struct sparc32_ipc_perm *, struct ipc_perm *)); static __inline void sparc32_from_ipc_perm __P((struct ipc_perm *, struct sparc32_ipc_perm *)); static __inline void sparc32_to_msg __P((struct sparc32_msg *, struct msg *)); static __inline void sparc32_from_msg __P((struct msg *, struct sparc32_msg *)); static __inline void sparc32_to_msqid_ds __P((struct sparc32_msqid_ds *, struct msqid_ds *)); static __inline void sparc32_from_msqid_ds __P((struct msqid_ds *, struct sparc32_msqid_ds *)); static __inline void sparc32_to_shmid_ds __P((struct sparc32_shmid_ds *, struct shmid_ds *)); static __inline void sparc32_from_shmid_ds __P((struct shmid_ds *, struct sparc32_shmid_ds *)); static __inline void sparc32_to_semid_ds __P((struct sparc32_semid_ds *, struct semid_ds *)); static __inline void sparc32_from_semid_ds __P((struct semid_ds *, struct sparc32_semid_ds *)); /* converters for structures that we need */ static __inline void sparc32_from_timeval(tv, tv32) struct timeval *tv; struct sparc32_timeval *tv32; { tv32->tv_sec = (sparc32_long)tv->tv_sec; tv32->tv_usec = (sparc32_long)tv->tv_usec; } static __inline void sparc32_to_timeval(tv32, tv) struct sparc32_timeval *tv32; struct timeval *tv; { tv->tv_sec = (long)tv32->tv_sec; tv->tv_usec = (long)tv32->tv_usec; } static __inline void sparc32_from_itimerval(itv, itv32) struct itimerval *itv; struct sparc32_itimerval *itv32; { sparc32_from_timeval(&itv->it_interval, &itv32->it_interval); sparc32_from_timeval(&itv->it_value, &itv32->it_value); } static __inline void sparc32_to_itimerval(itv32, itv) struct sparc32_itimerval *itv32; struct itimerval *itv; { sparc32_to_timeval(&itv->it_interval, &itv32->it_interval); sparc32_to_timeval(&itv->it_value, &itv32->it_value); } static __inline void sparc32_to_timespec(s32p, p) struct sparc32_timespec *s32p; struct timespec *p; { p->tv_sec = s32p->tv_sec; p->tv_nsec = (long)s32p->tv_nsec; } static __inline void sparc32_from_timespec(p, s32p) struct timespec *p; struct sparc32_timespec *s32p; { s32p->tv_sec = p->tv_sec; s32p->tv_nsec = (sparc32_long)p->tv_nsec; } static __inline void sparc32_from_rusage(rup, ru32p) struct rusage *rup; struct sparc32_rusage *ru32p; { sparc32_from_timeval(&rup->ru_utime, &ru32p->ru_utime); sparc32_from_timeval(&rup->ru_stime, &ru32p->ru_stime); #define C(var) ru32p->var = (sparc32_long)rup->var C(ru_maxrss); C(ru_ixrss); C(ru_idrss); C(ru_isrss); C(ru_minflt); C(ru_majflt); C(ru_nswap); C(ru_inblock); C(ru_oublock); C(ru_msgsnd); C(ru_msgrcv); C(ru_nsignals); C(ru_nvcsw); C(ru_nivcsw); #undef C } static __inline void sparc32_to_rusage(ru32p, rup) struct sparc32_rusage *ru32p; struct rusage *rup; { sparc32_to_timeval(&ru32p->ru_utime, &rup->ru_utime); sparc32_to_timeval(&ru32p->ru_stime, &rup->ru_stime); #define C(var) rup->var = (long)ru32p->var C(ru_maxrss); C(ru_ixrss); C(ru_idrss); C(ru_isrss); C(ru_minflt); C(ru_majflt); C(ru_nswap); C(ru_inblock); C(ru_oublock); C(ru_msgsnd); C(ru_msgrcv); C(ru_nsignals); C(ru_nvcsw); C(ru_nivcsw); #undef C } static __inline void sparc32_to_iovec(iov32p, iovp, len) struct sparc32_iovec *iov32p; struct iovec *iovp; int len; { int i; for (i = 0; i < len; i++, iovp++, iov32p++) { iovp->iov_base = (void *)(u_long)iov32p->iov_base; iovp->iov_len = (size_t)iov32p->iov_len; } } /* assumes that mhp's msg_iov has been allocated */ static __inline void sparc32_to_msghdr(mhp32, mhp) struct sparc32_msghdr *mhp32; struct msghdr *mhp; { mhp->msg_name = (caddr_t)(u_long)mhp32->msg_name; mhp->msg_namelen = mhp32->msg_namelen; mhp->msg_iovlen = (size_t)mhp32->msg_iovlen; mhp->msg_control = (caddr_t)(u_long)mhp32->msg_control; mhp->msg_controllen = mhp32->msg_controllen; mhp->msg_flags = mhp32->msg_flags; sparc32_to_iovec(mhp32->msg_iov, mhp->msg_iov, mhp->msg_iovlen); } static __inline void sparc32_from_statfs(sbp, sb32p) struct statfs *sbp; struct sparc32_statfs *sb32p; { sb32p->f_type = sbp->f_type; sb32p->f_flags = sbp->f_flags; sb32p->f_bsize = (sparc32_long)sbp->f_bsize; sb32p->f_iosize = (sparc32_long)sbp->f_iosize; sb32p->f_blocks = (sparc32_long)sbp->f_blocks; sb32p->f_bfree = (sparc32_long)sbp->f_bfree; sb32p->f_bavail = (sparc32_long)sbp->f_bavail; sb32p->f_files = (sparc32_long)sbp->f_files; sb32p->f_ffree = (sparc32_long)sbp->f_ffree; sb32p->f_fsid = sbp->f_fsid; sb32p->f_owner = sbp->f_owner; strncpy(sbp->f_fstypename, sb32p->f_fstypename, MFSNAMELEN); strncpy(sbp->f_fstypename, sb32p->f_fstypename, MNAMELEN); strncpy(sbp->f_fstypename, sb32p->f_mntfromname, MNAMELEN); } static __inline void sparc32_from_timex(txp, tx32p) struct timex *txp; struct sparc32_timex *tx32p; { tx32p->modes = txp->modes; tx32p->offset = (sparc32_long)txp->offset; tx32p->freq = (sparc32_long)txp->freq; tx32p->maxerror = (sparc32_long)txp->maxerror; tx32p->esterror = (sparc32_long)txp->esterror; tx32p->status = txp->status; tx32p->constant = (sparc32_long)txp->constant; tx32p->precision = (sparc32_long)txp->precision; tx32p->tolerance = (sparc32_long)txp->tolerance; tx32p->ppsfreq = (sparc32_long)txp->ppsfreq; tx32p->jitter = (sparc32_long)txp->jitter; tx32p->shift = txp->shift; tx32p->stabil = (sparc32_long)txp->stabil; tx32p->jitcnt = (sparc32_long)txp->jitcnt; tx32p->calcnt = (sparc32_long)txp->calcnt; tx32p->errcnt = (sparc32_long)txp->errcnt; tx32p->stbcnt = (sparc32_long)txp->stbcnt; } static __inline void sparc32_to_timex(tx32p, txp) struct sparc32_timex *tx32p; struct timex *txp; { txp->modes = tx32p->modes; txp->offset = (long)tx32p->offset; txp->freq = (long)tx32p->freq; txp->maxerror = (long)tx32p->maxerror; txp->esterror = (long)tx32p->esterror; txp->status = tx32p->status; txp->constant = (long)tx32p->constant; txp->precision = (long)tx32p->precision; txp->tolerance = (long)tx32p->tolerance; txp->ppsfreq = (long)tx32p->ppsfreq; txp->jitter = (long)tx32p->jitter; txp->shift = tx32p->shift; txp->stabil = (long)tx32p->stabil; txp->jitcnt = (long)tx32p->jitcnt; txp->calcnt = (long)tx32p->calcnt; txp->errcnt = (long)tx32p->errcnt; txp->stbcnt = (long)tx32p->stbcnt; } static __inline void sparc32_from___stat13(sbp, sb32p) struct stat *sbp; struct sparc32_stat *sb32p; { sb32p->st_dev = sbp->st_dev; sb32p->st_ino = sbp->st_ino; sb32p->st_mode = sbp->st_mode; sb32p->st_nlink = sbp->st_nlink; sb32p->st_uid = sbp->st_uid; sb32p->st_gid = sbp->st_gid; sb32p->st_rdev = sbp->st_rdev; if (sbp->st_size < (quad_t)1 << 32) sb32p->st_size = sbp->st_size; else sb32p->st_size = -2; sb32p->st_atimespec.tv_sec = sbp->st_atimespec.tv_sec; sb32p->st_atimespec.tv_nsec = (sparc32_long)sbp->st_atimespec.tv_nsec; sb32p->st_mtimespec.tv_sec = sbp->st_mtimespec.tv_sec; sb32p->st_mtimespec.tv_nsec = (sparc32_long)sbp->st_mtimespec.tv_nsec; sb32p->st_ctimespec.tv_sec = sbp->st_ctimespec.tv_sec; sb32p->st_ctimespec.tv_nsec = (sparc32_long)sbp->st_ctimespec.tv_nsec; sb32p->st_blksize = sbp->st_blksize; sb32p->st_blocks = sbp->st_blocks; sb32p->st_flags = sbp->st_flags; sb32p->st_gen = sbp->st_gen; } static __inline void sparc32_to_ipc_perm(ip32p, ipp) struct sparc32_ipc_perm *ip32p; struct ipc_perm *ipp; { ipp->cuid = ip32p->cuid; ipp->cgid = ip32p->cgid; ipp->uid = ip32p->uid; ipp->gid = ip32p->gid; ipp->mode = ip32p->mode; ipp->seq = ip32p->seq; ipp->key = (key_t)ip32p->key; } static __inline void sparc32_from_ipc_perm(ipp, ip32p) struct ipc_perm *ipp; struct sparc32_ipc_perm *ip32p; { ip32p->cuid = ipp->cuid; ip32p->cgid = ipp->cgid; ip32p->uid = ipp->uid; ip32p->gid = ipp->gid; ip32p->mode = ipp->mode; ip32p->seq = ipp->seq; ip32p->key = (sparc32_key_t)ipp->key; } static __inline void sparc32_to_msg(m32p, mp) struct sparc32_msg *m32p; struct msg *mp; { mp->msg_next = (struct msg *)(u_long)m32p->msg_next; mp->msg_type = (long)m32p->msg_type; mp->msg_ts = m32p->msg_ts; mp->msg_spot = m32p->msg_spot; } static __inline void sparc32_from_msg(mp, m32p) struct msg *mp; struct sparc32_msg *m32p; { m32p->msg_next = (sparc32_msgp_t)(u_long)mp->msg_next; m32p->msg_type = (sparc32_long)mp->msg_type; m32p->msg_ts = mp->msg_ts; m32p->msg_spot = mp->msg_spot; } static __inline void sparc32_to_msqid_ds(ds32p, dsp) struct sparc32_msqid_ds *ds32p; struct msqid_ds *dsp; { sparc32_to_ipc_perm(&ds32p->msg_perm, &dsp->msg_perm); sparc32_to_msg(&ds32p->msg_first, &dsp->msg_first); sparc32_to_msg(&ds32p->msg_last, &dsp->msg_last); dsp->msg_cbytes = (u_long)ds32p->msg_cbytes; dsp->msg_qnum = (u_long)ds32p->msg_qnum; dsp->msg_qbytes = (u_long)ds32p->msg_qbytes; dsp->msg_lspid = ds32p->msg_lspid; dsp->msg_lrpid = ds32p->msg_lrpid; dsp->msg_rtime = (time_t)ds32p->msg_rtime; dsp->msg_stime = (time_t)ds32p->msg_stime; dsp->msg_ctime = (time_t)ds32p->msg_ctime; } static __inline void sparc32_from_msqid_ds(dsp, ds32p) struct msqid_ds *dsp; struct sparc32_msqid_ds *ds32p; { sparc32_from_ipc_perm(&dsp->msg_perm, &ds32p->msg_perm); sparc32_from_msg(&dsp->msg_first, &ds32p->msg_first); sparc32_from_msg(&dsp->msg_last, &ds32p->msg_last); ds32p->msg_cbytes = (sparc32_u_long)dsp->msg_cbytes; ds32p->msg_qnum = (sparc32_u_long)dsp->msg_qnum; ds32p->msg_qbytes = (sparc32_u_long)dsp->msg_qbytes; ds32p->msg_lspid = dsp->msg_lspid; ds32p->msg_lrpid = dsp->msg_lrpid; ds32p->msg_rtime = dsp->msg_rtime; ds32p->msg_stime = dsp->msg_stime; ds32p->msg_ctime = dsp->msg_ctime; } static __inline void sparc32_to_shmid_ds(ds32p, dsp) struct sparc32_shmid_ds *ds32p; struct shmid_ds *dsp; { sparc32_to_ipc_perm(&ds32p->shm_perm, &dsp->shm_perm); dsp->shm_segsz = ds32p->shm_segsz; dsp->shm_lpid = ds32p->shm_lpid; dsp->shm_cpid = ds32p->shm_cpid; dsp->shm_nattch = ds32p->shm_nattch; dsp->shm_atime = (long)ds32p->shm_atime; dsp->shm_dtime = (long)ds32p->shm_dtime; dsp->shm_ctime = (long)ds32p->shm_ctime; dsp->shm_internal = (void *)(u_long)ds32p->shm_internal; } static __inline void sparc32_from_shmid_ds(dsp, ds32p) struct shmid_ds *dsp; struct sparc32_shmid_ds *ds32p; { sparc32_from_ipc_perm(&dsp->shm_perm, &ds32p->shm_perm); ds32p->shm_segsz = dsp->shm_segsz; ds32p->shm_lpid = dsp->shm_lpid; ds32p->shm_cpid = dsp->shm_cpid; ds32p->shm_nattch = dsp->shm_nattch; ds32p->shm_atime = (sparc32_long)dsp->shm_atime; ds32p->shm_dtime = (sparc32_long)dsp->shm_dtime; ds32p->shm_ctime = (sparc32_long)dsp->shm_ctime; ds32p->shm_internal = (sparc32_voidp)(u_long)dsp->shm_internal; } static __inline void sparc32_to_semid_ds(s32dsp, dsp) struct sparc32_semid_ds *s32dsp; struct semid_ds *dsp; { sparc32_from_ipc_perm(&dsp->sem_perm, &s32dsp->sem_perm); dsp->sem_base = (struct sem *)(u_long)s32dsp->sem_base; dsp->sem_nsems = s32dsp->sem_nsems; dsp->sem_otime = s32dsp->sem_otime; dsp->sem_ctime = s32dsp->sem_ctime; } static __inline void sparc32_from_semid_ds(dsp, s32dsp) struct semid_ds *dsp; struct sparc32_semid_ds *s32dsp; { sparc32_to_ipc_perm(&s32dsp->sem_perm, &dsp->sem_perm); s32dsp->sem_base = (sparc32_semp_t)(u_long)dsp->sem_base; s32dsp->sem_nsems = dsp->sem_nsems; s32dsp->sem_otime = dsp->sem_otime; s32dsp->sem_ctime = dsp->sem_ctime; } /* * below are all the standard NetBSD system calls, in the 32bit * environment, witht he necessary conversions to 64bit before * calling the real syscall. */ int compat_sparc32_read(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_read_args /* { syscallarg(int) fd; syscallarg(sparc32_voidp) buf; syscallarg(sparc32_size_t) nbyte; } */ *uap = v; struct sys_read_args ua; ssize_t rt; int error; SPARC32TO64_UAP(fd); SPARC32TOP_UAP(buf, void *); SPARC32TOX_UAP(nbyte, size_t); error = sys_read(p, &ua, (register_t *)&rt); *(sparc32_ssize_t *)retval = rt; return (error); } int compat_sparc32_write(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_write_args /* { syscallarg(int) fd; syscallarg(const sparc32_voidp) buf; syscallarg(sparc32_size_t) nbyte; } */ *uap = v; struct sys_write_args ua; ssize_t rt; int error; SPARC32TO64_UAP(fd); SPARC32TOP_UAP(buf, void *); SPARC32TOX_UAP(nbyte, size_t); error = sys_write(p, &ua, (register_t *)&rt); *(sparc32_ssize_t *)retval = rt; return (error); } int compat_sparc32_open(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_open_args /* { syscallarg(const sparc32_charp) path; syscallarg(int) flags; syscallarg(mode_t) mode; } */ *uap = v; struct sys_open_args ua; caddr_t sg; SPARC32TOP_UAP(path, const char); SPARC32TO64_UAP(flags); SPARC32TO64_UAP(mode); sg = stackgap_init(p->p_emul); SPARC32_CHECK_ALT_EXIST(p, &sg, SCARG(&ua, path)); return (sys_open(p, &ua, retval)); } int compat_sparc32_wait4(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_wait4_args /* { syscallarg(int) pid; syscallarg(sparc32_intp) status; syscallarg(int) options; syscallarg(sparc32_rusagep_t) rusage; } */ *uap = v; struct sys_wait4_args ua; struct rusage ru; struct sparc32_rusage *ru32p; struct sparc32_rusage ru32; int error; SPARC32TO64_UAP(pid); SPARC32TOP_UAP(status, int); SPARC32TO64_UAP(options); ru32p = (struct sparc32_rusage *)(u_long)SCARG(uap, rusage); if (ru32p) { if (copyin(ru32p, &ru32, sizeof(ru32))) return (EFAULT); SCARG(&ua, rusage) = &ru; sparc32_to_rusage(&ru32, &ru); } else SCARG(&ua, rusage) = NULL; error = sys_wait4(p, &ua, retval); if (ru32p) { sparc32_from_rusage(&ru, &ru32); if (copyout(&ru32, ru32p, sizeof(ru32))) error = EFAULT; } return (error); } int compat_sparc32_link(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_link_args /* { syscallarg(const sparc32_charp) path; syscallarg(const sparc32_charp) link; } */ *uap = v; struct sys_link_args ua; SPARC32TOP_UAP(path, const char); SPARC32TOP_UAP(link, const char); return (sys_link(p, &ua, retval)); } int compat_sparc32_unlink(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_unlink_args /* { syscallarg(const sparc32_charp) path; } */ *uap = v; struct sys_unlink_args ua; SPARC32TOP_UAP(path, const char); return (sys_unlink(p, &ua, retval)); } int compat_sparc32_chdir(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_chdir_args /* { syscallarg(const sparc32_charp) path; } */ *uap = v; struct sys_chdir_args ua; SPARC32TOP_UAP(path, const char); return (sys_chdir(p, &ua, retval)); } int compat_sparc32_mknod(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_mknod_args /* { syscallarg(const sparc32_charp) path; syscallarg(mode_t) mode; syscallarg(dev_t) dev; } */ *uap = v; struct sys_mknod_args ua; SPARC32TOP_UAP(path, const char); SPARC32TO64_UAP(dev); SPARC32TO64_UAP(mode); return (sys_mknod(p, &ua, retval)); } int compat_sparc32_chmod(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_chmod_args /* { syscallarg(const sparc32_charp) path; syscallarg(mode_t) mode; } */ *uap = v; struct sys_chmod_args ua; SPARC32TOP_UAP(path, const char); SPARC32TO64_UAP(mode); return (sys_chmod(p, &ua, retval)); } int compat_sparc32_chown(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_chown_args /* { syscallarg(const sparc32_charp) path; syscallarg(uid_t) uid; syscallarg(gid_t) gid; } */ *uap = v; struct sys_chown_args ua; SPARC32TOP_UAP(path, const char); SPARC32TO64_UAP(uid); SPARC32TO64_UAP(gid); return (sys_chown(p, &ua, retval)); } int compat_sparc32_break(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_break_args /* { syscallarg(sparc32_charp) nsize; } */ *uap = v; struct sys_obreak_args ua; SCARG(&ua, nsize) = (char *)(u_long)SCARG(uap, nsize); SPARC32TOP_UAP(nsize, char); return (sys_obreak(p, &ua, retval)); } int compat_sparc32_getfsstat(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_getfsstat_args /* { syscallarg(sparc32_statfsp_t) buf; syscallarg(sparc32_long) bufsize; syscallarg(int) flags; } */ *uap = v; struct sys_getfsstat_args ua; struct statfs sb; struct sparc32_statfs *sb32p; int error; sb32p = (struct sparc32_statfs *)(u_long)SCARG(uap, buf); if (sb32p) SCARG(&ua, buf) = &sb; else SCARG(&ua, buf) = NULL; SPARC32TOX_UAP(bufsize, long); SPARC32TO64_UAP(flags); error = sys_getfsstat(p, &ua, retval); if (error) return (error); if (sb32p) { struct sparc32_statfs sb32; sparc32_from_statfs(&sb, &sb32); if (copyout(&sb32, sb32p, sizeof(sb32))) return EFAULT; } return (0); } int compat_sparc32_mount(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_mount_args /* { syscallarg(const sparc32_charp) type; syscallarg(const sparc32_charp) path; syscallarg(int) flags; syscallarg(sparc32_voidp) data; } */ *uap = v; struct sys_mount_args ua; SPARC32TOP_UAP(type, const char); SPARC32TOP_UAP(path, const char); SPARC32TO64_UAP(flags); SPARC32TOP_UAP(data, void); return (sys_mount(p, &ua, retval)); } int compat_sparc32_unmount(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_unmount_args /* { syscallarg(const sparc32_charp) path; syscallarg(int) flags; } */ *uap = v; struct sys_unmount_args ua; SPARC32TOP_UAP(path, const char); SPARC32TO64_UAP(flags); return (sys_unmount(p, &ua, retval)); } int compat_sparc32_ptrace(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_ptrace_args /* { syscallarg(int) req; syscallarg(pid_t) pid; syscallarg(sparc32_caddr_t) addr; syscallarg(int) data; } */ *uap = v; struct sys_ptrace_args ua; SPARC32TO64_UAP(req); SPARC32TO64_UAP(pid); SPARC32TOX64_UAP(addr, caddr_t); SPARC32TO64_UAP(data); return (sys_ptrace(p, &ua, retval)); } int compat_sparc32_recvmsg(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_recvmsg_args /* { syscallarg(int) s; syscallarg(sparc32_msghdrp_t) msg; syscallarg(int) flags; } */ *uap = v; struct sys_recvmsg_args ua; struct msghdr mh; struct msghdr *mhp = &mh; struct sparc32_msghdr *mhp32, mh32; ssize_t rt; int error; SPARC32TO64_UAP(s); SPARC32TO64_UAP(flags); SCARG(&ua, msg) = mhp; mhp32 = (struct sparc32_msghdr *)(u_long)SCARG(uap, msg); if (copyin(mhp32, &mh32, sizeof(mh32))) return EFAULT; /* sparc32_msghdr needs the iov pre-allocated */ MALLOC(mhp->msg_iov, struct iovec *, sizeof(struct iovec) * mh32.msg_iovlen, M_TEMP, M_WAITOK); sparc32_to_msghdr(&mh32, mhp); error = sys_recvmsg(p, &ua, (register_t *)&rt); FREE(mhp->msg_iov, M_TEMP); *(sparc32_ssize_t *)retval = rt; return (error); } int compat_sparc32_sendmsg(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_sendmsg_args /* { syscallarg(int) s; syscallarg(const sparc32_msghdrp_t) msg; syscallarg(int) flags; } */ *uap = v; struct sys_sendmsg_args ua; struct msghdr mh; struct msghdr *mhp = &mh; struct sparc32_msghdr *mhp32, mh32; ssize_t rt; int error; SPARC32TO64_UAP(s); SPARC32TO64_UAP(flags); SCARG(&ua, msg) = mhp; mhp32 = (struct sparc32_msghdr *)(u_long)SCARG(uap, msg); if (copyin(mhp32, &mh32, sizeof(mh32))) return EFAULT; /* sparc32_msghdr needs the iov pre-allocated */ MALLOC(mhp->msg_iov, struct iovec *, sizeof(struct iovec) * mh32.msg_iovlen, M_TEMP, M_WAITOK); sparc32_to_msghdr(mhp32, mhp); error = sys_sendmsg(p, &ua, (register_t *)&rt); FREE(mhp->msg_iov, M_TEMP); *(sparc32_ssize_t *)retval = rt; return (error); } int compat_sparc32_recvfrom(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_recvfrom_args /* { syscallarg(int) s; syscallarg(sparc32_voidp) buf; syscallarg(sparc32_size_t) len; syscallarg(int) flags; syscallarg(sparc32_sockaddrp_t) from; syscallarg(sparc32_intp) fromlenaddr; } */ *uap = v; struct sys_recvfrom_args ua; off_t rt; int error; SPARC32TO64_UAP(s); SPARC32TOP_UAP(buf, void); SPARC32TOX_UAP(len, size_t); SPARC32TO64_UAP(flags); SPARC32TOP_UAP(from, struct sockaddr); SPARC32TOP_UAP(fromlenaddr, int); error = sys_recvfrom(p, &ua, (register_t *)&rt); *(sparc32_ssize_t *)retval = rt; return (error); } int compat_sparc32_sendto(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_sendto_args /* { syscallarg(int) s; syscallarg(const sparc32_voidp) buf; syscallarg(sparc32_size_t) len; syscallarg(int) flags; syscallarg(const sparc32_sockaddrp_t) to; syscallarg(int) tolen; } */ *uap = v; struct sys_sendto_args ua; off_t rt; int error; SPARC32TO64_UAP(s); SPARC32TOP_UAP(buf, void); SPARC32TOX_UAP(len, size_t); SPARC32TO64_UAP(flags); SPARC32TOP_UAP(to, struct sockaddr); SPARC32TOX_UAP(tolen, int); error = sys_sendto(p, &ua, (register_t *)&rt); *(sparc32_ssize_t *)retval = rt; return (error); } int compat_sparc32_socketpair(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_socketpair_args /* { syscallarg(int) domain; syscallarg(int) type; syscallarg(int) protocol; syscallarg(sparc32_intp) rsv; } */ *uap = v; struct sys_socketpair_args ua; SPARC32TO64_UAP(domain); SPARC32TO64_UAP(type); SPARC32TO64_UAP(protocol); SPARC32TOP_UAP(rsv, int); return (sys_socketpair(p, &ua, retval)); } int compat_sparc32_accept(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_accept_args /* { syscallarg(int) s; syscallarg(sparc32_sockaddrp_t) name; syscallarg(sparc32_intp) anamelen; } */ *uap = v; struct sys_accept_args ua; SPARC32TO64_UAP(s); SPARC32TOP_UAP(name, struct sockaddr); SPARC32TOP_UAP(anamelen, int); return (sys_accept(p, &ua, retval)); } int compat_sparc32_getpeername(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_getpeername_args /* { syscallarg(int) fdes; syscallarg(sparc32_sockaddrp_t) asa; syscallarg(sparc32_intp) alen; } */ *uap = v; struct sys_getpeername_args ua; SPARC32TO64_UAP(fdes); SPARC32TOP_UAP(asa, struct sockaddr); SPARC32TOP_UAP(alen, int); return (sys_getpeername(p, &ua, retval)); } int compat_sparc32_getsockname(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_getsockname_args /* { syscallarg(int) fdes; syscallarg(sparc32_sockaddrp_t) asa; syscallarg(sparc32_intp) alen; } */ *uap = v; struct sys_getsockname_args ua; SPARC32TO64_UAP(fdes); SPARC32TOP_UAP(asa, struct sockaddr); SPARC32TOP_UAP(alen, int); return (sys_getsockname(p, &ua, retval)); } int compat_sparc32_access(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_access_args /* { syscallarg(const sparc32_charp) path; syscallarg(int) flags; } */ *uap = v; struct sys_access_args ua; caddr_t sg; SPARC32TOP_UAP(path, const char); SPARC32TO64_UAP(flags); sg = stackgap_init(p->p_emul); SPARC32_CHECK_ALT_EXIST(p, &sg, SCARG(&ua, path)); return (sys_access(p, &ua, retval)); } int compat_sparc32_chflags(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_chflags_args /* { syscallarg(const sparc32_charp) path; syscallarg(sparc32_u_long) flags; } */ *uap = v; struct sys_chflags_args ua; SPARC32TOP_UAP(path, const char); SPARC32TO64_UAP(flags); return (sys_chflags(p, &ua, retval)); } int compat_sparc32_fchflags(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_fchflags_args /* { syscallarg(int) fd; syscallarg(sparc32_u_long) flags; } */ *uap = v; struct sys_fchflags_args ua; SPARC32TO64_UAP(fd); SPARC32TO64_UAP(flags); return (sys_fchflags(p, &ua, retval)); } int compat_sparc32_profil(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_profil_args /* { syscallarg(sparc32_caddr_t) samples; syscallarg(sparc32_size_t) size; syscallarg(sparc32_u_long) offset; syscallarg(u_int) scale; } */ *uap = v; struct sys_profil_args ua; SPARC32TOX64_UAP(samples, caddr_t); SPARC32TOX_UAP(size, size_t); SPARC32TOX_UAP(offset, u_long); SPARC32TO64_UAP(scale); return (sys_profil(p, &ua, retval)); } int compat_sparc32_ktrace(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_ktrace_args /* { syscallarg(const sparc32_charp) fname; syscallarg(int) ops; syscallarg(int) facs; syscallarg(int) pid; } */ *uap = v; struct sys_ktrace_args ua; SPARC32TOP_UAP(fname, const char); SPARC32TO64_UAP(ops); SPARC32TO64_UAP(facs); SPARC32TO64_UAP(pid); return (sys_ktrace(p, &ua, retval)); } int compat_sparc32_sigaction(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_sigaction_args /* { syscallarg(int) signum; syscallarg(const sparc32_sigactionp_t) nsa; syscallarg(sparc32_sigactionp_t) osa; } */ *uap = v; struct sys_sigaction_args ua; struct sigaction nsa, osa; struct sparc32_sigaction *sa32p, sa32; int error; SPARC32TO64_UAP(signum); if (SCARG(uap, osa)) SCARG(&ua, osa) = &osa; else SCARG(&ua, osa) = NULL; if (SCARG(uap, nsa)) { SCARG(&ua, nsa) = &nsa; sa32p = (struct sparc32_sigaction *)(u_long)SCARG(uap, nsa); if (copyin(sa32p, &sa32, sizeof(sa32))) return EFAULT; nsa.sa_handler = (void *)(u_long)sa32.sa_handler; nsa.sa_mask = sa32.sa_mask; nsa.sa_flags = sa32.sa_flags; } else SCARG(&ua, nsa) = NULL; SCARG(&ua, nsa) = &osa; error = sys_sigaction(p, &ua, retval); if (error) return (error); if (SCARG(uap, osa)) { sa32.sa_handler = (sparc32_sigactionp_t)(u_long)osa.sa_handler; sa32.sa_mask = osa.sa_mask; sa32.sa_flags = osa.sa_flags; sa32p = (struct sparc32_sigaction *)(u_long)SCARG(uap, osa); if (copyout(&sa32, sa32p, sizeof(sa32))) return EFAULT; } return (0); } int compat_sparc32___getlogin(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32___getlogin_args /* { syscallarg(sparc32_charp) namebuf; syscallarg(u_int) namelen; } */ *uap = v; struct sys___getlogin_args ua; SPARC32TOP_UAP(namebuf, char); SPARC32TO64_UAP(namelen); return (sys___getlogin(p, &ua, retval)); } int compat_sparc32_setlogin(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_setlogin_args /* { syscallarg(const sparc32_charp) namebuf; } */ *uap = v; struct sys_setlogin_args ua; SPARC32TOP_UAP(namebuf, char); return (sys_setlogin(p, &ua, retval)); } int compat_sparc32_acct(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_acct_args /* { syscallarg(const sparc32_charp) path; } */ *uap = v; struct sys_acct_args ua; SPARC32TOP_UAP(path, const char); return (sys_acct(p, &ua, retval)); } int compat_sparc32_revoke(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_revoke_args /* { syscallarg(const sparc32_charp) path; } */ *uap = v; struct sys_revoke_args ua; caddr_t sg; SPARC32TOP_UAP(path, const char); sg = stackgap_init(p->p_emul); SPARC32_CHECK_ALT_EXIST(p, &sg, SCARG(&ua, path)); return (sys_revoke(p, &ua, retval)); } int compat_sparc32_symlink(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_symlink_args /* { syscallarg(const sparc32_charp) path; syscallarg(const sparc32_charp) link; } */ *uap = v; struct sys_symlink_args ua; SPARC32TOP_UAP(path, const char); SPARC32TOP_UAP(link, const char); return (sys_symlink(p, &ua, retval)); } int compat_sparc32_readlink(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_readlink_args /* { syscallarg(const sparc32_charp) path; syscallarg(sparc32_charp) buf; syscallarg(sparc32_size_t) count; } */ *uap = v; struct sys_readlink_args ua; caddr_t sg; SPARC32TOP_UAP(path, const char); SPARC32TOP_UAP(buf, char); SPARC32TOX_UAP(count, size_t); sg = stackgap_init(p->p_emul); SPARC32_CHECK_ALT_EXIST(p, &sg, SCARG(&ua, path)); return (sys_readlink(p, &ua, retval)); } int compat_sparc32_execve(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_execve_args /* { syscallarg(const sparc32_charp) path; syscallarg(sparc32_charpp) argp; syscallarg(sparc32_charpp) envp; } */ *uap = v; struct sys_execve_args ua; caddr_t sg; SPARC32TOP_UAP(path, const char); SPARC32TOP_UAP(argp, char *); SPARC32TOP_UAP(envp, char *); sg = stackgap_init(p->p_emul); SPARC32_CHECK_ALT_EXIST(p, &sg, SCARG(&ua, path)); return (sys_execve(p, &ua, retval)); } int compat_sparc32_chroot(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_chroot_args /* { syscallarg(const sparc32_charp) path; } */ *uap = v; struct sys_chroot_args ua; SPARC32TOP_UAP(path, const char); return (sys_chroot(p, &ua, retval)); } int compat_sparc32_munmap(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_munmap_args /* { syscallarg(sparc32_voidp) addr; syscallarg(sparc32_size_t) len; } */ *uap = v; struct sys_munmap_args ua; SPARC32TOP_UAP(addr, void); SPARC32TOX_UAP(len, size_t); return (sys_munmap(p, &ua, retval)); } int compat_sparc32_mprotect(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_mprotect_args /* { syscallarg(sparc32_voidp) addr; syscallarg(sparc32_size_t) len; syscallarg(int) prot; } */ *uap = v; struct sys_mprotect_args ua; SPARC32TOP_UAP(addr, void); SPARC32TOX_UAP(len, size_t); SPARC32TO64_UAP(prot); return (sys_mprotect(p, &ua, retval)); } int compat_sparc32_madvise(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_madvise_args /* { syscallarg(sparc32_voidp) addr; syscallarg(sparc32_size_t) len; syscallarg(int) behav; } */ *uap = v; struct sys_madvise_args ua; SPARC32TOP_UAP(addr, void); SPARC32TOX_UAP(len, size_t); SPARC32TO64_UAP(behav); return (sys_madvise(p, &ua, retval)); } int compat_sparc32_mincore(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_mincore_args /* { syscallarg(sparc32_caddr_t) addr; syscallarg(sparc32_size_t) len; syscallarg(sparc32_charp) vec; } */ *uap = v; struct sys_mincore_args ua; SPARC32TOX64_UAP(addr, caddr_t); SPARC32TOX_UAP(len, size_t); SPARC32TOP_UAP(vec, char); return (sys_mincore(p, &ua, retval)); } int compat_sparc32_getgroups(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_getgroups_args /* { syscallarg(int) gidsetsize; syscallarg(sparc32_gid_tp) gidset; } */ *uap = v; struct sys_getgroups_args ua; SPARC32TO64_UAP(gidsetsize); SPARC32TOP_UAP(gidset, gid_t); return (sys_getgroups(p, &ua, retval)); } int compat_sparc32_setgroups(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_setgroups_args /* { syscallarg(int) gidsetsize; syscallarg(const sparc32_gid_tp) gidset; } */ *uap = v; struct sys_setgroups_args ua; SPARC32TO64_UAP(gidsetsize); SPARC32TOP_UAP(gidset, gid_t); return (sys_setgroups(p, &ua, retval)); } int compat_sparc32_setitimer(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_setitimer_args /* { syscallarg(int) which; syscallarg(const sparc32_itimervalp_t) itv; syscallarg(sparc32_itimervalp_t) oitv; } */ *uap = v; struct sys_setitimer_args ua; struct itimerval iit, oit; struct sparc32_itimerval *s32itp, s32it; int error; SPARC32TO64_UAP(which); s32itp = (struct sparc32_itimerval *)(u_long)SCARG(uap, itv); if (s32itp) { if (copyin(s32itp, &s32it, sizeof(s32it))) return EFAULT; SCARG(&ua, itv) = &iit; sparc32_to_itimerval(&s32it, &iit); } else SCARG(&ua, itv) = NULL; s32itp = (struct sparc32_itimerval *)(u_long)SCARG(uap, oitv); if (s32itp) SCARG(&ua, oitv) = &oit; else SCARG(&ua, oitv) = NULL; error = sys_setitimer(p, &ua, retval); if (error) return (error); if (s32itp) { sparc32_from_itimerval(&oit, &s32it); if (copyout(&s32it, s32itp, sizeof(s32it))) return EFAULT; } return (0); } int compat_sparc32_getitimer(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_getitimer_args /* { syscallarg(int) which; syscallarg(sparc32_itimervalp_t) itv; } */ *uap = v; struct sys_getitimer_args ua; struct itimerval it; struct sparc32_itimerval *s32itp, s32it; int error; SPARC32TO64_UAP(which); s32itp = (struct sparc32_itimerval *)(u_long)SCARG(uap, itv); if (s32itp == NULL) SCARG(&ua, itv) = ⁢ else SCARG(&ua, itv) = NULL; error = sys_getitimer(p, &ua, retval); if (error) return (error); if (s32itp) { sparc32_from_itimerval(&it, &s32it); if (copyout(&s32it, s32itp, sizeof(s32it))) return EFAULT; } return (0); } int compat_sparc32_fcntl(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_fcntl_args /* { syscallarg(int) fd; syscallarg(int) cmd; syscallarg(sparc32_voidp) arg; } */ *uap = v; struct sys_fcntl_args ua; SPARC32TO64_UAP(fd); SPARC32TO64_UAP(cmd); SPARC32TOP_UAP(arg, void); return (sys_fcntl(p, &ua, retval)); } int compat_sparc32_select(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_select_args /* { syscallarg(int) nd; syscallarg(sparc32_fd_setp_t) in; syscallarg(sparc32_fd_setp_t) ou; syscallarg(sparc32_fd_setp_t) ex; syscallarg(sparc32_timevalp_t) tv; } */ *uap = v; struct sys_select_args ua; struct timeval tv; struct sparc32_timeval *tv32p, tv32; int error; SPARC32TO64_UAP(nd); SPARC32TOP_UAP(in, fd_set); SPARC32TOP_UAP(ou, fd_set); SPARC32TOP_UAP(ex, fd_set); tv32p = (struct sparc32_timeval *)(u_long)SCARG(uap, tv); if (tv32p) { if (copyin(tv32p &tv32, sizeof(tv32))) return EFAULT; sparc32_to_timeval(&tv32, &tv); } SCARG(&ua, tv) = &tv; error = sys_select(p, &ua, retval); if (tv32p) { sparc32_from_timeval(&tv, &tv32); if (copyout(&tv32 tv32p, sizeof(tv32))) return EFAULT; } return (error); } int compat_sparc32_connect(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_connect_args /* { syscallarg(int) s; syscallarg(const sparc32_sockaddrp_t) name; syscallarg(int) namelen; } */ *uap = v; struct sys_connect_args ua; SPARC32TO64_UAP(s); SPARC32TOP_UAP(name, struct sockaddr); SPARC32TO64_UAP(namelen); return (sys_connect(p, &ua, retval)); } #undef DEBUG int compat_sparc32_sigreturn(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_sigreturn_args /* { syscallarg(struct sparc32_sigcontext *) sigcntxp; } */ *uap = v; struct sparc32_sigcontext *scp; struct sparc32_sigcontext sc; register struct trapframe *tf; struct rwindow32 *rwstack, *kstack; int i; /* First ensure consistent stack state (see sendsig). */ write_user_windows(); if (rwindow_save(p)) { #ifdef DEBUG printf("sigreturn: rwindow_save(%p) failed, sending SIGILL\n", p); Debugger(); #endif sigexit(p, SIGILL); } #ifdef DEBUG if (sigdebug & SDB_FOLLOW) { printf("sigreturn: %s[%d], sigcntxp %p\n", p->p_comm, p->p_pid, SCARG(uap, sigcntxp)); if (sigdebug & SDB_DDB) Debugger(); } #endif scp = SCARG(uap, sigcntxp); if ((int)scp & 3 || (copyin((caddr_t)scp, &sc, sizeof sc) != 0)) #ifdef DEBUG { printf("sigreturn: copyin failed\n"); Debugger(); return (EINVAL); } #else return (EINVAL); #endif tf = p->p_md.md_tf; /* * Only the icc bits in the psr are used, so it need not be * verified. pc and npc must be multiples of 4. This is all * that is required; if it holds, just do it. */ if (((sc.sc_pc | sc.sc_npc) & 3) != 0) #ifdef DEBUG { printf("sigreturn: pc %p or npc %p invalid\n", sc.sc_pc, sc.sc_npc); Debugger(); return (EINVAL); } #else return (EINVAL); #endif /* take only psr ICC field */ tf->tf_tstate = (int64_t)(tf->tf_tstate & ~TSTATE_CCR) | PSRCC_TO_TSTATE(sc.sc_psr); tf->tf_pc = (int64_t)sc.sc_pc; tf->tf_npc = (int64_t)sc.sc_npc; tf->tf_global[1] = (int64_t)sc.sc_g1; tf->tf_out[0] = (int64_t)sc.sc_o0; tf->tf_out[6] = (int64_t)sc.sc_sp; rwstack = (struct rwindow32 *)tf->tf_out[6]; kstack = (struct rwindow32 *)(((caddr_t)tf)-CCFSZ); for (i=0; i<8; i++) { int tmp; if (copyin((caddr_t)&rwstack->rw_local[i], &tmp, sizeof tmp)) { printf("sigreturn: cannot load \%l%d from %p\n", i, &rwstack->rw_local[i]); Debugger(); } tf->tf_local[i] = (int64_t)tmp; if (copyin((caddr_t)&rwstack->rw_in[i], &tmp, sizeof tmp)) { printf("sigreturn: cannot load \%i%d from %p\n", i, &rwstack->rw_in[i]); Debugger(); } tf->tf_in[i] = (int)tmp; } #ifdef DEBUG /* Need to sync tf locals and ins with stack to prevent panic */ { int i; kstack = (struct rwindow32 *)tf->tf_out[6]; for (i=0; i<8; i++) { tf->tf_local[i] = fuword(&kstack->rw_local[i]); tf->tf_in[i] = fuword(&kstack->rw_in[i]); } } #endif #ifdef DEBUG if (sigdebug & SDB_FOLLOW) { printf("sys_sigreturn: return trapframe pc=%p sp=%p tstate=%x\n", (int)tf->tf_pc, (int)tf->tf_out[6], (int)tf->tf_tstate); if (sigdebug & SDB_DDB) Debugger(); } #endif if (sc.sc_onstack & 1) p->p_sigacts->ps_sigstk.ss_flags |= SS_ONSTACK; else p->p_sigacts->ps_sigstk.ss_flags &= ~SS_ONSTACK; p->p_sigmask = sc.sc_mask & ~sigcantmask; return (EJUSTRETURN); } int compat_sparc32_bind(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_bind_args /* { syscallarg(int) s; syscallarg(const sparc32_sockaddrp_t) name; syscallarg(int) namelen; } */ *uap = v; struct sys_connect_args ua; SPARC32TO64_UAP(s); SPARC32TOP_UAP(name, struct sockaddr); SPARC32TO64_UAP(namelen); return (sys_connect(p, &ua, retval)); } int compat_sparc32_setsockopt(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_setsockopt_args /* { syscallarg(int) s; syscallarg(int) level; syscallarg(int) name; syscallarg(const sparc32_voidp) val; syscallarg(int) valsize; } */ *uap = v; struct sys_setsockopt_args ua; SPARC32TO64_UAP(s); SPARC32TO64_UAP(level); SPARC32TO64_UAP(name); SPARC32TOP_UAP(val, void); SPARC32TO64_UAP(valsize); return (sys_setsockopt(p, &ua, retval)); } int compat_sparc32_gettimeofday(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_gettimeofday_args /* { syscallarg(sparc32_timevalp_t) tp; syscallarg(sparc32_timezonep_t) tzp; } */ *uap = v; struct sys_gettimeofday_args ua; struct timeval tv; struct sparc32_timeval *tv32p, tv32; int error; tv32p = (struct sparc32_timeval *)(u_long)SCARG(uap, tp); if (tv32p) { SCARG(&ua, tp) = &tv; if (copyin(tv32p, &tv32, sizeof(tv32))) return EINVAL; sparc32_to_timeval(tv32p, &tv); } else SCARG(&ua, tp) = NULL; SPARC32TOP_UAP(tzp, struct timezone) error = sys_gettimeofday(p, &ua, retval); if (error) return (error); if (tv32p) sparc32_from_timeval(&tv, tv32p); return (0); } int compat_sparc32_settimeofday(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_settimeofday_args /* { syscallarg(const sparc32_timevalp_t) tv; syscallarg(const sparc32_timezonep_t) tzp; } */ *uap = v; struct sys_settimeofday_args ua; struct timeval tv; struct sparc32_timeval *tv32p; int error; tv32p = (struct sparc32_timeval *)(u_long)SCARG(uap, tv); if (tv32p) { SCARG(&ua, tv) = &tv; sparc32_to_timeval(tv32p, &tv); } else SCARG(&ua, tv) = NULL; SPARC32TOP_UAP(tzp, struct timezone) error = sys_settimeofday(p, &ua, retval); if (error) return (error); if (tv32p) sparc32_from_timeval(&tv, tv32p); return (0); } int compat_sparc32_getrusage(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_getrusage_args /* { syscallarg(int) who; syscallarg(sparc32_rusagep_t) rusage; } */ *uap = v; struct sys_getrusage_args ua; struct rusage ru; struct sparc32_rusage *ru32p; int error; SPARC32TO64_UAP(who); ru32p = (struct sparc32_rusage *)(u_long)SCARG(uap, rusage); if (ru32p) { SCARG(&ua, rusage) = &ru; sparc32_to_rusage(ru32p, &ru); } else SCARG(&ua, rusage) = NULL; error = sys_getrusage(p, &ua, retval); if (ru32p) sparc32_from_rusage(&ru, ru32p); return (error); } int compat_sparc32_getsockopt(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_getsockopt_args /* { syscallarg(int) s; syscallarg(int) level; syscallarg(int) name; syscallarg(sparc32_voidp) val; syscallarg(sparc32_intp) avalsize; } */ *uap = v; struct sys_getsockopt_args ua; SPARC32TO64_UAP(s); SPARC32TO64_UAP(level); SPARC32TO64_UAP(name); SPARC32TOP_UAP(val, void) SPARC32TOP_UAP(avalsize, int); return (sys_getsockopt(p, &ua, retval)); } int compat_sparc32_readv(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_readv_args /* { syscallarg(int) fd; syscallarg(const sparc32_iovecp_t) iovp; syscallarg(int) iovcnt; } */ *uap = v; struct sys_readv_args ua; struct iovec *iov; ssize_t rt; int error; SPARC32TO64_UAP(fd) SPARC32TO64_UAP(iovcnt); MALLOC(iov, struct iovec *, sizeof(struct iovec) * SCARG(uap, iovcnt), M_TEMP, M_WAITOK); sparc32_to_iovec((struct sparc32_iovec *)(u_long)SCARG(uap, iovp), iov, SCARG(uap, iovcnt)); SCARG(&ua, iovp) = iov; error = sys_readv(p, &ua, (register_t *)&rt); FREE(iov, M_TEMP); *(sparc32_ssize_t *)retval = rt; return (error); } int compat_sparc32_writev(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_writev_args /* { syscallarg(int) fd; syscallarg(const sparc32_iovecp_t) iovp; syscallarg(int) iovcnt; } */ *uap = v; struct sys_writev_args ua; struct iovec *iov; ssize_t rt; int error; SPARC32TO64_UAP(fd) SPARC32TO64_UAP(iovcnt); MALLOC(iov, struct iovec *, sizeof(struct iovec) * SCARG(uap, iovcnt), M_TEMP, M_WAITOK); sparc32_to_iovec((struct sparc32_iovec *)(u_long)SCARG(uap, iovp), iov, SCARG(uap, iovcnt)); SCARG(&ua, iovp) = iov; error = sys_writev(p, &ua, (register_t *)&rt); FREE(iov, M_TEMP); *(sparc32_ssize_t *)retval = rt; return (error); } int compat_sparc32_rename(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_rename_args /* { syscallarg(const sparc32_charp) from; syscallarg(const sparc32_charp) to; } */ *uap = v; struct sys_rename_args ua; SPARC32TOP_UAP(from, const char) SPARC32TOP_UAP(to, const char) return (sys_rename(p, &ua, retval)); } int compat_sparc32_mkfifo(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_mkfifo_args /* { syscallarg(const sparc32_charp) path; syscallarg(mode_t) mode; } */ *uap = v; struct sys_mkfifo_args ua; SPARC32TOP_UAP(path, const char) SPARC32TO64_UAP(mode); return (sys_mkfifo(p, &ua, retval)); } int compat_sparc32_mkdir(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_mkdir_args /* { syscallarg(const sparc32_charp) path; syscallarg(mode_t) mode; } */ *uap = v; struct sys_mkdir_args ua; SPARC32TOP_UAP(path, const char) SPARC32TO64_UAP(mode); return (sys_mkdir(p, &ua, retval)); } int compat_sparc32_rmdir(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_rmdir_args /* { syscallarg(const sparc32_charp) path; } */ *uap = v; struct sys_rmdir_args ua; SPARC32TOP_UAP(path, const char); return (sys_rmdir(p, &ua, retval)); } int compat_sparc32_utimes(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_utimes_args /* { syscallarg(const sparc32_charp) path; syscallarg(const sparc32_timevalp_t) tptr; } */ *uap = v; struct sys_utimes_args ua; struct timeval tv; struct sparc32_timeval *tv32p; SPARC32TOP_UAP(path, const char); tv32p = (struct sparc32_timeval *)(u_long)SCARG(uap, tptr); if (tv32p) { SCARG(&ua, tptr) = &tv; sparc32_to_timeval(tv32p, &tv); } else SCARG(&ua, tptr) = NULL; return (sys_utimes(p, &ua, retval)); } int compat_sparc32_adjtime(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_adjtime_args /* { syscallarg(const sparc32_timevalp_t) delta; syscallarg(sparc32_timevalp_t) olddelta; } */ *uap = v; struct sys_adjtime_args ua; struct timeval tv, otv; struct sparc32_timeval *tv32p, *otv32p; int error; tv32p = (struct sparc32_timeval *)(u_long)SCARG(uap, delta); otv32p = (struct sparc32_timeval *)(u_long)SCARG(uap, olddelta); if (tv32p) { SCARG(&ua, delta) = &tv; sparc32_to_timeval(tv32p, &tv); } else SCARG(&ua, delta) = NULL; if (otv32p) SCARG(&ua, olddelta) = &otv; else SCARG(&ua, olddelta) = NULL; error = sys_adjtime(p, &ua, retval); if (error) return (error); if (otv32p) sparc32_from_timeval(&otv, otv32p); return (0); } int compat_sparc32_quotactl(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_quotactl_args /* { syscallarg(const sparc32_charp) path; syscallarg(int) cmd; syscallarg(int) uid; syscallarg(sparc32_caddr_t) arg; } */ *uap = v; struct sys_quotactl_args ua; SPARC32TOP_UAP(path, const char); SPARC32TO64_UAP(cmd); SPARC32TO64_UAP(uid); SPARC32TOX64_UAP(arg, caddr_t); return (sys_quotactl(p, &ua, retval)); } int compat_sparc32_nfssvc(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_nfssvc_args /* { syscallarg(int) flag; syscallarg(sparc32_voidp) argp; } */ *uap = v; struct sys_nfssvc_args ua; SPARC32TO64_UAP(flag); SPARC32TOP_UAP(argp, void); return (sys_nfssvc(p, &ua, retval)); } int compat_sparc32_statfs(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_statfs_args /* { syscallarg(const sparc32_charp) path; syscallarg(sparc32_statfsp_t) buf; } */ *uap = v; struct sys_statfs_args ua; struct statfs sb; struct sparc32_statfs *sb32p; caddr_t sg; int error; SPARC32TOP_UAP(path, const char); sb32p = (struct sparc32_statfs *)(u_long)SCARG(uap, buf); if (sb32p) SCARG(&ua, buf) = &sb; else SCARG(&ua, buf) = NULL; sg = stackgap_init(p->p_emul); SPARC32_CHECK_ALT_EXIST(p, &sg, SCARG(&ua, path)); error = sys_statfs(p, &ua, retval); if (error) return (error); if (sb32p) sparc32_from_statfs(&sb, sb32p); return (0); } int compat_sparc32_fstatfs(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_fstatfs_args /* { syscallarg(int) fd; syscallarg(sparc32_statfsp_t) buf; } */ *uap = v; struct sys_fstatfs_args ua; struct statfs sb; struct sparc32_statfs *sb32p; int error; SPARC32TO64_UAP(fd); sb32p = (struct sparc32_statfs *)(u_long)SCARG(uap, buf); if (sb32p) SCARG(&ua, buf) = &sb; else SCARG(&ua, buf) = NULL; error = sys_fstatfs(p, &ua, retval); if (error) return (error); if (sb32p) sparc32_from_statfs(&sb, sb32p); return (0); } int compat_sparc32_getfh(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_getfh_args /* { syscallarg(const sparc32_charp) fname; syscallarg(sparc32_fhandlep_t) fhp; } */ *uap = v; struct sys_getfh_args ua; SPARC32TOP_UAP(fname, const char); SPARC32TOP_UAP(fhp, struct fhandle); return (sys_getfh(p, &ua, retval)); } int compat_sparc32_sysarch(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_sysarch_args /* { syscallarg(int) op; syscallarg(sparc32_voidp) parms; } */ *uap = v; struct sys_sysarch_args ua; SPARC32TO64_UAP(op); SPARC32TOP_UAP(parms, void); return (sys_getfh(p, &ua, retval)); } int compat_sparc32_pread(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_pread_args /* { syscallarg(int) fd; syscallarg(sparc32_voidp) buf; syscallarg(sparc32_size_t) nbyte; syscallarg(int) pad; syscallarg(off_t) offset; } */ *uap = v; struct sys_pread_args ua; ssize_t rt; int error; SPARC32TO64_UAP(fd); SPARC32TOP_UAP(buf, void); SPARC32TOX_UAP(nbyte, size_t); SPARC32TO64_UAP(pad); SPARC32TO64_UAP(offset); error = sys_pread(p, &ua, (register_t *)&rt); *(sparc32_ssize_t *)retval = rt; return (error); } int compat_sparc32_pwrite(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_pwrite_args /* { syscallarg(int) fd; syscallarg(const sparc32_voidp) buf; syscallarg(sparc32_size_t) nbyte; syscallarg(int) pad; syscallarg(off_t) offset; } */ *uap = v; struct sys_pwrite_args ua; ssize_t rt; int error; SPARC32TO64_UAP(fd); SPARC32TOP_UAP(buf, void); SPARC32TOX_UAP(nbyte, size_t); SPARC32TO64_UAP(pad); SPARC32TO64_UAP(offset); error = sys_pwrite(p, &ua, (register_t *)&rt); *(sparc32_ssize_t *)retval = rt; return (error); } int compat_sparc32_ntp_gettime(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_ntp_gettime_args /* { syscallarg(sparc32_ntptimevalp_t) ntvp; } */ *uap = v; struct sys_ntp_gettime_args ua; struct ntptimeval ntv; struct sparc32_ntptimeval *ntv32p; int error; ntv32p = (struct sparc32_ntptimeval *)(u_long)SCARG(uap, ntvp); if (ntv32p) SCARG(&ua, ntvp) = &ntv; else SCARG(&ua, ntvp) = NULL; error = sys_ntp_gettime(p, &ua, retval); if (error) return (error); if (ntv32p) { sparc32_from_timeval(&ntv, ntv32p); ntv32.maxerror = (sparc32_long)ntv.maxerror; ntv32.esterror = (sparc32_long)ntv.esterror; } return (0); } int compat_sparc32_ntp_adjtime(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_ntp_adjtime_args /* { syscallarg(sparc32_timexp_t) tp; } */ *uap = v; struct sys_ntp_adjtime_args ua; struct timex tx; struct sparc32_timex *tx32p; int error; tx32p = (struct sparc32_timex *)(u_long)SCARG(uap, tp); if (tx32p) { SCARG(&ua, tp) = &tx; sparc32_to_timex(tx32p, &tx); } else SCARG(&ua, tp) = NULL; error = sys_ntp_adjtime(p, &ua, retval); if (error) return (error); if (tx32p) sparc32_from_timeval(&tx, tx32p); return (0); } int compat_sparc32_lfs_bmapv(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_lfs_bmapv_args /* { syscallarg(sparc32_fsid_tp_t) fsidp; syscallarg(sparc32_block_infop_t) blkiov; syscallarg(int) blkcnt; } */ *uap = v; #if 0 struct sys_lfs_bmapv_args ua; SPARC32TOP_UAP(fdidp, struct fsid); SPARC32TO64_UAP(blkcnt); /* XXX finish me */ #else return (ENOSYS); /* XXX */ #endif } int compat_sparc32_lfs_markv(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_lfs_markv_args /* { syscallarg(sparc32_fsid_tp_t) fsidp; syscallarg(sparc32_block_infop_t) blkiov; syscallarg(int) blkcnt; } */ *uap = v; return (ENOSYS); /* XXX */ } int compat_sparc32_lfs_segclean(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_lfs_segclean_args /* { syscallarg(sparc32_fsid_tp_t) fsidp; syscallarg(sparc32_u_long) segment; } */ *uap = v; return (ENOSYS); /* XXX */ } int compat_sparc32_lfs_segwait(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_lfs_segwait_args /* { syscallarg(sparc32_fsid_tp_t) fsidp; syscallarg(sparc32_timevalp_t) tv; } */ *uap = v; return (ENOSYS); /* XXX */ } int compat_sparc32_pathconf(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_pathconf_args /* { syscallarg(int) fd; syscallarg(int) name; } */ *uap = v; struct sys_pathconf_args ua; long rt; int error; SPARC32TOP_UAP(path, const char); SPARC32TO64_UAP(name); error = sys_pathconf(p, &ua, (register_t *)&rt); *(sparc32_long *)retval = (sparc32_long)rt; return (error); } int compat_sparc32_fpathconf(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_fpathconf_args /* { syscallarg(int) fd; syscallarg(int) name; } */ *uap = v; struct sys_fpathconf_args ua; long rt; int error; SPARC32TO64_UAP(fd); SPARC32TO64_UAP(name); error = sys_fpathconf(p, &ua, (register_t *)&rt); *(sparc32_long *)retval = (sparc32_long)rt; return (error); } int compat_sparc32_getrlimit(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_getrlimit_args /* { syscallarg(int) which; syscallarg(sparc32_rlimitp_t) rlp; } */ *uap = v; struct sys_getrlimit_args ua; SPARC32TO64_UAP(which); SPARC32TOP_UAP(rlp, struct rlimit); return (sys_getrlimit(p, &ua, retval)); } int compat_sparc32_setrlimit(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_setrlimit_args /* { syscallarg(int) which; syscallarg(const sparc32_rlimitp_t) rlp; } */ *uap = v; struct sys_setrlimit_args ua; SPARC32TO64_UAP(which); SPARC32TOP_UAP(rlp, struct rlimit); return (sys_setrlimit(p, &ua, retval)); } int compat_sparc32_mmap(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_mmap_args /* { syscallarg(sparc32_voidp) addr; syscallarg(sparc32_size_t) len; syscallarg(int) prot; syscallarg(int) flags; syscallarg(int) fd; syscallarg(sparc32_long) pad; syscallarg(off_t) pos; } */ *uap = v; struct sys_mmap_args ua; void *rt; int error; SPARC32TOP_UAP(addr, void); SPARC32TOX_UAP(len, size_t); SPARC32TO64_UAP(prot); SPARC32TO64_UAP(flags); SPARC32TO64_UAP(fd); SPARC32TOX_UAP(pad, long); SPARC32TOX_UAP(pos, off_t); error = sys_mmap(p, &ua, (register_t *)&rt); if ((long)rt > (long)UINT_MAX) printf("compat_sparc32_mmap: retval out of range: 0x%qx", rt); *retval = (sparc32_voidp)(u_long)rt; return (error); } int compat_sparc32_truncate(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_truncate_args /* { syscallarg(const sparc32_charp) path; syscallarg(int) pad; syscallarg(off_t) length; } */ *uap = v; struct sys_truncate_args ua; SPARC32TOP_UAP(path, const char); SPARC32TO64_UAP(pad); SPARC32TO64_UAP(length); return (sys_truncate(p, &ua, retval)); } int compat_sparc32___sysctl(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32___sysctl_args /* { syscallarg(sparc32_intp) name; syscallarg(u_int) namelen; syscallarg(sparc32_voidp) old; syscallarg(sparc32_size_tp) oldlenp; syscallarg(sparc32_voidp) new; syscallarg(sparc32_size_t) newlen; } */ *uap = v; struct sys___sysctl_args ua; SPARC32TO64_UAP(namelen); SPARC32TOP_UAP(name, int); SPARC32TOP_UAP(old, void); SPARC32TOP_UAP(oldlenp, size_t); SPARC32TOP_UAP(new, void); SPARC32TOX_UAP(newlen, size_t); return (sys___sysctl(p, &ua, retval)); } int compat_sparc32_mlock(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_mlock_args /* { syscallarg(const sparc32_voidp) addr; syscallarg(sparc32_size_t) len; } */ *uap = v; struct sys_mlock_args ua; SPARC32TOP_UAP(addr, const void); SPARC32TO64_UAP(len); return (sys_mlock(p, &ua, retval)); } int compat_sparc32_munlock(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_munlock_args /* { syscallarg(const sparc32_voidp) addr; syscallarg(sparc32_size_t) len; } */ *uap = v; struct sys_munlock_args ua; SPARC32TOP_UAP(addr, const void); SPARC32TO64_UAP(len); return (sys_munlock(p, &ua, retval)); } int compat_sparc32_undelete(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_undelete_args /* { syscallarg(const sparc32_charp) path; } */ *uap = v; struct sys_undelete_args ua; SPARC32TOP_UAP(path, const char); return (sys_undelete(p, &ua, retval)); } int compat_sparc32_futimes(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_futimes_args /* { syscallarg(int) fd; syscallarg(const sparc32_timevalp_t) tptr; } */ *uap = v; struct sys_futimes_args ua; struct timeval tv; struct sparc32_timeval *tv32p; SPARC32TO64_UAP(fd); tv32p = (struct sparc32_timeval *)(u_long)SCARG(uap, tptr); if (tv32p) { SCARG(&ua, tptr) = &tv; sparc32_to_timeval(tv32p, &tv); } else SCARG(&ua, tptr) = NULL; return (sys_futimes(p, &ua, retval)); } int compat_sparc32_reboot(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_reboot_args /* { syscallarg(int) opt; syscallarg(sparc32_charp) bootstr; } */ *uap = v; struct sys_reboot_args ua; SPARC32TO64_UAP(opt); SPARC32TOP_UAP(bootstr, char); return (sys_reboot(p, &ua, retval)); } int compat_sparc32_poll(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_poll_args /* { syscallarg(sparc32_pollfdp_t) fds; syscallarg(u_int) nfds; syscallarg(int) timeout; } */ *uap = v; struct sys_poll_args ua; SPARC32TOP_UAP(fds, struct pollfd); SPARC32TO64_UAP(nfds); SPARC32TO64_UAP(timeout); return (sys_poll(p, &ua, retval)); } int compat_sparc32___semctl(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32___semctl_args /* { syscallarg(int) semid; syscallarg(int) semnum; syscallarg(int) cmd; syscallarg(sparc32_semunu_t) arg; } */ *uap = v; struct sys___semctl_args ua; struct semid_ds ds, *dsp = &ds; union sparc32_semun *sem32p; int error; SPARC32TO64_UAP(semid); SPARC32TO64_UAP(semnum); SPARC32TO64_UAP(cmd); sem32p = (union sparc32_semun *)(u_long)SCARG(uap, arg); if (sem32p) { SCARG(&ua, arg)->buf = dsp; switch (SCARG(uap, cmd)) { case IPC_SET: sparc32_to_semid_ds(sem32.buf, &ds); break; case SETVAL: SCARG(&ua, arg)->val = sem32.val; break; case SETALL: SCARG(&ua, arg)->array = (u_short *)(u_long)sem32.array; break; } } else SCARG(&ua, arg) = NULL; error = sys___semctl(p, &ua, retval); if (error) return (error); if (sem32p) { switch (SCARG(uap, cmd)) { case IPC_STAT: sparc32_from_semid_ds(&ds, sem32.buf); break; } } return (0); } int compat_sparc32_semget(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_semget_args /* { syscallarg(sparc32_key_t) key; syscallarg(int) nsems; syscallarg(int) semflg; } */ *uap = v; struct sys_semget_args ua; SPARC32TOX_UAP(key, key_t); SPARC32TO64_UAP(nsems); SPARC32TO64_UAP(semflg); return (sys_semget(p, &ua, retval)); } int compat_sparc32_semop(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_semop_args /* { syscallarg(int) semid; syscallarg(sparc32_sembufp_t) sops; syscallarg(sparc32_size_t) nsops; } */ *uap = v; struct sys_semop_args ua; SPARC32TO64_UAP(semid); SPARC32TOP_UAP(sops, struct sembuf); SPARC32TOX_UAP(nsops, size_t); return (sys_semop(p, &ua, retval)); } int compat_sparc32_msgctl(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_msgctl_args /* { syscallarg(int) msqid; syscallarg(int) cmd; syscallarg(sparc32_msqid_dsp_t) buf; } */ *uap = v; struct sys_msgctl_args ua; struct msqid_ds ds; struct sparc32_msqid_ds *ds32p; int error; SPARC32TO64_UAP(msqid); SPARC32TO64_UAP(cmd); ds32p = (struct sparc32_msqid_ds *)(u_long)SCARG(uap, buf); if (ds32p) { SCARG(&ua, buf) = NULL; sparc32_to_msqid_ds(ds32p, &ds); } else SCARG(&ua, buf) = NULL; error = sys_msgctl(p, &ua, retval); if (error) return (error); if (ds32p) sparc32_from_msqid_ds(&ds, ds32p); return (0); } int compat_sparc32_msgget(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_msgget_args /* { syscallarg(sparc32_key_t) key; syscallarg(int) msgflg; } */ *uap = v; struct sys_msgget_args ua; SPARC32TOX_UAP(key, key_t); SPARC32TO64_UAP(msgflg); return (sys_msgget(p, &ua, retval)); } int compat_sparc32_msgsnd(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_msgsnd_args /* { syscallarg(int) msqid; syscallarg(const sparc32_voidp) msgp; syscallarg(sparc32_size_t) msgsz; syscallarg(int) msgflg; } */ *uap = v; struct sys_msgsnd_args ua; SPARC32TO64_UAP(msqid); SPARC32TOP_UAP(msgp, void); SPARC32TOX_UAP(msgsz, size_t); SPARC32TO64_UAP(msgflg); return (sys_msgsnd(p, &ua, retval)); } int compat_sparc32_msgrcv(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_msgrcv_args /* { syscallarg(int) msqid; syscallarg(sparc32_voidp) msgp; syscallarg(sparc32_size_t) msgsz; syscallarg(sparc32_long) msgtyp; syscallarg(int) msgflg; } */ *uap = v; struct sys_msgrcv_args ua; ssize_t rt; int error; SPARC32TO64_UAP(msqid); SPARC32TOP_UAP(msgp, void); SPARC32TOX_UAP(msgsz, size_t); SPARC32TOX_UAP(msgtyp, long); SPARC32TO64_UAP(msgflg); error = sys_msgrcv(p, &ua, (register_t *)&rt); *(sparc32_ssize_t *)retval = rt; return (error); } int compat_sparc32_shmat(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_shmat_args /* { syscallarg(int) shmid; syscallarg(const sparc32_voidp) shmaddr; syscallarg(int) shmflg; } */ *uap = v; struct sys_shmat_args ua; void *rt; int error; SPARC32TO64_UAP(shmid); SPARC32TOP_UAP(shmaddr, void); SPARC32TO64_UAP(shmflg); error = sys_shmat(p, &ua, (register_t *)&rt); *retval = (sparc32_voidp)(u_long)rt; return (error); } int compat_sparc32_shmctl(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_shmctl_args /* { syscallarg(int) shmid; syscallarg(int) cmd; syscallarg(sparc32_shmid_dsp_t) buf; } */ *uap = v; struct sys_shmctl_args ua; struct shmid_ds ds; struct sparc32_shmid_ds *ds32p; int error; SPARC32TO64_UAP(shmid); SPARC32TO64_UAP(cmd); ds32p = (struct sparc32_shmid_ds *)(u_long)SCARG(uap, buf); if (ds32p) { SCARG(&ua, buf) = NULL; sparc32_to_shmid_ds(ds32p, &ds); } else SCARG(&ua, buf) = NULL; error = sys_shmctl(p, &ua, retval); if (error) return (error); if (ds32p) sparc32_from_shmid_ds(&ds, ds32p); return (0); } int compat_sparc32_shmdt(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_shmdt_args /* { syscallarg(const sparc32_voidp) shmaddr; } */ *uap = v; struct sys_shmdt_args ua; SPARC32TOP_UAP(shmaddr, const char); return (sys_shmdt(p, &ua, retval)); } int compat_sparc32_shmget(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_shmget_args /* { syscallarg(sparc32_key_t) key; syscallarg(sparc32_size_t) size; syscallarg(int) shmflg; } */ *uap = v; struct sys_shmget_args ua; SPARC32TOX_UAP(key, key_t) SPARC32TOX_UAP(size, size_t) SPARC32TO64_UAP(shmflg); return (sys_shmget(p, &ua, retval)); } int compat_sparc32_clock_gettime(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_clock_gettime_args /* { syscallarg(sparc32_clockid_t) clock_id; syscallarg(sparc32_timespecp_t) tp; } */ *uap = v; struct sys_clock_gettime_args ua; struct timespec ts; struct sparc32_timespec *ts32p; int error; SPARC32TO64_UAP(clock_id); ts32p = (struct sparc32_timespec *)(u_long)SCARG(uap, tp); if (ts32p) SCARG(&ua, tp) = &ts; else SCARG(&ua, tp) = NULL; error = sys_clock_gettime(p, &ua, retval); if (error) return (error); if (ts32p) sparc32_from_timespec(&ts, ts32p); return (0); } int compat_sparc32_clock_settime(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_clock_settime_args /* { syscallarg(sparc32_clockid_t) clock_id; syscallarg(const sparc32_timespecp_t) tp; } */ *uap = v; struct sys_clock_settime_args ua; struct timespec ts; struct sparc32_timespec *ts32p; SPARC32TO64_UAP(clock_id); ts32p = (struct sparc32_timespec *)(u_long)SCARG(uap, tp); if (ts32p) { SCARG(&ua, tp) = &ts; sparc32_to_timespec(ts32p, &ts); } else SCARG(&ua, tp) = NULL; return (sys_clock_settime(p, &ua, retval)); } int compat_sparc32_clock_getres(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_clock_getres_args /* { syscallarg(sparc32_clockid_t) clock_id; syscallarg(sparc32_timespecp_t) tp; } */ *uap = v; struct sys_clock_getres_args ua; struct timespec ts; struct sparc32_timespec *ts32p; int error; SPARC32TO64_UAP(clock_id); ts32p = (struct sparc32_timespec *)(u_long)SCARG(uap, tp); if (ts32p) SCARG(&ua, tp) = &ts; else SCARG(&ua, tp) = NULL; error = sys_clock_getres(p, &ua, retval); if (error) return (error); if (ts32p) sparc32_from_timespec(&ts, ts32p); return (0); } int compat_sparc32_nanosleep(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_nanosleep_args /* { syscallarg(const sparc32_timespecp_t) rqtp; syscallarg(sparc32_timespecp_t) rmtp; } */ *uap = v; struct sys_nanosleep_args ua; struct timespec qts, mts; struct sparc32_timespec *qts32p, *mts32p; int error; qts32p = (struct sparc32_timespec *)(u_long)SCARG(uap, rqtp); mts32p = (struct sparc32_timespec *)(u_long)SCARG(uap, rmtp); if (qts32p) { SCARG(&ua, rqtp) = &qts; sparc32_to_timespec(qts32p, &qts); } else SCARG(&ua, rqtp) = NULL; if (mts32p) { SCARG(&ua, rmtp) = &mts; } else SCARG(&ua, rmtp) = NULL; error = sys_nanosleep(p, &ua, retval); if (error) return (error); if (mts32p) sparc32_from_timespec(&mts, mts32p); return (0); } int compat_sparc32___posix_rename(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32___posix_rename_args /* { syscallarg(const sparc32_charp) from; syscallarg(const sparc32_charp) to; } */ *uap = v; struct sys___posix_rename_args ua; SPARC32TOP_UAP(from, const char) SPARC32TOP_UAP(to, const char) return (sys___posix_rename(p, &ua, retval)); } int compat_sparc32_swapctl(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_swapctl_args /* { syscallarg(int) cmd; syscallarg(const sparc32_voidp) arg; syscallarg(int) misc; } */ *uap = v; struct sys_swapctl_args ua; SPARC32TO64_UAP(cmd); SPARC32TOP_UAP(arg, const void); SPARC32TO64_UAP(misc); return (sys_swapctl(p, &ua, retval)); } int compat_sparc32_getdents(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_getdents_args /* { syscallarg(int) fd; syscallarg(sparc32_charp) buf; syscallarg(sparc32_size_t) count; } */ *uap = v; struct sys_getdents_args ua; SPARC32TO64_UAP(fd); SPARC32TOP_UAP(buf, char); SPARC32TOX_UAP(count, size_t); return (sys_getdents(p, &ua, retval)); } int compat_sparc32_minherit(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_minherit_args /* { syscallarg(sparc32_voidp) addr; syscallarg(sparc32_size_t) len; syscallarg(int) inherit; } */ *uap = v; struct sys_minherit_args ua; SPARC32TOP_UAP(addr, void); SPARC32TOX_UAP(len, size_t); SPARC32TO64_UAP(inherit); return (sys_minherit(p, &ua, retval)); } int compat_sparc32_lchmod(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_lchmod_args /* { syscallarg(const sparc32_charp) path; syscallarg(mode_t) mode; } */ *uap = v; struct sys_lchmod_args ua; SPARC32TOP_UAP(path, const char); SPARC32TO64_UAP(mode); return (sys_lchmod(p, &ua, retval)); } int compat_sparc32_lchown(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_lchown_args /* { syscallarg(const sparc32_charp) path; syscallarg(uid_t) uid; syscallarg(gid_t) gid; } */ *uap = v; struct sys_lchown_args ua; SPARC32TOP_UAP(path, const char); SPARC32TO64_UAP(uid); SPARC32TO64_UAP(gid); return (sys_lchown(p, &ua, retval)); } int compat_sparc32_lutimes(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_lutimes_args /* { syscallarg(const sparc32_charp) path; syscallarg(const sparc32_timevalp_t) tptr; } */ *uap = v; struct sys_lutimes_args ua; struct timeval tv; struct sparc32_timeval *tv32p; SPARC32TOP_UAP(path, const char); tv32p = (struct sparc32_timeval *)(u_long)SCARG(uap, tptr); if (tv32p) { SCARG(&ua, tptr) = &tv; sparc32_to_timeval(tv32p, &tv); } SCARG(&ua, tptr) = NULL; return (sys_lutimes(p, &ua, retval)); } int compat_sparc32___msync13(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32___msync13_args /* { syscallarg(sparc32_voidp) addr; syscallarg(sparc32_size_t) len; syscallarg(int) flags; } */ *uap = v; struct sys___msync13_args ua; SPARC32TOP_UAP(addr, void); SPARC32TOX_UAP(len, size_t); SPARC32TO64_UAP(flags); return (sys___msync13(p, &ua, retval)); } int compat_sparc32___stat13(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32___stat13_args /* { syscallarg(const sparc32_charp) path; syscallarg(sparc32_statp_t) ub; } */ *uap = v; struct sys___stat13_args ua; struct stat sb; struct sparc32_stat *sb32p; caddr_t sg; int error; SPARC32TOP_UAP(path, const char); sb32p = (struct sparc32_stat *)(u_long)SCARG(uap, ub); if (sb32p) SCARG(&ua, ub) = &sb; else SCARG(&ua, ub) = NULL; sg = stackgap_init(p->p_emul); SPARC32_CHECK_ALT_EXIST(p, &sg, SCARG(&ua, path)); error = sys___stat13(p, &ua, retval); if (error) return (error); if (sb32p) sparc32_from___stat13(&sb, sb32p); return (0); } int compat_sparc32___fstat13(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32___fstat13_args /* { syscallarg(int) fd; syscallarg(sparc32_statp_t) sb; } */ *uap = v; struct sys___fstat13_args ua; struct stat sb; struct sparc32_stat *sb32p; int error; SPARC32TO64_UAP(fd); sb32p = (struct sparc32_stat *)(u_long)SCARG(uap, sb); if (sb32p) SCARG(&ua, sb) = &sb; else SCARG(&ua, sb) = NULL; error = sys___fstat13(p, &ua, retval); if (error) return (error); if (sb32p) sparc32_from___stat13(&sb, sb32p); return (0); } int compat_sparc32___lstat13(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32___lstat13_args /* { syscallarg(const sparc32_charp) path; syscallarg(sparc32_statp_t) ub; } */ *uap = v; struct sys___lstat13_args ua; struct stat sb; struct sparc32_stat *sb32p; caddr_t sg; int error; SPARC32TOP_UAP(path, const char); sb32p = (struct sparc32_stat *)(u_long)SCARG(uap, ub); if (sb32p) SCARG(&ua, ub) = &sb; else SCARG(&ua, ub) = NULL; sg = stackgap_init(p->p_emul); SPARC32_CHECK_ALT_EXIST(p, &sg, SCARG(&ua, path)); error = sys___lstat13(p, &ua, retval); if (error) return (error); if (sb32p) sparc32_from___stat13(&sb, sb32p); return (0); } int compat_sparc32___sigaltstack14(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32___sigaltstack14_args /* { syscallarg(const sparc32_sigaltstackp_t) nss; syscallarg(sparc32_sigaltstackp_t) oss; } */ *uap = v; struct sys___sigaltstack14_args ua; struct sparc32_sigaltstack *nss32, *oss32; struct sigaltstack nss, oss; int error; nss32 = (struct sparc32_sigaltstack *)(u_long)SCARG(uap, nss); oss32 = (struct sparc32_sigaltstack *)(u_long)SCARG(uap, oss); if (nss32) { SCARG(&ua, nss) = &nss; nss.ss_sp = (void *)(u_long)nss32->ss_sp; nss.ss_size = (size_t)nss32->ss_size; nss.ss_flags = nss32->ss_flags; } else SCARG(&ua, nss) = NULL; if (oss32) SCARG(&ua, oss) = &oss; else SCARG(&ua, oss) = NULL; error = sys___sigaltstack14(p, &ua, retval); if (error) return (error); if (oss32) { oss32->ss_sp = (sparc32_voidp)(u_long)oss.ss_sp; oss32->ss_size = (sparc32_size_t)oss.ss_size; oss32->ss_flags = oss.ss_flags; } return (0); } int compat_sparc32___posix_chown(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32___posix_chown_args /* { syscallarg(const sparc32_charp) path; syscallarg(uid_t) uid; syscallarg(gid_t) gid; } */ *uap = v; struct sys___posix_chown_args ua; SPARC32TOP_UAP(path, const char); SPARC32TO64_UAP(uid); SPARC32TO64_UAP(gid); return (sys___posix_chown(p, &ua, retval)); } int compat_sparc32___posix_lchown(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32___posix_lchown_args /* { syscallarg(const sparc32_charp) path; syscallarg(uid_t) uid; syscallarg(gid_t) gid; } */ *uap = v; struct sys___posix_lchown_args ua; SPARC32TOP_UAP(path, const char); SPARC32TO64_UAP(uid); SPARC32TO64_UAP(gid); return (sys___posix_lchown(p, &ua, retval)); } int compat_sparc32_preadv(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_preadv_args /* { syscallarg(int) fd; syscallarg(const sparc32_iovecp_t) iovp; syscallarg(int) iovcnt; syscallarg(int) pad; syscallarg(off_t) offset; } */ *uap = v; struct sys_preadv_args ua; struct iovec *iov; ssize_t rt; int error; SPARC32TO64_UAP(fd); SPARC32TO64_UAP(iovcnt); SPARC32TO64_UAP(pad); SPARC32TO64_UAP(offset); MALLOC(iov, struct iovec *, sizeof(struct iovec) * SCARG(uap, iovcnt), M_TEMP, M_WAITOK); sparc32_to_iovec((struct sparc32_iovec *)(u_long)SCARG(uap, iovp), iov, SCARG(uap, iovcnt)); SCARG(&ua, iovp) = iov; error = sys_preadv(p, &ua, (register_t *)&rt); FREE(iov, M_TEMP); *(sparc32_ssize_t *)retval = rt; return (error); } int compat_sparc32_pwritev(p, v, retval) struct proc *p; void *v; register_t *retval; { struct compat_sparc32_pwritev_args /* { syscallarg(int) fd; syscallarg(const sparc32_iovecp_t) iovp; syscallarg(int) iovcnt; syscallarg(int) pad; syscallarg(off_t) offset; } */ *uap = v; struct sys_pwritev_args ua; struct iovec *iov; ssize_t rt; int error; SPARC32TO64_UAP(fd); SPARC32TO64_UAP(iovcnt); SPARC32TO64_UAP(pad); SPARC32TO64_UAP(offset); MALLOC(iov, struct iovec *, sizeof(struct iovec) * SCARG(uap, iovcnt), M_TEMP, M_WAITOK); sparc32_to_iovec((struct sparc32_iovec *)(u_long)SCARG(uap, iovp), iov, SCARG(uap, iovcnt)); SCARG(&ua, iovp) = iov; error = sys_pwritev(p, &ua, (register_t *)&rt); FREE(iov, M_TEMP); *(sparc32_ssize_t *)retval = rt; return (error); }