diff --git a/sys/arch/hp300/hpux/Makefile b/sys/arch/hp300/hpux/Makefile deleted file mode 100644 index 852d717c3239..000000000000 --- a/sys/arch/hp300/hpux/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -# $Id: Makefile,v 1.1 1994/05/23 08:04:11 mycroft Exp $ - -hpux_sysent.c hpux_syscalls.c hpux_syscall.h: makesyscalls.sh syscalls.master - -mv -f hpux_sysent.c hpux_sysent.c.bak - -mv -f hpux_syscalls.c hpux_syscalls.c.bak - -mv -f hpux_syscall.h hpux_syscall.h.bak - sh makesyscalls.sh syscalls.master diff --git a/sys/arch/hp300/hpux/hpux.h b/sys/arch/hp300/hpux/hpux.h deleted file mode 100644 index 8779377f45ac..000000000000 --- a/sys/arch/hp300/hpux/hpux.h +++ /dev/null @@ -1,287 +0,0 @@ -/* - * Copyright (c) 1988 University of Utah. - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * the Systems Programming Group of the University of Utah Computer - * Science Department. - * - * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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. - * - * from: Utah $Hdr: hpux.h 1.33 93/08/05$ - * - * from: @(#)hpux.h 8.4 (Berkeley) 2/13/94 - * $Id: hpux.h,v 1.6 1994/05/23 08:04:13 mycroft Exp $ - */ - -#include - -/* HP-UX style UTSNAME struct used by uname syscall */ - -struct hpux_utsname { - char sysname[9]; - char nodename[9]; - char release[9]; - char version[9]; - char machine[9]; - char idnumber[15]; -}; - -/* HP-UX style "old" IOCTLs */ - -struct hpux_sgttyb { - char sg_ispeed; - char sg_ospeed; - char sg_erase; - char sg_kill; - int sg_flags; /* only a short in BSD */ -}; - -#define V7_HUPCL 00001 -#define V7_XTABS 00002 -#define V7_NOAL 04000 - -#define HPUXTIOCGETP _IOR('t', 8, struct hpux_sgttyb) -#define HPUXTIOCSETP _IOW('t', 9, struct hpux_sgttyb) - -/* 6.5 job control related ioctls which need to be mapped */ - -#define HPUXTIOCSLTC _IOW('T', 23, struct ltchars) -#define HPUXTIOCGLTC _IOR('T', 24, struct ltchars) -#define HPUXTIOCLBIS _IOW('T', 25, int) -#define HPUXTIOCLBIC _IOW('T', 26, int) -#define HPUXTIOCLSET _IOW('T', 27, int) -#define HPUXTIOCLGET _IOR('T', 28, int) -# define HPUXLTOSTOP 0000001 -#define HPUXTIOCSPGRP _IOW('T', 29, int) -#define HPUXTIOCGPGRP _IOR('T', 30, int) -#define HPUXTIOCCONS _IO('t', 104) -#define HPUXTIOCSWINSZ _IOW('t', 106, struct winsize) -#define HPUXTIOCGWINSZ _IOR('t', 107, struct winsize) - -/* non-blocking IO--doesn't interfere with O_NDELAY */ -#define HPUXFIOSNBIO _IOW('f', 126, int) - -/* HP-UX stat structure */ - -#define bsdtohpuxdev(d) ((major(d) << 24) | minor(d)) - -struct hpux_stat { - long hst_dev; - u_long hst_ino; - u_short hst_mode; - short hst_nlink; - u_short hst_uid; - u_short hst_gid; - long hst_rdev; - long hst_size; - time_t hst_atime; - int hst_spare1; - time_t hst_mtime; - int hst_spare2; - time_t hst_ctime; - int hst_spare3; - long hst_blksize; - long hst_blocks; - u_int hst_remote; - long hst_netdev; - u_long hst_netino; - long hst_spare4[9]; -}; - -/* - * Skeletal 6.X HP-UX user structure info for ptrace() mapping. - * Yes, this is as bogus as it gets... - */ - -/* 6.0/6.2 offsets */ -#define ooHU_AROFF 0x004 -#define ooHU_TSOFF 0x092 -#define ooHU_EDOFF 0x91E -#define ooHU_FPOFF 0xA66 - -/* 6.5 offsets */ -#define oHU_AROFF 0x004 -#define oHU_TSOFF 0x0B2 -#define oHU_EDOFF 0x93A -#define oHU_FPOFF 0xA86 - -/* 7.X offsets */ -#define HU_AROFF 0x004 -#define HU_TSOFF 0x0B4 -#define HU_EDOFF 0x8C8 -#define HU_FPOFF 0xA28 - -#define HU_PAD1 (HU_AROFF) -#define HU_PAD2 (HU_TSOFF-HU_AROFF-4) -#define HU_PAD3 (HU_EDOFF-HU_TSOFF-12) -#define HU_PAD4 (HU_FPOFF-HU_EDOFF-sizeof(struct hpux_exec)) - -struct hpux_user { - u_char whocares1[HU_PAD1]; /* +0x000 */ - int *hpuxu_ar0; /* +0x004 */ - u_char whocares2[HU_PAD2]; /* +0x008 */ - int hpuxu_tsize; /* +0x0B2 */ - int hpuxu_dsize; /* +0x0B6 */ - int hpuxu_ssize; /* +0x0BA */ - u_char whocares3[HU_PAD3]; /* +0x0BE */ - struct hpux_exec hpuxu_exdata; /* +0x93A */ - u_char whocares4[HU_PAD4]; /* +0x95E */ - struct hpux_fp { /* +0xA66 */ - int hpfp_save[54]; - int hpfp_ctrl[3]; - int hpfp_reg[24]; - } hpuxu_fp; - short hpuxu_dragon; /* +0xBCA */ -}; - -/* HP-UX compat file flags */ -#define HPUXNDELAY 00000004 -#define HPUXFCREAT 00000400 -#define HPUXFTRUNC 00001000 -#define HPUXFEXCL 00002000 -#define HPUXFSYNCIO 00100000 -#define HPUXNONBLOCK 00200000 -#define HPUXFREMOTE 01000000 - -/* HP-UX fcntl file locking */ -struct hpux_flock { - short hl_type; - short hl_whence; - long hl_start; - long hl_len; - long hl_pid; -}; - -#define HPUXF_GETLK 7 -#define HPUXF_SETLK 8 -#define HPUXF_SETLKW 9 - -#define HPUXF_RDLCK 1 -#define HPUXF_WRLCK 2 -#define HPUXF_UNLCK 3 - -/* HP-UX only sysV shmctl() commands */ -#define SHM_LOCK 3 /* Lock segment in core */ -#define SHM_UNLOCK 4 /* Unlock segment */ - -/* SHM stuff reflecting POSIX types */ -struct hpux_ipc_perm { - long uid; /* owner's user id */ - long gid; /* owner's group id */ - long cuid; /* creator's user id */ - long cgid; /* creator's group id */ - u_short mode; /* access modes */ - u_short seq; /* slot usage sequence number */ - long key; /* key */ -}; - -struct hpux_shmid_ds { - struct hpux_ipc_perm shm_perm; /* operation permission struct */ - int shm_segsz; /* segment size (bytes) */ - struct pte *shm_ptbl; /* ptr to associated page table */ - long shm_lpid; /* pid of last shmop */ - long shm_cpid; /* pid of creator */ - u_short shm_nattch; /* current # attached */ - u_short shm_cnattch; /* in memory # attached */ - time_t shm_atime; /* last shmat time */ - time_t shm_dtime; /* last shmdt time */ - time_t shm_ctime; /* last change time */ - /* actually longer */ -}; - -/* HP-UX rtprio values */ -#define RTPRIO_MIN 0 -#define RTPRIO_MAX 127 -#define RTPRIO_NOCHG 1000 -#define RTPRIO_RTOFF 1001 - -/* HP-UX only sigvec sv_flags values */ -#define HPUXSV_RESET 000000004 - -/* - * HP-UX returns SIGILL instead of SIGFPE for the CHK and TRAPV exceptions. - * It also returns different u_code values for certain illegal instruction - * and floating point exceptions. Here are the proper HP-UX u_code values - * (numbers from hpux 6.2 manual pages). - */ - -/* SIGILL codes */ -#define HPUX_ILL_ILLINST_TRAP 0 /* T_ILLINST+USER */ -#define HPUX_ILL_CHK_TRAP 6 /* T_CHKINST+USER */ -#define HPUX_ILL_TRAPV_TRAP 7 /* T_TRAPVINST+USER */ -#define HPUX_ILL_PRIV_TRAP 8 /* T_PRIVINST+USER */ - -/* SIGFPE codes */ -#define HPUX_FPE_INTDIV_TRAP 5 /* T_ZERODIV+USER */ - -/* HP-UX POSIX signal stuff implementation */ -typedef struct __hpux_sigset_t { long sigset[8]; } hpux_sigset_t; -struct hpux_sigaction { - void (*sa_handler)(); - hpux_sigset_t sa_mask; - int sa_flags; -}; -#define HPUXSA_ONSTACK 1 -#define HPUXSA_RESETHAND 4 -#define HPUXSA_NOCLDSTOP 8 - -#define HPUXSIG_BLOCK 0 /* block specified signal set */ -#define HPUXSIG_UNBLOCK 1 /* unblock specified signal set */ -#define HPUXSIG_SETMASK 2 /* set specified signal set */ - -/* sysconf stuff */ -#define HPUX_SYSCONF_CLKTICK 2 -#define HPUX_SYSCONF_OPENMAX 4 -#define HPUX_SYSCONF_CPUTYPE 10001 -#define HPUX_SYSCONF_CPUM020 0x20C -#define HPUX_SYSCONF_CPUM030 0x20D -#define HPUX_SYSCONF_CPUM040 0x20E -#define HPUX_SYSCONF_CPUPA10 0x20B -#define HPUX_SYSCONF_CPUPA11 0x210 - -/* mmap stuff */ -#define HPUXMAP_FIXED 0x04 -#define HPUXMAP_REPLACE 0x08 -#define HPUXMAP_ANON 0x10 - -/* rlimit stuff */ -#define HPUXRLIMIT_NOFILE 6 - -/* - * In BSD EAGAIN and EWOULDBLOCK are the same error code. - * However, for HP-UX we must split them out to seperate codes. - * The easiest way to do this was to check the return value of - * BSD routines which are known to return EAGAIN (but never - * EWOULDBLOCK) and change it to the pseudo-code OEAGAIN when - * we see it. The error translation table will them map that - * code to the HP-UX EAGAIN value. - */ -#define OEAGAIN 82 diff --git a/sys/arch/hp300/hpux/hpux_compat.c b/sys/arch/hp300/hpux/hpux_compat.c deleted file mode 100644 index bd9e4ad8c5a4..000000000000 --- a/sys/arch/hp300/hpux/hpux_compat.c +++ /dev/null @@ -1,2146 +0,0 @@ -/* - * Copyright (c) 1988 University of Utah. - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * the Systems Programming Group of the University of Utah Computer - * Science Department. - * - * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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. - * - * from: Utah $Hdr: hpux_compat.c 1.64 93/08/05$ - * - * from: @(#)hpux_compat.c 8.4 (Berkeley) 2/13/94 - * $Id: hpux_compat.c,v 1.11 1994/05/25 11:55:06 mycroft Exp $ - */ - -/* - * Various HP-UX compatibility routines - */ - -#ifndef COMPAT_43 -#define COMPAT_43 -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - -#ifdef DEBUG -int unimpresponse = 0; -#endif - -/* SYS5 style UTSNAME info */ -struct hpux_utsname proto_utsname = { - "NetBSD", "", "0.9", "B", "9000/3?0", "" -}; - -/* 6.0 and later style context */ -#if defined(HP380) -char hpux_040context[] = - "standalone HP-MC68040 HP-MC68881 HP-MC68020 HP-MC68010 localroot default"; -#endif -#ifdef FPCOPROC -char hpux_context[] = - "standalone HP-MC68881 HP-MC68020 HP-MC68010 localroot default"; -#else -char hpux_context[] = - "standalone HP-MC68020 HP-MC68010 localroot default"; -#endif - -#define NERR 83 -#define BERR 1000 - -/* indexed by BSD errno */ -short bsdtohpuxerrnomap[NERR] = { -/*00*/ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -/*10*/ 10, 45, 12, 13, 14, 15, 16, 17, 18, 19, -/*20*/ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, -/*30*/ 30, 31, 32, 33, 34, 246, 245, 244, 216, 217, -/*40*/ 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, -/*50*/ 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, -/*60*/ 238, 239, 249, 248, 241, 242, 247,BERR,BERR,BERR, -/*70*/ 70, 71,BERR,BERR,BERR,BERR,BERR, 46, 251,BERR, -/*80*/ BERR,BERR, 11 -}; - -notimp(p, uap, retval, code, nargs) - struct proc *p; - int *uap, *retval; - int code, nargs; -{ - int error = 0; -#ifdef DEBUG - register int *argp = uap; - extern char *hpux_syscallnames[]; - - printf("HP-UX %s(", hpux_syscallnames[code]); - if (nargs) - while (nargs--) - printf("%x%c", *argp++, nargs? ',' : ')'); - else - printf(")"); - printf("\n"); - switch (unimpresponse) { - case 0: - error = nosys(p, uap, retval); - break; - case 1: - error = EINVAL; - break; - } -#else - error = nosys(p, uap, retval); -#endif - uprintf("HP-UX system call %d not implemented\n", code); - return (error); -} - -/* - * HP-UX fork and vfork need to map the EAGAIN return value appropriately. - */ -hpux_fork(p, uap, retval) - struct proc *p; - struct hpux_wait3_args *uap; - int *retval; -{ - int error; - - error = fork(p, uap, retval); - if (error == EAGAIN) - error = OEAGAIN; - return (error); -} - -hpux_vfork(p, uap, retval) - struct proc *p; - struct hpux_wait3_args *uap; - int *retval; - -{ - int error; - - error = vfork(p, uap, retval); - if (error == EAGAIN) - error = OEAGAIN; - return (error); -} - -struct hpux_execv_args { - char *fname; - char **argp; - char **envp; -}; -hpux_execv(p, uap, retval) - struct proc *p; - struct hpux_execv_args *uap; - int *retval; -{ - extern int execve(); - - uap->envp = NULL; - return (execve(p, uap, retval)); -} - -/* - * HP-UX versions of wait and wait3 actually pass the parameters - * (status pointer, options, rusage) into the kernel rather than - * handling it in the C library stub. We also need to map any - * termination signal from BSD to HP-UX. - */ -struct hpux_wait3_args { - int *status; - int options; - int rusage; -}; -hpux_wait3(p, uap, retval) - struct proc *p; - struct hpux_wait3_args *uap; - int *retval; -{ - /* rusage pointer must be zero */ - if (uap->rusage) - return (EINVAL); - p->p_md.md_regs[PS] = PSL_ALLCC; - p->p_md.md_regs[R0] = uap->options; - p->p_md.md_regs[R1] = uap->rusage; - return (hpux_wait(p, uap, retval)); -} - -struct hpux_wait_args { - int *status; -}; -hpux_wait(p, uap, retval) - struct proc *p; - struct hpux_wait_args *uap; - int *retval; -{ - int sig, *statp, error; - - statp = uap->status; /* owait clobbers first arg */ - error = owait(p, uap, retval); - /* - * HP-UX wait always returns EINTR when interrupted by a signal - * (well, unless its emulating a BSD process, but we don't bother...) - */ - if (error == ERESTART) - error = EINTR; - if (error) - return (error); - sig = retval[1] & 0xFF; - if (sig == WSTOPPED) { - sig = (retval[1] >> 8) & 0xFF; - retval[1] = (bsdtohpuxsig(sig) << 8) | WSTOPPED; - } else if (sig) - retval[1] = (retval[1] & 0xFF00) | - bsdtohpuxsig(sig & 0x7F) | (sig & 0x80); - if (statp) - if (suword((caddr_t)statp, retval[1])) - error = EFAULT; - return (error); -} - -struct hpux_waitpid_args { - int pid; - int *status; - int options; - struct rusage *rusage; /* wait4 arg */ -}; -hpux_waitpid(p, uap, retval) - struct proc *p; - struct hpux_waitpid_args *uap; - int *retval; -{ - int rv, sig, xstat, error; - - uap->rusage = 0; - error = wait4(p, uap, retval); - /* - * HP-UX wait always returns EINTR when interrupted by a signal - * (well, unless its emulating a BSD process, but we don't bother...) - */ - if (error == ERESTART) - error = EINTR; - if (error) - return (error); - if (uap->status) { - /* - * Wait4 already wrote the status out to user space, - * pull it back, change the signal portion, and write - * it back out. - */ - rv = fuword((caddr_t)uap->status); - if (WIFSTOPPED(rv)) { - sig = WSTOPSIG(rv); - rv = W_STOPCODE(bsdtohpuxsig(sig)); - } else if (WIFSIGNALED(rv)) { - sig = WTERMSIG(rv); - xstat = WEXITSTATUS(rv); - rv = W_EXITCODE(xstat, bsdtohpuxsig(sig)) | - WCOREDUMP(rv); - } - (void)suword((caddr_t)uap->status, rv); - } - return (error); -} - -/* - * Old creat system call. - */ -struct hpux_creat_args { - char *fname; - int fmode; -}; -hpux_creat(p, uap, retval) - struct proc *p; - register struct hpux_creat_args *uap; - int *retval; -{ - struct nargs { - char *fname; - int mode; - int crtmode; - } openuap; - - openuap.fname = uap->fname; - openuap.crtmode = uap->fmode; - openuap.mode = O_WRONLY | O_CREAT | O_TRUNC; - return (open(p, &openuap, retval)); -} - -/* - * XXX extensions to the fd_ofileflags flags. - * Hate to put this there, but they do need to be per-file. - */ -#define UF_NONBLOCK_ON 0x10 -#define UF_FNDELAY_ON 0x20 -#define UF_FIONBIO_ON 0x40 - -/* - * Must remap some bits in the mode mask. - * O_CREAT, O_TRUNC, and O_EXCL must be remapped, - * O_NONBLOCK is remapped and remembered, - * O_FNDELAY is remembered, - * O_SYNCIO is removed entirely. - */ -struct hpux_open_args { - char *fname; - int mode; - int crtmode; -}; -hpux_open(p, uap, retval) - struct proc *p; - register struct hpux_open_args *uap; - int *retval; -{ - int mode, error; - - mode = uap->mode; - uap->mode &= - ~(HPUXNONBLOCK|HPUXFSYNCIO|HPUXFEXCL|HPUXFTRUNC|HPUXFCREAT); - if (mode & HPUXFCREAT) { - /* - * simulate the pre-NFS behavior that opening a - * file for READ+CREATE ignores the CREATE (unless - * EXCL is set in which case we will return the - * proper error). - */ - if ((mode & HPUXFEXCL) || (FFLAGS(mode) & FWRITE)) - uap->mode |= O_CREAT; - } - if (mode & HPUXFTRUNC) - uap->mode |= O_TRUNC; - if (mode & HPUXFEXCL) - uap->mode |= O_EXCL; - if (mode & HPUXNONBLOCK) - uap->mode |= O_NDELAY; - error = open(p, uap, retval); - /* - * Record non-blocking mode for fcntl, read, write, etc. - */ - if (error == 0 && (uap->mode & O_NDELAY)) - p->p_fd->fd_ofileflags[*retval] |= - (mode & HPUXNONBLOCK) ? UF_NONBLOCK_ON : UF_FNDELAY_ON; - return (error); -} - -struct hpux_fcntl_args { - int fdes; - int cmd; - int arg; -}; -hpux_fcntl(p, uap, retval) - struct proc *p; - register struct hpux_fcntl_args *uap; - int *retval; -{ - int mode, error, flg = F_POSIX; - struct file *fp; - char *pop; - struct hpux_flock hfl; - struct flock fl; - struct vnode *vp; - - if ((unsigned)uap->fdes >= p->p_fd->fd_nfiles || - (fp = p->p_fd->fd_ofiles[uap->fdes]) == NULL) - return (EBADF); - pop = &p->p_fd->fd_ofileflags[uap->fdes]; - switch (uap->cmd) { - case F_SETFL: - if (uap->arg & HPUXNONBLOCK) - *pop |= UF_NONBLOCK_ON; - else - *pop &= ~UF_NONBLOCK_ON; - if (uap->arg & HPUXNDELAY) - *pop |= UF_FNDELAY_ON; - else - *pop &= ~UF_FNDELAY_ON; - if (*pop & (UF_NONBLOCK_ON|UF_FNDELAY_ON|UF_FIONBIO_ON)) - uap->arg |= FNONBLOCK; - else - uap->arg &= ~FNONBLOCK; - uap->arg &= ~(HPUXNONBLOCK|HPUXFSYNCIO|HPUXFREMOTE); - break; - case F_GETFL: - case F_DUPFD: - case F_GETFD: - case F_SETFD: - break; - - case HPUXF_SETLKW: - flg |= F_WAIT; - /* Fall into F_SETLK */ - - case HPUXF_SETLK: - if (fp->f_type != DTYPE_VNODE) - return (EBADF); - vp = (struct vnode *)fp->f_data; - /* Copy in the lock structure */ - error = copyin((caddr_t)uap->arg, (caddr_t)&hfl, sizeof (hfl)); - if (error) - return (error); - fl.l_start = hfl.hl_start; - fl.l_len = hfl.hl_len; - fl.l_pid = hfl.hl_pid; - fl.l_type = hfl.hl_type; - fl.l_whence = hfl.hl_whence; - if (fl.l_whence == SEEK_CUR) - fl.l_start += fp->f_offset; - switch (fl.l_type) { - - case F_RDLCK: - if ((fp->f_flag & FREAD) == 0) - return (EBADF); - p->p_flag |= P_ADVLOCK; - return (VOP_ADVLOCK(vp, (caddr_t)p, F_SETLK, &fl, flg)); - - case F_WRLCK: - if ((fp->f_flag & FWRITE) == 0) - return (EBADF); - p->p_flag |= P_ADVLOCK; - return (VOP_ADVLOCK(vp, (caddr_t)p, F_SETLK, &fl, flg)); - - case F_UNLCK: - return (VOP_ADVLOCK(vp, (caddr_t)p, F_UNLCK, &fl, - F_POSIX)); - - default: - return (EINVAL); - } - - case F_GETLK: - if (fp->f_type != DTYPE_VNODE) - return (EBADF); - vp = (struct vnode *)fp->f_data; - /* Copy in the lock structure */ - error = copyin((caddr_t)uap->arg, (caddr_t)&hfl, sizeof (hfl)); - if (error) - return (error); - fl.l_start = hfl.hl_start; - fl.l_len = hfl.hl_len; - fl.l_pid = hfl.hl_pid; - fl.l_type = hfl.hl_type; - fl.l_whence = hfl.hl_whence; - if (fl.l_whence == SEEK_CUR) - fl.l_start += fp->f_offset; - if (error = VOP_ADVLOCK(vp, (caddr_t)p, F_GETLK, &fl, F_POSIX)) - return (error); - hfl.hl_start = fl.l_start; - hfl.hl_len = fl.l_len; - hfl.hl_pid = fl.l_pid; - hfl.hl_type = fl.l_type; - hfl.hl_whence = fl.l_whence; - return (copyout((caddr_t)&hfl, (caddr_t)uap->arg, sizeof (hfl))); - - default: - return (EINVAL); - } - error = fcntl(p, uap, retval); - if (error == 0 && uap->cmd == F_GETFL) { - mode = *retval; - *retval &= ~(O_CREAT|O_TRUNC|O_EXCL); - if (mode & FNONBLOCK) { - if (*pop & UF_NONBLOCK_ON) - *retval |= HPUXNONBLOCK; - if ((*pop & UF_FNDELAY_ON) == 0) - *retval &= ~HPUXNDELAY; - } - if (mode & O_CREAT) - *retval |= HPUXFCREAT; - if (mode & O_TRUNC) - *retval |= HPUXFTRUNC; - if (mode & O_EXCL) - *retval |= HPUXFEXCL; - } - return (error); -} - -/* - * Read and write calls. Same as BSD except for non-blocking behavior. - * There are three types of non-blocking reads/writes in HP-UX checked - * in the following order: - * - * O_NONBLOCK: return -1 and errno == EAGAIN - * O_NDELAY: return 0 - * FIOSNBIO: return -1 and errno == EWOULDBLOCK - */ -struct hpux_rw_args { - int fd; -}; - -hpux_read(p, uap, retval) - struct proc *p; - struct hpux_rw_args *uap; - int *retval; -{ - int error; - - error = read(p, uap, retval); - if (error == EWOULDBLOCK) { - char *fp = &p->p_fd->fd_ofileflags[uap->fd]; - - if (*fp & UF_NONBLOCK_ON) { - *retval = -1; - error = OEAGAIN; - } else if (*fp & UF_FNDELAY_ON) { - *retval = 0; - error = 0; - } - } - return (error); -} - -hpux_write(p, uap, retval) - struct proc *p; - struct hpux_rw_args *uap; - int *retval; -{ - int error; - - error = write(p, uap, retval); - if (error == EWOULDBLOCK) { - char *fp = &p->p_fd->fd_ofileflags[uap->fd]; - - if (*fp & UF_NONBLOCK_ON) { - *retval = -1; - error = OEAGAIN; - } else if (*fp & UF_FNDELAY_ON) { - *retval = 0; - error = 0; - } - } - return (error); -} - -hpux_readv(p, uap, retval) - struct proc *p; - struct hpux_rw_args *uap; - int *retval; -{ - int error; - - error = readv(p, uap, retval); - if (error == EWOULDBLOCK) { - char *fp = &p->p_fd->fd_ofileflags[uap->fd]; - - if (*fp & UF_NONBLOCK_ON) { - *retval = -1; - error = OEAGAIN; - } else if (*fp & UF_FNDELAY_ON) { - *retval = 0; - error = 0; - } - } - return (error); -} - -hpux_writev(p, uap, retval) - struct proc *p; - struct hpux_rw_args *uap; - int *retval; -{ - int error; - - error = writev(p, uap, retval); - if (error == EWOULDBLOCK) { - char *fp = &p->p_fd->fd_ofileflags[uap->fd]; - - if (*fp & UF_NONBLOCK_ON) { - *retval = -1; - error = OEAGAIN; - } else if (*fp & UF_FNDELAY_ON) { - *retval = 0; - error = 0; - } - } - return (error); -} - -/* - * 4.3bsd dup allows dup2 to come in on the same syscall entry - * and hence allows two arguments. HP-UX dup has only one arg. - */ -struct hpux_dup_args { - int i; -}; -hpux_dup(p, uap, retval) - struct proc *p; - register struct hpux_dup_args *uap; - int *retval; -{ - register struct filedesc *fdp = p->p_fd; - struct file *fp; - int fd, error; - - if (((unsigned)uap->i) >= fdp->fd_nfiles || - (fp = fdp->fd_ofiles[uap->i]) == NULL) - return (EBADF); - if (error = fdalloc(p, 0, &fd)) - return (error); - fdp->fd_ofiles[fd] = fp; - fdp->fd_ofileflags[fd] = fdp->fd_ofileflags[uap->i] &~ UF_EXCLOSE; - fp->f_count++; - if (fd > fdp->fd_lastfile) - fdp->fd_lastfile = fd; - *retval = fd; - return (0); -} - -struct hpux_utssys_args { - struct hpux_utsname *uts; - int dev; - int request; -}; -hpux_utssys(p, uap, retval) - struct proc *p; - register struct hpux_utssys_args *uap; - int *retval; -{ - register int i; - int error; - - switch (uap->request) { - /* uname */ - case 0: - /* fill in machine type */ - switch (machineid) { - case HP_320: - proto_utsname.machine[6] = '2'; - break; - /* includes 318 and 319 */ - case HP_330: - proto_utsname.machine[6] = '3'; - break; - case HP_340: - proto_utsname.machine[6] = '4'; - break; - case HP_350: - proto_utsname.machine[6] = '5'; - break; - case HP_360: - proto_utsname.machine[6] = '6'; - break; - case HP_370: - proto_utsname.machine[6] = '7'; - break; - /* includes 345 */ - case HP_375: - proto_utsname.machine[6] = '7'; - proto_utsname.machine[7] = '5'; - break; - /* includes 425 */ - case HP_380: - proto_utsname.machine[6] = '8'; - break; - case HP_433: - proto_utsname.machine[5] = '4'; - proto_utsname.machine[6] = '3'; - proto_utsname.machine[7] = '3'; - break; - } - /* copy hostname (sans domain) to nodename */ - for (i = 0; i < 8 && hostname[i] != '.'; i++) - proto_utsname.nodename[i] = hostname[i]; - proto_utsname.nodename[i] = '\0'; - error = copyout((caddr_t)&proto_utsname, (caddr_t)uap->uts, - sizeof(struct hpux_utsname)); - break; - - /* gethostname */ - case 5: - /* uap->dev is length */ - if (uap->dev > hostnamelen + 1) - uap->dev = hostnamelen + 1; - error = copyout((caddr_t)hostname, (caddr_t)uap->uts, - uap->dev); - break; - - case 1: /* ?? */ - case 2: /* ustat */ - case 3: /* ?? */ - case 4: /* sethostname */ - default: - error = EINVAL; - break; - } - return (error); -} - -struct hpux_sysconf_args { - int name; -}; -hpux_sysconf(p, uap, retval) - struct proc *p; - struct hpux_sysconf_args *uap; - int *retval; -{ - switch (uap->name) { - - /* clock ticks per second */ - case HPUX_SYSCONF_CLKTICK: - *retval = hz; - break; - - /* open files */ - case HPUX_SYSCONF_OPENMAX: - *retval = NOFILE; - break; - - /* architecture */ - case HPUX_SYSCONF_CPUTYPE: - switch (machineid) { - case HP_320: - case HP_330: - case HP_350: - *retval = HPUX_SYSCONF_CPUM020; - break; - case HP_340: - case HP_360: - case HP_370: - case HP_375: - *retval = HPUX_SYSCONF_CPUM030; - break; - case HP_380: - case HP_433: - *retval = HPUX_SYSCONF_CPUM040; - break; - } - break; - default: - uprintf("HP-UX sysconf(%d) not implemented\n", uap->name); - return (EINVAL); - } - return (0); -} - -struct hpux_stat_args { - char *fname; - struct hpux_stat *hsb; -}; -hpux_stat(p, uap, retval) - struct proc *p; - struct hpux_stat_args *uap; - int *retval; -{ - return (hpux_stat1(uap->fname, uap->hsb, FOLLOW, p)); -} - -struct hpux_lstat_args { - char *fname; - struct hpux_stat *hsb; -}; -hpux_lstat(p, uap, retval) - struct proc *p; - struct hpux_lstat_args *uap; - int *retval; -{ - return (hpux_stat1(uap->fname, uap->hsb, NOFOLLOW, p)); -} - -struct hpux_fstat_args { - int fdes; - struct hpux_stat *hsb; -}; -hpux_fstat(p, uap, retval) - struct proc *p; - register struct hpux_fstat_args *uap; - int *retval; -{ - register struct filedesc *fdp = p->p_fd; - register struct file *fp; - struct stat sb; - int error; - - if (((unsigned)uap->fdes) >= fdp->fd_nfiles || - (fp = fdp->fd_ofiles[uap->fdes]) == NULL) - return (EBADF); - - switch (fp->f_type) { - - case DTYPE_VNODE: - error = vn_stat((struct vnode *)fp->f_data, &sb, p); - break; - - case DTYPE_SOCKET: - error = soo_stat((struct socket *)fp->f_data, &sb, p); - break; - - default: - panic("fstat"); - /*NOTREACHED*/ - } - /* is this right for sockets?? */ - if (error == 0) - error = bsdtohpuxstat(&sb, uap->hsb); - return (error); -} - -struct hpux_ulimit_args { - int cmd; - long newlimit; -}; -hpux_ulimit(p, uap, retval) - struct proc *p; - register struct hpux_ulimit_args *uap; - long *retval; -{ - struct rlimit *limp; - int error = 0; - - limp = &p->p_rlimit[RLIMIT_FSIZE]; - switch (uap->cmd) { - case 2: - uap->newlimit *= 512; - if (uap->newlimit > limp->rlim_max && - (error = suser(p->p_ucred, &p->p_acflag))) - break; - limp->rlim_cur = limp->rlim_max = uap->newlimit; - /* else fall into... */ - - case 1: - *retval = limp->rlim_max / 512; - break; - - case 3: - limp = &p->p_rlimit[RLIMIT_DATA]; - *retval = ctob(p->p_vmspace->vm_tsize) + limp->rlim_max; - break; - - default: - error = EINVAL; - break; - } - return (error); -} - -/* - * Map "real time" priorities 0 (high) thru 127 (low) into nice - * values -16 (high) thru -1 (low). - */ -struct hpux_rtprio_args { - int pid; - int prio; -}; -hpux_rtprio(cp, uap, retval) - struct proc *cp; - register struct hpux_rtprio_args *uap; - int *retval; -{ - struct proc *p; - int nice, error; - - if (uap->prio < RTPRIO_MIN && uap->prio > RTPRIO_MAX && - uap->prio != RTPRIO_NOCHG && uap->prio != RTPRIO_RTOFF) - return (EINVAL); - if (uap->pid == 0) - p = cp; - else if ((p = pfind(uap->pid)) == 0) - return (ESRCH); - nice = p->p_nice; - if (nice < NZERO) - *retval = (nice + 16) << 3; - else - *retval = RTPRIO_RTOFF; - switch (uap->prio) { - - case RTPRIO_NOCHG: - return (0); - - case RTPRIO_RTOFF: - if (nice >= NZERO) - return (0); - nice = NZERO; - break; - - default: - nice = (uap->prio >> 3) - 16; - break; - } - error = donice(cp, p, nice); - if (error == EACCES) - error = EPERM; - return (error); -} - -struct hpux_advise_args { - int arg; -}; -hpux_advise(p, uap, retval) - struct proc *p; - struct hpux_advise_args *uap; - int *retval; -{ - int error = 0; - - switch (uap->arg) { - case 0: - p->p_md.md_flags |= MDP_HPUXMMAP; - break; - case 1: - ICIA(); - break; - case 2: - DCIA(); - break; - default: - error = EINVAL; - break; - } - return (error); -} - -struct hpux_ptrace_args { - int req; - int pid; - int *addr; - int data; -}; -hpux_ptrace(p, uap, retval) - struct proc *p; - struct hpux_ptrace_args *uap; - int *retval; -{ - int error, isps = 0; - struct proc *cp; - - switch (uap->req) { - /* map signal */ - case PT_STEP: - case PT_CONTINUE: - if (uap->data) { - uap->data = hpuxtobsdsig(uap->data); - if (uap->data == 0) - uap->data = NSIG; - } - break; - /* map u-area offset */ - case PT_READ_U: - case PT_WRITE_U: - /* - * Big, cheezy hack: hpuxtobsduoff is really intended - * to be called in the child context (procxmt) but we - * do it here in the parent context to avoid hacks in - * the MI sys_process.c file. This works only because - * we can access the child's md_regs pointer and it - * has the correct value (the child has already trapped - * into the kernel). - */ - if ((cp = pfind(uap->pid)) == 0) - return (ESRCH); - uap->addr = (int *) hpuxtobsduoff(uap->addr, &isps, cp); - - /* - * Since HP-UX PS is only 16-bits in ar0, requests - * to write PS actually contain the PS in the high word - * and the high half of the PC (the following register) - * in the low word. Move the PS value to where BSD - * expects it. - */ - if (isps && uap->req == PT_WRITE_U) - uap->data >>= 16; - break; - } - error = ptrace(p, uap, retval); - /* - * Align PS as HP-UX expects it (see WRITE_U comment above). - * Note that we do not return the high part of PC like HP-UX - * would, but the HP-UX debuggers don't require it. - */ - if (isps && error == 0 && uap->req == PT_READ_U) - *retval <<= 16; - return (error); -} - -#ifdef SYSVSHM -#include - -hpux_shmctl(p, uap, retval) - struct proc *p; - int *uap, *retval; -{ - return (hpux_shmctl1(p, uap, retval, 0)); -} - -hpux_nshmctl(p, uap, retval) - struct proc *p; - int *uap, *retval; -{ - return (hpux_shmctl1(p, uap, retval, 1)); -} - -/* - * Handle HP-UX specific commands. - */ -struct hpux_shmctl_args { - int shmid; - int cmd; - caddr_t buf; -}; -hpux_shmctl1(p, uap, retval, isnew) - struct proc *p; - struct hpux_shmctl_args *uap; - int *retval; - int isnew; -{ - register struct shmid_ds *shp; - register struct ucred *cred = p->p_ucred; - struct hpux_shmid_ds sbuf; - int error; - - if (error = shmvalid(uap->shmid)) - return (error); - shp = &shmsegs[uap->shmid % SHMMMNI]; - switch (uap->cmd) { - case SHM_LOCK: - case SHM_UNLOCK: - /* don't really do anything, but make them think we did */ - if (cred->cr_uid && cred->cr_uid != shp->shm_perm.uid && - cred->cr_uid != shp->shm_perm.cuid) - return (EPERM); - return (0); - - case IPC_STAT: - if (!isnew) - break; - error = ipcaccess(&shp->shm_perm, IPC_R, cred); - if (error == 0) { - sbuf.shm_perm.uid = shp->shm_perm.uid; - sbuf.shm_perm.gid = shp->shm_perm.gid; - sbuf.shm_perm.cuid = shp->shm_perm.cuid; - sbuf.shm_perm.cgid = shp->shm_perm.cgid; - sbuf.shm_perm.mode = shp->shm_perm.mode; - sbuf.shm_perm.seq = shp->shm_perm.seq; - sbuf.shm_perm.key = shp->shm_perm.key; - sbuf.shm_segsz = shp->shm_segsz; - sbuf.shm_ptbl = shp->shm_handle; /* XXX */ - sbuf.shm_lpid = shp->shm_lpid; - sbuf.shm_cpid = shp->shm_cpid; - sbuf.shm_nattch = shp->shm_nattch; - sbuf.shm_cnattch = shp->shm_nattch; /* XXX */ - sbuf.shm_atime = shp->shm_atime; - sbuf.shm_dtime = shp->shm_dtime; - sbuf.shm_ctime = shp->shm_ctime; - error = copyout((caddr_t)&sbuf, uap->buf, sizeof sbuf); - } - return (error); - - case IPC_SET: - if (!isnew) - break; - if (cred->cr_uid && cred->cr_uid != shp->shm_perm.uid && - cred->cr_uid != shp->shm_perm.cuid) { - return (EPERM); - } - error = copyin(uap->buf, (caddr_t)&sbuf, sizeof sbuf); - if (error == 0) { - shp->shm_perm.uid = sbuf.shm_perm.uid; - shp->shm_perm.gid = sbuf.shm_perm.gid; - shp->shm_perm.mode = (shp->shm_perm.mode & ~0777) - | (sbuf.shm_perm.mode & 0777); - shp->shm_ctime = time.tv_sec; - } - return (error); - } - return (shmctl(p, uap, retval)); -} -#endif - -/* - * HP-UX mmap() emulation (mainly for shared library support). - */ -struct hpux_mmap_args { - caddr_t addr; - int len; - int prot; - int flags; - int fd; - long pos; -}; -hpux_mmap(p, uap, retval) - struct proc *p; - struct hpux_mmap_args *uap; - int *retval; -{ - struct mmap_args { - caddr_t addr; - int len; - int prot; - int flags; - int fd; - long pad; - off_t pos; - } nargs; - - nargs.addr = uap->addr; - nargs.len = uap->len; - nargs.prot = uap->prot; - nargs.flags = uap->flags & - ~(HPUXMAP_FIXED|HPUXMAP_REPLACE|HPUXMAP_ANON); - if (uap->flags & HPUXMAP_FIXED) - nargs.flags |= MAP_FIXED; - if (uap->flags & HPUXMAP_ANON) - nargs.flags |= MAP_ANON; - nargs.fd = (nargs.flags & MAP_ANON) ? -1 : uap->fd; - nargs.pos = uap->pos; - return (mmap(p, &nargs, retval)); -} - -/* convert from BSD to HP-UX errno */ -bsdtohpuxerrno(err) - int err; -{ - if (err < 0 || err >= NERR) - return(BERR); - return((int)bsdtohpuxerrnomap[err]); -} - -hpux_stat1(fname, hsb, follow, p) - char *fname; - struct hpux_stat *hsb; - int follow; - struct proc *p; -{ - int error; - struct stat sb; - struct nameidata nd; - - NDINIT(&nd, LOOKUP, follow | LOCKLEAF, UIO_USERSPACE, fname, p); - if (error = namei(&nd)) - return (error); - error = vn_stat(nd.ni_vp, &sb, p); - vput(nd.ni_vp); - if (error == 0) - error = bsdtohpuxstat(&sb, hsb); - return (error); -} - -#include "grf.h" -#if NGRF > 0 -#ifdef __STDC__ -extern int grfopen(dev_t dev, int oflags, int devtype, struct proc *p); -#else -extern int grfopen(); -#endif -#endif - -#define NHIL 1 /* XXX */ -#if NHIL > 0 -#ifdef __STDC__ -extern int hilopen(dev_t dev, int oflags, int devtype, struct proc *p); -#else -extern int hilopen(); -#endif -#endif - -#include - -bsdtohpuxstat(sb, hsb) - struct stat *sb; - struct hpux_stat *hsb; -{ - struct hpux_stat ds; - - bzero((caddr_t)&ds, sizeof(ds)); - ds.hst_dev = (u_short)sb->st_dev; - ds.hst_ino = (u_long)sb->st_ino; - ds.hst_mode = sb->st_mode; - ds.hst_nlink = sb->st_nlink; - ds.hst_uid = (u_short)sb->st_uid; - ds.hst_gid = (u_short)sb->st_gid; - ds.hst_rdev = bsdtohpuxdev(sb->st_rdev); - - /* XXX: I don't want to talk about it... */ - if ((sb->st_mode & S_IFMT) == S_IFCHR) { -#if NGRF > 0 - if (cdevsw[major(sb->st_rdev)].d_open == grfopen) - ds.hst_rdev = grfdevno(sb->st_rdev); -#endif -#if NHIL > 0 - if (cdevsw[major(sb->st_rdev)].d_open == hilopen) - ds.hst_rdev = hildevno(sb->st_rdev); -#endif - ; - } - if (sb->st_size < (quad_t)1 << 32) - ds.hst_size = (long)sb->st_size; - else - ds.hst_size = -2; - ds.hst_atime = sb->st_atime; - ds.hst_mtime = sb->st_mtime; - ds.hst_ctime = sb->st_ctime; - ds.hst_blksize = sb->st_blksize; - ds.hst_blocks = sb->st_blocks; - return(copyout((caddr_t)&ds, (caddr_t)hsb, sizeof(ds))); -} - -hpuxtobsdioctl(com) - int com; -{ - switch (com) { - case HPUXTIOCSLTC: - com = TIOCSLTC; break; - case HPUXTIOCGLTC: - com = TIOCGLTC; break; - case HPUXTIOCSPGRP: - com = TIOCSPGRP; break; - case HPUXTIOCGPGRP: - com = TIOCGPGRP; break; - case HPUXTIOCLBIS: - com = TIOCLBIS; break; - case HPUXTIOCLBIC: - com = TIOCLBIC; break; - case HPUXTIOCLSET: - com = TIOCLSET; break; - case HPUXTIOCLGET: - com = TIOCLGET; break; - case HPUXTIOCGWINSZ: - com = TIOCGWINSZ; break; - case HPUXTIOCSWINSZ: - com = TIOCSWINSZ; break; - } - return(com); -} - -/* - * HP-UX ioctl system call. The differences here are: - * IOC_IN also means IOC_VOID if the size portion is zero. - * no FIOCLEX/FIONCLEX/FIOASYNC/FIOGETOWN/FIOSETOWN - * the sgttyb struct is 2 bytes longer - */ -struct hpux_ioctl_args { - int fdes; - int cmd; - caddr_t cmarg; -}; -hpux_ioctl(p, uap, retval) - struct proc *p; - register struct hpux_ioctl_args *uap; - int *retval; -{ - register struct filedesc *fdp = p->p_fd; - register struct file *fp; - register int com, error; - register u_int size; - caddr_t memp = 0; -#define STK_PARAMS 128 - char stkbuf[STK_PARAMS]; - caddr_t data = stkbuf; - - com = uap->cmd; - -#ifdef COMPAT_OHPUX - /* XXX */ - if (com == HPUXTIOCGETP || com == HPUXTIOCSETP) - return (getsettty(p, uap->fdes, com, uap->cmarg)); -#endif - - if (((unsigned)uap->fdes) >= fdp->fd_nfiles || - (fp = fdp->fd_ofiles[uap->fdes]) == NULL) - return (EBADF); - if ((fp->f_flag & (FREAD|FWRITE)) == 0) - return (EBADF); - - /* - * Interpret high order word to find - * amount of data to be copied to/from the - * user's address space. - */ - size = IOCPARM_LEN(com); - if (size > IOCPARM_MAX) - return (ENOTTY); - if (size > sizeof (stkbuf)) { - memp = (caddr_t)malloc((u_long)size, M_IOCTLOPS, M_WAITOK); - data = memp; - } - if (com&IOC_IN) { - if (size) { - error = copyin(uap->cmarg, data, (u_int)size); - if (error) { - if (memp) - free(memp, M_IOCTLOPS); - return (error); - } - } else - *(caddr_t *)data = uap->cmarg; - } else if ((com&IOC_OUT) && size) - /* - * Zero the buffer so the user always - * gets back something deterministic. - */ - bzero(data, size); - else if (com&IOC_VOID) - *(caddr_t *)data = uap->cmarg; - - switch (com) { - - case HPUXFIOSNBIO: - { - char *ofp = &fdp->fd_ofileflags[uap->fdes]; - int tmp; - - if (*(int *)data) - *ofp |= UF_FIONBIO_ON; - else - *ofp &= ~UF_FIONBIO_ON; - /* - * Only set/clear if O_NONBLOCK/FNDELAY not in effect - */ - if ((*ofp & (UF_NONBLOCK_ON|UF_FNDELAY_ON)) == 0) { - tmp = *ofp & UF_FIONBIO_ON; - error = (*fp->f_ops->fo_ioctl)(fp, FIONBIO, - (caddr_t)&tmp, p); - } - break; - } - - case HPUXTIOCCONS: - *(int *)data = 1; - error = (*fp->f_ops->fo_ioctl)(fp, TIOCCONS, data, p); - break; - - /* BSD-style job control ioctls */ - case HPUXTIOCLBIS: - case HPUXTIOCLBIC: - case HPUXTIOCLSET: - *(int *)data &= HPUXLTOSTOP; - if (*(int *)data & HPUXLTOSTOP) - *(int *)data = LTOSTOP; - /* fall into */ - - /* simple mapping cases */ - case HPUXTIOCLGET: - case HPUXTIOCSLTC: - case HPUXTIOCGLTC: - case HPUXTIOCSPGRP: - case HPUXTIOCGPGRP: - case HPUXTIOCGWINSZ: - case HPUXTIOCSWINSZ: - error = (*fp->f_ops->fo_ioctl) - (fp, hpuxtobsdioctl(com), data, p); - if (error == 0 && com == HPUXTIOCLGET) { - *(int *)data &= LTOSTOP; - if (*(int *)data & LTOSTOP) - *(int *)data = HPUXLTOSTOP; - } - break; - - /* SYS 5 termio and POSIX termios */ - case HPUXTCGETA: - case HPUXTCSETA: - case HPUXTCSETAW: - case HPUXTCSETAF: - case HPUXTCGETATTR: - case HPUXTCSETATTR: - case HPUXTCSETATTRD: - case HPUXTCSETATTRF: - error = hpux_termio(uap->fdes, com, data, p); - break; - - default: - error = (*fp->f_ops->fo_ioctl)(fp, com, data, p); - break; - } - /* - * Copy any data to user, size was - * already set and checked above. - */ - if (error == 0 && (com&IOC_OUT) && size) - error = copyout(data, uap->cmarg, (u_int)size); - if (memp) - free(memp, M_IOCTLOPS); - return (error); -} - -/* - * Man page lies, behaviour here is based on observed behaviour. - */ -struct hpux_getcontext_args { - char *buf; - int len; -}; -hpux_getcontext(p, uap, retval) - struct proc *p; - struct hpux_getcontext_args *uap; - int *retval; -{ - int error = 0; - register int len; - -#if defined(HP380) - if (machineid == HP_380) { - len = min(uap->len, sizeof(hpux_040context)); - if (len) - error = copyout(hpux_040context, uap->buf, len); - if (error == 0) - *retval = sizeof(hpux_040context); - return (error); - } -#endif - len = min(uap->len, sizeof(hpux_context)); - if (len) - error = copyout(hpux_context, uap->buf, (u_int)len); - if (error == 0) - *retval = sizeof(hpux_context); - return (error); -} - -/* - * This is the equivalent of BSD getpgrp but with more restrictions. - * Note we do not check the real uid or "saved" uid. - */ -struct hpux_getpgrp2_args { - int pid; -}; -hpux_getpgrp2(cp, uap, retval) - struct proc *cp; - register struct hpux_getpgrp2_args *uap; - int *retval; -{ - register struct proc *p; - - if (uap->pid == 0) - uap->pid = cp->p_pid; - p = pfind(uap->pid); - if (p == 0) - return (ESRCH); - if (cp->p_ucred->cr_uid && p->p_ucred->cr_uid != cp->p_ucred->cr_uid && - !inferior(p)) - return (EPERM); - *retval = p->p_pgid; - return (0); -} - -/* - * This is the equivalent of BSD setpgrp but with more restrictions. - * Note we do not check the real uid or "saved" uid or pgrp. - */ -struct hpux_setpgrp2_args { - int pid; - int pgrp; -}; -hpux_setpgrp2(p, uap, retval) - struct proc *p; - struct hpux_setpgrp2_args *uap; - int *retval; -{ - /* empirically determined */ - if (uap->pgrp < 0 || uap->pgrp >= 30000) - return (EINVAL); - return (setpgid(p, uap, retval)); -} - -/* - * XXX Same as BSD setre[ug]id right now. Need to consider saved ids. - */ -struct hpux_setresuid_args { - int ruid; - int euid; - int suid; -}; -hpux_setresuid(p, uap, retval) - struct proc *p; - struct hpux_setresuid_args *uap; - int *retval; -{ - return (osetreuid(p, uap, retval)); -} - -struct hpux_setresgid_args { - int rgid; - int egid; - int sgid; -}; -hpux_setresgid(p, uap, retval) - struct proc *p; - struct hpux_setresgid_args *uap; - int *retval; -{ - return (osetregid(p, uap, retval)); -} - -struct hpux_rlimit_args { - u_int which; - struct orlimit *rlp; -}; -hpux_getrlimit(p, uap, retval) - struct proc *p; - struct hpux_rlimit_args *uap; - int *retval; -{ - if (uap->which > HPUXRLIMIT_NOFILE) - return (EINVAL); - if (uap->which == HPUXRLIMIT_NOFILE) - uap->which = RLIMIT_NOFILE; - return (ogetrlimit(p, uap, retval)); -} - -hpux_setrlimit(p, uap, retval) - struct proc *p; - struct hpux_rlimit_args *uap; - int *retval; -{ - if (uap->which > HPUXRLIMIT_NOFILE) - return (EINVAL); - if (uap->which == HPUXRLIMIT_NOFILE) - uap->which = RLIMIT_NOFILE; - return (osetrlimit(p, uap, retval)); -} - -/* - * XXX: simple recognition hack to see if we can make grmd work. - */ -struct hpux_lockf_args { - int fd; - int func; - long size; -}; -hpux_lockf(p, uap, retval) - struct proc *p; - struct hpux_lockf_args *uap; - int *retval; -{ - return (0); -} - -struct hpux_getaccess_args { - char *path; - int uid; - int ngroups; - int *gidset; - void *label; - void *privs; -}; -hpux_getaccess(p, uap, retval) - register struct proc *p; - register struct hpux_getaccess_args *uap; - int *retval; -{ - int lgroups[NGROUPS]; - int error = 0; - register struct ucred *cred; - register struct vnode *vp; - struct nameidata nd; - - /* - * Build an appropriate credential structure - */ - cred = crdup(p->p_ucred); - switch (uap->uid) { - case 65502: /* UID_EUID */ - break; - case 65503: /* UID_RUID */ - cred->cr_uid = p->p_cred->p_ruid; - break; - case 65504: /* UID_SUID */ - error = EINVAL; - break; - default: - if (uap->uid > 65504) - error = EINVAL; - cred->cr_uid = uap->uid; - break; - } - switch (uap->ngroups) { - case -1: /* NGROUPS_EGID */ - cred->cr_ngroups = 1; - break; - case -5: /* NGROUPS_EGID_SUPP */ - break; - case -2: /* NGROUPS_RGID */ - cred->cr_ngroups = 1; - cred->cr_gid = p->p_cred->p_rgid; - break; - case -6: /* NGROUPS_RGID_SUPP */ - cred->cr_gid = p->p_cred->p_rgid; - break; - case -3: /* NGROUPS_SGID */ - case -7: /* NGROUPS_SGID_SUPP */ - error = EINVAL; - break; - case -4: /* NGROUPS_SUPP */ - if (cred->cr_ngroups > 1) - cred->cr_gid = cred->cr_groups[1]; - else - error = EINVAL; - break; - default: - if (uap->ngroups > 0 && uap->ngroups <= NGROUPS) - error = copyin((caddr_t)uap->gidset, - (caddr_t)&lgroups[0], - uap->ngroups * sizeof(lgroups[0])); - else - error = EINVAL; - if (error == 0) { - int gid; - - for (gid = 0; gid < uap->ngroups; gid++) - cred->cr_groups[gid] = lgroups[gid]; - cred->cr_ngroups = uap->ngroups; - } - break; - } - /* - * Lookup file using caller's effective IDs. - */ - if (error == 0) { - NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_USERSPACE, - uap->path, p); - error = namei(&nd); - } - if (error) { - crfree(cred); - return (error); - } - /* - * Use the constructed credentials for access checks. - */ - vp = nd.ni_vp; - *retval = 0; - if (VOP_ACCESS(vp, VREAD, cred, p) == 0) - *retval |= R_OK; - if (vn_writechk(vp) == 0 && VOP_ACCESS(vp, VWRITE, cred, p) == 0) - *retval |= W_OK; - /* XXX we return X_OK for root on VREG even if not */ - if (VOP_ACCESS(vp, VEXEC, cred, p) == 0) - *retval |= X_OK; - vput(vp); - crfree(cred); - return (error); -} - -extern char kstack[]; -#define UOFF(f) ((int)&((struct user *)0)->f) -#define HPUOFF(f) ((int)&((struct hpux_user *)0)->f) - -/* simplified FP structure */ -struct bsdfp { - int save[54]; - int reg[24]; - int ctrl[3]; -}; - -/* - * Brutal hack! Map HP-UX u-area offsets into BSD k-stack offsets. - */ -hpuxtobsduoff(off, isps, p) - int *off, *isps; - struct proc *p; -{ - register int *ar0 = p->p_md.md_regs; - struct hpux_fp *hp; - struct bsdfp *bp; - register u_int raddr; - - *isps = 0; - - /* u_ar0 field; procxmt puts in U_ar0 */ - if ((int)off == HPUOFF(hpuxu_ar0)) - return(UOFF(U_ar0)); - -#ifdef FPCOPROC - /* FP registers from PCB */ - hp = (struct hpux_fp *)HPUOFF(hpuxu_fp); - bp = (struct bsdfp *)UOFF(u_pcb.pcb_fpregs); - if (off >= hp->hpfp_ctrl && off < &hp->hpfp_ctrl[3]) - return((int)&bp->ctrl[off - hp->hpfp_ctrl]); - if (off >= hp->hpfp_reg && off < &hp->hpfp_reg[24]) - return((int)&bp->reg[off - hp->hpfp_reg]); -#endif - - /* - * Everything else we recognize comes from the kernel stack, - * so we convert off to an absolute address (if not already) - * for simplicity. - */ - if (off < (int *)ctob(UPAGES)) - off = (int *)((u_int)off + (u_int)kstack); - - /* - * General registers. - * We know that the HP-UX registers are in the same order as ours. - * The only difference is that their PS is 2 bytes instead of a - * padded 4 like ours throwing the alignment off. - */ - if (off >= ar0 && off < &ar0[18]) { - /* - * PS: return low word and high word of PC as HP-UX would - * (e.g. &u.u_ar0[16.5]). - * - * XXX we don't do this since HP-UX adb doesn't rely on - * it and passing such an offset to procxmt will cause - * it to fail anyway. Instead, we just set the offset - * to PS and let hpux_ptrace() shift up the value returned. - */ - if (off == &ar0[PS]) { -#if 0 - raddr = (u_int) &((short *)ar0)[PS*2+1]; -#else - raddr = (u_int) &ar0[(int)(off - ar0)]; -#endif - *isps = 1; - } - /* - * PC: off will be &u.u_ar0[16.5] since HP-UX saved PS - * is only 16 bits. - */ - else if (off == (int *)&(((short *)ar0)[PS*2+1])) - raddr = (u_int) &ar0[PC]; - /* - * D0-D7, A0-A7: easy - */ - else - raddr = (u_int) &ar0[(int)(off - ar0)]; - return((int)(raddr - (u_int)kstack)); - } - - /* everything else */ - return(-1); -} - -/* - * Kludge up a uarea dump so that HP-UX debuggers can find out - * what they need. IMPORTANT NOTE: we do not EVEN attempt to - * convert the entire user struct. - */ -hpux_dumpu(vp, cred) - struct vnode *vp; - struct ucred *cred; -{ - struct proc *p = curproc; - int error; - struct hpux_user *faku; - struct bsdfp *bp; - short *foop; - - faku = (struct hpux_user *)malloc((u_long)ctob(1), M_TEMP, M_WAITOK); - /* - * Make sure there is no mistake about this - * being a real user structure. - */ - bzero((caddr_t)faku, ctob(1)); - /* - * Fill in the process sizes. - */ - faku->hpuxu_tsize = p->p_vmspace->vm_tsize; - faku->hpuxu_dsize = p->p_vmspace->vm_dsize; - faku->hpuxu_ssize = p->p_vmspace->vm_ssize; - /* - * Fill in the exec header for CDB. - * This was saved back in exec(). As far as I can tell CDB - * only uses this information to verify that a particular - * core file goes with a particular binary. - */ - bcopy((caddr_t)p->p_addr->u_md.md_exec, - (caddr_t)&faku->hpuxu_exdata, sizeof (struct hpux_exec)); - /* - * Adjust user's saved registers (on kernel stack) to reflect - * HP-UX order. Note that HP-UX saves the SR as 2 bytes not 4 - * so we have to move it up. - */ - faku->hpuxu_ar0 = p->p_md.md_regs; - foop = (short *) p->p_md.md_regs; - foop[32] = foop[33]; - foop[33] = foop[34]; - foop[34] = foop[35]; -#ifdef FPCOPROC - /* - * Copy 68881 registers from our PCB format to HP-UX format - */ - bp = (struct bsdfp *) &p->p_addr->u_pcb.pcb_fpregs; - bcopy((caddr_t)bp->save, (caddr_t)faku->hpuxu_fp.hpfp_save, - sizeof(bp->save)); - bcopy((caddr_t)bp->ctrl, (caddr_t)faku->hpuxu_fp.hpfp_ctrl, - sizeof(bp->ctrl)); - bcopy((caddr_t)bp->reg, (caddr_t)faku->hpuxu_fp.hpfp_reg, - sizeof(bp->reg)); -#endif - /* - * Slay the dragon - */ - faku->hpuxu_dragon = -1; - /* - * Dump this artfully constructed page in place of the - * user struct page. - */ - error = vn_rdwr(UIO_WRITE, vp, (caddr_t)faku, ctob(1), (off_t)0, - UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, cred, - (int *)NULL, p); - /* - * Dump the remaining UPAGES-1 pages normally - */ - if (!error) - error = vn_rdwr(UIO_WRITE, vp, kstack + ctob(1), - ctob(UPAGES-1), (off_t)ctob(1), UIO_SYSSPACE, - IO_NODELOCKED|IO_UNIT, cred, (int *)NULL, p); - free((caddr_t)faku, M_TEMP); - return(error); -} - -/* - * The remaining routines are essentially the same as those in kern_xxx.c - * and vfs_xxx.c as defined under "#ifdef COMPAT". We replicate them here - * to avoid COMPAT_HPUX dependencies in those files and to make sure that - * HP-UX compatibility still works even when COMPAT is not defined. - * - * These are still needed as of HP-UX 7.05. - */ -#ifdef COMPAT_OHPUX - -#define HPUX_HZ 50 - -#include "sys/times.h" - -/* from old timeb.h */ -struct hpux_timeb { - time_t time; - u_short millitm; - short timezone; - short dstflag; -}; - -/* ye ole stat structure */ -struct ohpux_stat { - u_short ohst_dev; - u_short ohst_ino; - u_short ohst_mode; - short ohst_nlink; - short ohst_uid; - short ohst_gid; - u_short ohst_rdev; - int ohst_size; - int ohst_atime; - int ohst_mtime; - int ohst_ctime; -}; - -/* - * SYS V style setpgrp() - */ -ohpux_setpgrp(p, uap, retval) - register struct proc *p; - int *uap, *retval; -{ - if (p->p_pid != p->p_pgid) - enterpgrp(p, p->p_pid, 0); - *retval = p->p_pgid; - return (0); -} - -struct ohpux_time_args { - long *tp; -}; -ohpux_time(p, uap, retval) - struct proc *p; - register struct ohpux_time_args *uap; - int *retval; -{ - int error = 0; - - if (uap->tp) - error = copyout((caddr_t)&time.tv_sec, (caddr_t)uap->tp, - sizeof (long)); - *(time_t *)retval = time.tv_sec; - return (error); -} - -struct ohpux_stime_args { - int time; -}; -ohpux_stime(p, uap, retval) - struct proc *p; - register struct ohpux_stime_args *uap; - int *retval; -{ - struct timeval tv; - int s, error; - - tv.tv_sec = uap->time; - tv.tv_usec = 0; - if (error = suser(p->p_ucred, &p->p_acflag)) - return (error); - - /* WHAT DO WE DO ABOUT PENDING REAL-TIME TIMEOUTS??? */ - boottime.tv_sec += tv.tv_sec - time.tv_sec; - s = splhigh(); time = tv; splx(s); - resettodr(); - return (0); -} - -struct ohpux_ftime_args { - struct hpux_timeb *tp; -}; -ohpux_ftime(p, uap, retval) - struct proc *p; - register struct ohpux_ftime_args *uap; - int *retval; -{ - struct hpux_timeb tb; - int s; - - s = splhigh(); - tb.time = time.tv_sec; - tb.millitm = time.tv_usec / 1000; - splx(s); - tb.timezone = tz.tz_minuteswest; - tb.dstflag = tz.tz_dsttime; - return (copyout((caddr_t)&tb, (caddr_t)uap->tp, sizeof (tb))); -} - -struct ohpux_alarm_args { - int deltat; -}; -ohpux_alarm(p, uap, retval) - register struct proc *p; - register struct ohpux_alarm_args *uap; - int *retval; -{ - int s = splhigh(); - - untimeout(realitexpire, (caddr_t)p); - timerclear(&p->p_realtimer.it_interval); - *retval = 0; - if (timerisset(&p->p_realtimer.it_value) && - timercmp(&p->p_realtimer.it_value, &time, >)) - *retval = p->p_realtimer.it_value.tv_sec - time.tv_sec; - if (uap->deltat == 0) { - timerclear(&p->p_realtimer.it_value); - splx(s); - return (0); - } - p->p_realtimer.it_value = time; - p->p_realtimer.it_value.tv_sec += uap->deltat; - timeout(realitexpire, (caddr_t)p, hzto(&p->p_realtimer.it_value)); - splx(s); - return (0); -} - -struct ohpux_nice_args { - int niceness; -}; -ohpux_nice(p, uap, retval) - register struct proc *p; - register struct ohpux_nice_args *uap; - int *retval; -{ - int error; - - error = donice(p, p, (p->p_nice-NZERO)+uap->niceness); - if (error == 0) - *retval = p->p_nice - NZERO; - return (error); -} - -struct ohpux_times_args { - struct tms *tmsb; -}; -ohpux_times(p, uap, retval) - struct proc *p; - register struct ohpux_times_args *uap; - int *retval; -{ - struct timeval ru, rs; - struct tms atms; - int error; - - calcru(p, &ru, &rs, NULL); - atms.tms_utime = hpux_scale(&ru); - atms.tms_stime = hpux_scale(&rs); - atms.tms_cutime = hpux_scale(&p->p_stats->p_cru.ru_utime); - atms.tms_cstime = hpux_scale(&p->p_stats->p_cru.ru_stime); - error = copyout((caddr_t)&atms, (caddr_t)uap->tmsb, sizeof (atms)); - if (error == 0) - *(time_t *)retval = hpux_scale(&time) - hpux_scale(&boottime); - return (error); -} - -/* - * Doesn't exactly do what the documentation says. - * What we really do is return 1/HPUX_HZ-th of a second since that - * is what HP-UX returns. - */ -hpux_scale(tvp) - register struct timeval *tvp; -{ - return (tvp->tv_sec * HPUX_HZ + tvp->tv_usec * HPUX_HZ / 1000000); -} - -/* - * Set IUPD and IACC times on file. - * Can't set ICHG. - */ -struct ohpux_utime_args { - char *fname; - time_t *tptr; -}; -ohpux_utime(p, uap, retval) - struct proc *p; - register struct ohpux_utime_args *uap; - int *retval; -{ - register struct vnode *vp; - struct vattr vattr; - time_t tv[2]; - int error; - struct nameidata nd; - - if (uap->tptr) { - error = copyin((caddr_t)uap->tptr, (caddr_t)tv, sizeof (tv)); - if (error) - return (error); - } else - tv[0] = tv[1] = time.tv_sec; - vattr_null(&vattr); - vattr.va_atime.ts_sec = tv[0]; - vattr.va_atime.ts_nsec = 0; - vattr.va_mtime.ts_sec = tv[1]; - vattr.va_mtime.ts_nsec = 0; - NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_USERSPACE, uap->fname, p); - if (error = namei(&nd)) - return (error); - vp = nd.ni_vp; - if (vp->v_mount->mnt_flag & MNT_RDONLY) - error = EROFS; - else - error = VOP_SETATTR(vp, &vattr, nd.ni_cnd.cn_cred, p); - vput(vp); - return (error); -} - -ohpux_pause(p, uap, retval) - struct proc *p; - int *uap, *retval; -{ - (void) tsleep(kstack, PPAUSE | PCATCH, "pause", 0); - /* always return EINTR rather than ERESTART... */ - return (EINTR); -} - -/* - * The old fstat system call. - */ -struct ohpux_fstat_args { - int fd; - struct ohpux_stat *sb; -}; -ohpux_fstat(p, uap, retval) - struct proc *p; - register struct ohpux_fstat_args *uap; - int *retval; -{ - register struct filedesc *fdp = p->p_fd; - struct file *fp; - - if (((unsigned)uap->fd) >= fdp->fd_nfiles || - (fp = fdp->fd_ofiles[uap->fd]) == NULL) - return (EBADF); - if (fp->f_type != DTYPE_VNODE) - return (EINVAL); - return (ohpux_stat1((struct vnode *)fp->f_data, uap->sb, p)); -} - -/* - * Old stat system call. This version follows links. - */ -struct ohpux_stat_args { - char *fname; - struct ohpux_stat *sb; -}; -ohpux_stat(p, uap, retval) - struct proc *p; - register struct ohpux_stat_args *uap; - int *retval; -{ - int error; - struct nameidata nd; - - NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_USERSPACE, uap->fname, p); - if (error = namei(&nd)) - return (error); - error = ohpux_stat1(nd.ni_vp, uap->sb, p); - vput(nd.ni_vp); - return (error); -} - -int -ohpux_stat1(vp, ub, p) - struct vnode *vp; - struct ohpux_stat *ub; - struct proc *p; -{ - struct ohpux_stat ohsb; - struct stat sb; - int error; - - error = vn_stat(vp, &sb, p); - if (error) - return (error); - - ohsb.ohst_dev = sb.st_dev; - ohsb.ohst_ino = sb.st_ino; - ohsb.ohst_mode = sb.st_mode; - ohsb.ohst_nlink = sb.st_nlink; - ohsb.ohst_uid = sb.st_uid; - ohsb.ohst_gid = sb.st_gid; - ohsb.ohst_rdev = sb.st_rdev; - if (sb.st_size < (quad_t)1 << 32) - ohsb.ohst_size = sb.st_size; - else - ohsb.ohst_size = -2; - ohsb.ohst_atime = sb.st_atime; - ohsb.ohst_mtime = sb.st_mtime; - ohsb.ohst_ctime = sb.st_ctime; - return (copyout((caddr_t)&ohsb, (caddr_t)ub, sizeof(ohsb))); -} -#endif diff --git a/sys/arch/hp300/hpux/hpux_exec.h b/sys/arch/hp300/hpux/hpux_exec.h deleted file mode 100644 index 1f174d56ad60..000000000000 --- a/sys/arch/hp300/hpux/hpux_exec.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 1988 University of Utah. - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * the Systems Programming Group of the University of Utah Computer - * Science Department. - * - * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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. - * - * from: Utah $Hdr: hpux_exec.h 1.6 92/01/20$ - * - * from: @(#)hpux_exec.h 8.1 (Berkeley) 6/10/93 - * $Id: hpux_exec.h,v 1.4 1994/05/23 08:04:17 mycroft Exp $ - */ - -/* - * HPUX a.out header format - */ -struct hpux_exec { - long ha_magic; /* magic number */ - short ha_version; /* version ID */ - short ha_pad0; /* doesn't matter */ - long ha_misc; /* misc. info */ -unsigned long ha_text; /* size of text segment */ -unsigned long ha_data; /* size of initialized data */ -unsigned long ha_bss; /* size of uninitialized data */ -unsigned long ha_pad2[5]; /* doesn't matter */ -unsigned long ha_entry; /* entry point */ -unsigned long ha_pad3[4]; /* doesn't matter */ -}; - -#define HPUXM_VALID 0x00000001 -#define HPUXM_STKWT 0x02000000 -#define HPUXM_DATAWT 0x04000000 diff --git a/sys/arch/hp300/hpux/hpux_net.c b/sys/arch/hp300/hpux/hpux_net.c deleted file mode 100644 index 43daea0d539f..000000000000 --- a/sys/arch/hp300/hpux/hpux_net.c +++ /dev/null @@ -1,291 +0,0 @@ -/* - * Copyright (c) 1988 University of Utah. - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * the Systems Programming Group of the University of Utah Computer - * Science Department. - * - * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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. - * - * from: Utah $Hdr: hpux_net.c 1.8 93/08/02$ - * - * from: @(#)hpux_net.c 8.2 (Berkeley) 9/9/93 - * $Id: hpux_net.c,v 1.6 1994/05/23 08:04:18 mycroft Exp $ - */ - -/* - * Network related HP-UX compatibility routines - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#define MINBSDIPCCODE 0x3EE -#define NUMBSDIPC 32 - -/* - * HPUX netioctl() to BSD syscall map. - * Indexed by callno - MINBSDIPCCODE - */ -extern int socket(), listen(), bind(), oaccept(), connect(), orecv(); -extern int osend(), shutdown(), ogetsockname(), sendto(); -extern int orecvfrom(), ogetpeername(); -int hpux_getsockopt(), hpux_setsockopt(); - -struct hpuxtobsdipc { - int (*rout)(); - int nargs; -} hpuxtobsdipc[NUMBSDIPC] = { - socket, 3, /* 3ee */ listen, 2, /* 3ef */ - bind, 3, /* 3f0 */ oaccept, 3, /* 3f1 */ - connect, 3, /* 3f2 */ orecv, 4, /* 3f3 */ - osend, 4, /* 3f4 */ shutdown, 2, /* 3f5 */ - ogetsockname, 3, /* 3f6 */ hpux_setsockopt,5, /* 3f7 */ - sendto, 6, /* 3f8 */ orecvfrom, 6, /* 3f9 */ - ogetpeername, 3, /* 3fa */ NULL, 0, /* 3fb */ - NULL, 0, /* 3fc */ NULL, 0, /* 3fd */ - NULL, 0, /* 3fe */ NULL, 0, /* 3ff */ - NULL, 0, /* 400 */ NULL, 0, /* 401 */ - NULL, 0, /* 402 */ NULL, 0, /* 403 */ - NULL, 0, /* 404 */ NULL, 0, /* 405 */ - NULL, 0, /* 406 */ NULL, 0, /* 407 */ - NULL, 0, /* 408 */ NULL, 0, /* 409 */ - NULL, 0, /* 40a */ hpux_getsockopt,5, /* 40b */ - NULL, 0, /* 40c */ NULL, 0, /* 40d */ -}; - -/* - * Single system call entry to BSD style IPC. - * Gleened from disassembled libbsdipc.a syscall entries. - */ -struct hpux_netioctl_args { - int call; - int *args; -}; -hpux_netioctl(p, uap, retval) - struct proc *p; - struct hpux_netioctl_args *uap; - int *retval; -{ - int *args, i; - register int code; - int error; - - args = uap->args; - code = uap->call - MINBSDIPCCODE; - if (code < 0 || code >= NUMBSDIPC || hpuxtobsdipc[code].rout == NULL) - return (EINVAL); - if ((i = hpuxtobsdipc[code].nargs * sizeof (int)) && - (error = copyin((caddr_t)args, (caddr_t)uap, (u_int)i))) { -#ifdef KTRACE - if (KTRPOINT(p, KTR_SYSCALL)) - ktrsyscall(p->p_tracep, code + MINBSDIPCCODE, - hpuxtobsdipc[code].nargs, (int *)uap); -#endif - return (error); - } -#ifdef KTRACE - if (KTRPOINT(p, KTR_SYSCALL)) - ktrsyscall(p->p_tracep, code + MINBSDIPCCODE, - hpuxtobsdipc[code].nargs, (int *)uap); -#endif - return ((*hpuxtobsdipc[code].rout)(p, uap, retval)); -} - -socksetsize(size, m) - int size; - struct mbuf *m; -{ - register int tmp; - - if (size < sizeof(int)) { - switch(size) { - case 1: - tmp = (int) *mtod(m, char *); - break; - case 2: - tmp = (int) *mtod(m, short *); - break; - case 3: - tmp = (((int) *mtod(m, int *)) >> 8) & 0xffffff; - break; - } - *mtod(m, int *) = tmp; - m->m_len = sizeof(int); - } else { - m->m_len = size; - } -} - -struct hpux_setsockopt_args { - int s; - int level; - int name; - caddr_t val; - int valsize; -}; -/* ARGSUSED */ -hpux_setsockopt(p, uap, retval) - struct proc *p; - struct hpux_setsockopt_args *uap; - int *retval; -{ - struct file *fp; - struct mbuf *m = NULL; - int tmp, error; - - if (error = getsock(p->p_fd, uap->s, &fp)) - return (error); - if (uap->valsize > MLEN) - return (EINVAL); - if (uap->val) { - m = m_get(M_WAIT, MT_SOOPTS); - if (m == NULL) - return (ENOBUFS); - if (error = copyin(uap->val, mtod(m, caddr_t), - (u_int)uap->valsize)) { - (void) m_free(m); - return (error); - } - if (uap->name == SO_LINGER) { - tmp = *mtod(m, int *); - mtod(m, struct linger *)->l_onoff = 1; - mtod(m, struct linger *)->l_linger = tmp; - m->m_len = sizeof(struct linger); - } else - socksetsize(uap->valsize, m); - } else if (uap->name == ~SO_LINGER) { - m = m_get(M_WAIT, MT_SOOPTS); - if (m) { - uap->name = SO_LINGER; - mtod(m, struct linger *)->l_onoff = 0; - m->m_len = sizeof(struct linger); - } - } - return (sosetopt((struct socket *)fp->f_data, uap->level, - uap->name, m)); -} - -struct hpux_setsockopt2_args { - int s; - int level; - int name; - caddr_t val; - int valsize; -}; -/* ARGSUSED */ -hpux_setsockopt2(p, uap, retval) - struct proc *p; - register struct hpux_setsockopt2_args *uap; - int *retval; -{ - struct file *fp; - struct mbuf *m = NULL; - int error; - - if (error = getsock(p->p_fd, uap->s, &fp)) - return (error); - if (uap->valsize > MLEN) - return (EINVAL); - if (uap->val) { - m = m_get(M_WAIT, MT_SOOPTS); - if (m == NULL) - return (ENOBUFS); - if (error = copyin(uap->val, mtod(m, caddr_t), - (u_int)uap->valsize)) { - (void) m_free(m); - return (error); - } - socksetsize(uap->valsize, m); - } - return (sosetopt((struct socket *)fp->f_data, uap->level, - uap->name, m)); -} - -struct hpux_getsockopt_args { - int s; - int level; - int name; - caddr_t val; - int *avalsize; -}; -hpux_getsockopt(p, uap, retval) - struct proc *p; - struct hpux_getsockopt_args *uap; - int *retval; -{ - struct file *fp; - struct mbuf *m = NULL; - int valsize, error; - - if (error = getsock(p->p_fd, uap->s, &fp)) - return (error); - if (uap->val) { - if (error = copyin((caddr_t)uap->avalsize, (caddr_t)&valsize, - sizeof (valsize))) - return (error); - } else - valsize = 0; - if (error = sogetopt((struct socket *)fp->f_data, uap->level, - uap->name, &m)) - goto bad; - if (uap->val && valsize && m != NULL) { - if (uap->name == SO_LINGER) { - if (mtod(m, struct linger *)->l_onoff) - *mtod(m, int *) = mtod(m, struct linger *)->l_linger; - else - *mtod(m, int *) = 0; - m->m_len = sizeof(int); - } - if (valsize > m->m_len) - valsize = m->m_len; - error = copyout(mtod(m, caddr_t), uap->val, (u_int)valsize); - if (error == 0) - error = copyout((caddr_t)&valsize, - (caddr_t)uap->avalsize, sizeof (valsize)); - } -bad: - if (m != NULL) - (void) m_free(m); - return (error); -}