44725836bc
annoying issues, so I'll just check in this snapshot.
3405 lines
76 KiB
C
3405 lines
76 KiB
C
/* $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 <sys/param.h>
|
|
#include <sys/systm.h>
|
|
#include <sys/ipc.h>
|
|
#include <sys/msg.h>
|
|
#include <sys/sem.h>
|
|
#include <sys/shm.h>
|
|
#include <sys/malloc.h>
|
|
#include <sys/mount.h>
|
|
#include <sys/socket.h>
|
|
#include <sys/sockio.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/time.h>
|
|
#include <sys/timex.h>
|
|
#include <sys/signalvar.h>
|
|
|
|
#include <vm/vm.h>
|
|
#include <sys/syscallargs.h>
|
|
|
|
#include <net/if.h>
|
|
|
|
#include <compat/sparc32/sparc32.h>
|
|
#include <compat/sparc32/sparc32_syscallargs.h>
|
|
|
|
#include <machine/frame.h>
|
|
|
|
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);
|
|
}
|