1*21709ad0Sriastradh /* $NetBSD: linux_osf1.c,v 1.6 2024/10/01 16:35:41 riastradh Exp $ */ 2ddc423bfSmaxv 3ddc423bfSmaxv /* 4ddc423bfSmaxv * Copyright (c) 1999 Christopher G. Demetriou. All rights reserved. 5ddc423bfSmaxv * 6ddc423bfSmaxv * Redistribution and use in source and binary forms, with or without 7ddc423bfSmaxv * modification, are permitted provided that the following conditions 8ddc423bfSmaxv * are met: 9ddc423bfSmaxv * 1. Redistributions of source code must retain the above copyright 10ddc423bfSmaxv * notice, this list of conditions and the following disclaimer. 11ddc423bfSmaxv * 2. Redistributions in binary form must reproduce the above copyright 12ddc423bfSmaxv * notice, this list of conditions and the following disclaimer in the 13ddc423bfSmaxv * documentation and/or other materials provided with the distribution. 14ddc423bfSmaxv * 3. All advertising materials mentioning features or use of this software 15ddc423bfSmaxv * must display the following acknowledgement: 16ddc423bfSmaxv * This product includes software developed by Christopher G. Demetriou 17ddc423bfSmaxv * for the NetBSD Project. 18ddc423bfSmaxv * 4. The name of the author may not be used to endorse or promote products 19ddc423bfSmaxv * derived from this software without specific prior written permission 20ddc423bfSmaxv * 21ddc423bfSmaxv * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22ddc423bfSmaxv * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23ddc423bfSmaxv * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24ddc423bfSmaxv * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25ddc423bfSmaxv * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26ddc423bfSmaxv * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27ddc423bfSmaxv * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28ddc423bfSmaxv * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29ddc423bfSmaxv * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30ddc423bfSmaxv * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31ddc423bfSmaxv */ 32ddc423bfSmaxv 33ddc423bfSmaxv #include <sys/cdefs.h> 34*21709ad0Sriastradh __KERNEL_RCSID(0, "$NetBSD: linux_osf1.c,v 1.6 2024/10/01 16:35:41 riastradh Exp $"); 35ddc423bfSmaxv 36ddc423bfSmaxv #include <sys/param.h> 37ddc423bfSmaxv #include <sys/systm.h> 38ddc423bfSmaxv #include <sys/namei.h> 39ddc423bfSmaxv #include <sys/proc.h> 40ddc423bfSmaxv #include <sys/file.h> 41ddc423bfSmaxv #include <sys/filedesc.h> 42ddc423bfSmaxv #include <sys/kernel.h> 43ddc423bfSmaxv #include <sys/mount.h> 44ddc423bfSmaxv #include <sys/vnode.h> 45ddc423bfSmaxv #include <sys/wait.h> 46ddc423bfSmaxv #include <sys/select.h> 47ddc423bfSmaxv #include <sys/syscallargs.h> 48ddc423bfSmaxv #include <sys/vfs_syscalls.h> 49ddc423bfSmaxv 50ddc423bfSmaxv #include <machine/alpha.h> 51ddc423bfSmaxv #include <machine/cpuconf.h> 52ddc423bfSmaxv #include <machine/rpb.h> 53ddc423bfSmaxv #include <machine/fpu.h> 54ddc423bfSmaxv 55ddc423bfSmaxv #include <compat/common/compat_util.h> 56ddc423bfSmaxv #include <compat/linux/common/linux_types.h> 57ddc423bfSmaxv #include <compat/linux/common/linux_signal.h> 58ddc423bfSmaxv #include <compat/linux/arch/alpha/linux_signal.h> 59ddc423bfSmaxv #include <compat/linux/arch/alpha/linux_osf1.h> 60ddc423bfSmaxv #include <compat/linux/linux_syscallargs.h> 61ddc423bfSmaxv 62ddc423bfSmaxv #include <net/if.h> 63ddc423bfSmaxv #include <netinet/in.h> 64ddc423bfSmaxv 65ddc423bfSmaxv #include <nfs/rpcv2.h> 66ddc423bfSmaxv #include <nfs/nfsproto.h> 67ddc423bfSmaxv #include <nfs/nfs.h> 68ddc423bfSmaxv #include <nfs/nfsmount.h> 69ddc423bfSmaxv 70ddc423bfSmaxv #include <ufs/ufs/quota.h> 71ddc423bfSmaxv #include <ufs/ufs/ufsmount.h> 72ddc423bfSmaxv 73ddc423bfSmaxv #include <machine/vmparam.h> 74ddc423bfSmaxv 75ddc423bfSmaxv const struct emul_flags_xtab osf1_wait_options_xtab[] = { 76ddc423bfSmaxv { OSF1_WNOHANG, OSF1_WNOHANG, WNOHANG }, 77ddc423bfSmaxv { OSF1_WUNTRACED, OSF1_WUNTRACED, WUNTRACED }, 78ddc423bfSmaxv { 0 } 79ddc423bfSmaxv }; 80ddc423bfSmaxv 81ddc423bfSmaxv const struct emul_flags_xtab osf1_nfs_mount_flags_xtab[] = { 82ddc423bfSmaxv { OSF1_NFSMNT_SOFT, OSF1_NFSMNT_SOFT, NFSMNT_SOFT, }, 83ddc423bfSmaxv { OSF1_NFSMNT_WSIZE, OSF1_NFSMNT_WSIZE, NFSMNT_WSIZE, }, 84ddc423bfSmaxv { OSF1_NFSMNT_RSIZE, OSF1_NFSMNT_RSIZE, NFSMNT_RSIZE, }, 85ddc423bfSmaxv { OSF1_NFSMNT_TIMEO, OSF1_NFSMNT_TIMEO, NFSMNT_TIMEO, }, 86ddc423bfSmaxv { OSF1_NFSMNT_RETRANS, OSF1_NFSMNT_RETRANS, NFSMNT_RETRANS, }, 87ddc423bfSmaxv #if 0 /* no equivalent; needs special handling, see below */ 88ddc423bfSmaxv { OSF1_NFSMNT_HOSTNAME, OSF1_NFSMNT_HOSTNAME, ???, }, 89ddc423bfSmaxv #endif 90ddc423bfSmaxv { OSF1_NFSMNT_INT, OSF1_NFSMNT_INT, NFSMNT_INT, }, 91ddc423bfSmaxv { OSF1_NFSMNT_NOCONN, OSF1_NFSMNT_NOCONN, NFSMNT_NOCONN, }, 92ddc423bfSmaxv #if 0 /* no equivalents */ 93ddc423bfSmaxv { OSF1_NFSMNT_NOAC, OSF1_NFSMNT_NOAC, ???, }, 94ddc423bfSmaxv { OSF1_NFSMNT_ACREGMIN, OSF1_NFSMNT_ACREGMIN, ???, }, 95ddc423bfSmaxv { OSF1_NFSMNT_ACREGMAX, OSF1_NFSMNT_ACREGMAX, ???, }, 96ddc423bfSmaxv { OSF1_NFSMNT_ACDIRMIN, OSF1_NFSMNT_ACDIRMIN, ???, }, 97ddc423bfSmaxv { OSF1_NFSMNT_ACDIRMAX, OSF1_NFSMNT_ACDIRMAX, ???, }, 98ddc423bfSmaxv { OSF1_NFSMNT_NOCTO, OSF1_NFSMNT_NOCTO, ???, }, 99ddc423bfSmaxv { OSF1_NFSMNT_POSIX, OSF1_NFSMNT_POSIX, ???, }, 100ddc423bfSmaxv { OSF1_NFSMNT_AUTO, OSF1_NFSMNT_AUTO, ???, }, 101ddc423bfSmaxv { OSF1_NFSMNT_SEC, OSF1_NFSMNT_SEC, ???, }, 102ddc423bfSmaxv { OSF1_NFSMNT_TCP, OSF1_NFSMNT_TCP, ???, }, 103ddc423bfSmaxv { OSF1_NFSMNT_PROPLIST, OSF1_NFSMNT_PROPLIST, ???, }, 104ddc423bfSmaxv #endif 105ddc423bfSmaxv { 0 } 106ddc423bfSmaxv }; 107ddc423bfSmaxv 108ddc423bfSmaxv static void 109ddc423bfSmaxv osf1_cvt_rusage_from_native(const struct rusage *ru, struct osf1_rusage *oru) 110ddc423bfSmaxv { 111ddc423bfSmaxv 11241aa5859Sriastradh memset(oru, 0, sizeof(*oru)); 11341aa5859Sriastradh 114ddc423bfSmaxv oru->ru_utime.tv_sec = ru->ru_utime.tv_sec; 115ddc423bfSmaxv oru->ru_utime.tv_usec = ru->ru_utime.tv_usec; 116ddc423bfSmaxv 117ddc423bfSmaxv oru->ru_stime.tv_sec = ru->ru_stime.tv_sec; 118ddc423bfSmaxv oru->ru_stime.tv_usec = ru->ru_stime.tv_usec; 119ddc423bfSmaxv 120ddc423bfSmaxv oru->ru_maxrss = ru->ru_maxrss; 121ddc423bfSmaxv oru->ru_ixrss = ru->ru_ixrss; 122ddc423bfSmaxv oru->ru_idrss = ru->ru_idrss; 123ddc423bfSmaxv oru->ru_isrss = ru->ru_isrss; 124ddc423bfSmaxv oru->ru_minflt = ru->ru_minflt; 125ddc423bfSmaxv oru->ru_majflt = ru->ru_majflt; 126ddc423bfSmaxv oru->ru_nswap = ru->ru_nswap; 127ddc423bfSmaxv oru->ru_inblock = ru->ru_inblock; 128ddc423bfSmaxv oru->ru_oublock = ru->ru_oublock; 129ddc423bfSmaxv oru->ru_msgsnd = ru->ru_msgsnd; 130ddc423bfSmaxv oru->ru_msgrcv = ru->ru_msgrcv; 131ddc423bfSmaxv oru->ru_nsignals = ru->ru_nsignals; 132ddc423bfSmaxv oru->ru_nvcsw = ru->ru_nvcsw; 133ddc423bfSmaxv oru->ru_nivcsw = ru->ru_nivcsw; 134ddc423bfSmaxv } 135ddc423bfSmaxv 136ddc423bfSmaxv static void 137ddc423bfSmaxv osf1_cvt_statfs_from_native(const struct statvfs *bsfs, struct osf1_statfs *osfs) 138ddc423bfSmaxv { 139ddc423bfSmaxv 14041aa5859Sriastradh memset(osfs, 0, sizeof(*osfs)); 141ddc423bfSmaxv if (!strncmp(MOUNT_FFS, bsfs->f_fstypename, sizeof(bsfs->f_fstypename))) 142ddc423bfSmaxv osfs->f_type = OSF1_MOUNT_UFS; 143ddc423bfSmaxv else if (!strncmp(MOUNT_NFS, bsfs->f_fstypename, sizeof(bsfs->f_fstypename))) 144ddc423bfSmaxv osfs->f_type = OSF1_MOUNT_NFS; 145ddc423bfSmaxv else if (!strncmp(MOUNT_MFS, bsfs->f_fstypename, sizeof(bsfs->f_fstypename))) 146ddc423bfSmaxv osfs->f_type = OSF1_MOUNT_MFS; 147ddc423bfSmaxv else 148ddc423bfSmaxv /* uh oh... XXX = PC, CDFS, PROCFS, etc. */ 149ddc423bfSmaxv osfs->f_type = OSF1_MOUNT_ADDON; 150ddc423bfSmaxv osfs->f_flags = bsfs->f_flag; /* XXX translate */ 151ddc423bfSmaxv osfs->f_fsize = bsfs->f_frsize; 152ddc423bfSmaxv osfs->f_bsize = bsfs->f_bsize; 153ddc423bfSmaxv osfs->f_blocks = bsfs->f_blocks; 154ddc423bfSmaxv osfs->f_bfree = bsfs->f_bfree; 155ddc423bfSmaxv osfs->f_bavail = bsfs->f_bavail; 156ddc423bfSmaxv osfs->f_files = bsfs->f_files; 157ddc423bfSmaxv osfs->f_ffree = bsfs->f_ffree; 158ddc423bfSmaxv memcpy(&osfs->f_fsid, &bsfs->f_fsidx, sizeof osfs->f_fsid); 159ddc423bfSmaxv /* osfs->f_spare zeroed above */ 160ddc423bfSmaxv memcpy(osfs->f_mntonname, bsfs->f_mntonname, sizeof osfs->f_mntonname); 161ddc423bfSmaxv memcpy(osfs->f_mntfromname, bsfs->f_mntfromname, 162ddc423bfSmaxv sizeof osfs->f_mntfromname); 163ddc423bfSmaxv /* XXX osfs->f_xxx should be filled in... */ 164ddc423bfSmaxv } 165ddc423bfSmaxv 166ddc423bfSmaxv /* --------------------------------------------------------------------- */ 167ddc423bfSmaxv 168ddc423bfSmaxv int 169ddc423bfSmaxv linux_sys_osf1_wait4(struct lwp *l, const struct linux_sys_osf1_wait4_args *uap, register_t *retval) 170ddc423bfSmaxv { 171ddc423bfSmaxv struct osf1_rusage osf1_rusage; 172ddc423bfSmaxv struct rusage netbsd_rusage; 173ddc423bfSmaxv unsigned long leftovers; 174ddc423bfSmaxv int error, status; 175ddc423bfSmaxv int options = SCARG(uap, options); 176ddc423bfSmaxv int pid = SCARG(uap, pid); 177ddc423bfSmaxv 178ddc423bfSmaxv /* translate options */ 179ddc423bfSmaxv options = emul_flags_translate(osf1_wait_options_xtab, 180ddc423bfSmaxv options, &leftovers); 181ddc423bfSmaxv if (leftovers != 0) 182ddc423bfSmaxv return (EINVAL); 183ddc423bfSmaxv 184ddc423bfSmaxv error = do_sys_wait(&pid, &status, options, 185ddc423bfSmaxv SCARG(uap, rusage) != NULL ? &netbsd_rusage : NULL); 186ddc423bfSmaxv 187ddc423bfSmaxv retval[0] = pid; 188ddc423bfSmaxv if (pid == 0) 189ddc423bfSmaxv return error; 190ddc423bfSmaxv 191ddc423bfSmaxv if (SCARG(uap, rusage)) { 192ddc423bfSmaxv osf1_cvt_rusage_from_native(&netbsd_rusage, &osf1_rusage); 193ddc423bfSmaxv error = copyout(&osf1_rusage, SCARG(uap, rusage), 194ddc423bfSmaxv sizeof osf1_rusage); 195ddc423bfSmaxv } 196ddc423bfSmaxv 197ddc423bfSmaxv if (error == 0 && SCARG(uap, status)) 198ddc423bfSmaxv error = copyout(&status, SCARG(uap, status), sizeof(status)); 199ddc423bfSmaxv 200ddc423bfSmaxv return error; 201ddc423bfSmaxv } 202ddc423bfSmaxv 203ddc423bfSmaxv #define OSF1_MNT_WAIT 0x1 204ddc423bfSmaxv #define OSF1_MNT_NOWAIT 0x2 205ddc423bfSmaxv 206ddc423bfSmaxv #define OSF1_MNT_FORCE 0x1 207ddc423bfSmaxv #define OSF1_MNT_NOFORCE 0x2 208ddc423bfSmaxv 209ddc423bfSmaxv /* acceptable flags for various calls */ 210ddc423bfSmaxv #define OSF1_GETFSSTAT_FLAGS (OSF1_MNT_WAIT|OSF1_MNT_NOWAIT) 211ddc423bfSmaxv #define OSF1_MOUNT_FLAGS 0xffffffff /* XXX */ 212ddc423bfSmaxv #define OSF1_UNMOUNT_FLAGS (OSF1_MNT_FORCE|OSF1_MNT_NOFORCE) 213ddc423bfSmaxv 214ddc423bfSmaxv static int 215ddc423bfSmaxv osf1_mount_mfs(struct lwp *l, const struct linux_sys_osf1_mount_args *uap) 216ddc423bfSmaxv { 217ddc423bfSmaxv struct osf1_mfs_args osf_ma; 218ddc423bfSmaxv struct mfs_args bsd_ma; 219ddc423bfSmaxv int error; 220ddc423bfSmaxv register_t dummy; 221ddc423bfSmaxv 222ddc423bfSmaxv if ((error = copyin(SCARG(uap, data), &osf_ma, sizeof osf_ma))) 223ddc423bfSmaxv return error; 224ddc423bfSmaxv 225ddc423bfSmaxv memset(&bsd_ma, 0, sizeof bsd_ma); 226ddc423bfSmaxv bsd_ma.fspec = osf_ma.name; 227ddc423bfSmaxv /* XXX export args */ 228ddc423bfSmaxv bsd_ma.base = osf_ma.base; 229ddc423bfSmaxv bsd_ma.size = osf_ma.size; 230ddc423bfSmaxv 231ddc423bfSmaxv return do_sys_mount(l, "mfs", UIO_SYSSPACE, SCARG(uap, path), 232ddc423bfSmaxv SCARG(uap, flags), &bsd_ma, UIO_SYSSPACE, sizeof bsd_ma, &dummy); 233ddc423bfSmaxv } 234ddc423bfSmaxv 235ddc423bfSmaxv static int 236ddc423bfSmaxv osf1_mount_nfs(struct lwp *l, const struct linux_sys_osf1_mount_args *uap) 237ddc423bfSmaxv { 238ddc423bfSmaxv struct osf1_nfs_args osf_na; 239ddc423bfSmaxv struct nfs_args bsd_na; 240ddc423bfSmaxv int error; 241ddc423bfSmaxv unsigned long leftovers; 242ddc423bfSmaxv register_t dummy; 243ddc423bfSmaxv 244ddc423bfSmaxv if ((error = copyin(SCARG(uap, data), &osf_na, sizeof osf_na))) 245ddc423bfSmaxv return error; 246ddc423bfSmaxv 247ddc423bfSmaxv memset(&bsd_na, 0, sizeof bsd_na); 248ddc423bfSmaxv bsd_na.addr = (struct sockaddr *)osf_na.addr; 249ddc423bfSmaxv bsd_na.addrlen = sizeof (struct sockaddr_in); 250ddc423bfSmaxv bsd_na.fh = osf_na.fh; 251ddc423bfSmaxv 252ddc423bfSmaxv /* translate flags */ 253ddc423bfSmaxv bsd_na.flags = emul_flags_translate(osf1_nfs_mount_flags_xtab, 254ddc423bfSmaxv osf_na.flags, &leftovers); 255ddc423bfSmaxv if (leftovers & OSF1_NFSMNT_HOSTNAME) { 256ddc423bfSmaxv leftovers &= ~OSF1_NFSMNT_HOSTNAME; 257ddc423bfSmaxv bsd_na.hostname = osf_na.hostname; 258ddc423bfSmaxv } else { 259ddc423bfSmaxv /* XXX FILL IN HOST NAME WITH IPADDR? */ 260ddc423bfSmaxv } 261ddc423bfSmaxv if (leftovers & OSF1_NFSMNT_TCP) { 262ddc423bfSmaxv leftovers &= ~OSF1_NFSMNT_TCP; 263ddc423bfSmaxv bsd_na.sotype = SOCK_DGRAM; 264ddc423bfSmaxv bsd_na.proto = 0; 265ddc423bfSmaxv } else { 266ddc423bfSmaxv bsd_na.sotype = SOCK_STREAM; 267ddc423bfSmaxv bsd_na.proto = 0; 268ddc423bfSmaxv } 269ddc423bfSmaxv if (leftovers != 0) 270ddc423bfSmaxv return (EINVAL); 271ddc423bfSmaxv 272ddc423bfSmaxv /* copy structure elements based on flags */ 273ddc423bfSmaxv if (bsd_na.flags & NFSMNT_WSIZE) 274ddc423bfSmaxv bsd_na.wsize = osf_na.wsize; 275ddc423bfSmaxv if (bsd_na.flags & NFSMNT_RSIZE) 276ddc423bfSmaxv bsd_na.rsize = osf_na.rsize; 277ddc423bfSmaxv if (bsd_na.flags & NFSMNT_TIMEO) 278ddc423bfSmaxv bsd_na.timeo = osf_na.timeo; 279ddc423bfSmaxv if (bsd_na.flags & NFSMNT_RETRANS) 280ddc423bfSmaxv bsd_na.retrans = osf_na.retrans; 281ddc423bfSmaxv 282ddc423bfSmaxv return do_sys_mount(l, "nfs", UIO_SYSSPACE, SCARG(uap, path), 283ddc423bfSmaxv SCARG(uap, flags), &bsd_na, UIO_SYSSPACE, sizeof bsd_na, &dummy); 284ddc423bfSmaxv } 285ddc423bfSmaxv 286ddc423bfSmaxv int 287ddc423bfSmaxv linux_sys_osf1_mount(struct lwp *l, const struct linux_sys_osf1_mount_args *uap, register_t *retval) 288ddc423bfSmaxv { 289ddc423bfSmaxv 290ddc423bfSmaxv if (SCARG(uap, flags) & ~OSF1_MOUNT_FLAGS) 291ddc423bfSmaxv return (EINVAL); 292ddc423bfSmaxv 293ddc423bfSmaxv /* XXX - xlate flags */ 294ddc423bfSmaxv 295ddc423bfSmaxv switch (SCARG(uap, type)) { 296ddc423bfSmaxv case OSF1_MOUNT_NFS: 297ddc423bfSmaxv return osf1_mount_nfs(l, uap); 298ddc423bfSmaxv break; 299ddc423bfSmaxv 300ddc423bfSmaxv case OSF1_MOUNT_MFS: 301ddc423bfSmaxv return osf1_mount_mfs(l, uap); 302ddc423bfSmaxv 303ddc423bfSmaxv default: 304ddc423bfSmaxv return (EINVAL); 305ddc423bfSmaxv } 306ddc423bfSmaxv } 307ddc423bfSmaxv 308ddc423bfSmaxv int 309ddc423bfSmaxv linux_sys_osf1_set_program_attributes(struct lwp *l, const struct linux_sys_osf1_set_program_attributes_args *uap, register_t *retval) 310ddc423bfSmaxv { 311ddc423bfSmaxv struct proc *p = l->l_proc; 312ddc423bfSmaxv segsz_t tsize, dsize; 313ddc423bfSmaxv 314ddc423bfSmaxv tsize = btoc(SCARG(uap, tsize)); 315ddc423bfSmaxv dsize = btoc(SCARG(uap, dsize)); 316ddc423bfSmaxv 317ddc423bfSmaxv if (dsize > p->p_rlimit[RLIMIT_DATA].rlim_cur) 318ddc423bfSmaxv return (ENOMEM); 3197c02b47bSchristos #ifdef MAXTSIZ 320ddc423bfSmaxv if (tsize > MAXTSIZ) 321ddc423bfSmaxv return (ENOMEM); 3227c02b47bSchristos #endif 323ddc423bfSmaxv 324ddc423bfSmaxv /* XXXSMP unlocked */ 325ddc423bfSmaxv p->p_vmspace->vm_taddr = SCARG(uap, taddr); 326ddc423bfSmaxv p->p_vmspace->vm_tsize = tsize; 327ddc423bfSmaxv p->p_vmspace->vm_daddr = SCARG(uap, daddr); 328ddc423bfSmaxv p->p_vmspace->vm_dsize = dsize; 329ddc423bfSmaxv 330ddc423bfSmaxv return (0); 331ddc423bfSmaxv } 332ddc423bfSmaxv 333ddc423bfSmaxv int 334ddc423bfSmaxv linux_sys_osf1_setitimer(struct lwp *l, const struct linux_sys_osf1_setitimer_args *uap, register_t *retval) 335ddc423bfSmaxv { 336ddc423bfSmaxv struct osf1_itimerval o_itv, o_oitv; 337ddc423bfSmaxv struct itimerval b_itv, b_oitv; 338ddc423bfSmaxv int which; 339ddc423bfSmaxv int error; 340ddc423bfSmaxv 341ddc423bfSmaxv switch (SCARG(uap, which)) { 342ddc423bfSmaxv case OSF1_ITIMER_REAL: 343ddc423bfSmaxv which = ITIMER_REAL; 344ddc423bfSmaxv break; 345ddc423bfSmaxv 346ddc423bfSmaxv case OSF1_ITIMER_VIRTUAL: 347ddc423bfSmaxv which = ITIMER_VIRTUAL; 348ddc423bfSmaxv break; 349ddc423bfSmaxv 350ddc423bfSmaxv case OSF1_ITIMER_PROF: 351ddc423bfSmaxv which = ITIMER_PROF; 352ddc423bfSmaxv break; 353ddc423bfSmaxv 354ddc423bfSmaxv default: 355ddc423bfSmaxv return (EINVAL); 356ddc423bfSmaxv } 357ddc423bfSmaxv 358ddc423bfSmaxv /* get the OSF/1 itimerval argument */ 359ddc423bfSmaxv error = copyin(SCARG(uap, itv), &o_itv, sizeof o_itv); 360ddc423bfSmaxv if (error != 0) 361ddc423bfSmaxv return error; 362ddc423bfSmaxv 363ddc423bfSmaxv /* fill in and the NetBSD timeval */ 364ddc423bfSmaxv memset(&b_itv, 0, sizeof b_itv); 365ddc423bfSmaxv b_itv.it_interval.tv_sec = o_itv.it_interval.tv_sec; 366ddc423bfSmaxv b_itv.it_interval.tv_usec = o_itv.it_interval.tv_usec; 367ddc423bfSmaxv b_itv.it_value.tv_sec = o_itv.it_value.tv_sec; 368ddc423bfSmaxv b_itv.it_value.tv_usec = o_itv.it_value.tv_usec; 369ddc423bfSmaxv 370ddc423bfSmaxv if (SCARG(uap, oitv) != NULL) { 371ddc423bfSmaxv dogetitimer(l->l_proc, which, &b_oitv); 372ddc423bfSmaxv if (error) 373ddc423bfSmaxv return error; 374ddc423bfSmaxv } 375ddc423bfSmaxv 376ddc423bfSmaxv error = dosetitimer(l->l_proc, which, &b_itv); 377ddc423bfSmaxv 378ddc423bfSmaxv if (error == 0 || SCARG(uap, oitv) == NULL) 379ddc423bfSmaxv return error; 380ddc423bfSmaxv 381ddc423bfSmaxv /* fill in and copy out the old timeval */ 382ddc423bfSmaxv memset(&o_oitv, 0, sizeof o_oitv); 383ddc423bfSmaxv o_oitv.it_interval.tv_sec = b_oitv.it_interval.tv_sec; 384ddc423bfSmaxv o_oitv.it_interval.tv_usec = b_oitv.it_interval.tv_usec; 385ddc423bfSmaxv o_oitv.it_value.tv_sec = b_oitv.it_value.tv_sec; 386ddc423bfSmaxv o_oitv.it_value.tv_usec = b_oitv.it_value.tv_usec; 387ddc423bfSmaxv 388ddc423bfSmaxv return copyout(&o_oitv, SCARG(uap, oitv), sizeof o_oitv); 389ddc423bfSmaxv } 390ddc423bfSmaxv 391ddc423bfSmaxv int 392ddc423bfSmaxv linux_sys_osf1_select(struct lwp *l, const struct linux_sys_osf1_select_args *uap, 393ddc423bfSmaxv register_t *retval) 394ddc423bfSmaxv { 395ddc423bfSmaxv struct osf1_timeval otv; 396ddc423bfSmaxv struct timespec ats, *ts = NULL; 397ddc423bfSmaxv int error; 398ddc423bfSmaxv 399ddc423bfSmaxv if (SCARG(uap, tv)) { 400ddc423bfSmaxv /* get the OSF/1 timeval argument */ 401ddc423bfSmaxv error = copyin(SCARG(uap, tv), &otv, sizeof otv); 402ddc423bfSmaxv if (error != 0) 403ddc423bfSmaxv return error; 404ddc423bfSmaxv 405ddc423bfSmaxv ats.tv_sec = otv.tv_sec; 406ddc423bfSmaxv ats.tv_nsec = otv.tv_usec * 1000; 407ddc423bfSmaxv ts = &ats; 408ddc423bfSmaxv } 409ddc423bfSmaxv 410ddc423bfSmaxv return selcommon(retval, SCARG(uap, nd), SCARG(uap, in), 411ddc423bfSmaxv SCARG(uap, ou), SCARG(uap, ex), ts, NULL); 412ddc423bfSmaxv } 413ddc423bfSmaxv 414ddc423bfSmaxv int 415ddc423bfSmaxv linux_sys_osf1_gettimeofday(struct lwp *l, const struct linux_sys_osf1_gettimeofday_args *uap, register_t *retval) 416ddc423bfSmaxv { 417ddc423bfSmaxv struct osf1_timeval otv; 418ddc423bfSmaxv struct osf1_timezone otz; 419ddc423bfSmaxv struct timeval tv; 420ddc423bfSmaxv int error; 421ddc423bfSmaxv 422ddc423bfSmaxv microtime(&tv); 423ddc423bfSmaxv memset(&otv, 0, sizeof otv); 424ddc423bfSmaxv otv.tv_sec = tv.tv_sec; 425ddc423bfSmaxv otv.tv_usec = tv.tv_usec; 42603d46ac0Schristos error = copyout(&otv, SCARG(uap, tv), sizeof otv); 427ddc423bfSmaxv 428ddc423bfSmaxv if (error == 0 && SCARG(uap, tzp) != NULL) { 429ddc423bfSmaxv memset(&otz, 0, sizeof otz); 430ddc423bfSmaxv error = copyout(&otz, SCARG(uap, tzp), sizeof otz); 431ddc423bfSmaxv } 432ddc423bfSmaxv return (error); 433ddc423bfSmaxv } 434ddc423bfSmaxv 435ddc423bfSmaxv int 436ddc423bfSmaxv linux_sys_osf1_getrusage(struct lwp *l, const struct linux_sys_osf1_getrusage_args *uap, register_t *retval) 437ddc423bfSmaxv { 438ddc423bfSmaxv int error, who; 439ddc423bfSmaxv struct osf1_rusage osf1_rusage; 440ddc423bfSmaxv struct rusage ru; 441ddc423bfSmaxv struct proc *p = l->l_proc; 442ddc423bfSmaxv 443ddc423bfSmaxv 444ddc423bfSmaxv switch (SCARG(uap, who)) { 445ddc423bfSmaxv case OSF1_RUSAGE_SELF: 446ddc423bfSmaxv who = RUSAGE_SELF; 447ddc423bfSmaxv break; 448ddc423bfSmaxv 449ddc423bfSmaxv case OSF1_RUSAGE_CHILDREN: 450ddc423bfSmaxv who = RUSAGE_CHILDREN; 451ddc423bfSmaxv break; 452ddc423bfSmaxv 453ddc423bfSmaxv case OSF1_RUSAGE_THREAD: /* XXX not supported */ 454ddc423bfSmaxv default: 455ddc423bfSmaxv return EINVAL; 456ddc423bfSmaxv } 457ddc423bfSmaxv 458ddc423bfSmaxv error = getrusage1(p, who, &ru); 459ddc423bfSmaxv if (error != 0) 460ddc423bfSmaxv return error; 461ddc423bfSmaxv 462ddc423bfSmaxv osf1_cvt_rusage_from_native(&ru, &osf1_rusage); 463ddc423bfSmaxv 464ddc423bfSmaxv return copyout(&osf1_rusage, SCARG(uap, rusage), sizeof osf1_rusage); 465ddc423bfSmaxv } 466ddc423bfSmaxv 467ddc423bfSmaxv int 468ddc423bfSmaxv linux_sys_osf1_settimeofday(struct lwp *l, const struct linux_sys_osf1_settimeofday_args *uap, register_t *retval) 469ddc423bfSmaxv { 470ddc423bfSmaxv struct osf1_timeval otv; 471ddc423bfSmaxv struct timeval tv, *tvp; 472ddc423bfSmaxv int error = 0; 473ddc423bfSmaxv 474ddc423bfSmaxv if (SCARG(uap, tv) == NULL) 475ddc423bfSmaxv tvp = NULL; 476ddc423bfSmaxv else { 477ddc423bfSmaxv /* get the OSF/1 timeval argument */ 478ddc423bfSmaxv error = copyin(SCARG(uap, tv), &otv, sizeof otv); 479ddc423bfSmaxv if (error != 0) 480ddc423bfSmaxv return error; 481ddc423bfSmaxv 482ddc423bfSmaxv tv.tv_sec = otv.tv_sec; 483ddc423bfSmaxv tv.tv_usec = otv.tv_usec; 484ddc423bfSmaxv tvp = &tv; 485ddc423bfSmaxv } 486ddc423bfSmaxv 487ddc423bfSmaxv /* NetBSD ignores the timezone field */ 488ddc423bfSmaxv 489ddc423bfSmaxv return settimeofday1(tvp, false, (const void *)SCARG(uap, tzp), l, true); 490ddc423bfSmaxv } 491ddc423bfSmaxv 492ddc423bfSmaxv int 493ddc423bfSmaxv linux_sys_osf1_utimes(struct lwp *l, const struct linux_sys_osf1_utimes_args *uap, register_t *retval) 494ddc423bfSmaxv { 495ddc423bfSmaxv struct osf1_timeval otv; 496ddc423bfSmaxv struct timeval tv[2], *tvp; 497ddc423bfSmaxv int error; 498ddc423bfSmaxv 499ddc423bfSmaxv if (SCARG(uap, tptr) == NULL) 500ddc423bfSmaxv tvp = NULL; 501ddc423bfSmaxv else { 502ddc423bfSmaxv /* get the OSF/1 timeval argument */ 503ddc423bfSmaxv error = copyin(SCARG(uap, tptr), &otv, sizeof otv); 504ddc423bfSmaxv if (error != 0) 505ddc423bfSmaxv return error; 506ddc423bfSmaxv 507ddc423bfSmaxv /* fill in and copy out the NetBSD timeval */ 508ddc423bfSmaxv tv[0].tv_sec = otv.tv_sec; 509ddc423bfSmaxv tv[0].tv_usec = otv.tv_usec; 510ddc423bfSmaxv /* Set access and modified to the same time */ 511ddc423bfSmaxv tv[1].tv_sec = otv.tv_sec; 512ddc423bfSmaxv tv[1].tv_usec = otv.tv_usec; 513ddc423bfSmaxv tvp = tv; 514ddc423bfSmaxv } 515ddc423bfSmaxv 516ddc423bfSmaxv return do_sys_utimes(l, NULL, SCARG(uap, path), FOLLOW, 517ddc423bfSmaxv tvp, UIO_SYSSPACE); 518ddc423bfSmaxv } 519ddc423bfSmaxv 520ddc423bfSmaxv int 521ddc423bfSmaxv linux_sys_osf1_statfs(struct lwp *l, const struct linux_sys_osf1_statfs_args *uap, register_t *retval) 522ddc423bfSmaxv { 523ddc423bfSmaxv struct mount *mp; 524ddc423bfSmaxv struct statvfs *sp; 525ddc423bfSmaxv struct osf1_statfs osfs; 526ddc423bfSmaxv int error; 527ddc423bfSmaxv struct vnode *vp; 528ddc423bfSmaxv 529ddc423bfSmaxv error = namei_simple_user(SCARG(uap, path), 530ddc423bfSmaxv NSM_FOLLOW_TRYEMULROOT, &vp); 531ddc423bfSmaxv if (error != 0) 532ddc423bfSmaxv return (error); 533ddc423bfSmaxv mp = vp->v_mount; 534ddc423bfSmaxv sp = &mp->mnt_stat; 535ddc423bfSmaxv vrele(vp); 536ddc423bfSmaxv if ((error = VFS_STATVFS(mp, sp))) 537ddc423bfSmaxv return (error); 538ddc423bfSmaxv sp->f_flag = mp->mnt_flag & MNT_VISFLAGMASK; 539ddc423bfSmaxv osf1_cvt_statfs_from_native(sp, &osfs); 540ddc423bfSmaxv return copyout(&osfs, SCARG(uap, buf), uimin(sizeof osfs, 541ddc423bfSmaxv SCARG(uap, len))); 542ddc423bfSmaxv } 543ddc423bfSmaxv 544ddc423bfSmaxv int 545ddc423bfSmaxv linux_sys_osf1_fstatfs(struct lwp *l, const struct linux_sys_osf1_fstatfs_args *uap, register_t *retval) 546ddc423bfSmaxv { 547ddc423bfSmaxv file_t *fp; 548ddc423bfSmaxv struct mount *mp; 549ddc423bfSmaxv struct statvfs *sp; 550ddc423bfSmaxv struct osf1_statfs osfs; 551ddc423bfSmaxv int error; 552ddc423bfSmaxv 553ddc423bfSmaxv /* fd_getvnode() will use the descriptor for us */ 554ddc423bfSmaxv if ((error = fd_getvnode(SCARG(uap, fd), &fp))) 555ddc423bfSmaxv return (error); 556ddc423bfSmaxv mp = fp->f_vnode->v_mount; 557ddc423bfSmaxv sp = &mp->mnt_stat; 558ddc423bfSmaxv if ((error = VFS_STATVFS(mp, sp))) 559ddc423bfSmaxv goto out; 560ddc423bfSmaxv sp->f_flag = mp->mnt_flag & MNT_VISFLAGMASK; 561ddc423bfSmaxv osf1_cvt_statfs_from_native(sp, &osfs); 562ddc423bfSmaxv error = copyout(&osfs, SCARG(uap, buf), uimin(sizeof osfs, 563ddc423bfSmaxv SCARG(uap, len))); 564ddc423bfSmaxv out: 565ddc423bfSmaxv fd_putfile(SCARG(uap, fd)); 566ddc423bfSmaxv return (error); 567ddc423bfSmaxv } 568ddc423bfSmaxv 569ddc423bfSmaxv int 570ddc423bfSmaxv linux_sys_osf1_sysinfo(struct lwp *l, const struct linux_sys_osf1_sysinfo_args *uap, register_t *retval) 571ddc423bfSmaxv { 572ddc423bfSmaxv const char *string; 573ddc423bfSmaxv size_t slen; 574ddc423bfSmaxv int error; 575ddc423bfSmaxv 576ddc423bfSmaxv error = 0; 577ddc423bfSmaxv switch (SCARG(uap, cmd)) { 578ddc423bfSmaxv case OSF1_SI_SYSNAME: 579ddc423bfSmaxv string = ostype; 580ddc423bfSmaxv break; 581ddc423bfSmaxv 582ddc423bfSmaxv case OSF1_SI_HOSTNAME: 583ddc423bfSmaxv string = hostname; 584ddc423bfSmaxv break; 585ddc423bfSmaxv 586ddc423bfSmaxv case OSF1_SI_RELEASE: 587ddc423bfSmaxv string = osrelease; 588ddc423bfSmaxv break; 589ddc423bfSmaxv 590ddc423bfSmaxv case OSF1_SI_VERSION: 591ddc423bfSmaxv goto should_handle; 592ddc423bfSmaxv 593ddc423bfSmaxv case OSF1_SI_MACHINE: 594ddc423bfSmaxv string = MACHINE; 595ddc423bfSmaxv break; 596ddc423bfSmaxv 597ddc423bfSmaxv case OSF1_SI_ARCHITECTURE: 598ddc423bfSmaxv string = MACHINE_ARCH; 599ddc423bfSmaxv break; 600ddc423bfSmaxv 601ddc423bfSmaxv case OSF1_SI_HW_SERIAL: 602ddc423bfSmaxv string = "666"; /* OSF/1 emulation? YES! */ 603ddc423bfSmaxv break; 604ddc423bfSmaxv 605ddc423bfSmaxv case OSF1_SI_HW_PROVIDER: 606ddc423bfSmaxv string = "unknown"; 607ddc423bfSmaxv break; 608ddc423bfSmaxv 609ddc423bfSmaxv case OSF1_SI_SRPC_DOMAIN: 610ddc423bfSmaxv goto dont_care; 611ddc423bfSmaxv 612ddc423bfSmaxv case OSF1_SI_SET_HOSTNAME: 613ddc423bfSmaxv goto should_handle; 614ddc423bfSmaxv 615ddc423bfSmaxv case OSF1_SI_SET_SYSNAME: 616ddc423bfSmaxv goto should_handle; 617ddc423bfSmaxv 618ddc423bfSmaxv case OSF1_SI_SET_SRPC_DOMAIN: 619ddc423bfSmaxv goto dont_care; 620ddc423bfSmaxv 621ddc423bfSmaxv default: 622ddc423bfSmaxv should_handle: 623ddc423bfSmaxv printf("osf1_sys_sysinfo(%d, %p, 0x%lx)\n", SCARG(uap, cmd), 624ddc423bfSmaxv SCARG(uap, buf), SCARG(uap,len)); 625ddc423bfSmaxv dont_care: 626ddc423bfSmaxv return (EINVAL); 627ddc423bfSmaxv }; 628ddc423bfSmaxv 629ddc423bfSmaxv slen = strlen(string) + 1; 630ddc423bfSmaxv if (SCARG(uap, buf)) { 631ddc423bfSmaxv error = copyout(string, SCARG(uap, buf), 632ddc423bfSmaxv uimin(slen, SCARG(uap, len))); 633ddc423bfSmaxv if (!error && (SCARG(uap, len) > 0) && (SCARG(uap, len) < slen)) 63491bfaeb6Sthorpej error = ustore_char(SCARG(uap, buf) 63591bfaeb6Sthorpej + SCARG(uap, len) - 1, 0); 636ddc423bfSmaxv } 637ddc423bfSmaxv if (!error) 638ddc423bfSmaxv retval[0] = slen; 639ddc423bfSmaxv 640ddc423bfSmaxv return (error); 641ddc423bfSmaxv } 642ddc423bfSmaxv 643ddc423bfSmaxv int 644ddc423bfSmaxv linux_sys_osf1_usleep_thread(struct lwp *l, const struct linux_sys_osf1_usleep_thread_args *uap, register_t *retval) 645ddc423bfSmaxv { 646ddc423bfSmaxv struct osf1_timeval otv, endotv; 647ddc423bfSmaxv struct timeval tv, ntv, endtv; 648ddc423bfSmaxv u_long ticks; 649ddc423bfSmaxv int error; 650ddc423bfSmaxv 651ddc423bfSmaxv if ((error = copyin(SCARG(uap, sleep), &otv, sizeof otv))) 652ddc423bfSmaxv return (error); 653ddc423bfSmaxv tv.tv_sec = otv.tv_sec; 654ddc423bfSmaxv tv.tv_usec = otv.tv_usec; 655ddc423bfSmaxv 656ddc423bfSmaxv ticks = howmany((u_long)tv.tv_sec * 1000000 + tv.tv_usec, tick); 657ddc423bfSmaxv if (ticks == 0) 658ddc423bfSmaxv ticks = 1; 659ddc423bfSmaxv 660ddc423bfSmaxv getmicrotime(&tv); 661ddc423bfSmaxv 662ddc423bfSmaxv tsleep(l, PUSER|PCATCH, "uslpthrd", ticks); /* XXX */ 663ddc423bfSmaxv 664ddc423bfSmaxv if (SCARG(uap, slept) != NULL) { 665ddc423bfSmaxv getmicrotime(&ntv); 666ddc423bfSmaxv timersub(&ntv, &tv, &endtv); 667ddc423bfSmaxv if (endtv.tv_sec < 0 || endtv.tv_usec < 0) 668ddc423bfSmaxv endtv.tv_sec = endtv.tv_usec = 0; 669ddc423bfSmaxv 67041aa5859Sriastradh memset(&endotv, 0, sizeof(endotv)); 671ddc423bfSmaxv endotv.tv_sec = endtv.tv_sec; 672ddc423bfSmaxv endotv.tv_usec = endtv.tv_usec; 673ddc423bfSmaxv error = copyout(&endotv, SCARG(uap, slept), sizeof endotv); 674ddc423bfSmaxv } 675ddc423bfSmaxv return (error); 676ddc423bfSmaxv } 677ddc423bfSmaxv 678ddc423bfSmaxv int 679ddc423bfSmaxv linux_sys_osf1_getsysinfo(struct lwp *l, const struct linux_sys_osf1_getsysinfo_args *uap, register_t *retval) 680ddc423bfSmaxv { 681ddc423bfSmaxv extern int ncpus; 682ddc423bfSmaxv int error; 683ddc423bfSmaxv int unit; 684ddc423bfSmaxv long percpu; 685ddc423bfSmaxv long proctype; 686ddc423bfSmaxv u_int64_t fpflags; 687ddc423bfSmaxv struct osf1_cpu_info cpuinfo; 688ddc423bfSmaxv const void *data; 689ddc423bfSmaxv size_t datalen; 690ddc423bfSmaxv 691ddc423bfSmaxv error = 0; 692ddc423bfSmaxv 693ddc423bfSmaxv switch(SCARG(uap, op)) 694ddc423bfSmaxv { 695ddc423bfSmaxv case OSF_GET_MAX_UPROCS: 696ddc423bfSmaxv data = &maxproc; 697ddc423bfSmaxv datalen = sizeof(maxproc); 698ddc423bfSmaxv break; 699ddc423bfSmaxv case OSF_GET_PHYSMEM: 700ddc423bfSmaxv data = &physmem; 701ddc423bfSmaxv datalen = sizeof(physmem); 702ddc423bfSmaxv break; 703ddc423bfSmaxv case OSF_GET_MAX_CPU: 704ddc423bfSmaxv case OSF_GET_CPUS_IN_BOX: 705ddc423bfSmaxv data = &ncpus; 706ddc423bfSmaxv datalen = sizeof(ncpus); 707ddc423bfSmaxv break; 708ddc423bfSmaxv case OSF_GET_IEEE_FP_CONTROL: 709ddc423bfSmaxv if (((fpflags = alpha_read_fp_c(l)) & IEEE_INHERIT) != 0) { 710ddc423bfSmaxv fpflags |= 1ULL << 63; 711ddc423bfSmaxv fpflags &= ~IEEE_INHERIT; 712ddc423bfSmaxv } 713ddc423bfSmaxv data = &fpflags; 714ddc423bfSmaxv datalen = sizeof(fpflags); 715ddc423bfSmaxv break; 716ddc423bfSmaxv case OSF_GET_CPU_INFO: 717ddc423bfSmaxv memset(&cpuinfo, 0, sizeof(cpuinfo)); 718ddc423bfSmaxv #ifdef __alpha__ 719ddc423bfSmaxv unit = alpha_pal_whami(); 720ddc423bfSmaxv #else 721ddc423bfSmaxv unit = 0; /* XXX */ 722ddc423bfSmaxv #endif 723ddc423bfSmaxv cpuinfo.current_cpu = unit; 724ddc423bfSmaxv cpuinfo.cpus_in_box = ncpus; 725ddc423bfSmaxv cpuinfo.cpu_type = LOCATE_PCS(hwrpb, unit)->pcs_proc_type; 726ddc423bfSmaxv cpuinfo.ncpus = ncpus; 727ddc423bfSmaxv cpuinfo.cpus_present = ncpus; 728ddc423bfSmaxv cpuinfo.cpus_running = ncpus; 729ddc423bfSmaxv cpuinfo.cpu_binding = 1; 730ddc423bfSmaxv cpuinfo.cpu_ex_binding = 0; 731ddc423bfSmaxv cpuinfo.mhz = hwrpb->rpb_cc_freq / 1000000; 732ddc423bfSmaxv data = &cpuinfo; 733ddc423bfSmaxv datalen = sizeof(cpuinfo); 734ddc423bfSmaxv break; 735ddc423bfSmaxv case OSF_GET_PROC_TYPE: 736ddc423bfSmaxv #ifdef __alpha__ 737ddc423bfSmaxv unit = alpha_pal_whami(); 738ddc423bfSmaxv proctype = LOCATE_PCS(hwrpb, unit)->pcs_proc_type; 739ddc423bfSmaxv #else 740ddc423bfSmaxv proctype = 0; /* XXX */ 741ddc423bfSmaxv #endif 742ddc423bfSmaxv data = &proctype; 743ddc423bfSmaxv datalen = sizeof(percpu); 744ddc423bfSmaxv break; 745ddc423bfSmaxv case OSF_GET_HWRPB: /* note -- osf/1 doesn't have rpb_tbhint[8] */ 746ddc423bfSmaxv data = hwrpb; 747ddc423bfSmaxv datalen = hwrpb->rpb_size; 748ddc423bfSmaxv break; 749ddc423bfSmaxv case OSF_GET_PLATFORM_NAME: 750ddc423bfSmaxv data = platform.model; 751ddc423bfSmaxv datalen = strlen(platform.model) + 1; 752ddc423bfSmaxv break; 753ddc423bfSmaxv default: 754ddc423bfSmaxv printf("osf1_getsysinfo called with unknown op=%ld\n", 755ddc423bfSmaxv SCARG(uap, op)); 756ddc423bfSmaxv /* return EINVAL; */ 757ddc423bfSmaxv return 0; 758ddc423bfSmaxv } 759ddc423bfSmaxv 760ddc423bfSmaxv if (SCARG(uap, nbytes) < datalen) 761ddc423bfSmaxv return (EINVAL); 762ddc423bfSmaxv error = copyout(data, SCARG(uap, buffer), datalen); 763ddc423bfSmaxv if (!error) 764ddc423bfSmaxv retval[0] = 1; 765ddc423bfSmaxv return (error); 766ddc423bfSmaxv } 767ddc423bfSmaxv 768ddc423bfSmaxv int 769ddc423bfSmaxv linux_sys_osf1_setsysinfo(struct lwp *l, const struct linux_sys_osf1_setsysinfo_args *uap, register_t *retval) 770ddc423bfSmaxv { 771ddc423bfSmaxv u_int64_t temp; 772ddc423bfSmaxv int error; 773ddc423bfSmaxv 774ddc423bfSmaxv error = 0; 775ddc423bfSmaxv 776ddc423bfSmaxv switch(SCARG(uap, op)) { 777ddc423bfSmaxv case OSF_SET_IEEE_FP_CONTROL: 778ddc423bfSmaxv 779ddc423bfSmaxv if ((error = copyin(SCARG(uap, buffer), &temp, sizeof(temp)))) 780ddc423bfSmaxv break; 781ddc423bfSmaxv if (temp >> 63 != 0) 782ddc423bfSmaxv temp |= IEEE_INHERIT; 783ddc423bfSmaxv alpha_write_fp_c(l, temp); 784ddc423bfSmaxv break; 785ddc423bfSmaxv default: 786ddc423bfSmaxv uprintf("osf1_setsysinfo called with op=%ld\n", SCARG(uap, op)); 787ddc423bfSmaxv //error = EINVAL; 788ddc423bfSmaxv } 789ddc423bfSmaxv retval[0] = 0; 790ddc423bfSmaxv return (error); 791ddc423bfSmaxv } 792