summaryrefslogtreecommitdiff
path: root/sys/compat/osf1
diff options
context:
space:
mode:
authorEric Jackson <ericj@cvs.openbsd.org>2000-08-04 15:47:56 +0000
committerEric Jackson <ericj@cvs.openbsd.org>2000-08-04 15:47:56 +0000
commit9863a155a1fef7eb589b7e96e7a38bde61e92e3f (patch)
treef438371a10a4285317e5681bfcfa88c91a16d130 /sys/compat/osf1
parent2f06eab90d1767ad671a20e8390f4a40403ac020 (diff)
Merge in NetBSD changes. This now works for most statically compiled osf1
bins. Shared osf1 libs don't work quite yet.
Diffstat (limited to 'sys/compat/osf1')
-rw-r--r--sys/compat/osf1/Makefile4
-rw-r--r--sys/compat/osf1/README.dynamic106
-rw-r--r--sys/compat/osf1/README.mach-traps13
-rw-r--r--sys/compat/osf1/README.syscalls8
-rw-r--r--sys/compat/osf1/files.osf126
-rw-r--r--sys/compat/osf1/osf1.h599
-rw-r--r--sys/compat/osf1/osf1_cvt.c705
-rw-r--r--sys/compat/osf1/osf1_cvt.h98
-rw-r--r--sys/compat/osf1/osf1_cvt_errno.c130
-rw-r--r--sys/compat/osf1/osf1_cvt_signal.c112
-rw-r--r--sys/compat/osf1/osf1_descrip.c305
-rw-r--r--sys/compat/osf1/osf1_errno.h149
-rw-r--r--sys/compat/osf1/osf1_exec.c352
-rw-r--r--sys/compat/osf1/osf1_file.c348
-rw-r--r--sys/compat/osf1/osf1_generic.c213
-rw-r--r--sys/compat/osf1/osf1_ioctl.c116
-rw-r--r--sys/compat/osf1/osf1_misc.c1025
-rw-r--r--sys/compat/osf1/osf1_mmap.c282
-rw-r--r--sys/compat/osf1/osf1_mount.c455
-rw-r--r--sys/compat/osf1/osf1_prot.c142
-rw-r--r--sys/compat/osf1/osf1_resource.c171
-rw-r--r--sys/compat/osf1/osf1_signal.c362
-rw-r--r--sys/compat/osf1/osf1_signal.h39
-rw-r--r--sys/compat/osf1/osf1_socket.c229
-rw-r--r--sys/compat/osf1/osf1_sysv_ipc.c88
-rw-r--r--sys/compat/osf1/osf1_time.c238
-rw-r--r--sys/compat/osf1/osf1_util.h16
-rw-r--r--sys/compat/osf1/syscalls.conf4
-rw-r--r--sys/compat/osf1/syscalls.master220
29 files changed, 4906 insertions, 1649 deletions
diff --git a/sys/compat/osf1/Makefile b/sys/compat/osf1/Makefile
index df0262d81ef..2791a967572 100644
--- a/sys/compat/osf1/Makefile
+++ b/sys/compat/osf1/Makefile
@@ -1,4 +1,3 @@
-# $OpenBSD: Makefile,v 1.2 1996/08/02 20:35:23 niklas Exp $
# $NetBSD: Makefile,v 1.1 1995/02/13 21:39:00 cgd Exp $
DEP= syscalls.conf syscalls.master ../../kern/makesyscalls.sh
@@ -10,3 +9,6 @@ ${OBJS}: ${DEP}
-mv -f osf1_syscall.h osf1_syscall.h.bak
-mv -f osf1_syscallargs.h osf1_syscallargs.h.bak
sh ../../kern/makesyscalls.sh syscalls.conf syscalls.master
+
+clean:
+ rm -f ${OBJS}
diff --git a/sys/compat/osf1/README.dynamic b/sys/compat/osf1/README.dynamic
index 0545a15b72c..5f60ad0efee 100644
--- a/sys/compat/osf1/README.dynamic
+++ b/sys/compat/osf1/README.dynamic
@@ -1,78 +1,54 @@
-$OpenBSD: README.dynamic,v 1.3 1998/02/15 21:19:14 niklas Exp $
-$NetBSD: README.dynamic,v 1.1 1995/02/13 21:39:01 cgd Exp $
+$NetBSD: README.dynamic,v 1.2 1999/04/27 06:39:49 cgd Exp $
-Currently, the OpenBSD OSF/1 emulation code only supports statically
-linked OSF/1 binaries. This document is meant to be a quick
-description of what would need to happen to support dynamically linked
-OSF/1 binaries, and to provide an indication of the amount of work
-that would be required to add such support.
+Dynamically linked programs are supported by NetBSD's Digital UNIX
+(formerly DEC OSF/1) emulation. The OSF/1 dynamic linker scheme is
+described in fair detail in:
-To support dynamically linked OSF/1 binaries, three steps would have
-to be taken:
- (1) The osf1_exec_with_loader() syscall emulation code would
- have to be written.
- (2) Execve() would have to be changed to support invocation of
- a loader for dynamically linked binaries.
- (3) The pmap code would have to be extended to allow process
- virtual spaces that are much larger than are currently
- allowed.
+ %A Larry W. Allen
+ %A Harminder G. Singh
+ %A Kevin G. Wallace
+ %A Melanie B. Weaver
+ %T Program Loading in OSF/1
+ %P 145-160
+ %I USENIX
+ %B USENIX Conference Proceedings
+ %D January 21-25, 1991
+ %C Dallas, TX
+ %W Open Software Foundation
-1. Implementing osf1_exec_with_loader().
+Additionally, the object file formats in use are described in the
+Digital UNIX _Assembly Language Programmer's Guide_ which can be
+found (among other places) on a version-specific page off of:
-The description of osf1_exec_with_loader is as follows:
+ http://www.unix.digital.com/faqs/publications/pub_page/doc_list.html
- int exec_with_loader(int flags, const char *loader,
- const char *file, char * const argv[],
- char * const envp[]);
+Finally, the actual representation of Auxiliary Vectors came from information
+in the Digital UNIX auxv.h header file.
-It invokes the program named by file, with the given argv and envp,
-by starting the specified loader (or /sbin/loader) and somehow passing
-the flags, file name, argv, and envp in such a way that the
-appropriate things will happen with them. This interface is
-completely undocumented (in the documentation that we have available),
-and so the only way to figure it out is to disassemble the OSF/1
-kernel and/or /sbin/loader.
+There are at least two potential issues with the implementation as it
+currently exists:
-2. Changing execve() to support OSF/1 dynamically linked executables.
+1. exec_with_loader() is not emulated.
-Normally, dynamically linked executables are invoked using execve(),
-in the normal fashion. The kernel transforms that request into one
-that uses the loader, and causes the loader to be invoked with the
-appropriate information to run the target executable.
+ Most uses of dynamically linked programs come through execve()
+ and use the default loader (/sbin/loader). In Digital UNIX
+ (and OSF/1) you can also force a specific loader to always be
+ invoked to load an executable by using the exec_with_loader()
+ system call. Few, if any, programs use this feature.
-The mechanism by which this is done is unknown; it may be possible to
-completely replace the OSF/1 loader with one designed for NetBSD, but
-that is rather prohibitive. (Additionally, it wouldn't solve the
-problem of needing to implement the osf1_exec_with_loader()
-functionality.)
+2. It is not immediately obvious that the right values are used for
+ text and data locations when invoking a dynamically linked executable.
-In any case, this would not be insignificant; it and/or the
-implementation of osf1_exec_with_loader() would probably require a
-complete rewrite or duplication of the current execve() code.
+ The text and data sections, and the break, are set up as if
+ /sbin/loader itself had been executed. It's not clear that this
+ is correct, but /sbin/loader seems to expect that at least the
+ break will be set up this way.
-3. Extending the pmap code to handle larger virtual spaces.
+ This has certain implications for the way mmap() behaves. See
+ the comment in the osf1_mmap() function in osf1_misc.c.
-OSF/1's /sbin/loader wants to be loaded at 0x3ff80000000. Currently,
-because of a simplifying assumption (specifically, to only use the
-first level-one pte for user-space mappings, effectively turning the
-pmap into one that looks much like one for a mc68030), only 8Gb
-(0x200000000 bytes) of user virtual space are supported.
+3. The stack location is used is the normal NetBSD/alpha stack location.
-It is unclear that the extra virtual space is necessary for any
-applications that NetBSD/Alpha would be used for, and support for it
-would add a significant amount of complexity to the pmap module.
-Adding that support would probably require a from-scratch rewrite of
-the pmap module.
-
-
-Because of the difficulties in emulating the system call interface
-used to run dynamic executables, and the difficulties in allowing
-support for the address space the OSF/1 loader needs, I do not think
-that it is feasible to support dynamically linked OSF/1 executables
-with the OSF/1 loading mechanism. It may be possible to do so with a
-new loading mechanism which could be written for NetBSD, but it is
-unclear that the necessary interfaces to do even that could be
-discovered, and the effort required to implement a new loading
-mechanism would be prohibitive.
-
--- cgd
+ No attempt is made to put the stack in the place where
+ Digital UNIX would normally put it. This may confuse some
+ programs.
diff --git a/sys/compat/osf1/README.mach-traps b/sys/compat/osf1/README.mach-traps
index c1326769f92..545e626c298 100644
--- a/sys/compat/osf1/README.mach-traps
+++ b/sys/compat/osf1/README.mach-traps
@@ -1,4 +1,3 @@
-$OpenBSD: README.mach-traps,v 1.2 1996/08/02 20:35:24 niklas Exp $
$NetBSD: README.mach-traps,v 1.1 1995/02/13 21:39:02 cgd Exp $
Some Alpha AXP OSF/1 binaries directly use the facilities provided by
@@ -35,15 +34,25 @@ msg_receive_trap -21 5
msg_rpc_trap -22 6
lw_wire -30 3
lw_unwire -31 1
-inode_swap_preference -40 3
+nxm_task_init -33 2
+nxm_sched_thread -34 1
+nxm_idle -35 1
+nxm_wakeup_idle -36 1
+nxm_set_pthid -37 2
+nxm_thread_kill -38 2
+nxm_thread_block -39 1
+nxm_thread_wakeup -40 1
+inode_swap_preference -40 3 old call?
init_process -41 0
map_fd -43 5
+nxm_resched -44 2
htg_unix_syscall -52 3
host_self -55 1
host_priv_self -56 1
swtch_pri -59 1
swtch -60 0
thread_switch -61 3
+semop_fast -62 4
mach_sctimes_0 -70 0 only if MACH_SCTIMES defined
mach_sctimes_1 -71 1 only if MACH_SCTIMES defined
mach_sctimes_2 -72 2 only if MACH_SCTIMES defined
diff --git a/sys/compat/osf1/README.syscalls b/sys/compat/osf1/README.syscalls
index 0e5cb85dc3b..6b0af772c31 100644
--- a/sys/compat/osf1/README.syscalls
+++ b/sys/compat/osf1/README.syscalls
@@ -1,5 +1,7 @@
-$OpenBSD: README.syscalls,v 1.2 1996/08/02 20:35:25 niklas Exp $
-$NetBSD: README.syscalls,v 1.1 1995/02/13 21:39:03 cgd Exp $
+$NetBSD: README.syscalls,v 1.2 1999/04/27 16:09:28 cgd Exp $
+
+XXX this file should be gutted. functions' comments should go with
+XXX the functions. Further, this file is ... very out of date.
Once the new syscall argument-handling method was implemented, most
OSF/1 syscalls boiled down to their NetBSD equivalents. The
@@ -16,7 +18,7 @@ but which seem strange enough to merit a bit more explanation.
OSF/1 compatibility is helped by the fact that the sigcontext
structure was created for NetBSD/Alpha to be the same as the OSF/1
sigcontext structure. Because of this, only one sendsig() function is
-needed, and the the NetBSD sigreturn() function can be used for OSF/1
+needed, and then the NetBSD sigreturn() function can be used for OSF/1
sigreturn(), as well.
The system calls are split out among the three files:
diff --git a/sys/compat/osf1/files.osf1 b/sys/compat/osf1/files.osf1
index 4c1292ad6a2..b853b3c9d7f 100644
--- a/sys/compat/osf1/files.osf1
+++ b/sys/compat/osf1/files.osf1
@@ -1,5 +1,5 @@
-# $OpenBSD: files.osf1,v 1.4 1999/11/10 15:55:22 mickey Exp $
-# $NetBSD: files.osf1,v 1.3 1995/11/15 05:42:17 cgd Exp $
+# $OpenBSD: files.osf1,v 1.5 2000/08/04 15:47:54 ericj Exp $
+# $NetBSD: files.osf1,v 1.15 1999/05/01 05:49:01 cgd Exp $
#
# Config file description for machine-independent OSF/1 compat code.
# Included by ports that need it.
@@ -9,9 +9,27 @@
# XXX COMPAT_OSF1 requires ECOFF
+# syscall table-related files
+file compat/osf1/osf1_syscalls.c compat_osf1 & syscall_debug
+file compat/osf1/osf1_sysent.c compat_osf1
+
+# OSF/1 <-> OpenBSD structure, flag, and value conversion files
+file compat/osf1/osf1_cvt.c compat_osf1
+file compat/osf1/osf1_cvt_errno.c compat_osf1
+file compat/osf1/osf1_cvt_signal.c compat_osf1
+
+# functionality emulation files
+file compat/osf1/osf1_descrip.c compat_osf1
+file compat/osf1/osf1_exec.c compat_osf1
+file compat/osf1/osf1_file.c compat_osf1
+file compat/osf1/osf1_generic.c compat_osf1
file compat/osf1/osf1_ioctl.c compat_osf1
file compat/osf1/osf1_misc.c compat_osf1
+file compat/osf1/osf1_mmap.c compat_osf1
file compat/osf1/osf1_mount.c compat_osf1
+file compat/osf1/osf1_prot.c compat_osf1
+file compat/osf1/osf1_resource.c compat_osf1
file compat/osf1/osf1_signal.c compat_osf1
-file compat/osf1/osf1_syscalls.c compat_osf1 & syscall_debug
-file compat/osf1/osf1_sysent.c compat_osf1
+file compat/osf1/osf1_socket.c compat_osf1
+file compat/osf1/osf1_sysv_ipc.c compat_osf1
+file compat/osf1/osf1_time.c compat_osf1
diff --git a/sys/compat/osf1/osf1.h b/sys/compat/osf1/osf1.h
new file mode 100644
index 00000000000..f485096d36d
--- /dev/null
+++ b/sys/compat/osf1/osf1.h
@@ -0,0 +1,599 @@
+/* $OpenBSD */
+/* $NetBSD: osf1.h,v 1.20 1999/05/10 21:41:07 cgd Exp $ */
+
+/*
+ * Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Christopher G. Demetriou
+ * for the NetBSD Project.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _COMPAT_OSF1_OSF1_H_
+#define _COMPAT_OSF1_OSF1_H_
+
+/*
+ * Collected OSF/1 definitions and structures, sorted by OSF/1 header.
+ * Error numbers (errno.h) aren't here, since they're likely to change
+ * (additions) more often.
+ *
+ * This file is up to date as of Digital UNIX V4.0.
+ */
+
+#include <sys/types.h>
+#include <compat/osf1/osf1_errno.h>
+#include <compat/osf1/osf1_signal.h>
+
+/*
+ * type and structure definitions used by other structures
+ */
+
+typedef int16_t osf1_short;
+typedef int32_t osf1_int;
+typedef int64_t osf1_long;
+typedef u_int32_t osf1_u_int;
+
+typedef int32_t osf1_dev_t;
+typedef u_int32_t osf1_ino_t;
+typedef u_int32_t osf1_mode_t;
+typedef u_int16_t osf1_nlink_t;
+typedef u_int32_t osf1_uid_t;
+typedef u_int32_t osf1_gid_t;
+typedef u_int64_t osf1_off_t;
+typedef int32_t osf1_time_t;
+typedef u_int32_t osf1_uint_t;
+typedef u_int64_t osf1_sigset_t;
+typedef u_int64_t osf1_size_t;
+typedef u_int64_t osf1_fsid_t;
+typedef u_int64_t osf1_rlim_t;
+typedef void *osf1_data_ptr; /* XXX hard to fix size */
+typedef void *osf1_fcn_ptr; /* XXX hard to fix size, bogus */
+typedef osf1_int osf1_key_t;
+typedef osf1_int osf1_pid_t;
+typedef void (*osf1_handler_t) __P((int));
+
+struct osf1_timeval { /* time.h */
+ osf1_time_t tv_sec;
+ osf1_int tv_usec;
+};
+
+
+/* access.h */
+
+#define OSF1_F_OK 0 /* pseudo-flag */
+#define OSF1_X_OK 0x01
+#define OSF1_W_OK 0x02
+#define OSF1_R_OK 0x04
+
+
+/* auxv.h */
+
+union osf1_auxv_data {
+ osf1_long a_val;
+ osf1_data_ptr a_ptr;
+ osf1_fcn_ptr a_fcn;
+};
+
+struct osf1_auxv {
+ osf1_int a_type;
+ union osf1_auxv_data a_un;
+};
+
+/* auxv entry types */
+#define OSF1_AT_NULL 0
+#define OSF1_AT_IGNORE 1
+#define OSF1_AT_EXECFD 2
+#define OSF1_AT_PHDR 3
+#define OSF1_AT_PHENT 4
+#define OSF1_AT_PHNUM 5
+#define OSF1_AT_PAGESZ 6
+#define OSF1_AT_BASE 7
+#define OSF1_AT_FLAGS 8
+#define OSF1_AT_ENTRY 9
+#define OSF1_AT_EXEC_FILENAME 1001
+#define OSF1_AT_EXEC_LOADER_FILENAME 1002
+#define OSF1_AT_EXEC_LOADER_FLAGS 1003
+
+
+/* exec.h/ldr_exec.h */
+
+#define OSF1_LDR_EXEC_DEFAULT_LOADER "/sbin/loader"
+
+/* exec_with_loader()/OSF1_AT_EXEC_LOADER_FLAGS flags regions */
+#define OSF1_LDR_EXEC_SYSTEM_MASK 0xffff0000
+#define OSF1_LDR_EXEC_USER_MASK 0xffff0000
+
+/* OSF1_AT_EXEC_LOADER_FLAGS flags */
+#define OSF1_LDR_EXEC_NOPRIVS_F 0x10000000
+#define OSF1_LDR_EXEC_PTRACE_F 0x20000000
+#define OSF1_LDR_EXEC_SETGID_F 0x40000000
+#define OSF1_LDR_EXEC_SETUID_F 0x80000000
+
+
+/* fcntl.h */
+
+/* fcntl ops */
+#define OSF1_F_DUPFD 0
+#define OSF1_F_GETFD 1 /* uses flags, see below */
+#define OSF1_F_SETFD 2 /* uses flags, see below */
+#define OSF1_F_GETFL 3 /* uses flags, see below */
+#define OSF1_F_SETFL 4 /* uses flags, see below */
+#define OSF1_F_GETOWN 5
+#define OSF1_F_SETOWN 6
+#define OSF1_F_GETLK 7 /* uses osf1_flock, see below */
+#define OSF1_F_SETLK 8 /* uses osf1_flock, see below */
+#define OSF1_F_SETLKW 9 /* uses osf1_flock, see below */
+#define OSF1_F_RGETLK 10 /* [lock mgr op] */
+#define OSF1_F_RSETLK 11 /* [lock mgr op] */
+#define OSF1_F_CNVT 12 /* [lock mgr op] */
+#define OSF1_F_RSETLKW 13 /* [lock mgr op] */
+#define OSF1_F_PURGEFS 14 /* [lock mgr op] */
+#define OSF1_F_PURGENFS 15 /* [DECsafe op] */
+
+/* fcntl GETFD/SETFD flags */
+#define OSF1_FD_CLOEXEC 1
+
+/* fcntl GETFL/SETFL flags, in addition to the O_* flags below */
+#define OSF1_FASYNC 0x00000040
+
+/* struct osf1_flock, for GETLK/SETLK/SETLKW */
+struct osf1_flock {
+ osf1_short l_type;
+ osf1_short l_whence;
+ osf1_off_t l_start;
+ osf1_off_t l_len;
+ osf1_pid_t l_pid;
+};
+
+/* GETLK/SETLK/SETLKW locking types */
+#define OSF1_F_RDLCK 1
+#define OSF1_F_WRLCK 2
+#define OSF1_F_UNLCK 8
+
+/* open flags */
+#define OSF1_O_RDONLY 0x00000000
+#define OSF1_O_WRONLY 0x00000001
+#define OSF1_O_RDWR 0x00000002
+#define OSF1_O_ACCMODE 0x00000003 /* mask of RD and WR bits */
+#define OSF1_O_NONBLOCK 0x00000004
+#define OSF1_O_APPEND 0x00000008
+/* no 0x00000010 */
+#define OSF1_O_DEFER 0x00000020
+/* no 0x00000040 */
+/* no 0x00000080 */
+/* no 0x00000100 */
+#define OSF1_O_CREAT 0x00000200
+#define OSF1_O_TRUNC 0x00000400
+#define OSF1_O_EXCL 0x00000800
+#define OSF1_O_NOCTTY 0x00001000
+#define OSF1_O_SYNC 0x00004000
+#define OSF1_O_NDELAY 0x00008000
+#define OSF1_O_DRD 0x00008000 /* == O_NDELAY, DON'T USE */
+/* no 0x00010000 */
+/* no 0x00020000 */
+/* no 0x00040000 */
+#define OSF1_O_DSYNC 0x00080000
+#define OSF1_O_RSYNC 0x00100000
+/* no 0x00200000+ */
+
+
+/* ioctl.h */
+
+#define OSF1_IOCPARM_MASK 0x1fff
+#define OSF1_IOCPARM_LEN(x) (((x) >> 16) & OSF1_IOCPARM_MASK)
+#define OSF1_IOCGROUP(x) (((x) >> 8) & 0xff)
+#define OSF1_IOCCMD(x) ((x) & 0xff)
+
+#define OSF1_IOCPARM_MAX 8192
+#define OSF1_IOC_VOID 0x20000000
+#define OSF1_IOC_OUT 0x40000000
+#define OSF1_IOC_IN 0x80000000
+#define OSF1_IOC_INOUT (OSF1_IOC_IN|OSF1_IOC_OUT)
+#define OSF1_IOC_DIRMASK 0xe0000000
+
+
+/* mman.h */
+
+/* protection mask */
+#define OSF1_PROT_NONE 0 /* pseudo-flag */
+#define OSF1_PROT_READ 0x0001
+#define OSF1_PROT_WRITE 0x0002
+#define OSF1_PROT_EXEC 0x0004
+
+/* mmap flags */
+#define OSF1_MAP_SHARED 0x0001
+#define OSF1_MAP_PRIVATE 0x0002
+
+#define OSF1_MAP_FILE 0 /* pseudo-flag */
+#define OSF1_MAP_ANON 0x0010
+#define OSF1_MAP_TYPE 0x00f0
+
+#define OSF1_MAP_FIXED 0x0100
+#define OSF1_MAP_VARIABLE 0 /* pseudo-flag */
+
+#define OSF1_MAP_HASSEMAPHORE 0x0200
+#define OSF1_MAP_INHERIT 0x0400
+#define OSF1_MAP_UNALIGNED 0x0800
+
+/* madvise operations */
+#define OSF1_MADV_NORMAL 0
+#define OSF1_MADV_RANDOM 1
+#define OSF1_MADV_SEQUENTIAL 2
+#define OSF1_MADV_WILLNEED 3
+#define OSF1_MADV_DONTNEED_COMPAT 4
+#define OSF1_MADV_SPACEAVAIL 5
+#define OSF1_MADV_DONTNEED 6
+
+
+/* mount.h */
+
+/* file system type numbers */
+#define OSF1_MOUNT_NONE 0
+#define OSF1_MOUNT_UFS 1
+#define OSF1_MOUNT_NFS 2
+#define OSF1_MOUNT_MFS 3
+#define OSF1_MOUNT_PC 4
+#define OSF1_MOUNT_S5FS 5
+#define OSF1_MOUNT_CDFS 6
+#define OSF1_MOUNT_DFS 7
+#define OSF1_MOUNT_EFS 8
+#define OSF1_MOUNT_PROCFS 9
+#define OSF1_MOUNT_MSFS 10
+#define OSF1_MOUNT_FFM 11
+#define OSF1_MOUNT_FDFS 12
+#define OSF1_MOUNT_ADDON 13
+#define OSF1_MOUNT_NFS3 14
+
+#define OSF1_MNAMELEN 90
+
+/* MFS mount argument structure */
+struct osf1_mfs_args {
+ osf1_data_ptr name;
+ osf1_data_ptr base;
+ osf1_u_int size;
+};
+
+/* NFS mount argument structure */
+struct osf1_nfs_args {
+ osf1_data_ptr addr;
+ osf1_data_ptr fh;
+ osf1_int flags;
+ osf1_int wsize;
+ osf1_int rsize;
+ osf1_int timeo;
+ osf1_int retrans;
+ osf1_data_ptr hostname;
+ osf1_int acregmin;
+ osf1_int acregmax;
+ osf1_int acdirmin;
+ osf1_int acdirmax;
+ osf1_data_ptr netname;
+ osf1_data_ptr pathconf;
+};
+
+/* NFS mount argument structure flags */
+#define OSF1_NFSMNT_SOFT 0x00000001
+#define OSF1_NFSMNT_WSIZE 0x00000002
+#define OSF1_NFSMNT_RSIZE 0x00000004
+#define OSF1_NFSMNT_TIMEO 0x00000008
+#define OSF1_NFSMNT_RETRANS 0x00000010
+#define OSF1_NFSMNT_HOSTNAME 0x00000020
+#define OSF1_NFSMNT_INT 0x00000040
+#define OSF1_NFSMNT_NOCONN 0x00000080
+#define OSF1_NFSMNT_NOAC 0x00000100
+#define OSF1_NFSMNT_ACREGMIN 0x00000200
+#define OSF1_NFSMNT_ACREGMAX 0x00000400
+#define OSF1_NFSMNT_ACDIRMIN 0x00000800
+#define OSF1_NFSMNT_ACDIRMAX 0x00001000
+#define OSF1_NFSMNT_NOCTO 0x00002000
+#define OSF1_NFSMNT_POSIX 0x00004000
+#define OSF1_NFSMNT_AUTO 0x00008000
+#define OSF1_NFSMNT_SEC 0x00010000
+#define OSF1_NFSMNT_TCP 0x00020000
+#define OSF1_NFSMNT_PROPLIST 0x00040000
+/* no 0x00080000+ */
+
+/* union of all mount argument structures */
+union osf1_mount_info {
+ struct osf1_mfs_args mfs_args;
+ struct osf1_nfs_args nfs_args;
+ char pad[80];
+};
+
+/* statfs structure */
+struct osf1_statfs {
+ osf1_short f_type;
+ osf1_short f_flags;
+ osf1_int f_fsize;
+ osf1_int f_bsize;
+ osf1_int f_blocks;
+ osf1_int f_bfree;
+ osf1_int f_bavail;
+ osf1_int f_files;
+ osf1_int f_ffree;
+ osf1_fsid_t f_fsid;
+ osf1_int f_spare[9];
+ char f_mntonname[OSF1_MNAMELEN];
+ char f_mntfromname[OSF1_MNAMELEN];
+ union osf1_mount_info mount_info;
+};
+
+
+/* reboot.h */
+
+/* reboot flags */
+#define OSF1_RB_AUTOBOOT 0 /* pseudo-flag */
+
+#define OSF1_RB_ASKNAME 0x0001
+#define OSF1_RB_SINGLE 0x0002
+#define OSF1_RB_NOSYNC 0x0004
+#define OSF1_RB_KDB 0x0004 /* == RB_NOSYNC; boot only? */
+#define OSF1_RB_HALT 0x0008
+#define OSF1_RB_INITNAME 0x0010
+#define OSF1_RB_DFLTROOT 0x0020
+#define OSF1_RB_ALTBOOT 0x0040
+#define OSF1_RB_UNIPROC 0x0080
+#define OSF1_RB_PARAM 0x0100
+#define OSF1_RB_DUMP 0x0200
+
+
+/* resource.h */
+
+#define OSF1_RUSAGE_THREAD 1
+#define OSF1_RUSAGE_SELF 0
+#define OSF1_RUSAGE_CHILDREN -1
+
+struct osf1_rusage {
+ struct osf1_timeval ru_utime;
+ struct osf1_timeval ru_stime;
+ osf1_long ru_maxrss;
+ osf1_long ru_ixrss;
+ osf1_long ru_idrss;
+ osf1_long ru_isrss;
+ osf1_long ru_minflt;
+ osf1_long ru_majflt;
+ osf1_long ru_nswap;
+ osf1_long ru_inblock;
+ osf1_long ru_oublock;
+ osf1_long ru_msgsnd;
+ osf1_long ru_msgrcv;
+ osf1_long ru_nsignals;
+ osf1_long ru_nvcsw;
+ osf1_long ru_nivcsw;
+};
+
+#define OSF1_RLIMIT_CPU 0
+#define OSF1_RLIMIT_FSIZE 1
+#define OSF1_RLIMIT_DATA 2
+#define OSF1_RLIMIT_STACK 3
+#define OSF1_RLIMIT_CORE 4
+#define OSF1_RLIMIT_RSS 5
+#define OSF1_RLIMIT_NOFILE 6
+#define OSF1_RLIMIT_AS 7
+
+#define OSF1_RLIM_INFINITY 0x7fffffffffffffffL
+
+struct osf1_rlimit {
+ rlim_t rlim_cur;
+ rlim_t rlim_max;
+};
+
+
+/* seek.h */
+
+#define OSF1_SEEK_SET 0
+#define OSF1_SEEK_CUR 1
+#define OSF1_SEEK_END 2
+
+
+/* signal.h (some in machine/signal.h) */
+
+#define sigemptyset(s) bzero((s), sizeof(*(s)))
+#define sigismember(s, n) (*(s) & sigmask(n))
+#define sigaddset(s, n) (*(s) |= sigmask(n))
+
+struct osf1_sigaction {
+ osf1_handler_t sa__handler;
+ osf1_sigset_t sa_mask;
+ int sa_flags;
+};
+
+/* actually from sysmisc.h */
+struct osf1_sigaltstack {
+ osf1_data_ptr ss_sp;
+ osf1_int ss_flags;
+ osf1_size_t ss_size;
+};
+
+/* sigaction flags */
+#define OSF1_SA_ONSTACK 0x00000001
+#define OSF1_SA_RESTART 0x00000002
+#define OSF1_SA_NOCLDSTOP 0x00000004
+#define OSF1_SA_NODEFER 0x00000008
+#define OSF1_SA_RESETHAND 0x00000010
+#define OSF1_SA_NOCLDWAIT 0x00000020
+#define OSF1_SA_SIGINFO 0x00000040
+
+/* sigaltstack flags */
+#define OSF1_SS_ONSTACK 0x00000001
+#define OSF1_SS_DISABLE 0x00000002
+#define OSF1_SS_NOMASK 0x00000004
+#define OSF1_SS_UCONTEXT 0x00000008
+
+/* signal set manipulation macros */
+#define osf1_sigmask(n) ((osf1_sigset_t)1 << ((n) - 1))
+#define osf1_sigemptyset(s) (*(s) = (osf1_sigset_t)0)
+#define osf1_sigismember(s, n) (*(s) & osf1_sigmask(n))
+#define osf1_sigaddset(s, n) (*(s) |= osf1_sigmask(n))
+
+
+/* socket.h */
+
+struct osf1_msghdr {
+ osf1_data_ptr msg_name;
+ osf1_u_int msg_namelen;
+ osf1_data_ptr msg_iov; /* struct osf1_iovec_xopen * */
+ osf1_u_int msg_iovlen;
+ osf1_data_ptr msg_control;
+ osf1_u_int msg_controllen;
+ osf1_int msg_flags;
+};
+
+struct osf1_msghdr_xopen {
+ osf1_data_ptr msg_name;
+ osf1_size_t msg_namelen;
+ osf1_data_ptr msg_iov; /* struct osf1_iovec_xopen * */
+ osf1_int msg_iovlen;
+ osf1_data_ptr msg_control;
+ osf1_size_t msg_controllen;
+ osf1_int msg_flags;
+};
+
+/* max message iov len */
+#define OSF1_MSG_MAXIOVLEN 16
+
+/* send/recv-family message flags */
+#define OSF1_MSG_OOB 0x0001
+#define OSF1_MSG_PEEK 0x0002
+#define OSF1_MSG_DONTROUTE 0x0004
+#define OSF1_MSG_EOR 0x0008
+#define OSF1_MSG_TRUNC 0x0010
+#define OSF1_MSG_CTRUNC 0x0020
+#define OSF1_MSG_WAITALL 0x0040
+
+
+/* stat.h */
+
+struct osf1_stat {
+ osf1_dev_t st_dev;
+ osf1_ino_t st_ino;
+ osf1_mode_t st_mode;
+ osf1_nlink_t st_nlink;
+ osf1_uid_t st_uid;
+ osf1_gid_t st_gid;
+ osf1_dev_t st_rdev;
+ osf1_off_t st_size;
+ osf1_time_t st_atime_sec;
+ osf1_int st_spare1;
+ osf1_time_t st_mtime_sec;
+ osf1_int st_spare2;
+ osf1_time_t st_ctime_sec;
+ osf1_int st_spare3;
+ osf1_uint_t st_blksize;
+ osf1_int st_blocks;
+ osf1_uint_t st_flags;
+ osf1_uint_t st_gen;
+};
+
+
+/* systeminfo.h */
+
+#define OSF1_SI_SYSNAME 1
+#define OSF1_SI_HOSTNAME 2
+#define OSF1_SI_RELEASE 3
+#define OSF1_SI_VERSION 4
+#define OSF1_SI_MACHINE 5
+#define OSF1_SI_ARCHITECTURE 6
+#define OSF1_SI_HW_SERIAL 7
+#define OSF1_SI_HW_PROVIDER 8
+#define OSF1_SI_SRPC_DOMAIN 9
+#define OSF1_SI_SET_HOSTNAME 258
+#define OSF1_SI_SET_SYSNAME 259
+#define OSF1_SI_SET_SRPC_DOMAIN 265
+
+
+/* time.h */
+
+struct osf1_itimerval {
+ struct osf1_timeval it_interval;
+ struct osf1_timeval it_value;
+};
+
+#define OSF1_ITIMER_REAL 0
+#define OSF1_ITIMER_VIRTUAL 1
+#define OSF1_ITIMER_PROF 2
+
+struct osf1_timezone {
+ osf1_int tz_minuteswest;
+ osf1_int tz_dsttime;
+};
+
+
+/* types.h */
+
+#define osf1_major(x) ((((dev_t)(x)) >> 20) & 0x00000fff)
+#define osf1_minor(x) ((((dev_t)(x)) >> 0) & 0x000fffff)
+#define osf1_makedev(x,y) ((((dev_t)(x)) << 20) | ((dev_t)(y)))
+
+
+/* uio.h */
+
+struct osf1_iovec {
+ osf1_data_ptr iov_base;
+ osf1_int iov_len;
+};
+
+struct osf1_iovec_xopen {
+ osf1_data_ptr iov_base;
+ osf1_size_t iov_len;
+};
+
+
+/* unistd.h (user-land header) */
+
+#define OSF1__PC_CHOWN_RESTRICTED 10
+#define OSF1__PC_LINK_MAX 11
+#define OSF1__PC_MAX_CANON 12
+#define OSF1__PC_MAX_INPUT 13
+#define OSF1__PC_NAME_MAX 14
+#define OSF1__PC_NO_TRUNC 15
+#define OSF1__PC_PATH_MAX 16
+#define OSF1__PC_PIPE_BUF 17
+#define OSF1__PC_VDISABLE 18
+
+
+/* utsname.h */
+
+#define OSF1__SYS_NMLN 32
+
+struct osf1_utsname {
+ char sysname[OSF1__SYS_NMLN];
+ char nodename[OSF1__SYS_NMLN];
+ char release[OSF1__SYS_NMLN];
+ char version[OSF1__SYS_NMLN];
+ char machine[OSF1__SYS_NMLN];
+};
+
+
+/* wait.h */
+
+/* wait3() and wait4() options. */
+#define OSF1_WNOHANG 0x01
+#define OSF1_WUNTRACED 0x02
+
+/* XXX should have status word bits */
+
+
+#endif /* _COMPAT_OSF1_OSF1_H_ */
diff --git a/sys/compat/osf1/osf1_cvt.c b/sys/compat/osf1/osf1_cvt.c
new file mode 100644
index 00000000000..d8c99097ee5
--- /dev/null
+++ b/sys/compat/osf1/osf1_cvt.c
@@ -0,0 +1,705 @@
+/* $OpenBSD: osf1_cvt.c,v 1.1 2000/08/04 15:47:54 ericj Exp $ */
+/* $NetBSD: osf1_cvt.c,v 1.7 1999/06/26 01:23:23 cgd Exp $ */
+
+/*
+ * Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Christopher G. Demetriou
+ * for the NetBSD Project.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Copyright (c) 1994, 1995 Carnegie-Mellon University.
+ * All rights reserved.
+ *
+ * Author: Chris G. Demetriou
+ *
+ * Permission to use, copy, modify and distribute this software and
+ * its documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ *
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
+ * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ *
+ * Carnegie Mellon requests users of this software to return to
+ *
+ * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
+ * School of Computer Science
+ * Carnegie Mellon University
+ * Pittsburgh PA 15213-3890
+ *
+ * any improvements or extensions that they make and grant Carnegie the
+ * rights to redistribute these changes.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/namei.h>
+#include <sys/proc.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <sys/filedesc.h>
+#include <sys/kernel.h>
+#include <sys/malloc.h>
+#include <sys/mman.h>
+#include <sys/mount.h>
+#include <sys/signal.h>
+#include <sys/signalvar.h>
+#include <sys/reboot.h>
+#include <sys/syscallargs.h>
+#include <sys/exec.h>
+#include <sys/vnode.h>
+#include <sys/socketvar.h>
+#include <sys/resource.h>
+#include <sys/resourcevar.h>
+#include <sys/wait.h>
+#include <vm/vm.h> /* XXX see mmap emulation */
+
+#include <nfs/rpcv2.h>
+#include <nfs/nfsproto.h>
+#include <nfs/nfs.h>
+#include <nfs/nfsmount.h>
+
+#include <compat/osf1/osf1.h>
+#include <compat/osf1/osf1_util.h>
+#include <compat/osf1/osf1_cvt.h>
+
+const struct emul_flags_xtab osf1_access_flags_xtab[] = {
+#if 0 /* pseudo-flag */
+ { OSF1_F_OK, OSF1_F_OK, F_OK },
+#endif
+ { OSF1_X_OK, OSF1_X_OK, X_OK },
+ { OSF1_W_OK, OSF1_W_OK, W_OK },
+ { OSF1_R_OK, OSF1_R_OK, R_OK },
+ { 0 }
+};
+
+const struct emul_flags_xtab osf1_fcntl_getsetfd_flags_rxtab[] = {
+ { FD_CLOEXEC, FD_CLOEXEC, OSF1_FD_CLOEXEC },
+ { 0 }
+};
+
+const struct emul_flags_xtab osf1_fcntl_getsetfd_flags_xtab[] = {
+ { OSF1_FD_CLOEXEC, OSF1_FD_CLOEXEC, FD_CLOEXEC },
+ { 0 }
+};
+
+/* flags specific to GETFL/SETFL; also uses open rxtab */
+const struct emul_flags_xtab osf1_fcntl_getsetfl_flags_rxtab[] = {
+ { FASYNC, FASYNC, OSF1_FASYNC },
+ { 0 }
+};
+
+/* flags specific to GETFL/SETFL; also uses open xtab */
+const struct emul_flags_xtab osf1_fcntl_getsetfl_flags_xtab[] = {
+ { OSF1_FASYNC, OSF1_FASYNC, FASYNC },
+ { 0 }
+};
+
+const struct emul_flags_xtab osf1_mmap_flags_xtab[] = {
+ { OSF1_MAP_SHARED, OSF1_MAP_SHARED, MAP_SHARED },
+ { OSF1_MAP_PRIVATE, OSF1_MAP_PRIVATE, MAP_PRIVATE },
+ { OSF1_MAP_TYPE, OSF1_MAP_FILE, MAP_FILE },
+ { OSF1_MAP_TYPE, OSF1_MAP_ANON, MAP_ANON },
+ { OSF1_MAP_FIXED, OSF1_MAP_FIXED, MAP_FIXED },
+#if 0 /* pseudo-flag, and the default */
+ { OSF1_MAP_VARIABLE, OSF1_MAP_VARIABLE, 0 },
+#endif
+ { OSF1_MAP_HASSEMAPHORE, OSF1_MAP_HASSEMAPHORE, MAP_HASSEMAPHORE },
+ { OSF1_MAP_INHERIT, OSF1_MAP_INHERIT, MAP_INHERIT },
+#if 0 /* no equivalent +++ */
+ { OSF1_MAP_UNALIGNED, OSF1_MAP_UNALIGNED, ??? },
+#endif
+ { 0 }
+};
+
+const struct emul_flags_xtab osf1_mmap_prot_xtab[] = {
+#if 0 /* pseudo-flag */
+ { OSF1_PROT_NONE, OSF1_PROT_NONE, PROT_NONE },
+#endif
+ { OSF1_PROT_READ, OSF1_PROT_READ, PROT_READ },
+ { OSF1_PROT_WRITE, OSF1_PROT_WRITE, PROT_READ|PROT_WRITE },
+ { OSF1_PROT_EXEC, OSF1_PROT_EXEC, PROT_READ|PROT_EXEC },
+ { 0 }
+};
+
+const struct emul_flags_xtab osf1_nfs_mount_flags_xtab[] = {
+ { OSF1_NFSMNT_SOFT, OSF1_NFSMNT_SOFT, NFSMNT_SOFT, },
+ { OSF1_NFSMNT_WSIZE, OSF1_NFSMNT_WSIZE, NFSMNT_WSIZE, },
+ { OSF1_NFSMNT_RSIZE, OSF1_NFSMNT_RSIZE, NFSMNT_RSIZE, },
+ { OSF1_NFSMNT_TIMEO, OSF1_NFSMNT_TIMEO, NFSMNT_TIMEO, },
+ { OSF1_NFSMNT_RETRANS, OSF1_NFSMNT_RETRANS, NFSMNT_RETRANS, },
+#if 0 /* no equivalent; needs special handling, see below */
+ { OSF1_NFSMNT_HOSTNAME, OSF1_NFSMNT_HOSTNAME, ???, },
+#endif
+ { OSF1_NFSMNT_INT, OSF1_NFSMNT_INT, NFSMNT_INT, },
+ { OSF1_NFSMNT_NOCONN, OSF1_NFSMNT_NOCONN, NFSMNT_NOCONN, },
+#if 0 /* no equivalents */
+ { OSF1_NFSMNT_NOAC, OSF1_NFSMNT_NOAC, ???, },
+ { OSF1_NFSMNT_ACREGMIN, OSF1_NFSMNT_ACREGMIN, ???, },
+ { OSF1_NFSMNT_ACREGMAX, OSF1_NFSMNT_ACREGMAX, ???, },
+ { OSF1_NFSMNT_ACDIRMIN, OSF1_NFSMNT_ACDIRMIN, ???, },
+ { OSF1_NFSMNT_ACDIRMAX, OSF1_NFSMNT_ACDIRMAX, ???, },
+ { OSF1_NFSMNT_NOCTO, OSF1_NFSMNT_NOCTO, ???, },
+ { OSF1_NFSMNT_POSIX, OSF1_NFSMNT_POSIX, ???, },
+ { OSF1_NFSMNT_AUTO, OSF1_NFSMNT_AUTO, ???, },
+ { OSF1_NFSMNT_SEC, OSF1_NFSMNT_SEC, ???, },
+ { OSF1_NFSMNT_TCP, OSF1_NFSMNT_TCP, ???, },
+ { OSF1_NFSMNT_PROPLIST, OSF1_NFSMNT_PROPLIST, ???, },
+#endif
+ { 0 }
+};
+
+const struct emul_flags_xtab osf1_open_flags_rxtab[] = {
+ { O_ACCMODE, O_RDONLY, OSF1_O_RDONLY },
+ { O_ACCMODE, O_WRONLY, OSF1_O_WRONLY },
+ { O_ACCMODE, O_RDWR, OSF1_O_RDWR },
+ { O_NONBLOCK, O_NONBLOCK, OSF1_O_NONBLOCK },
+ { O_APPEND, O_APPEND, OSF1_O_APPEND },
+#if 0 /* no equivalent +++ */
+ { ???, ???, O_DEFER },
+#endif
+ { O_CREAT, O_CREAT, OSF1_O_CREAT },
+ { O_TRUNC, O_TRUNC, OSF1_O_TRUNC },
+ { O_EXCL, O_EXCL, OSF1_O_EXCL },
+ { O_NOCTTY, O_NOCTTY, OSF1_O_NOCTTY },
+ { O_SYNC, O_SYNC, OSF1_O_SYNC },
+ { O_NDELAY, O_NDELAY, OSF1_O_NDELAY },
+#if 0 /* no equivalent, also same value as O_NDELAY! */
+ { ???, ???, O_DRD },
+#endif
+ { O_DSYNC, O_DSYNC, OSF1_O_DSYNC },
+ { O_RSYNC, O_RSYNC, OSF1_O_RSYNC },
+ { 0 }
+};
+
+const struct emul_flags_xtab osf1_open_flags_xtab[] = {
+ { OSF1_O_ACCMODE, OSF1_O_RDONLY, O_RDONLY },
+ { OSF1_O_ACCMODE, OSF1_O_WRONLY, O_WRONLY },
+ { OSF1_O_ACCMODE, OSF1_O_RDWR, O_RDWR },
+ { OSF1_O_NONBLOCK, OSF1_O_NONBLOCK, O_NONBLOCK },
+ { OSF1_O_APPEND, OSF1_O_APPEND, O_APPEND },
+#if 0 /* no equivalent +++ */
+ { OSF1_O_DEFER, OSF1_O_DEFER, ??? },
+#endif
+ { OSF1_O_CREAT, OSF1_O_CREAT, O_CREAT },
+ { OSF1_O_TRUNC, OSF1_O_TRUNC, O_TRUNC },
+ { OSF1_O_EXCL, OSF1_O_EXCL, O_EXCL },
+ { OSF1_O_NOCTTY, OSF1_O_NOCTTY, O_NOCTTY },
+ { OSF1_O_SYNC, OSF1_O_SYNC, O_SYNC },
+ { OSF1_O_NDELAY, OSF1_O_NDELAY, O_NDELAY },
+#if 0 /* no equivalent, also same value as O_NDELAY! */
+ { OSF1_O_DRD, OSF1_O_DRD, ??? },
+#endif
+ { OSF1_O_DSYNC, OSF1_O_DSYNC, O_DSYNC },
+ { OSF1_O_RSYNC, OSF1_O_RSYNC, O_RSYNC },
+ { 0 }
+};
+
+const struct emul_flags_xtab osf1_reboot_opt_xtab[] = {
+#if 0 /* pseudo-flag */
+ { OSF1_RB_AUTOBOOT, OSF1_RB_AUTOBOOT, RB_AUTOBOOT },
+#endif
+ { OSF1_RB_ASKNAME, OSF1_RB_ASKNAME, RB_ASKNAME },
+ { OSF1_RB_SINGLE, OSF1_RB_SINGLE, RB_SINGLE },
+ { OSF1_RB_NOSYNC, OSF1_RB_NOSYNC, RB_NOSYNC },
+#if 0 /* same value as O_NDELAY, only used at boot time? */
+ { OSF1_RB_KDB, OSF1_RB_KDB, RB_KDB },
+#endif
+ { OSF1_RB_HALT, OSF1_RB_HALT, RB_HALT },
+ { OSF1_RB_INITNAME, OSF1_RB_INITNAME, RB_INITNAME },
+ { OSF1_RB_DFLTROOT, OSF1_RB_DFLTROOT, RB_DFLTROOT },
+#if 0 /* no equivalents +++ */
+ { OSF1_RB_ALTBOOT, OSF1_RB_ALTBOOT, ??? },
+ { OSF1_RB_UNIPROC, OSF1_RB_UNIPROC, ??? },
+ { OSF1_RB_PARAM, OSF1_RB_PARAM, ??? },
+#endif
+ { OSF1_RB_DUMP, OSF1_RB_DUMP, RB_DUMP },
+ { 0 }
+};
+
+const struct emul_flags_xtab osf1_sendrecv_msg_flags_xtab[] = {
+ { OSF1_MSG_OOB, OSF1_MSG_OOB, MSG_OOB },
+ { OSF1_MSG_PEEK, OSF1_MSG_PEEK, MSG_PEEK },
+ { OSF1_MSG_DONTROUTE, OSF1_MSG_DONTROUTE, MSG_DONTROUTE },
+ { OSF1_MSG_EOR, OSF1_MSG_EOR, MSG_EOR },
+ { OSF1_MSG_TRUNC, OSF1_MSG_TRUNC, MSG_TRUNC },
+ { OSF1_MSG_CTRUNC, OSF1_MSG_CTRUNC, MSG_CTRUNC },
+ { OSF1_MSG_WAITALL, OSF1_MSG_WAITALL, MSG_WAITALL },
+ { 0 }
+};
+
+const struct emul_flags_xtab osf1_sigaction_flags_rxtab[] = {
+ { SA_ONSTACK, SA_ONSTACK, OSF1_SA_ONSTACK },
+ { SA_RESTART, SA_RESTART, OSF1_SA_RESTART },
+ { SA_NOCLDSTOP, SA_NOCLDSTOP, OSF1_SA_NOCLDSTOP },
+ { SA_NODEFER, SA_NODEFER, OSF1_SA_NODEFER },
+ { SA_RESETHAND, SA_RESETHAND, OSF1_SA_RESETHAND },
+ { SA_NOCLDWAIT, SA_NOCLDWAIT, OSF1_SA_NOCLDWAIT },
+#if 0 /* XXX not yet */
+ { SA_SIGINFO, SA_SIGINFO, OSF1_SA_SIGINFO },
+#endif
+ { 0 },
+};
+
+const struct emul_flags_xtab osf1_sigaction_flags_xtab[] = {
+ { OSF1_SA_ONSTACK, OSF1_SA_ONSTACK, SA_ONSTACK },
+ { OSF1_SA_RESTART, OSF1_SA_RESTART, SA_RESTART },
+ { OSF1_SA_NOCLDSTOP, OSF1_SA_NOCLDSTOP, SA_NOCLDSTOP },
+ { OSF1_SA_NODEFER, OSF1_SA_NODEFER, SA_NODEFER },
+ { OSF1_SA_RESETHAND, OSF1_SA_RESETHAND, SA_RESETHAND },
+ { OSF1_SA_NOCLDWAIT, OSF1_SA_NOCLDWAIT, SA_NOCLDWAIT },
+#if 0 /* XXX not yet */
+ { OSF1_SA_SIGINFO, OSF1_SA_SIGINFO, SA_SIGINFO },
+#endif
+ { 0 },
+};
+
+const struct emul_flags_xtab osf1_sigaltstack_flags_rxtab[] = {
+ { SS_ONSTACK, SS_ONSTACK, OSF1_SS_ONSTACK },
+ { SS_DISABLE, SS_DISABLE, OSF1_SS_DISABLE },
+#if 0 /* XXX no equivalents */
+ { ???, ???, OSF1_SS_NOMASK },
+ { ???, ???, OSF1_SS_UCONTEXT },
+#endif
+ { 0 },
+};
+
+const struct emul_flags_xtab osf1_sigaltstack_flags_xtab[] = {
+ { OSF1_SS_ONSTACK, OSF1_SS_ONSTACK, SS_ONSTACK },
+ { OSF1_SS_DISABLE, OSF1_SS_DISABLE, SS_DISABLE },
+#if 0 /* XXX no equivalents */
+ { OSF1_SS_NOMASK, OSF1_SS_NOMASK, ??? },
+ { OSF1_SS_UCONTEXT, OSF1_SS_UCONTEXT, ??? },
+#endif
+ { 0 },
+};
+
+const struct emul_flags_xtab osf1_wait_options_xtab[] = {
+ { OSF1_WNOHANG, OSF1_WNOHANG, WNOHANG },
+ { OSF1_WUNTRACED, OSF1_WUNTRACED, WUNTRACED },
+ { 0 }
+};
+
+void
+osf1_cvt_flock_from_native(nf, of)
+ const struct flock *nf;
+ struct osf1_flock *of;
+{
+
+ memset(of, 0, sizeof of);
+
+ of->l_start = nf->l_start;
+ of->l_len = nf->l_len;
+ of->l_pid = nf->l_pid;
+
+ switch (nf->l_type) {
+ case F_RDLCK:
+ of->l_type = OSF1_F_RDLCK;
+ break;
+
+ case F_WRLCK:
+ of->l_type = OSF1_F_WRLCK;
+ break;
+
+ case F_UNLCK:
+ of->l_type = OSF1_F_UNLCK;
+ break;
+ }
+
+ switch (nf->l_whence) {
+ case SEEK_SET:
+ of->l_whence = OSF1_SEEK_SET;
+ break;
+
+ case SEEK_CUR:
+ of->l_whence = OSF1_SEEK_CUR;
+ break;
+
+ case SEEK_END:
+ of->l_whence = OSF1_SEEK_END;
+ break;
+ }
+}
+
+int
+osf1_cvt_flock_to_native(of, nf)
+ const struct osf1_flock *of;
+ struct flock *nf;
+{
+
+ memset(nf, 0, sizeof nf);
+
+ nf->l_start = of->l_start;
+ nf->l_len = of->l_len;
+ nf->l_pid = of->l_pid;
+
+ switch (of->l_type) {
+ case OSF1_F_RDLCK:
+ nf->l_type = F_RDLCK;
+ break;
+
+ case OSF1_F_WRLCK:
+ nf->l_type = F_WRLCK;
+ break;
+
+ case OSF1_F_UNLCK:
+ nf->l_type = F_UNLCK;
+ break;
+
+ default:
+ return (EINVAL);
+ }
+
+ switch (of->l_whence) {
+ case OSF1_SEEK_SET:
+ nf->l_whence = SEEK_SET;
+ break;
+
+ case OSF1_SEEK_CUR:
+ nf->l_whence = SEEK_CUR;
+ break;
+
+ case OSF1_SEEK_END:
+ nf->l_whence = SEEK_END;
+ break;
+
+ default:
+ return (EINVAL);
+ }
+
+ return (0);
+}
+
+int
+osf1_cvt_msghdr_xopen_to_native(omh, bmh)
+ const struct osf1_msghdr_xopen *omh;
+ struct msghdr *bmh;
+{
+ unsigned long leftovers;
+
+ memset(bmh, 0, sizeof bmh);
+ bmh->msg_name = omh->msg_name; /* XXX sockaddr translation */
+ bmh->msg_namelen = omh->msg_namelen;
+ bmh->msg_iov = NULL; /* iovec xlation separate */
+ bmh->msg_iovlen = omh->msg_iovlen;
+
+ /* XXX we don't translate control messages (yet) */
+ if (bmh->msg_control != NULL || bmh->msg_controllen != 0)
+{
+printf("osf1_cvt_msghdr_xopen_to_native: control\n");
+ return (EINVAL);
+}
+
+ /* translate flags */
+ bmh->msg_flags = emul_flags_translate(osf1_sendrecv_msg_flags_xtab,
+ omh->msg_flags, &leftovers);
+ if (leftovers != 0)
+{
+printf("osf1_cvt_msghdr_xopen_to_native: leftovers 0x%lx\n", leftovers);
+ return (EINVAL);
+}
+
+ return (0);
+}
+
+int
+osf1_cvt_pathconf_name_to_native(oname, bnamep)
+ int oname, *bnamep;
+{
+ int error;
+
+ error = 0;
+ switch (oname) {
+ case OSF1__PC_CHOWN_RESTRICTED:
+ *bnamep = _PC_CHOWN_RESTRICTED;
+ break;
+
+ case OSF1__PC_LINK_MAX:
+ *bnamep = _PC_LINK_MAX;
+ break;
+
+ case OSF1__PC_MAX_CANON:
+ *bnamep = _PC_MAX_CANON;
+ break;
+
+ case OSF1__PC_MAX_INPUT:
+ *bnamep = _PC_MAX_INPUT;
+ break;
+
+ case OSF1__PC_NAME_MAX:
+ *bnamep = _PC_NAME_MAX;
+ break;
+
+ case OSF1__PC_NO_TRUNC:
+ *bnamep = _PC_NO_TRUNC;
+ break;
+
+ case OSF1__PC_PATH_MAX:
+ *bnamep = _PC_PATH_MAX;
+ break;
+
+ case OSF1__PC_PIPE_BUF:
+ *bnamep = _PC_PIPE_BUF;
+ break;
+
+ case OSF1__PC_VDISABLE:
+ *bnamep = _PC_VDISABLE;
+ break;
+
+ default:
+ error = EINVAL;
+ break;
+ }
+
+ return (error);
+}
+
+/*
+ * Convert from as rusage structure to an osf1 rusage structure.
+ */
+void
+osf1_cvt_rusage_from_native(ru, oru)
+ const struct rusage *ru;
+ struct osf1_rusage *oru;
+{
+
+ oru->ru_utime.tv_sec = ru->ru_utime.tv_sec;
+ oru->ru_utime.tv_usec = ru->ru_utime.tv_usec;
+
+ oru->ru_stime.tv_sec = ru->ru_stime.tv_sec;
+ oru->ru_stime.tv_usec = ru->ru_stime.tv_usec;
+
+ oru->ru_maxrss = ru->ru_maxrss;
+ oru->ru_ixrss = ru->ru_ixrss;
+ oru->ru_idrss = ru->ru_idrss;
+ oru->ru_isrss = ru->ru_isrss;
+ oru->ru_minflt = ru->ru_minflt;
+ oru->ru_majflt = ru->ru_majflt;
+ oru->ru_nswap = ru->ru_nswap;
+ oru->ru_inblock = ru->ru_inblock;
+ oru->ru_oublock = ru->ru_oublock;
+ oru->ru_msgsnd = ru->ru_msgsnd;
+ oru->ru_msgrcv = ru->ru_msgrcv;
+ oru->ru_nsignals = ru->ru_nsignals;
+ oru->ru_nvcsw = ru->ru_nvcsw;
+ oru->ru_nivcsw = ru->ru_nivcsw;
+}
+
+/*
+ * XXX: Only a subset of the flags is currently implemented.
+ */
+void
+osf1_cvt_sigaction_from_native(bsa, osa)
+ const struct sigaction *bsa;
+ struct osf1_sigaction *osa;
+{
+ osa->sa__handler = bsa->sa_handler;
+ osf1_cvt_sigset_from_native(&bsa->sa_mask, &osa->sa_mask);
+ osa->sa_flags = 0;
+
+ /* Translate by hand */
+ if ((bsa->sa_flags & SA_ONSTACK) != 0)
+ osa->sa_flags |= OSF1_SA_ONSTACK;
+ if ((bsa->sa_flags & SA_RESTART) != 0)
+ osa->sa_flags |= OSF1_SA_RESTART;
+ if ((bsa->sa_flags & SA_NOCLDSTOP) != 0)
+ osa->sa_flags |= OSF1_SA_NOCLDSTOP;
+ if ((bsa->sa_flags & SA_NOCLDWAIT) != 0)
+ osa->sa_flags |= OSF1_SA_NOCLDWAIT;
+ if ((bsa->sa_flags & SA_NODEFER) != 0)
+ osa->sa_flags |= OSF1_SA_NODEFER;
+ if ((bsa->sa_flags & SA_RESETHAND) != 0)
+ osa->sa_flags |= OSF1_SA_RESETHAND;
+ if ((bsa->sa_flags & SA_SIGINFO) != 0)
+ osa->sa_flags |= OSF1_SA_SIGINFO;
+}
+
+int
+osf1_cvt_sigaction_to_native(osa, bsa)
+ const struct osf1_sigaction *osa;
+ struct sigaction *bsa;
+{
+ bsa->sa_handler = osa->sa__handler;
+ osf1_cvt_sigset_to_native(&osa->sa_mask, &bsa->sa_mask);
+ bsa->sa_flags = 0;
+
+ /* Translate by hand */
+ if ((osa->sa_flags & OSF1_SA_ONSTACK) != 0)
+ bsa->sa_flags |= SA_ONSTACK;
+ if ((osa->sa_flags & OSF1_SA_RESTART) != 0)
+ bsa->sa_flags |= SA_RESTART;
+ if ((osa->sa_flags & OSF1_SA_RESETHAND) != 0)
+ bsa->sa_flags |= SA_RESETHAND;
+ if ((osa->sa_flags & OSF1_SA_NOCLDSTOP) != 0)
+ bsa->sa_flags |= SA_NOCLDSTOP;
+ if ((osa->sa_flags & OSF1_SA_NOCLDWAIT) != 0)
+ bsa->sa_flags |= SA_NOCLDWAIT;
+ if ((osa->sa_flags & OSF1_SA_NODEFER) != 0)
+ bsa->sa_flags |= SA_NODEFER;
+ if ((osa->sa_flags & OSF1_SA_SIGINFO) != 0)
+ bsa->sa_flags |= SA_SIGINFO;
+
+ return(0);
+}
+
+void
+osf1_cvt_sigaltstack_from_native(bss, oss)
+ const struct sigaltstack *bss;
+ struct osf1_sigaltstack *oss;
+{
+
+ oss->ss_sp = bss->ss_sp;
+ oss->ss_size = bss->ss_size;
+
+ /* translate flags */
+ oss->ss_flags = emul_flags_translate(osf1_sigaltstack_flags_rxtab,
+ bss->ss_flags, NULL);
+}
+
+int
+osf1_cvt_sigaltstack_to_native(oss, bss)
+ const struct osf1_sigaltstack *oss;
+ struct sigaltstack *bss;
+{
+ unsigned long leftovers;
+
+ bss->ss_sp = oss->ss_sp;
+ bss->ss_size = oss->ss_size;
+
+ /* translate flags */
+ bss->ss_flags = emul_flags_translate(osf1_sigaltstack_flags_xtab,
+ oss->ss_flags, &leftovers);
+
+ if (leftovers != 0) {
+ printf("osf1_cvt_sigaltstack_to_native: leftovers = 0x%lx\n",
+ leftovers);
+ return (EINVAL);
+ }
+
+ return (0);
+}
+
+void
+osf1_cvt_sigset_from_native(bss, oss)
+ const sigset_t *bss;
+ osf1_sigset_t *oss;
+{
+ int i, newsig;
+
+ osf1_sigemptyset(oss);
+ for (i = 1; i < NSIG; i++) {
+ if (sigismember(bss, i)) {
+ newsig = osf1_signal_rxlist[i];
+ if (newsig)
+ osf1_sigaddset(oss, newsig);
+ }
+ }
+}
+
+int
+osf1_cvt_sigset_to_native(oss, bss)
+ const osf1_sigset_t *oss;
+ sigset_t *bss;
+{
+ int i, newsig;
+
+ sigemptyset(bss);
+ for (i = 1; i < OSF1_NSIG; i++) {
+ if (osf1_sigismember(oss, i)) {
+ newsig = osf1_signal_xlist[i];
+ if (newsig)
+ sigaddset(bss, newsig);
+ }
+ }
+ return (0);
+}
+
+/*
+ * Convert from a stat structure to an osf1 stat structure.
+ */
+void
+osf1_cvt_stat_from_native(st, ost)
+ const struct stat *st;
+ struct osf1_stat *ost;
+{
+
+ ost->st_dev = osf1_cvt_dev_from_native(st->st_dev);
+ ost->st_ino = st->st_ino;
+ ost->st_mode = st->st_mode;
+ ost->st_nlink = st->st_nlink;
+ ost->st_uid = st->st_uid == -2 ? (u_int16_t) -2 : st->st_uid;
+ ost->st_gid = st->st_gid == -2 ? (u_int16_t) -2 : st->st_gid;
+ ost->st_rdev = osf1_cvt_dev_from_native(st->st_rdev);
+ ost->st_size = st->st_size;
+ ost->st_atime_sec = st->st_atime;
+ ost->st_spare1 = 0;
+ ost->st_mtime_sec = st->st_mtime;
+ ost->st_spare2 = 0;
+ ost->st_ctime_sec = st->st_ctime;
+ ost->st_spare3 = 0;
+ ost->st_blksize = st->st_blksize;
+ ost->st_blocks = st->st_blocks;
+ ost->st_flags = st->st_flags;
+ ost->st_gen = st->st_gen;
+}
+
+void
+osf1_cvt_statfs_from_native(bsfs, osfs)
+ const struct statfs *bsfs;
+ struct osf1_statfs *osfs;
+{
+
+ memset(osfs, 0, sizeof (struct osf1_statfs));
+ if (!strncmp(MOUNT_FFS, bsfs->f_fstypename, MFSNAMELEN))
+ osfs->f_type = OSF1_MOUNT_UFS;
+ else if (!strncmp(MOUNT_NFS, bsfs->f_fstypename, MFSNAMELEN))
+ osfs->f_type = OSF1_MOUNT_NFS;
+ else if (!strncmp(MOUNT_MFS, bsfs->f_fstypename, MFSNAMELEN))
+ osfs->f_type = OSF1_MOUNT_MFS;
+ else
+ /* uh oh... XXX = PC, CDFS, PROCFS, etc. */
+ osfs->f_type = OSF1_MOUNT_ADDON;
+ osfs->f_flags = bsfs->f_flags; /* XXX translate */
+ osfs->f_fsize = bsfs->f_bsize;
+ osfs->f_bsize = bsfs->f_iosize;
+ osfs->f_blocks = bsfs->f_blocks;
+ osfs->f_bfree = bsfs->f_bfree;
+ osfs->f_bavail = bsfs->f_bavail;
+ osfs->f_files = bsfs->f_files;
+ osfs->f_ffree = bsfs->f_ffree;
+ memcpy(&osfs->f_fsid, &bsfs->f_fsid,
+ max(sizeof bsfs->f_fsid, sizeof osfs->f_fsid));
+ /* osfs->f_spare zeroed above */
+ memcpy(osfs->f_mntonname, bsfs->f_mntonname,
+ max(sizeof bsfs->f_mntonname, sizeof osfs->f_mntonname));
+ memcpy(osfs->f_mntfromname, bsfs->f_mntfromname,
+ max(sizeof bsfs->f_mntfromname, sizeof osfs->f_mntfromname));
+ /* XXX osfs->f_xxx should be filled in... */
+}
diff --git a/sys/compat/osf1/osf1_cvt.h b/sys/compat/osf1/osf1_cvt.h
new file mode 100644
index 00000000000..1f8dd8f43b1
--- /dev/null
+++ b/sys/compat/osf1/osf1_cvt.h
@@ -0,0 +1,98 @@
+/* $OpenBSD: osf1_cvt.h,v 1.1 2000/08/04 15:47:54 ericj Exp $ */
+/* $NetBSD: osf1_cvt.h,v 1.5 1999/05/10 05:58:44 cgd Exp $ */
+
+/*
+ * Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Christopher G. Demetriou
+ * for the NetBSD Project.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _COMPAT_OSF1_OSF1_CVT_H_
+#define _COMPAT_OSF1_OSF1_CVT_H_
+
+#include <sys/param.h>
+#include <sys/proc.h>
+#include <sys/mount.h>
+#include <sys/resource.h>
+#include <sys/signal.h>
+#include <sys/stat.h>
+#include <sys/fcntl.h>
+
+#include <compat/common/compat_util.h>
+
+#define osf1_cvt_dev_from_native(dev) \
+ osf1_makedev(major(dev), minor(dev))
+#define osf1_cvt_dev_to_native(dev) \
+ makedev(osf1_major(dev), osf1_minor(dev))
+
+void osf1_cvt_flock_from_native(const struct flock *nf,
+ struct osf1_flock *of);
+int osf1_cvt_flock_to_native(const struct osf1_flock *of,
+ struct flock *nf);
+int osf1_cvt_msghdr_xopen_to_native(const struct osf1_msghdr_xopen *omh,
+ struct msghdr *nmh);
+int osf1_cvt_pathconf_name_to_native(int oname, int *bnamep);
+void osf1_cvt_rusage_from_native(const struct rusage *nru,
+ struct osf1_rusage *oru);
+void osf1_cvt_sigaction_from_native(const struct sigaction *nsa,
+ struct osf1_sigaction *osa);
+int osf1_cvt_sigaction_to_native(const struct osf1_sigaction *osa,
+ struct sigaction *nsa);
+void osf1_cvt_sigaltstack_from_native(const struct sigaltstack *nss,
+ struct osf1_sigaltstack *oss);
+int osf1_cvt_sigaltstack_to_native(const struct osf1_sigaltstack *oss,
+ struct sigaltstack *nss);
+void osf1_cvt_sigset_from_native(const sigset_t *nss, osf1_sigset_t *oss);
+int osf1_cvt_sigset_to_native(const osf1_sigset_t *oss, sigset_t *nss);
+void osf1_cvt_stat_from_native(const struct stat *nst,
+ struct osf1_stat *ost);
+void osf1_cvt_statfs_from_native(const struct statfs *nsfs,
+ struct osf1_statfs *osfs);
+
+extern const int osf1_errno_rxlist[];
+extern const int osf1_signal_xlist[];
+extern const int osf1_signal_rxlist[];
+
+extern const struct emul_flags_xtab osf1_access_flags_xtab[];
+extern const struct emul_flags_xtab osf1_fcntl_getsetfd_flags_rxtab[];
+extern const struct emul_flags_xtab osf1_fcntl_getsetfd_flags_xtab[];
+extern const struct emul_flags_xtab osf1_fcntl_getsetfl_flags_rxtab[];
+extern const struct emul_flags_xtab osf1_fcntl_getsetfl_flags_xtab[];
+extern const struct emul_flags_xtab osf1_mmap_flags_xtab[];
+extern const struct emul_flags_xtab osf1_mmap_prot_xtab[];
+extern const struct emul_flags_xtab osf1_nfs_mount_flags_xtab[];
+extern const struct emul_flags_xtab osf1_open_flags_rxtab[];
+extern const struct emul_flags_xtab osf1_open_flags_xtab[];
+extern const struct emul_flags_xtab osf1_reboot_opt_xtab[];
+extern const struct emul_flags_xtab osf1_sendrecv_msg_flags_xtab[];
+extern const struct emul_flags_xtab osf1_sigaction_flags_rxtab[];
+extern const struct emul_flags_xtab osf1_sigaction_flags_xtab[];
+extern const struct emul_flags_xtab osf1_sigaltstack_flags_rxtab[];
+extern const struct emul_flags_xtab osf1_sigaltstack_flags_xtab[];
+extern const struct emul_flags_xtab osf1_wait_options_xtab[];
+
+#endif /* _COMPAT_OSF1_OSF1_CVT_H_ */
diff --git a/sys/compat/osf1/osf1_cvt_errno.c b/sys/compat/osf1/osf1_cvt_errno.c
new file mode 100644
index 00000000000..f31b2a5a1c0
--- /dev/null
+++ b/sys/compat/osf1/osf1_cvt_errno.c
@@ -0,0 +1,130 @@
+/* $OpenBSD: osf1_cvt_errno.c,v 1.1 2000/08/04 15:47:54 ericj Exp $ */
+/* $NetBSD: osf1_cvt_errno.c,v 1.4 1999/05/01 02:16:01 cgd Exp $ */
+
+/*
+ * Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Christopher G. Demetriou
+ * for the NetBSD Project.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <compat/osf1/osf1.h>
+#include <compat/osf1/osf1_cvt.h>
+
+/*
+ * This table is used to translate NetBSD errnos to OSF/1 errnos
+ * when returning from a system call.
+ *
+ * It is up to date as of Digital UNIX V4.0 and NetBSD 1.4.
+ */
+
+const int osf1_errno_rxlist[] = {
+ 0,
+ OSF1_EPERM, /* EPERM (1) -> 1 */
+ OSF1_ENOENT, /* ENOENT (2) -> 2 */
+ OSF1_ESRCH, /* ESRCH (3) -> 3 */
+ OSF1_EINTR, /* EINTR (4) -> 4 */
+ OSF1_EIO, /* EIO (5) -> 5 */
+ OSF1_ENXIO, /* ENXIO (6) -> 6 */
+ OSF1_E2BIG, /* E2BIG (7) -> 7 */
+ OSF1_ENOEXEC, /* ENOEXEC (8) -> 8 */
+ OSF1_EBADF, /* EBADF (9) -> 9 */
+ OSF1_ECHILD, /* ECHILD (10) -> 10 */
+ OSF1_EDEADLK, /* EDEADLK (11) -> 11 */
+ OSF1_ENOMEM, /* ENOMEM (12) -> 12 */
+ OSF1_EACCES, /* EACCES (13) -> 13 */
+ OSF1_EFAULT, /* EFAULT (14) -> 14 */
+ OSF1_ENOTBLK, /* ENOTBLK (15) -> 15 */
+ OSF1_EBUSY, /* EBUSY (16) -> 16 */
+ OSF1_EEXIST, /* EEXIST (17) -> 17 */
+ OSF1_EXDEV, /* EXDEV (18) -> 18 */
+ OSF1_ENODEV, /* ENODEV (19) -> 19 */
+ OSF1_ENOTDIR, /* ENOTDIR (20) -> 20 */
+ OSF1_EISDIR, /* EISDIR (21) -> 21 */
+ OSF1_EINVAL, /* EINVAL (22) -> 22 */
+ OSF1_ENFILE, /* ENFILE (23) -> 23 */
+ OSF1_EMFILE, /* EMFILE (24) -> 24 */
+ OSF1_ENOTTY, /* ENOTTY (25) -> 25 */
+ OSF1_ETXTBSY, /* ETXTBSY (26) -> 26 */
+ OSF1_EFBIG, /* EFBIG (27) -> 27 */
+ OSF1_ENOSPC, /* ENOSPC (28) -> 28 */
+ OSF1_ESPIPE, /* ESPIPE (29) -> 29 */
+ OSF1_EROFS, /* EROFS (30) -> 30 */
+ OSF1_EMLINK, /* EMLINK (31) -> 31 */
+ OSF1_EPIPE, /* EPIPE (32) -> 32 */
+ OSF1_EDOM, /* EDOM (33) -> 33 */
+ OSF1_ERANGE, /* ERANGE (34) -> 34 */
+ OSF1_EWOULDBLOCK, /* EAGAIN (35) -> OSF1_EWOULDBLOCK (35) */
+ OSF1_EINPROGRESS, /* EINPROGRESS (36) -> 36 */
+ OSF1_EALREADY, /* EALREADY (37) -> 37 */
+ OSF1_ENOTSOCK, /* ENOTSOCK (38) -> 38 */
+ OSF1_EDESTADDRREQ, /* EDESTADDRREQ (39) -> 39 */
+ OSF1_EMSGSIZE, /* EMSGSIZE (40) -> 40 */
+ OSF1_EPROTOTYPE, /* EPROTOTYPE (41) -> 41 */
+ OSF1_ENOPROTOOPT, /* ENOPROTOOPT (42) -> 42 */
+ OSF1_EPROTONOSUPPORT, /* EPROTONOSUPPORT (43) -> 43 */
+ OSF1_ESOCKTNOSUPPORT, /* ESOCKTNOSUPPORT (44) -> 44 */
+ OSF1_EOPNOTSUPP, /* EOPNOTSUPP (45) -> 45 */
+ OSF1_EPFNOSUPPORT, /* EPFNOSUPPORT (46) -> 46 */
+ OSF1_EAFNOSUPPORT, /* EAFNOSUPPORT (47) -> 47 */
+ OSF1_EADDRINUSE, /* EADDRINUSE (48) -> 48 */
+ OSF1_EADDRNOTAVAIL, /* EADDRNOTAVAIL (49) -> 49 */
+ OSF1_ENETDOWN, /* ENETDOWN (50) -> 50 */
+ OSF1_ENETUNREACH, /* ENETUNREACH (51) -> 51 */
+ OSF1_ENETRESET, /* ENETRESET (52) -> 52 */
+ OSF1_ECONNABORTED, /* ECONNABORTED (53) -> 53 */
+ OSF1_ECONNRESET, /* ECONNRESET (54) -> 54 */
+ OSF1_ENOBUFS, /* ENOBUFS (55) -> 55 */
+ OSF1_EISCONN, /* EISCONN (56) -> 56 */
+ OSF1_ENOTCONN, /* ENOTCONN (57) -> 57 */
+ OSF1_ESHUTDOWN, /* ESHUTDOWN (58) -> 58 */
+ OSF1_ETOOMANYREFS, /* ETOOMANYREFS (59) -> 59 */
+ OSF1_ETIMEDOUT, /* ETIMEDOUT (60) -> 60 */
+ OSF1_ECONNREFUSED, /* ECONNREFUSED (61) -> 61 */
+ OSF1_ELOOP, /* ELOOP (62) -> 62 */
+ OSF1_ENAMETOOLONG, /* ENAMETOOLONG (63) -> 63 */
+ OSF1_EHOSTDOWN, /* EHOSTDOWN (64) -> 64 */
+ OSF1_EHOSTUNREACH, /* EHOSTUNREACH (65) -> 65 */
+ OSF1_ENOTEMPTY, /* ENOTEMPTY (66) -> 66 */
+ OSF1_EPROCLIM, /* EPROCLIM (67) -> 67 */
+ OSF1_EUSERS, /* EUSERS (68) -> 68 */
+ OSF1_EDQUOT, /* EDQUOT (69) -> 69 */
+ OSF1_ESTALE, /* ESTALE (70) -> 70 */
+ OSF1_EREMOTE, /* EREMOTE (71) -> 71 */
+ OSF1_EBADRPC, /* EBADRPC (72) -> 72 */
+ OSF1_ERPCMISMATCH, /* ERPCMISMATCH (73) -> 73 */
+ OSF1_EPROGUNAVAIL, /* EPROGUNAVAIL (74) -> 74 */
+ OSF1_EPROGMISMATCH, /* EPROGMISMATCH (75) -> 75 */
+ OSF1_EPROCUNAVAIL, /* EPROCUNAVAIL (76) -> 76 */
+ OSF1_ENOLCK, /* ENOLCK (77) -> 77 */
+ OSF1_ENOSYS, /* ENOSYS (78) -> 78 */
+ OSF1_EFTYPE, /* EFTYPE (79) -> 79 */
+ OSF1_ENOSYS, /* EAUTH (80) has no equivalent */
+ OSF1_ENOSYS, /* ENEEDAUTH (81) has no equivalent */
+ OSF1_EIDRM, /* EIDRM (82) -> 81 */
+ OSF1_ENOMSG, /* ENOMSG (83) -> 80 */
+ OSF1_EOVERFLOW, /* EOVERFLOW (84) -> 103 */
+};
diff --git a/sys/compat/osf1/osf1_cvt_signal.c b/sys/compat/osf1/osf1_cvt_signal.c
new file mode 100644
index 00000000000..1ae4d84e7a3
--- /dev/null
+++ b/sys/compat/osf1/osf1_cvt_signal.c
@@ -0,0 +1,112 @@
+/* $OpenBSD: osf1_cvt_signal.c,v 1.1 2000/08/04 15:47:54 ericj Exp $ */
+/* $NetBSD: osf1_signal.c,v 1.13 1999/04/30 05:24:04 cgd Exp $ */
+
+/*
+ * Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Christopher G. Demetriou
+ * for the NetBSD Project.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <compat/osf1/osf1.h>
+#include <compat/osf1/osf1_cvt.h>
+
+/*
+ * These tables are used to translate between NetBSD and OSF/1 signal
+ * numbers.
+ *
+ * XXX IT IS NOT UP TO DATE.
+ */
+
+const int osf1_signal_rxlist[] = {
+ 0,
+ OSF1_SIGHUP,
+ OSF1_SIGINT,
+ OSF1_SIGQUIT,
+ OSF1_SIGILL,
+ OSF1_SIGTRAP,
+ OSF1_SIGABRT,
+ OSF1_SIGEMT,
+ OSF1_SIGFPE,
+ OSF1_SIGKILL,
+ OSF1_SIGBUS,
+ OSF1_SIGSEGV,
+ OSF1_SIGSYS,
+ OSF1_SIGPIPE,
+ OSF1_SIGALRM,
+ OSF1_SIGTERM,
+ OSF1_SIGURG,
+ OSF1_SIGSTOP,
+ OSF1_SIGTSTP,
+ OSF1_SIGCONT,
+ OSF1_SIGCHLD,
+ OSF1_SIGTTIN,
+ OSF1_SIGTTOU,
+ OSF1_SIGIO,
+ OSF1_SIGXCPU,
+ OSF1_SIGXFSZ,
+ OSF1_SIGVTALRM,
+ OSF1_SIGPROF,
+ OSF1_SIGWINCH,
+ OSF1_SIGINFO,
+ OSF1_SIGUSR1,
+ OSF1_SIGUSR2,
+};
+
+const int osf1_signal_xlist[] = {
+ 0,
+ SIGHUP,
+ SIGINT,
+ SIGQUIT,
+ SIGILL,
+ SIGTRAP,
+ SIGABRT,
+ SIGEMT,
+ SIGFPE,
+ SIGKILL,
+ SIGBUS,
+ SIGSEGV,
+ SIGSYS,
+ SIGPIPE,
+ SIGALRM,
+ SIGTERM,
+ SIGURG,
+ SIGSTOP,
+ SIGTSTP,
+ SIGCONT,
+ SIGCHLD,
+ SIGTTIN,
+ SIGTTOU,
+ SIGIO,
+ SIGXCPU,
+ SIGXFSZ,
+ SIGVTALRM,
+ SIGPROF,
+ SIGWINCH,
+ SIGINFO,
+ SIGUSR1,
+ SIGUSR2,
+};
diff --git a/sys/compat/osf1/osf1_descrip.c b/sys/compat/osf1/osf1_descrip.c
new file mode 100644
index 00000000000..a9123899768
--- /dev/null
+++ b/sys/compat/osf1/osf1_descrip.c
@@ -0,0 +1,305 @@
+/* $OpenBSD: osf1_descrip.c,v 1.1 2000/08/04 15:47:54 ericj Exp $ */
+/* $NetBSD: osf1_descrip.c,v 1.5 1999/06/26 01:24:41 cgd Exp $ */
+
+/*
+ * Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Christopher G. Demetriou
+ * for the NetBSD Project.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Copyright (c) 1994, 1995 Carnegie-Mellon University.
+ * All rights reserved.
+ *
+ * Author: Chris G. Demetriou
+ *
+ * Permission to use, copy, modify and distribute this software and
+ * its documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ *
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
+ * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ *
+ * Carnegie Mellon requests users of this software to return to
+ *
+ * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
+ * School of Computer Science
+ * Carnegie Mellon University
+ * Pittsburgh PA 15213-3890
+ *
+ * any improvements or extensions that they make and grant Carnegie the
+ * rights to redistribute these changes.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/namei.h>
+#include <sys/proc.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <sys/filedesc.h>
+#include <sys/kernel.h>
+#include <sys/malloc.h>
+#include <sys/mman.h>
+#include <sys/mount.h>
+#include <sys/signal.h>
+#include <sys/signalvar.h>
+#include <sys/reboot.h>
+#include <sys/syscallargs.h>
+#include <sys/exec.h>
+#include <sys/vnode.h>
+#include <sys/socketvar.h>
+#include <sys/resource.h>
+#include <sys/resourcevar.h>
+#include <sys/wait.h>
+
+#include <compat/osf1/osf1.h>
+#include <compat/osf1/osf1_syscallargs.h>
+#include <compat/osf1/osf1_cvt.h>
+
+int
+osf1_sys_fcntl(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_fcntl_args *uap = v;
+ struct sys_fcntl_args a;
+ struct osf1_flock oflock;
+ struct flock nflock;
+ unsigned long xfl, leftovers;
+ caddr_t sg;
+ int error;
+
+ sg = stackgap_init(p->p_emul);
+
+ SCARG(&a, fd) = SCARG(uap, fd);
+
+ leftovers = 0;
+ switch (SCARG(uap, cmd)) {
+ case OSF1_F_DUPFD:
+ SCARG(&a, cmd) = F_DUPFD;
+ SCARG(&a, arg) = SCARG(uap, arg);
+ break;
+
+ case OSF1_F_GETFD:
+ SCARG(&a, cmd) = F_GETFD;
+ SCARG(&a, arg) = 0; /* ignored */
+ break;
+
+ case OSF1_F_SETFD:
+ SCARG(&a, cmd) = F_SETFD;
+ SCARG(&a, arg) = (void *)emul_flags_translate(
+ osf1_fcntl_getsetfd_flags_xtab,
+ (unsigned long)SCARG(uap, arg), &leftovers);
+ break;
+
+ case OSF1_F_GETFL:
+ SCARG(&a, cmd) = F_GETFL;
+ SCARG(&a, arg) = 0; /* ignored */
+ break;
+
+ case OSF1_F_SETFL:
+ SCARG(&a, cmd) = F_SETFL;
+ xfl = emul_flags_translate(osf1_open_flags_xtab,
+ (unsigned long)SCARG(uap, arg), &leftovers);
+ xfl |= emul_flags_translate(osf1_fcntl_getsetfl_flags_xtab,
+ leftovers, &leftovers);
+ SCARG(&a, arg) = (void *)xfl;
+ break;
+
+ case OSF1_F_GETOWN: /* XXX not yet supported */
+ case OSF1_F_SETOWN: /* XXX not yet supported */
+ /* XXX translate. */
+ return (EINVAL);
+
+ case OSF1_F_GETLK:
+ case OSF1_F_SETLK:
+ case OSF1_F_SETLKW:
+ if (SCARG(uap, cmd) == OSF1_F_GETLK)
+ SCARG(&a, cmd) = F_GETLK;
+ else if (SCARG(uap, cmd) == OSF1_F_SETLK)
+ SCARG(&a, cmd) = F_SETLK;
+ else if (SCARG(uap, cmd) == OSF1_F_SETLKW)
+ SCARG(&a, cmd) = F_SETLKW;
+ SCARG(&a, arg) = stackgap_alloc(&sg, sizeof nflock);
+
+ error = copyin(SCARG(uap, arg), &oflock, sizeof oflock);
+ if (error == 0)
+ error = osf1_cvt_flock_to_native(&oflock, &nflock);
+ if (error == 0)
+ error = copyout(&nflock, SCARG(&a, arg),
+ sizeof nflock);
+ if (error != 0)
+ return (error);
+ break;
+
+ case OSF1_F_RGETLK: /* [lock mgr op] XXX not supported */
+ case OSF1_F_RSETLK: /* [lock mgr op] XXX not supported */
+ case OSF1_F_CNVT: /* [lock mgr op] XXX not supported */
+ case OSF1_F_RSETLKW: /* [lock mgr op] XXX not supported */
+ case OSF1_F_PURGEFS: /* [lock mgr op] XXX not supported */
+ case OSF1_F_PURGENFS: /* [DECsafe op] XXX not supported */
+ default:
+ /* XXX syslog? */
+ return (EINVAL);
+ }
+ if (leftovers != 0)
+ return (EINVAL);
+
+ error = sys_fcntl(p, &a, retval);
+
+ if (error)
+ return error;
+
+ switch (SCARG(uap, cmd)) {
+ case OSF1_F_GETFD:
+ retval[0] = emul_flags_translate(
+ osf1_fcntl_getsetfd_flags_rxtab, retval[0], NULL);
+ break;
+
+ case OSF1_F_GETFL:
+ xfl = emul_flags_translate(osf1_open_flags_rxtab,
+ retval[0], &leftovers);
+ xfl |= emul_flags_translate(osf1_fcntl_getsetfl_flags_rxtab,
+ leftovers, NULL);
+ retval[0] = xfl;
+ break;
+
+ case OSF1_F_GETLK:
+ error = copyin(SCARG(&a, arg), &nflock, sizeof nflock);
+ if (error == 0) {
+ osf1_cvt_flock_from_native(&nflock, &oflock);
+ error = copyout(&oflock, SCARG(uap, arg),
+ sizeof oflock);
+ }
+ break;
+ }
+
+ return error;
+}
+
+int
+osf1_sys_fpathconf(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_fpathconf_args *uap = v;
+ struct sys_fpathconf_args a;
+ int error;
+
+ SCARG(&a, fd) = SCARG(uap, fd);
+
+ error = osf1_cvt_pathconf_name_to_native(SCARG(uap, name),
+ &SCARG(&a, name));
+
+ if (error == 0)
+ error = sys_fpathconf(p, &a, retval);
+
+ return (error);
+}
+
+/*
+ * Return status information about a file descriptor.
+ */
+int
+osf1_sys_fstat(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_fstat_args *uap = v;
+ struct filedesc *fdp = p->p_fd;
+ struct file *fp;
+ struct stat ub;
+ struct osf1_stat oub;
+ int error;
+
+ /* XXX */
+ if ((unsigned)SCARG(uap, fd) >= fdp->fd_nfiles ||
+ (fp = fdp->fd_ofiles[SCARG(uap, fd)]) == NULL) /* ||
+ (fp->f_iflags & FIF_WANTCLOSE) != 0) */
+ return (EBADF);
+
+ switch (fp->f_type) {
+
+ case DTYPE_VNODE:
+ error = vn_stat((struct vnode *)fp->f_data, &ub, p);
+ break;
+
+ case DTYPE_SOCKET:
+ error = soo_stat((struct socket *)fp->f_data, &ub);
+ break;
+
+ default:
+ panic("ofstat");
+ /*NOTREACHED*/
+ }
+ osf1_cvt_stat_from_native(&ub, &oub);
+ if (error == 0)
+ error = copyout((caddr_t)&oub, (caddr_t)SCARG(uap, sb),
+ sizeof (oub));
+
+ return (error);
+}
+
+int
+osf1_sys_ftruncate(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_ftruncate_args *uap = v;
+ struct sys_ftruncate_args a;
+
+ SCARG(&a, fd) = SCARG(uap, fd);
+ SCARG(&a, pad) = 0;
+ SCARG(&a, length) = SCARG(uap, length);
+
+ return sys_ftruncate(p, &a, retval);
+}
+
+int
+osf1_sys_lseek(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_lseek_args *uap = v;
+ struct sys_lseek_args a;
+
+ SCARG(&a, fd) = SCARG(uap, fd);
+ SCARG(&a, pad) = 0;
+ SCARG(&a, offset) = SCARG(uap, offset);
+ SCARG(&a, whence) = SCARG(uap, whence);
+
+ return sys_lseek(p, &a, retval);
+}
diff --git a/sys/compat/osf1/osf1_errno.h b/sys/compat/osf1/osf1_errno.h
new file mode 100644
index 00000000000..c69e14321ea
--- /dev/null
+++ b/sys/compat/osf1/osf1_errno.h
@@ -0,0 +1,149 @@
+/* $OpenBSD: osf1_errno.h,v 1.1 2000/08/04 15:47:54 ericj Exp $ */
+/* $NetBSD: osf1_errno.h,v 1.2 1999/04/23 18:00:34 cgd Exp $ */
+
+/*
+ * Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Christopher G. Demetriou
+ * for the NetBSD Project.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * OSF/1 error number definitions, as described by the Digital UNIX V4.0
+ * <sys/errno.h>.
+ */
+
+#ifndef _COMPAT_OSF1_OSF1_ERRNO_H_
+#define _COMPAT_OSF1_OSF1_ERRNO_H_
+
+#define OSF1_ESUCCESS 0
+#define OSF1_EPERM 1
+#define OSF1_ENOENT 2
+#define OSF1_ESRCH 3
+#define OSF1_EINTR 4
+#define OSF1_EIO 5
+#define OSF1_ENXIO 6
+#define OSF1_E2BIG 7
+#define OSF1_ENOEXEC 8
+#define OSF1_EBADF 9
+#define OSF1_ECHILD 10
+#define OSF1_EDEADLK 11
+#define OSF1_ENOMEM 12
+#define OSF1_EACCES 13
+#define OSF1_EFAULT 14
+#define OSF1_ENOTBLK 15
+#define OSF1_EBUSY 16
+#define OSF1_EEXIST 17
+#define OSF1_EXDEV 18
+#define OSF1_ENODEV 19
+#define OSF1_ENOTDIR 20
+#define OSF1_EISDIR 21
+#define OSF1_EINVAL 22
+#define OSF1_ENFILE 23
+#define OSF1_EMFILE 24
+#define OSF1_ENOTTY 25
+#define OSF1_ETXTBSY 26
+#define OSF1_EFBIG 27
+#define OSF1_ENOSPC 28
+#define OSF1_ESPIPE 29
+#define OSF1_EROFS 30
+#define OSF1_EMLINK 31
+#define OSF1_EPIPE 32
+#define OSF1_EDOM 33
+#define OSF1_ERANGE 34
+#define OSF1_EWOULDBLOCK 35
+#define OSF1_EINPROGRESS 36
+#define OSF1_EALREADY 37
+#define OSF1_ENOTSOCK 38
+#define OSF1_EDESTADDRREQ 39
+#define OSF1_EMSGSIZE 40
+#define OSF1_EPROTOTYPE 41
+#define OSF1_ENOPROTOOPT 42
+#define OSF1_EPROTONOSUPPORT 43
+#define OSF1_ESOCKTNOSUPPORT 44
+#define OSF1_EOPNOTSUPP 45
+#define OSF1_EPFNOSUPPORT 46
+#define OSF1_EAFNOSUPPORT 47
+#define OSF1_EADDRINUSE 48
+#define OSF1_EADDRNOTAVAIL 49
+#define OSF1_ENETDOWN 50
+#define OSF1_ENETUNREACH 51
+#define OSF1_ENETRESET 52
+#define OSF1_ECONNABORTED 53
+#define OSF1_ECONNRESET 54
+#define OSF1_ENOBUFS 55
+#define OSF1_EISCONN 56
+#define OSF1_ENOTCONN 57
+#define OSF1_ESHUTDOWN 58
+#define OSF1_ETOOMANYREFS 59
+#define OSF1_ETIMEDOUT 60
+#define OSF1_ECONNREFUSED 61
+#define OSF1_ELOOP 62
+#define OSF1_ENAMETOOLONG 63
+#define OSF1_EHOSTDOWN 64
+#define OSF1_EHOSTUNREACH 65
+#define OSF1_ENOTEMPTY 66
+#define OSF1_EPROCLIM 67
+#define OSF1_EUSERS 68
+#define OSF1_EDQUOT 69
+#define OSF1_ESTALE 70
+#define OSF1_EREMOTE 71
+#define OSF1_EBADRPC 72
+#define OSF1_ERPCMISMATCH 73
+#define OSF1_EPROGUNAVAIL 74
+#define OSF1_EPROGMISMATCH 75
+#define OSF1_EPROCUNAVAIL 76
+#define OSF1_ENOLCK 77
+#define OSF1_ENOSYS 78
+#define OSF1_EFTYPE 79
+#define OSF1_ENOMSG 80
+#define OSF1_EIDRM 81
+#define OSF1_ENOSR 82
+#define OSF1_ETIME 83
+#define OSF1_EBADMSG 84
+#define OSF1_EPROTO 85
+#define OSF1_ENODATA 86
+#define OSF1_ENOSTR 87
+#define OSF1_ECLONEME 88
+#define OSF1_EDIRTY 89
+#define OSF1_EDUPPKG 90
+#define OSF1_EVERSION 91
+#define OSF1_ENOPKG 92
+#define OSF1_ENOSYM 93
+#define OSF1_ECANCELED 94
+#define OSF1_EFAIL 95
+#define OSF1_EINPROG 97
+#define OSF1_EMTIMERS 98
+#define OSF1_ENOTSUP 99
+#define OSF1_EAIO 100
+#define OSF1_EMULTIHOP 101
+#define OSF1_ENOLINK 102
+#define OSF1_EOVERFLOW 103
+#define OSF1_EILSEQ 116
+#define OSF1_ESOFT 123
+#define OSF1_EMEDIA 124
+
+#endif /* _COMPAT_OSF1_OSF1_ERRNO_H_ */
diff --git a/sys/compat/osf1/osf1_exec.c b/sys/compat/osf1/osf1_exec.c
new file mode 100644
index 00000000000..036c36cc3f1
--- /dev/null
+++ b/sys/compat/osf1/osf1_exec.c
@@ -0,0 +1,352 @@
+/* $OpenBSD: osf1_exec.c,v 1.1 2000/08/04 15:47:55 ericj Exp $ */
+/* $NetBSD$ */
+
+/*
+ * Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Christopher G. Demetriou
+ * for the NetBSD Project.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/proc.h>
+#include <sys/malloc.h>
+#include <sys/namei.h>
+#include <sys/vnode.h>
+#include <sys/mount.h>
+#include <sys/exec.h>
+#include <sys/exec_ecoff.h>
+#include <sys/signalvar.h>
+#include <sys/fcntl.h>
+#include <sys/stat.h>
+
+#include <compat/osf1/osf1.h>
+#include <compat/osf1/osf1_syscall.h>
+#include <compat/osf1/osf1_util.h>
+#include <compat/osf1/osf1_cvt.h>
+
+extern int scdebug;
+extern char *osf1_syscallnames[];
+
+
+struct osf1_exec_emul_arg {
+ int flags;
+#define OSF1_EXEC_EMUL_FLAGS_HAVE_LOADER 0x01
+
+ char exec_name[MAXPATHLEN+1];
+ char loader_name[MAXPATHLEN+1];
+};
+
+#if 0
+static void *osf1_copyargs(struct exec_package *pack,
+ struct ps_strings *arginfo, void *stack, void *argp);
+
+#define MAX_AUX_ENTRIES 4 /* max we'll ever push (right now) */
+#endif
+
+extern struct sysent osf1_sysent[];
+extern void cpu_exec_ecoff_setregs __P((struct proc *, struct exec_package *,
+ u_long, register_t *));
+extern char sigcode[], esigcode[];
+
+struct emul emul_osf1 = {
+ "osf1",
+ NULL,
+ sendsig,
+ OSF1_SYS_syscall,
+ OSF1_SYS_MAXSYSCALL,
+ osf1_sysent,
+#ifdef SYSCALL_DEBUG
+ osf1_syscallnames,
+#else
+ NULL,
+#endif
+ 0,
+ copyargs,
+ cpu_exec_ecoff_setregs,
+ NULL,
+ sigcode,
+ esigcode,
+};
+
+#if 0
+int
+osf1_exec_ecoff_hook(struct proc *p, struct exec_package *epp)
+{
+ struct ecoff_exechdr *execp = (struct ecoff_exechdr *)epp->ep_hdr;
+ struct osf1_exec_emul_arg *emul_arg;
+ int error;
+
+ /* if we're here and we're exec-able at all, we're an OSF/1 binary */
+ epp->ep_emul = &emul_osf1;
+
+ /* set up the exec package emul arg as appropriate */
+ emul_arg = malloc(sizeof *emul_arg, M_TEMP, M_WAITOK);
+ epp->ep_emul_arg = emul_arg;
+
+ emul_arg->flags = 0;
+ if (epp->ep_ndp->ni_segflg == UIO_SYSSPACE)
+ error = copystr(epp->ep_ndp->ni_dirp, emul_arg->exec_name,
+ MAXPATHLEN + 1, NULL);
+ else
+ error = copyinstr(epp->ep_ndp->ni_dirp, emul_arg->exec_name,
+ MAXPATHLEN + 1, NULL);
+#ifdef DIAGNOSTIC
+ if (error != 0)
+ panic("osf1_exec_ecoff_hook: copyinstr failed");
+#endif
+
+ /* do any special object file handling */
+ switch (execp->f.f_flags & ECOFF_FLAG_OBJECT_TYPE_MASK) {
+ case ECOFF_OBJECT_TYPE_SHARABLE:
+ /* can't exec a shared library! */
+#if 0
+ uprintf("can't execute OSF/1 shared libraries\n");
+#endif
+ error = ENOEXEC;
+ break;
+
+ case ECOFF_OBJECT_TYPE_CALL_SHARED:
+ error = osf1_exec_ecoff_dynamic(p, epp);
+ break;
+
+ default:
+ /* just let the normal ECOFF handlers deal with it. */
+ error = 0;
+ break;
+ }
+
+ if (error) {
+ free(epp->ep_emul_arg, M_TEMP);
+ epp->ep_emul_arg = NULL;
+ kill_vmcmds(&epp->ep_vmcmds); /* if any */
+ }
+
+ return (error);
+}
+
+/*
+ * copy arguments onto the stack in the normal way, then copy out
+ * any ELF-like AUX entries used by the dynamic loading scheme.
+ */
+static void *
+osf1_copyargs(pack, arginfo, stack, argp)
+ struct exec_package *pack;
+ struct ps_strings *arginfo;
+ void *stack;
+ void *argp;
+{
+ struct proc *p = curproc; /* XXX !!! */
+ struct osf1_exec_emul_arg *emul_arg = pack->ep_emul_arg;
+ struct osf1_auxv ai[MAX_AUX_ENTRIES], *a;
+ char *prognameloc, *loadernameloc;
+ size_t len;
+
+ stack = copyargs(pack, arginfo, stack, argp);
+ if (!stack)
+ goto bad;
+
+ a = ai;
+ memset(ai, 0, sizeof ai);
+
+ prognameloc = (char *)stack + sizeof ai;
+ if (copyoutstr(emul_arg->exec_name, prognameloc, MAXPATHLEN + 1, NULL))
+ goto bad;
+ a->a_type = OSF1_AT_EXEC_FILENAME;
+ a->a_un.a_ptr = prognameloc;
+ a++;
+
+ /*
+ * if there's a loader, push additional auxv entries on the stack.
+ */
+ if (emul_arg->flags & OSF1_EXEC_EMUL_FLAGS_HAVE_LOADER) {
+
+ loadernameloc = prognameloc + MAXPATHLEN + 1;
+ if (copyoutstr(emul_arg->loader_name, loadernameloc,
+ MAXPATHLEN + 1, NULL))
+ goto bad;
+ a->a_type = OSF1_AT_EXEC_LOADER_FILENAME;
+ a->a_un.a_ptr = loadernameloc;
+ a++;
+
+ a->a_type = OSF1_AT_EXEC_LOADER_FLAGS;
+ a->a_un.a_val = 0;
+ if (pack->ep_vap->va_mode & S_ISUID)
+ a->a_un.a_val |= OSF1_LDR_EXEC_SETUID_F;
+ if (pack->ep_vap->va_mode & S_ISGID)
+ a->a_un.a_val |= OSF1_LDR_EXEC_SETGID_F;
+ if (p->p_flag & P_TRACED)
+ a->a_un.a_val |= OSF1_LDR_EXEC_PTRACE_F;
+ a++;
+ }
+
+ a->a_type = OSF1_AT_NULL;
+ a->a_un.a_val = 0;
+ a++;
+
+ len = (a - ai) * sizeof(struct osf1_auxv);
+ if (copyout(ai, stack, len))
+ goto bad;
+ stack = (caddr_t)stack + len;
+
+out:
+ free(pack->ep_emul_arg, M_TEMP);
+ pack->ep_emul_arg = NULL;
+ return stack;
+
+bad:
+ stack = NULL;
+ goto out;
+}
+
+static int
+osf1_exec_ecoff_dynamic(struct proc *p, struct exec_package *epp)
+{
+ struct osf1_exec_emul_arg *emul_arg = epp->ep_emul_arg;
+ struct ecoff_exechdr ldr_exechdr;
+ struct nameidata nd;
+ struct vnode *ldr_vp;
+ const char *pathbuf;
+ size_t resid;
+ int error;
+
+ /*
+ * locate the loader
+ */
+ error = emul_find(p, NULL, osf1_emul_path,
+ OSF1_LDR_EXEC_DEFAULT_LOADER, &pathbuf, 0);
+ /* includes /emul/osf1 if appropriate */
+ strncpy(emul_arg->loader_name, pathbuf, MAXPATHLEN + 1);
+ emul_arg->flags |= OSF1_EXEC_EMUL_FLAGS_HAVE_LOADER;
+ if (!error)
+ free((char *)pathbuf, M_TEMP);
+
+#if 0
+ uprintf("loader is %s\n", emul_arg->loader_name);
+#endif
+
+ /*
+ * open the loader, see if it's an ECOFF executable,
+ * make sure the object type is amenable, then arrange to
+ * load it up.
+ */
+ NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_SYSSPACE,
+ emul_arg->loader_name, p);
+ if ((error = namei(&nd)) != 0)
+ goto bad_no_vp;
+ ldr_vp = nd.ni_vp;
+
+ /*
+ * Basic access checks. Reject if:
+ * not a regular file
+ * exec not allowed on binary
+ * exec not allowed on mount point
+ */
+ if (ldr_vp->v_type != VREG) {
+ error = EACCES;
+ goto badunlock;
+ }
+
+ if ((error = VOP_ACCESS(ldr_vp, VEXEC, p->p_ucred, p)) != 0)
+ goto badunlock;
+
+ if (ldr_vp->v_mount->mnt_flag & MNT_NOEXEC) {
+ error = EACCES;
+ goto badunlock;
+ }
+
+ /*
+ * If loader's mount point disallows set-id execution,
+ * disable set-id.
+ */
+ if (ldr_vp->v_mount->mnt_flag & MNT_NOSUID)
+ epp->ep_vap->va_mode &= ~(S_ISUID | S_ISGID);
+
+ VOP_UNLOCK(ldr_vp, 0);
+
+ /*
+ * read the header, and make sure we got all of it.
+ */
+ if ((error = vn_rdwr(UIO_READ, ldr_vp, (caddr_t)&ldr_exechdr,
+ sizeof ldr_exechdr, 0, UIO_SYSSPACE, 0, p->p_ucred,
+ &resid, p)) != 0)
+ goto bad;
+ if (resid != 0) {
+ error = ENOEXEC;
+ goto bad;
+ }
+
+ /*
+ * Check the magic. We expect it to be the native Alpha ECOFF
+ * (Digital UNIX) magic number. Also make sure it's not a shared
+ * lib or dynamically linked executable.
+ */
+ if (ldr_exechdr.f.f_magic != ECOFF_MAGIC_ALPHA) {
+ error = ENOEXEC;
+ goto bad;
+ }
+ switch (ldr_exechdr.f.f_flags & ECOFF_FLAG_OBJECT_TYPE_MASK) {
+ case ECOFF_OBJECT_TYPE_SHARABLE:
+ case ECOFF_OBJECT_TYPE_CALL_SHARED:
+ /* can't exec shared lib or dynamically linked executable. */
+ error = ENOEXEC;
+ goto bad;
+ }
+
+ switch (ldr_exechdr.a.magic) {
+ case ECOFF_OMAGIC:
+ error = exec_ecoff_prep_omagic(p, epp, &ldr_exechdr, ldr_vp);
+ break;
+ case ECOFF_NMAGIC:
+ error = exec_ecoff_prep_nmagic(p, epp, &ldr_exechdr, ldr_vp);
+ break;
+ case ECOFF_ZMAGIC:
+ error = exec_ecoff_prep_zmagic(p, epp, &ldr_exechdr, ldr_vp);
+ break;
+ default:
+ error = ENOEXEC;
+ }
+ if (error)
+ goto bad;
+
+ /* finally, set up the stack. */
+ error = exec_ecoff_setup_stack(p, epp);
+ if (error)
+ goto bad;
+
+ vrele(ldr_vp);
+ return (0);
+
+badunlock:
+ VOP_UNLOCK(ldr_vp, 0);
+bad:
+ vrele(ldr_vp);
+bad_no_vp:
+ return (error);
+}
+#endif
diff --git a/sys/compat/osf1/osf1_file.c b/sys/compat/osf1/osf1_file.c
new file mode 100644
index 00000000000..23e472e6ff9
--- /dev/null
+++ b/sys/compat/osf1/osf1_file.c
@@ -0,0 +1,348 @@
+/* $OpenBSD: osf1_file.c,v 1.1 2000/08/04 15:47:55 ericj Exp $ */
+/* $NetBSD: osf1_file.c,v 1.6 2000/06/06 19:04:17 soren Exp $ */
+
+/*
+ * Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Christopher G. Demetriou
+ * for the NetBSD Project.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Copyright (c) 1994, 1995 Carnegie-Mellon University.
+ * All rights reserved.
+ *
+ * Author: Chris G. Demetriou
+ *
+ * Permission to use, copy, modify and distribute this software and
+ * its documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ *
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
+ * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ *
+ * Carnegie Mellon requests users of this software to return to
+ *
+ * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
+ * School of Computer Science
+ * Carnegie Mellon University
+ * Pittsburgh PA 15213-3890
+ *
+ * any improvements or extensions that they make and grant Carnegie the
+ * rights to redistribute these changes.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/namei.h>
+#include <sys/proc.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <sys/filedesc.h>
+#include <sys/kernel.h>
+#include <sys/malloc.h>
+#include <sys/mman.h>
+#include <sys/mount.h>
+#include <sys/signal.h>
+#include <sys/signalvar.h>
+#include <sys/reboot.h>
+#include <sys/syscallargs.h>
+#include <sys/exec.h>
+#include <sys/vnode.h>
+#include <sys/socketvar.h>
+#include <sys/resource.h>
+#include <sys/resourcevar.h>
+#include <sys/wait.h>
+
+#include <compat/osf1/osf1.h>
+#include <compat/osf1/osf1_syscallargs.h>
+#include <compat/osf1/osf1_util.h>
+#include <compat/osf1/osf1_cvt.h>
+
+int
+osf1_sys_access(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_access_args *uap = v;
+ struct sys_access_args a;
+ unsigned long leftovers;
+ caddr_t sg;
+
+ sg = stackgap_init(p->p_emul);
+ OSF1_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+
+ SCARG(&a, path) = SCARG(uap, path);
+
+ /* translate flags */
+ SCARG(&a, flags) = emul_flags_translate(osf1_access_flags_xtab,
+ SCARG(uap, flags), &leftovers);
+ if (leftovers != 0)
+ return (EINVAL);
+
+ return sys_access(p, &a, retval);
+}
+
+int
+osf1_sys_execve(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_execve_args *uap = v;
+ struct sys_execve_args ap;
+ caddr_t sg;
+
+ sg = stackgap_init(p->p_emul);
+ OSF1_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+
+ SCARG(&ap, path) = SCARG(uap, path);
+ SCARG(&ap, argp) = SCARG(uap, argp);
+ SCARG(&ap, envp) = SCARG(uap, envp);
+
+ return sys_execve(p, &ap, retval);
+}
+
+/*
+ * Get file status; this version does not follow links.
+ */
+/* ARGSUSED */
+int
+osf1_sys_lstat(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_lstat_args *uap = v;
+ struct stat sb;
+ struct osf1_stat osb;
+ int error;
+ struct nameidata nd;
+ caddr_t sg;
+
+ sg = stackgap_init(p->p_emul);
+ OSF1_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+
+ NDINIT(&nd, LOOKUP, NOFOLLOW | LOCKLEAF, UIO_USERSPACE,
+ SCARG(uap, path), p);
+ if ((error = namei(&nd)))
+ return (error);
+ error = vn_stat(nd.ni_vp, &sb, p);
+ vput(nd.ni_vp);
+ if (error)
+ return (error);
+ osf1_cvt_stat_from_native(&sb, &osb);
+ error = copyout((caddr_t)&osb, (caddr_t)SCARG(uap, ub), sizeof (osb));
+ return (error);
+}
+
+int
+osf1_sys_mknod(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_mknod_args *uap = v;
+ struct sys_mknod_args a;
+ caddr_t sg;
+
+ sg = stackgap_init(p->p_emul);
+ OSF1_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+
+ SCARG(&a, path) = SCARG(uap, path);
+ SCARG(&a, mode) = SCARG(uap, mode);
+ SCARG(&a, dev) = osf1_cvt_dev_to_native(SCARG(uap, dev));
+
+ return sys_mknod(p, &a, retval);
+}
+
+int
+osf1_sys_open(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_open_args *uap = v;
+ struct sys_open_args a;
+ char *path;
+ caddr_t sg;
+ unsigned long leftovers;
+#ifdef SYSCALL_DEBUG
+ char pnbuf[1024];
+
+ if (scdebug &&
+ copyinstr(SCARG(uap, path), pnbuf, sizeof pnbuf, NULL) == 0)
+ printf("osf1_open: open: %s\n", pnbuf);
+#endif
+
+ sg = stackgap_init(p->p_emul);
+
+ /* translate flags */
+ SCARG(&a, flags) = emul_flags_translate(osf1_open_flags_xtab,
+ SCARG(uap, flags), &leftovers);
+ if (leftovers != 0)
+ return (EINVAL);
+
+ /* copy mode, no translation necessary */
+ SCARG(&a, mode) = SCARG(uap, mode);
+
+ /* pick appropriate path */
+ path = SCARG(uap, path);
+ if (SCARG(&a, flags) & O_CREAT)
+ OSF1_CHECK_ALT_CREAT(p, &sg, path);
+ else
+ OSF1_CHECK_ALT_EXIST(p, &sg, path);
+ SCARG(&a, path) = path;
+
+ return sys_open(p, &a, retval);
+}
+
+int
+osf1_sys_pathconf(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_pathconf_args *uap = v;
+ struct sys_pathconf_args a;
+ caddr_t sg;
+ int error;
+
+ sg = stackgap_init(p->p_emul);
+
+ OSF1_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+ SCARG(&a, path) = SCARG(uap, path);
+
+ error = osf1_cvt_pathconf_name_to_native(SCARG(uap, name),
+ &SCARG(&a, name));
+
+ if (error == 0)
+ error = sys_pathconf(p, &a, retval);
+
+ return (error);
+}
+
+/*
+ * Get file status; this version follows links.
+ */
+/* ARGSUSED */
+int
+osf1_sys_stat(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_stat_args *uap = v;
+ struct stat sb;
+ struct osf1_stat osb;
+ int error;
+ struct nameidata nd;
+ caddr_t sg;
+
+ sg = stackgap_init(p->p_emul);
+ OSF1_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+
+ NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_USERSPACE,
+ SCARG(uap, path), p);
+ if ((error = namei(&nd)))
+ return (error);
+ error = vn_stat(nd.ni_vp, &sb, p);
+ vput(nd.ni_vp);
+ if (error)
+ return (error);
+ osf1_cvt_stat_from_native(&sb, &osb);
+ error = copyout((caddr_t)&osb, (caddr_t)SCARG(uap, ub), sizeof (osb));
+ return (error);
+}
+
+int
+osf1_sys_truncate(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_truncate_args *uap = v;
+ struct sys_truncate_args a;
+ caddr_t sg;
+
+ sg = stackgap_init(p->p_emul);
+ OSF1_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+
+ SCARG(&a, path) = SCARG(uap, path);
+ SCARG(&a, pad) = 0;
+ SCARG(&a, length) = SCARG(uap, length);
+
+ return sys_truncate(p, &a, retval);
+}
+
+int
+osf1_sys_utimes(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_utimes_args *uap = v;
+ struct sys_utimes_args a;
+ struct osf1_timeval otv;
+ struct timeval tv;
+ caddr_t sg;
+ int error;
+
+ sg = stackgap_init(p->p_emul);
+
+ OSF1_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+ SCARG(&a, path) = SCARG(uap, path);
+
+ error = 0;
+ if (SCARG(uap, tptr) == NULL)
+ SCARG(&a, tptr) = NULL;
+ else {
+ SCARG(&a, tptr) = stackgap_alloc(&sg, sizeof tv);
+
+ /* get the OSF/1 timeval argument */
+ error = copyin((caddr_t)SCARG(uap, tptr),
+ (caddr_t)&otv, sizeof otv);
+ if (error == 0) {
+
+ /* fill in and copy out the NetBSD timeval */
+ memset(&tv, 0, sizeof tv);
+ tv.tv_sec = otv.tv_sec;
+ tv.tv_usec = otv.tv_usec;
+
+ error = copyout((caddr_t)&tv,
+ (caddr_t)SCARG(&a, tptr), sizeof tv);
+ }
+ }
+
+ if (error == 0)
+ error = sys_utimes(p, &a, retval);
+
+ return (error);
+}
diff --git a/sys/compat/osf1/osf1_generic.c b/sys/compat/osf1/osf1_generic.c
new file mode 100644
index 00000000000..853608877a5
--- /dev/null
+++ b/sys/compat/osf1/osf1_generic.c
@@ -0,0 +1,213 @@
+/* $OpenBSD: osf1_generic.c,v 1.1 2000/08/04 15:47:55 ericj Exp $ */
+/* $NetBSD: osf1_generic.c,v 1.1 1999/05/01 05:06:46 cgd Exp $ */
+
+/*
+ * Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Christopher G. Demetriou
+ * for the NetBSD Project.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Copyright (c) 1994, 1995 Carnegie-Mellon University.
+ * All rights reserved.
+ *
+ * Author: Chris G. Demetriou
+ *
+ * Permission to use, copy, modify and distribute this software and
+ * its documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ *
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
+ * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ *
+ * Carnegie Mellon requests users of this software to return to
+ *
+ * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
+ * School of Computer Science
+ * Carnegie Mellon University
+ * Pittsburgh PA 15213-3890
+ *
+ * any improvements or extensions that they make and grant Carnegie the
+ * rights to redistribute these changes.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/namei.h>
+#include <sys/proc.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <sys/malloc.h>
+#include <sys/mman.h>
+#include <sys/mount.h>
+#include <sys/syscallargs.h>
+#include <sys/exec.h>
+
+#include <compat/osf1/osf1.h>
+#include <compat/osf1/osf1_syscallargs.h>
+#include <compat/osf1/osf1_cvt.h>
+
+/*
+ * The structures end up being the same... but we can't be sure that
+ * the other word of our iov_len is zero!
+ */
+int
+osf1_sys_readv(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_readv_args *uap = v;
+ struct sys_readv_args a;
+ struct osf1_iovec *oio;
+ struct iovec *nio;
+ caddr_t sg = stackgap_init(p->p_emul);
+ int error, osize, nsize, i;
+
+ if (SCARG(uap, iovcnt) > (STACKGAPLEN / sizeof (struct iovec)))
+ return (EINVAL);
+
+ osize = SCARG(uap, iovcnt) * sizeof (struct osf1_iovec);
+ nsize = SCARG(uap, iovcnt) * sizeof (struct iovec);
+
+ oio = malloc(osize, M_TEMP, M_WAITOK);
+ nio = malloc(nsize, M_TEMP, M_WAITOK);
+
+ error = 0;
+ if ((error = copyin(SCARG(uap, iovp), oio, osize)))
+ goto punt;
+ for (i = 0; i < SCARG(uap, iovcnt); i++) {
+ nio[i].iov_base = oio[i].iov_base;
+ nio[i].iov_len = oio[i].iov_len;
+ }
+
+ SCARG(&a, fd) = SCARG(uap, fd);
+ SCARG(&a, iovp) = stackgap_alloc(&sg, nsize);
+ SCARG(&a, iovcnt) = SCARG(uap, iovcnt);
+
+ if ((error = copyout(nio, (caddr_t)SCARG(&a, iovp), nsize)))
+ goto punt;
+ error = sys_readv(p, &a, retval);
+
+punt:
+ free(oio, M_TEMP);
+ free(nio, M_TEMP);
+ return (error);
+}
+
+int
+osf1_sys_select(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_select_args *uap = v;
+ struct sys_select_args a;
+ struct osf1_timeval otv;
+ struct timeval tv;
+ int error;
+ caddr_t sg;
+
+ SCARG(&a, nd) = SCARG(uap, nd);
+ SCARG(&a, in) = SCARG(uap, in);
+ SCARG(&a, ou) = SCARG(uap, ou);
+ SCARG(&a, ex) = SCARG(uap, ex);
+
+ error = 0;
+ if (SCARG(uap, tv) == NULL)
+ SCARG(&a, tv) = NULL;
+ else {
+ sg = stackgap_init(p->p_emul);
+ SCARG(&a, tv) = stackgap_alloc(&sg, sizeof tv);
+
+ /* get the OSF/1 timeval argument */
+ error = copyin((caddr_t)SCARG(uap, tv),
+ (caddr_t)&otv, sizeof otv);
+ if (error == 0) {
+
+ /* fill in and copy out the NetBSD timeval */
+ memset(&tv, 0, sizeof tv);
+ tv.tv_sec = otv.tv_sec;
+ tv.tv_usec = otv.tv_usec;
+
+ error = copyout((caddr_t)&tv,
+ (caddr_t)SCARG(&a, tv), sizeof tv);
+ }
+ }
+
+ if (error == 0)
+ error = sys_select(p, &a, retval);
+
+ return (error);
+}
+
+int
+osf1_sys_writev(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_writev_args *uap = v;
+ struct sys_writev_args a;
+ struct osf1_iovec *oio;
+ struct iovec *nio;
+ caddr_t sg = stackgap_init(p->p_emul);
+ int error, osize, nsize, i;
+
+ if (SCARG(uap, iovcnt) > (STACKGAPLEN / sizeof (struct iovec)))
+ return (EINVAL);
+
+ osize = SCARG(uap, iovcnt) * sizeof (struct osf1_iovec);
+ nsize = SCARG(uap, iovcnt) * sizeof (struct iovec);
+
+ oio = malloc(osize, M_TEMP, M_WAITOK);
+ nio = malloc(nsize, M_TEMP, M_WAITOK);
+
+ error = 0;
+ if ((error = copyin(SCARG(uap, iovp), oio, osize)))
+ goto punt;
+ for (i = 0; i < SCARG(uap, iovcnt); i++) {
+ nio[i].iov_base = oio[i].iov_base;
+ nio[i].iov_len = oio[i].iov_len;
+ }
+
+ SCARG(&a, fd) = SCARG(uap, fd);
+ SCARG(&a, iovp) = stackgap_alloc(&sg, nsize);
+ SCARG(&a, iovcnt) = SCARG(uap, iovcnt);
+
+ if ((error = copyout(nio, (caddr_t)SCARG(&a, iovp), nsize)))
+ goto punt;
+ error = sys_writev(p, &a, retval);
+
+punt:
+ free(oio, M_TEMP);
+ free(nio, M_TEMP);
+ return (error);
+}
diff --git a/sys/compat/osf1/osf1_ioctl.c b/sys/compat/osf1/osf1_ioctl.c
index 8ad73d211a3..cba166475c5 100644
--- a/sys/compat/osf1/osf1_ioctl.c
+++ b/sys/compat/osf1/osf1_ioctl.c
@@ -1,5 +1,35 @@
-/* $OpenBSD: osf1_ioctl.c,v 1.2 1996/08/02 20:35:26 niklas Exp $ */
-/* $NetBSD: osf1_ioctl.c,v 1.3 1995/10/07 06:27:19 mycroft Exp $ */
+/* $OpenBSD: osf1_ioctl.c,v 1.3 2000/08/04 15:47:55 ericj Exp $ */
+/* $NetBSD: osf1_ioctl.c,v 1.11 1999/05/05 01:51:33 cgd Exp $ */
+
+/*
+ * Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Christopher G. Demetriou
+ * for the NetBSD Project.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
/*
* Copyright (c) 1994, 1995 Carnegie-Mellon University.
@@ -32,31 +62,21 @@
#include <sys/systm.h>
#include <sys/ioctl.h>
#include <sys/termios.h>
-
#include <sys/mount.h>
#include <sys/syscallargs.h>
+
+#include <compat/osf1/osf1.h>
#include <compat/osf1/osf1_syscallargs.h>
#ifdef SYSCALL_DEBUG
extern int scdebug;
#endif
-#define OSF1_IOCPARM_MASK 0x1fff /* parameter length, at most 13 bits */
-#define OSF1_IOCPARM_LEN(x) (((x) >> 16) & OSF1_IOCPARM_MASK)
-#define OSF1_IOCGROUP(x) (((x) >> 8) & 0xff)
-
-#define OSF1_IOCPARM_MAX NBPG /* max size of ioctl */
-#define OSF1_IOC_VOID 0x20000000 /* no parameters */
-#define OSF1_IOC_OUT 0x40000000 /* copy out parameters */
-#define OSF1_IOC_IN 0x80000000 /* copy in parameters */
-#define OSF1_IOC_INOUT (OSF1_IOC_IN|OSF1_IOC_OUT)
-#define OSF1_IOC_DIRMASK 0xe0000000 /* mask for IN/OUT/VOID */
-
-#define OSF1_IOCCMD(x) ((x) & 0xff)
-
-int osf1_ioctl_i __P((struct proc *p, struct sys_ioctl_args *nuap,
+static int osf1_ioctl_f __P((struct proc *p, struct sys_ioctl_args *nuap,
register_t *retval, int cmd, int dir, int len));
-int osf1_ioctl_t __P((struct proc *p, struct sys_ioctl_args *nuap,
+static int osf1_ioctl_i __P((struct proc *p, struct sys_ioctl_args *nuap,
+ register_t *retval, int cmd, int dir, int len));
+static int osf1_ioctl_t __P((struct proc *p, struct sys_ioctl_args *nuap,
register_t *retval, int cmd, int dir, int len));
int
@@ -65,16 +85,8 @@ osf1_sys_ioctl(p, v, retval)
void *v;
register_t *retval;
{
- struct osf1_sys_ioctl_args /* {
- syscallarg(int) fd;
- syscallarg(int) com;
- syscallarg(caddr_t) data;
- } */ *uap = v;
- struct sys_ioctl_args /* {
- syscallarg(int) fd;
- syscallarg(u_long) com;
- syscallarg(caddr_t) data;
- } */ a;
+ struct osf1_sys_ioctl_args *uap = v;
+ struct sys_ioctl_args a;
int op, dir, group, cmd, len;
#ifdef SYSCALL_DEBUG
char *dirstr;
@@ -123,9 +135,11 @@ osf1_sys_ioctl(p, v, retval)
#endif
SCARG(&a, fd) = SCARG(uap, fd);
- SCARG(&a, com) = SCARG(uap, com);
+ SCARG(&a, com) = SCARG(uap, com) & 0xffffffff; /* XXX */
SCARG(&a, data) = SCARG(uap, data);
switch (group) {
+ case 'f':
+ return osf1_ioctl_f(p, &a, retval, cmd, dir, len);
case 'i':
return osf1_ioctl_i(p, &a, retval, cmd, dir, len);
case 't':
@@ -135,14 +149,38 @@ osf1_sys_ioctl(p, v, retval)
}
}
-int
+static int
+osf1_ioctl_f(p, uap, retval, cmd, dir, len)
+ struct proc *p;
+ struct sys_ioctl_args *uap;
+ register_t *retval;
+ int cmd;
+ int dir;
+ int len;
+{
+
+ switch (cmd) {
+ case 1: /* OSF/1 FIOCLEX */
+ case 2: /* OSF/1 FIONCLEX */
+ case 123: /* OSF/1 FIOGETOWN */
+ case 124: /* OSF/1 FIOSETOWN */
+ case 125: /* OSF/1 FIOASYNC */
+ case 126: /* OSF/1 FIONBIO */
+ case 127: /* OSF/1 FIONREAD */
+ /* same as in NetBSD */
+ break;
+
+ default:
+ return (ENOTTY);
+ }
+
+ return sys_ioctl(p, uap, retval);
+}
+
+static int
osf1_ioctl_i(p, uap, retval, cmd, dir, len)
struct proc *p;
- struct sys_ioctl_args /* {
- syscallarg(int) fd;
- syscallarg(int) com;
- syscallarg(caddr_t) data;
- } */ *uap;
+ struct sys_ioctl_args *uap;
register_t *retval;
int cmd;
int dir;
@@ -173,14 +211,10 @@ osf1_ioctl_i(p, uap, retval, cmd, dir, len)
return sys_ioctl(p, uap, retval);
}
-int
+static int
osf1_ioctl_t(p, uap, retval, cmd, dir, len)
struct proc *p;
- struct sys_ioctl_args /* {
- syscallarg(int) fd;
- syscallarg(int) com;
- syscallarg(caddr_t) data;
- } */ *uap;
+ struct sys_ioctl_args *uap;
register_t *retval;
int cmd;
int dir;
diff --git a/sys/compat/osf1/osf1_misc.c b/sys/compat/osf1/osf1_misc.c
index 272308b3272..0800adcce1b 100644
--- a/sys/compat/osf1/osf1_misc.c
+++ b/sys/compat/osf1/osf1_misc.c
@@ -1,5 +1,35 @@
-/* $OpenBSD: osf1_misc.c,v 1.11 1999/11/10 15:55:23 mickey Exp $ */
-/* $NetBSD: osf1_misc.c,v 1.7 1995/10/07 06:53:04 mycroft Exp $ */
+/* $OpenBSD: osf1_misc.c,v 1.12 2000/08/04 15:47:55 ericj Exp $ */
+/* $NetBSD: osf1_misc.c,v 1.55 2000/06/28 15:39:33 mrg Exp $ */
+
+/*
+ * Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Christopher G. Demetriou
+ * for the NetBSD Project.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
/*
* Copyright (c) 1994, 1995 Carnegie-Mellon University.
@@ -41,949 +71,282 @@
#include <sys/mount.h>
#include <sys/signal.h>
#include <sys/signalvar.h>
-#include <sys/socketvar.h>
#include <sys/reboot.h>
#include <sys/syscallargs.h>
+#include <sys/exec.h>
#include <sys/vnode.h>
+#include <sys/socketvar.h>
+#include <sys/resource.h>
+#include <sys/resourcevar.h>
+#include <sys/wait.h>
-#include <compat/osf1/osf1_syscall.h>
+#include <compat/osf1/osf1.h>
#include <compat/osf1/osf1_syscallargs.h>
#include <compat/osf1/osf1_util.h>
-
-#include <vm/vm.h>
+#include <compat/osf1/osf1_cvt.h>
#ifdef SYSCALL_DEBUG
extern int scdebug;
-extern char *osf1_syscallnames[];
-#endif
-
-extern struct sysent osf1_sysent[];
-extern void cpu_exec_ecoff_setregs __P((struct proc *, struct exec_package *,
- u_long, register_t *));
-
-extern char sigcode[], esigcode[];
-
-void cvtstat2osf1 __P((struct stat *, struct osf1_stat *));
-
-struct emul emul_osf1 = {
- "osf1",
- NULL,
- sendsig,
- OSF1_SYS_syscall,
- OSF1_SYS_MAXSYSCALL,
- osf1_sysent,
-#ifdef SYSCALL_DEBUG
- osf1_syscallnames,
-#else
- NULL,
-#endif
- 0,
- copyargs,
- cpu_exec_ecoff_setregs,
- NULL,
- sigcode,
- esigcode,
-};
-
-int
-osf1_sys_open(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- struct osf1_sys_open_args /* {
- syscallarg(char *) path;
- syscallarg(int) flags;
- syscallarg(int) mode;
- } */ *uap = v;
- struct sys_open_args /* {
- syscallarg(char *) path;
- syscallarg(int) flags;
- syscallarg(int) mode;
- } */ a;
-#ifdef SYSCALL_DEBUG
- char pnbuf[1024];
-
- if (scdebug &&
- copyinstr(SCARG(uap, path), pnbuf, sizeof pnbuf, NULL) == 0)
- printf("osf1_open: open: %s\n", pnbuf);
#endif
- SCARG(&a, path) = SCARG(uap, path);
- SCARG(&a, flags) = SCARG(uap, flags); /* XXX translate */
- SCARG(&a, mode) = SCARG(uap, mode);
-
- return sys_open(p, &a, retval);
-}
+const char osf1_emul_path[] = "/emul/osf1";
int
-osf1_sys_setsysinfo(p, v, retval)
+osf1_sys_classcntl(p, v, retval)
struct proc *p;
void *v;
register_t *retval;
{
-#if 0
- struct osf1_setsysinfo_args /* {
- syscallarg(u_long) op;
- syscallarg(caddr_t) buffer;
- syscallarg(u_long) nbytes;
- syscallarg(caddr_t) arg;
- syscallarg(u_long) flag;
- } */ *uap = v;
-#endif;
- return (0);
+ /* XXX */
+ return (ENOSYS);
}
-#define OSF1_RLIMIT_LASTCOMMON 5 /* last one that's common */
-#define OSF1_RLIMIT_NOFILE 6 /* OSF1's RLIMIT_NOFILE */
-#define OSF1_RLIMIT_NLIMITS 8 /* Number of OSF1 rlimits */
-
int
-osf1_sys_getrlimit(p, v, retval)
+osf1_sys_reboot(p, v, retval)
struct proc *p;
void *v;
register_t *retval;
{
- struct osf1_sys_getrlimit_args /* {
- syscallarg(u_int) which;
- syscallarg(struct rlimit *) rlp;
- } */ *uap = v;
- struct sys_getrlimit_args /* {
- syscallarg(u_int) which;
- syscallarg(struct rlimit *) rlp;
- } */ a;
-
- if (SCARG(uap, which) >= OSF1_RLIMIT_NLIMITS)
- return (EINVAL);
-
- if (SCARG(uap, which) <= OSF1_RLIMIT_LASTCOMMON)
- SCARG(&a, which) = SCARG(uap, which);
- else if (SCARG(uap, which) == OSF1_RLIMIT_NOFILE)
- SCARG(&a, which) = RLIMIT_NOFILE;
- else
- return (0);
- SCARG(&a, rlp) = SCARG(uap, rlp);
-
- return sys_getrlimit(p, &a, retval);
-}
+ struct osf1_sys_reboot_args *uap = v;
+ struct sys_reboot_args a;
+ unsigned long leftovers;
-int
-osf1_sys_setrlimit(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- struct osf1_sys_setrlimit_args /* {
- syscallarg(u_int) which;
- syscallarg(struct rlimit *) rlp;
- } */ *uap = v;
- struct sys_setrlimit_args /* {
- syscallarg(u_int) which;
- syscallarg(struct rlimit *) rlp;
- } */ a;
-
- if (SCARG(uap, which) >= OSF1_RLIMIT_NLIMITS)
+ /* translate opt */
+ SCARG(&a, opt) = emul_flags_translate(osf1_reboot_opt_xtab,
+ SCARG(uap, opt), &leftovers);
+ if (leftovers != 0)
return (EINVAL);
- if (SCARG(uap, which) <= OSF1_RLIMIT_LASTCOMMON)
- SCARG(&a, which) = SCARG(uap, which);
- else if (SCARG(uap, which) == OSF1_RLIMIT_NOFILE)
- SCARG(&a, which) = RLIMIT_NOFILE;
- else
- return (0);
- SCARG(&a, rlp) = SCARG(uap, rlp);
-
- return sys_setrlimit(p, &a, retval);
-}
-
-#define OSF1_MAP_SHARED 0x001
-#define OSF1_MAP_PRIVATE 0x002
-#define OSF1_MAP_ANONYMOUS 0x010
-#define OSF1_MAP_FILE 0x000
-#define OSF1_MAP_TYPE 0x0f0
-#define OSF1_MAP_FIXED 0x100
-#define OSF1_MAP_HASSEMAPHORE 0x200
-#define OSF1_MAP_INHERIT 0x400
-#define OSF1_MAP_UNALIGNED 0x800
-
-int
-osf1_sys_mmap(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- struct osf1_sys_mmap_args /* {
- syscallarg(caddr_t) addr;
- syscallarg(size_t) len;
- syscallarg(int) prot;
- syscallarg(int) flags;
- syscallarg(int) fd;
- syscallarg(off_t) pos;
- } */ *uap = v;
- struct sys_mmap_args /* {
- syscallarg(caddr_t) addr;
- syscallarg(size_t) len;
- syscallarg(int) prot;
- syscallarg(int) flags;
- syscallarg(int) fd;
- syscallarg(long) pad;
- syscallarg(off_t) pos;
- } */ a;
-
- SCARG(&a, addr) = SCARG(uap, addr);
- SCARG(&a, len) = SCARG(uap, len);
- SCARG(&a, prot) = SCARG(uap, prot);
- SCARG(&a, fd) = SCARG(uap, fd);
- SCARG(&a, pad) = 0;
- SCARG(&a, pos) = SCARG(uap, pos);
-
- SCARG(&a, flags) = 0;
- if (SCARG(uap, flags) & OSF1_MAP_SHARED)
- SCARG(&a, flags) |= MAP_SHARED;
- if (SCARG(uap, flags) & OSF1_MAP_PRIVATE)
- SCARG(&a, flags) |= MAP_PRIVATE;
- switch (SCARG(uap, flags) & OSF1_MAP_TYPE) {
- case OSF1_MAP_ANONYMOUS:
- SCARG(&a, flags) |= MAP_ANON;
- break;
- case OSF1_MAP_FILE:
- SCARG(&a, flags) |= MAP_FILE;
- break;
- default:
- return (EINVAL);
- }
- if (SCARG(uap, flags) & OSF1_MAP_FIXED)
- SCARG(&a, flags) |= MAP_FIXED;
- if (SCARG(uap, flags) & OSF1_MAP_HASSEMAPHORE)
- SCARG(&a, flags) |= MAP_HASSEMAPHORE;
- if (SCARG(uap, flags) & OSF1_MAP_INHERIT)
- SCARG(&a, flags) |= MAP_INHERIT;
- if (SCARG(uap, flags) & OSF1_MAP_UNALIGNED)
- return (EINVAL);
+ /* SCARG(&a, bootstr) = NULL; */
- return sys_mmap(p, &a, retval);
+ return sys_reboot(p, &a, retval);
}
int
-osf1_sys_usleep_thread(p, v, retval)
+osf1_sys_set_program_attributes(p, v, retval)
struct proc *p;
void *v;
register_t *retval;
{
- struct osf1_sys_usleep_thread_args /* {
- syscallarg(struct timeval *) sleep;
- syscallarg(struct timeval *) slept;
- } */ *uap = v;
- struct timeval tv, endtv;
- u_long ticks;
- int error, s;
-
- if ((error = copyin(SCARG(uap, sleep), &tv, sizeof tv)) != 0)
- return (error);
+ struct osf1_sys_set_program_attributes_args *uap = v;
+ segsz_t tsize, dsize;
- ticks = ((u_long)tv.tv_sec * 1000000 + tv.tv_usec) / tick;
- s = splclock();
- tv = time;
- splx(s);
+ tsize = btoc(SCARG(uap, tsize));
+ dsize = btoc(SCARG(uap, dsize));
- tsleep(p, PUSER|PCATCH, "OSF/1", ticks); /* XXX */
+ if (dsize > p->p_rlimit[RLIMIT_DATA].rlim_cur)
+ return (ENOMEM);
+ if (tsize > MAXTSIZ)
+ return (ENOMEM);
- if (SCARG(uap, slept) != NULL) {
- s = splclock();
- timersub(&time, &tv, &endtv);
- splx(s);
- if (tv.tv_sec < 0 || tv.tv_usec < 0)
- tv.tv_sec = tv.tv_usec = 0;
+ p->p_vmspace->vm_taddr = SCARG(uap, taddr);
+ p->p_vmspace->vm_tsize = tsize;
+ p->p_vmspace->vm_daddr = SCARG(uap, daddr);
+ p->p_vmspace->vm_dsize = dsize;
- error = copyout(&endtv, SCARG(uap, slept), sizeof endtv);
- }
- return (error);
-}
-
-struct osf1_stat {
- int32_t st_dev;
- u_int32_t st_ino;
- u_int32_t st_mode;
- u_int16_t st_nlink;
- u_int32_t st_uid;
- u_int32_t st_gid;
- int32_t st_rdev;
- u_int64_t st_size;
- int32_t st_atime_sec;
- int32_t st_spare1;
- int32_t st_mtime_sec;
- int32_t st_spare2;
- int32_t st_ctime_sec;
- int32_t st_spare3;
- u_int32_t st_blksize;
- int32_t st_blocks;
- u_int32_t st_flags;
- u_int32_t st_gen;
-};
-
-/*
- * Get file status; this version follows links.
- */
-/* ARGSUSED */
-int
-osf1_sys_stat(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- register struct osf1_sys_stat_args /* {
- syscallarg(char *) path;
- syscallarg(struct osf1_stat *) ub;
- } */ *uap = v;
- struct stat sb;
- struct osf1_stat osb;
- int error;
- struct nameidata nd;
-
- NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_USERSPACE,
- SCARG(uap, path), p);
- if ((error = namei(&nd)) != 0)
- return (error);
- error = vn_stat(nd.ni_vp, &sb, p);
- vput(nd.ni_vp);
- if (error)
- return (error);
- cvtstat2osf1(&sb, &osb);
- error = copyout((caddr_t)&osb, (caddr_t)SCARG(uap, ub), sizeof (osb));
- return (error);
+ return (0);
}
-/*
- * Get file status; this version does not follow links.
- */
-/* ARGSUSED */
int
-osf1_sys_lstat(p, v, retval)
+osf1_sys_setsysinfo(p, v, retval)
struct proc *p;
void *v;
register_t *retval;
{
- register struct osf1_sys_lstat_args /* {
- syscallarg(char *) path;
- syscallarg(struct osf1_stat *) ub;
- } */ *uap = v;
- struct stat sb;
- struct osf1_stat osb;
- int error;
- struct nameidata nd;
- NDINIT(&nd, LOOKUP, NOFOLLOW | LOCKLEAF, UIO_USERSPACE,
- SCARG(uap, path), p);
- if ((error = namei(&nd)) != 0)
- return (error);
- error = vn_stat(nd.ni_vp, &sb, p);
- vput(nd.ni_vp);
- if (error)
- return (error);
- cvtstat2osf1(&sb, &osb);
- error = copyout((caddr_t)&osb, (caddr_t)SCARG(uap, ub), sizeof (osb));
- return (error);
+ /* XXX */
+ return (0);
}
-/*
- * Return status information about a file descriptor.
- */
int
-osf1_sys_fstat(p, v, retval)
+osf1_sys_sysinfo(p, v, retval)
struct proc *p;
void *v;
register_t *retval;
{
- register struct osf1_sys_fstat_args /* {
- syscallarg(int) fd;
- syscallarg(struct osf1_stat *) sb;
- } */ *uap = v;
- register struct filedesc *fdp = p->p_fd;
- register struct file *fp;
- struct stat ub;
- struct osf1_stat oub;
+ struct osf1_sys_sysinfo_args *uap = v;
+ const char *string;
int error;
- if ((unsigned)SCARG(uap, fd) >= fdp->fd_nfiles ||
- (fp = fdp->fd_ofiles[SCARG(uap, fd)]) == NULL)
- return (EBADF);
- switch (fp->f_type) {
-
- case DTYPE_VNODE:
- error = vn_stat((struct vnode *)fp->f_data, &ub, p);
+ error = 0;
+ switch (SCARG(uap, cmd)) {
+ case OSF1_SI_SYSNAME:
+ goto should_handle;
+ /* string = ostype; */
break;
- case DTYPE_SOCKET:
- error = soo_stat((struct socket *)fp->f_data, &ub);
+ case OSF1_SI_HOSTNAME:
+ string = hostname;
break;
- default:
- panic("ofstat");
- /*NOTREACHED*/
- }
- cvtstat2osf1(&ub, &oub);
- if (error == 0)
- error = copyout((caddr_t)&oub, (caddr_t)SCARG(uap, sb),
- sizeof (oub));
- return (error);
-}
-
-#define bsd2osf_dev(dev) (major(dev) << 20 | minor(dev))
-#define osf2bsd_dev(dev) makedev((dev >> 20) & 0xfff, dev & 0xfffff)
-
-/*
- * Convert from a stat structure to an osf1 stat structure.
- */
-void
-cvtstat2osf1(st, ost)
- struct stat *st;
- struct osf1_stat *ost;
-{
-
- ost->st_dev = bsd2osf_dev(st->st_dev);
- ost->st_ino = st->st_ino;
- ost->st_mode = st->st_mode;
- ost->st_nlink = st->st_nlink;
- ost->st_uid = st->st_uid == -2 ? (u_int16_t) -2 : st->st_uid;
- ost->st_gid = st->st_gid == -2 ? (u_int16_t) -2 : st->st_gid;
- ost->st_rdev = bsd2osf_dev(st->st_rdev);
- ost->st_size = st->st_size;
- ost->st_atime_sec = st->st_atime;
- ost->st_spare1 = 0;
- ost->st_mtime_sec = st->st_mtime;
- ost->st_spare2 = 0;
- ost->st_ctime_sec = st->st_ctime;
- ost->st_spare3 = 0;
- ost->st_blksize = st->st_blksize;
- ost->st_blocks = st->st_blocks;
- ost->st_flags = st->st_flags;
- ost->st_gen = st->st_gen;
-}
-
-int
-osf1_sys_mknod(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- struct osf1_sys_mknod_args /* {
- syscallarg(char *) path;
- syscallarg(int) mode;
- syscallarg(int) dev;
- } */ *uap = v;
- struct sys_mknod_args a;
-
- SCARG(&a, path) = SCARG(uap, path);
- SCARG(&a, mode) = SCARG(uap, mode);
- SCARG(&a, dev) = osf2bsd_dev(SCARG(uap, dev));
-
- return sys_mknod(p, &a, retval);
-}
-
-#define OSF1_F_DUPFD 0
-#define OSF1_F_GETFD 1
-#define OSF1_F_SETFD 2
-#define OSF1_F_GETFL 3
-#define OSF1_F_SETFL 4
-
-#define OSF1_FAPPEND 0x00008 /* XXX OSF1_O_APPEND */
-#define OSF1_FNONBLOCK 0x00004 /* XXX OSF1_O_NONBLOCK */
-#define OSF1_FASYNC 0x00040
-#define OSF1_FSYNC 0x04000 /* XXX OSF1_O_SYNC */
-
-int
-osf1_sys_fcntl(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- struct osf1_sys_fcntl_args /* {
- syscallarg(int) fd;
- syscallarg(int) cmd;
- syscallarg(void *) arg;
- } */ *uap = v;
- struct sys_fcntl_args a;
- long tmp;
- int error;
+ case OSF1_SI_RELEASE:
+ string = version;
+ break;
- SCARG(&a, fd) = SCARG(uap, fd);
+ case OSF1_SI_VERSION:
+ goto should_handle;
- switch (SCARG(uap, cmd)) {
- case OSF1_F_DUPFD:
- SCARG(&a, cmd) = F_DUPFD;
- SCARG(&a, arg) = SCARG(uap, arg);
+ case OSF1_SI_MACHINE:
+ string = MACHINE;
break;
- case OSF1_F_GETFD:
- SCARG(&a, cmd) = F_GETFD;
- SCARG(&a, arg) = SCARG(uap, arg);
+ case OSF1_SI_ARCHITECTURE:
+ string = MACHINE_ARCH;
break;
- case OSF1_F_SETFD:
- SCARG(&a, cmd) = F_SETFD;
- SCARG(&a, arg) = SCARG(uap, arg);
+ case OSF1_SI_HW_SERIAL:
+ string = "666"; /* OSF/1 emulation? YES! */
break;
- case OSF1_F_GETFL:
- SCARG(&a, cmd) = F_GETFL;
- SCARG(&a, arg) = SCARG(uap, arg); /* ignored */
+ case OSF1_SI_HW_PROVIDER:
+ string = "unknown";
break;
- case OSF1_F_SETFL:
- SCARG(&a, cmd) = F_SETFL;
- tmp = 0;
- if ((long)SCARG(uap, arg) & OSF1_FAPPEND)
- tmp |= FAPPEND;
- if ((long)SCARG(uap, arg) & OSF1_FNONBLOCK)
- tmp |= FNONBLOCK;
- if ((long)SCARG(uap, arg) & OSF1_FASYNC)
- tmp |= FASYNC;
- if ((long)SCARG(uap, arg) & OSF1_FSYNC)
- tmp |= FFSYNC;
- SCARG(&a, arg) = (void *)tmp;
- break;
+ case OSF1_SI_SRPC_DOMAIN:
+ goto dont_care;
- default: /* XXX other cases */
- return (EINVAL);
- }
+ case OSF1_SI_SET_HOSTNAME:
+ goto should_handle;
- error = sys_fcntl(p, &a, retval);
+ case OSF1_SI_SET_SYSNAME:
+ goto should_handle;
- if (error)
- return error;
+ case OSF1_SI_SET_SRPC_DOMAIN:
+ goto dont_care;
- switch (SCARG(uap, cmd)) {
- case OSF1_F_GETFL:
- /* XXX */
+ default:
+should_handle:
+ printf("osf1_sys_sysinfo(%d, %p, 0x%lx)\n", SCARG(uap, cmd),
+ SCARG(uap, buf), SCARG(uap,len));
+dont_care:
+ error = EINVAL;
break;
- }
-
- return error;
-}
+ };
-int
-osf1_sys_poll(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- register struct osf1_sys_poll_args /* {
- syscallarg(struct pollfd *) fds;
- syscallarg(unsigned int) nfds;
- syscallarg(int) timeout;
- } */ *uap = v;
- struct sys_poll_args a;
-
- SCARG(&a, fds) = SCARG(uap, fds);
- SCARG(&a, nfds) = SCARG(uap, nfds);
- SCARG(&a, timeout) = SCARG(uap, timeout);
-
- return sys_poll(p, &a, retval);
-}
-
-int
-osf1_sys_socket(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- register struct osf1_sys_socket_args /* {
- syscallarg(int) domain;
- syscallarg(int) type;
- syscallarg(int) protocol;
- } */ *uap = v;
- struct sys_socket_args a;
-
- if (SCARG(uap, type) > AF_LINK)
- return (EINVAL); /* XXX After AF_LINK, divergence. */
-
- SCARG(&a, domain) = SCARG(uap, domain);
- SCARG(&a, type) = SCARG(uap, type);
- SCARG(&a, protocol) = SCARG(uap, protocol);
+ if (error == 0)
+ error = copyoutstr(string, SCARG(uap, buf), SCARG(uap, len),
+ NULL);
- return sys_socket(p, &a, retval);
+ return (error);
}
int
-osf1_sys_sendto(p, v, retval)
+osf1_sys_uname(p, v, retval)
struct proc *p;
void *v;
register_t *retval;
{
- register struct osf1_sys_sendto_args /* {
- syscallarg(int) s;
- syscallarg(const void *) buf;
- syscallarg(size_t) len;
- syscallarg(int) flags;
- syscallarg(const struct sockaddr *) to;
- syscallarg(int) tolen;
- } */ *uap = v;
- struct sys_sendto_args a;
-
- if (SCARG(uap, flags) & ~0x7f) /* unsupported flags */
- return (EINVAL);
-
- SCARG(&a, s) = SCARG(uap, s);
- SCARG(&a, buf) = SCARG(uap, buf);
- SCARG(&a, len) = SCARG(uap, len);
- SCARG(&a, flags) = SCARG(uap, flags);
- SCARG(&a, to) = SCARG(uap, to);
- SCARG(&a, tolen) = SCARG(uap, tolen);
-
- return sys_sendto(p, &a, retval);
+ struct osf1_sys_uname_args *uap = v;
+ struct osf1_utsname u;
+ const char *cp;
+ char *dp, *ep;
+
+ /* XXX would use stackgap, but our struct utsname is too big! */
+ /*
+ * strncpy(u.sysname, ostype, sizeof(u.sysname));
+ */
+ strncpy(u.sysname, "OpenBSD", sizeof(u.sysname));
+ strncpy(u.nodename, hostname, sizeof(u.nodename));
+ strncpy(u.release, version, sizeof(u.release));
+ dp = u.version;
+ ep = &u.version[sizeof(u.version) - 1];
+ for (cp = version; *cp && *cp != '('; cp++)
+ ;
+ for (cp++; *cp && *cp != ')' && dp < ep; cp++)
+ *dp++ = *cp;
+ for (; *cp && *cp != '#'; cp++)
+ ;
+ for (; *cp && *cp != ':' && dp < ep; cp++)
+ *dp++ = *cp;
+ *dp = '\0';
+ strncpy(u.machine, MACHINE, sizeof(u.machine));
+ return (copyout((caddr_t)&u, (caddr_t)SCARG(uap, name), sizeof u));
}
-#define OSF1_RB_ASKNAME 0x001
-#define OSF1_RB_SINGLE 0x002
-#define OSF1_RB_NOSYNC 0x004
-#define OSF1_RB_HALT 0x008
-#define OSF1_RB_INITNAME 0x010
-#define OSF1_RB_DFLTROOT 0x020
-#define OSF1_RB_ALTBOOT 0x040
-#define OSF1_RB_UNIPROC 0x080
-#define OSF1_RB_ALLFLAGS 0x0ff /* all of the above */
-
int
-osf1_sys_reboot(p, v, retval)
+osf1_sys_usleep_thread(p, v, retval)
struct proc *p;
void *v;
register_t *retval;
{
- struct osf1_sys_reboot_args /* {
- syscallarg(int) opt;
- } */ *uap = v;
- struct sys_reboot_args a;
+ struct osf1_sys_usleep_thread_args *uap = v;
+ struct osf1_timeval otv, endotv;
+ struct timeval tv, endtv;
+ u_long ticks;
+ int error, s;
- if (SCARG(uap, opt) & ~OSF1_RB_ALLFLAGS &&
- SCARG(uap, opt) & (OSF1_RB_ALTBOOT|OSF1_RB_UNIPROC))
- return (EINVAL);
+ if ((error = copyin(SCARG(uap, sleep), &otv, sizeof otv)))
+ return (error);
+ tv.tv_sec = otv.tv_sec;
+ tv.tv_usec = otv.tv_usec;
- SCARG(&a, opt) = 0;
- if (SCARG(uap, opt) & OSF1_RB_ASKNAME)
- SCARG(&a, opt) |= RB_ASKNAME;
- if (SCARG(uap, opt) & OSF1_RB_SINGLE)
- SCARG(&a, opt) |= RB_SINGLE;
- if (SCARG(uap, opt) & OSF1_RB_NOSYNC)
- SCARG(&a, opt) |= RB_NOSYNC;
- if (SCARG(uap, opt) & OSF1_RB_HALT)
- SCARG(&a, opt) |= RB_HALT;
- if (SCARG(uap, opt) & OSF1_RB_INITNAME)
- SCARG(&a, opt) |= RB_INITNAME;
- if (SCARG(uap, opt) & OSF1_RB_DFLTROOT)
- SCARG(&a, opt) |= RB_DFLTROOT;
+ ticks = howmany((u_long)tv.tv_sec * 1000000 + tv.tv_usec, tick);
+ if (ticks == 0)
+ ticks = 1;
- return sys_reboot(p, &a, retval);
-}
+ s = splclock();
+ tv = time;
+ splx(s);
-int
-osf1_sys_lseek(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- struct osf1_sys_lseek_args /* {
- syscallarg(int) fd;
- syscallarg(off_t) offset;
- syscallarg(int) whence;
- } */ *uap = v;
- struct sys_lseek_args a;
-
- SCARG(&a, fd) = SCARG(uap, fd);
- SCARG(&a, pad) = 0;
- SCARG(&a, offset) = SCARG(uap, offset);
- SCARG(&a, whence) = SCARG(uap, whence);
-
- return sys_lseek(p, &a, retval);
-}
+ tsleep(p, PUSER|PCATCH, "uslpthrd", ticks); /* XXX */
-/*
- * OSF/1 defines _POSIX_SAVED_IDS, which means that our normal
- * setuid() won't work.
- *
- * Instead, by P1003.1b-1993, setuid() is supposed to work like:
- * If the process has appropriate [super-user] priviledges, the
- * setuid() function sets the real user ID, effective user
- * ID, and the saved set-user-ID to uid.
- * If the process does not have appropriate priviledges, but uid
- * is equal to the real user ID or the saved set-user-ID, the
- * setuid() function sets the effective user ID to uid; the
- * real user ID and saved set-user-ID remain unchanged by
- * this function call.
- */
-int
-osf1_sys_setuid(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- struct osf1_sys_setuid_args /* {
- syscallargs(uid_t) uid;
- } */ *uap = v;
- register struct pcred *pc = p->p_cred;
- uid_t uid = SCARG(uap, uid);
- int error;
-
- if ((error = suser(pc->pc_ucred, &p->p_acflag)) != 0 &&
- uid != pc->p_ruid && uid != pc->p_svuid)
- return (error);
+ if (SCARG(uap, slept) != NULL) {
+ s = splclock();
+ timersub(&time, &tv, &endtv);
+ splx(s);
+ if (endtv.tv_sec < 0 || endtv.tv_usec < 0)
+ endtv.tv_sec = endtv.tv_usec = 0;
- pc->pc_ucred = crcopy(pc->pc_ucred);
- pc->pc_ucred->cr_uid = uid;
- if (error == 0) {
- (void)chgproccnt(pc->p_ruid, -1);
- (void)chgproccnt(uid, 1);
- pc->p_ruid = uid;
- pc->p_svuid = uid;
+ endotv.tv_sec = endtv.tv_sec;
+ endotv.tv_usec = endtv.tv_usec;
+ error = copyout(&endotv, SCARG(uap, slept), sizeof endotv);
}
- p->p_flag |= P_SUGID;
- return (0);
+ return (error);
}
-/*
- * OSF/1 defines _POSIX_SAVED_IDS, which means that our normal
- * setgid() won't work.
- *
- * If you change "uid" to "gid" in the discussion, above, about
- * setuid(), you'll get a correct description of setgid().
- */
int
-osf1_sys_setgid(p, v, retval)
+osf1_sys_wait4(p, v, retval)
struct proc *p;
void *v;
register_t *retval;
{
- struct osf1_sys_setgid_args /* {
- syscallargs(gid_t) gid;
- } */ *uap = v;
- register struct pcred *pc = p->p_cred;
- gid_t gid = SCARG(uap, gid);
+ struct osf1_sys_wait4_args *uap = v;
+ struct sys_wait4_args a;
+ struct osf1_rusage osf1_rusage;
+ struct rusage netbsd_rusage;
+ unsigned long leftovers;
+ caddr_t sg;
int error;
- if ((error = suser(pc->pc_ucred, &p->p_acflag)) != 0 &&
- gid != pc->p_rgid && gid != pc->p_svgid)
- return (error);
-
- pc->pc_ucred = crcopy(pc->pc_ucred);
- pc->pc_ucred->cr_gid = gid;
- if (error == 0) {
- pc->p_rgid = gid;
- pc->p_svgid = gid;
- }
- p->p_flag |= P_SUGID;
- return (0);
-}
-
-/*
- * The structures end up being the same... but we can't be sure that
- * the other word of our iov_len is zero!
- */
-struct osf1_iovec {
- char *iov_base;
- int iov_len;
-};
+ SCARG(&a, pid) = SCARG(uap, pid);
+ SCARG(&a, status) = SCARG(uap, status);
-int
-osf1_sys_readv(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- struct osf1_sys_readv_args /* {
- syscallarg(int) fd;
- syscallarg(struct osf1_iovec *) iovp;
- syscallarg(u_int) iovcnt;
- } */ *uap = v;
- struct sys_readv_args /* {
- syscallarg(int) fd;
- syscallarg(struct iovec *) iovp;
- syscallarg(u_int) iovcnt;
- } */ a;
- struct emul *e = p->p_emul;
- struct osf1_iovec *oio;
- struct iovec *nio;
- int error, i;
-
- if (SCARG(uap, iovcnt) > (STACKGAPLEN / sizeof (struct iovec)))
+ /* translate options */
+ SCARG(&a, options) = emul_flags_translate(osf1_wait_options_xtab,
+ SCARG(uap, options), &leftovers);
+ if (leftovers != 0)
return (EINVAL);
- oio = (struct osf1_iovec *)
- malloc(SCARG(uap, iovcnt)*sizeof (struct osf1_iovec),
- M_TEMP, M_WAITOK);
- nio = (struct iovec *)malloc(SCARG(uap, iovcnt)*sizeof (struct iovec),
- M_TEMP, M_WAITOK);
-
- error = 0;
- if ((error = copyin(SCARG(uap, iovp), oio,
- SCARG(uap, iovcnt) * sizeof (struct osf1_iovec))) != 0)
- goto punt;
- for (i = 0; i < SCARG(uap, iovcnt); i++) {
- nio[i].iov_base = oio[i].iov_base;
- nio[i].iov_len = oio[i].iov_len;
+ if (SCARG(uap, rusage) == NULL)
+ SCARG(&a, rusage) = NULL;
+ else {
+ sg = stackgap_init(p->p_emul);
+ SCARG(&a, rusage) = stackgap_alloc(&sg, sizeof netbsd_rusage);
}
- SCARG(&a, fd) = SCARG(uap, fd);
- SCARG(&a, iovp) = (struct iovec *)STACKGAPBASE;
- SCARG(&a, iovcnt) = SCARG(uap, iovcnt);
-
- if ((error = copyout(nio, (caddr_t)SCARG(&a, iovp),
- SCARG(uap, iovcnt) * sizeof (struct iovec))) != 0)
- goto punt;
- error = sys_readv(p, &a, retval);
-
-punt:
- free(oio, M_TEMP);
- free(nio, M_TEMP);
- return (error);
-}
-
-int
-osf1_sys_writev(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- struct osf1_sys_writev_args /* {
- syscallarg(int) fd;
- syscallarg(struct osf1_iovec *) iovp;
- syscallarg(u_int) iovcnt;
- } */ *uap = v;
- struct sys_writev_args /* {
- syscallarg(int) fd;
- syscallarg(struct iovec *) iovp;
- syscallarg(u_int) iovcnt;
- } */ a;
- struct emul *e = p->p_emul;
- struct osf1_iovec *oio;
- struct iovec *nio;
- int error, i;
-
- if (SCARG(uap, iovcnt) > (STACKGAPLEN / sizeof (struct iovec)))
- return (EINVAL);
-
- oio = (struct osf1_iovec *)
- malloc(SCARG(uap, iovcnt)*sizeof (struct osf1_iovec),
- M_TEMP, M_WAITOK);
- nio = (struct iovec *)malloc(SCARG(uap, iovcnt)*sizeof (struct iovec),
- M_TEMP, M_WAITOK);
-
- error = 0;
- if ((error = copyin(SCARG(uap, iovp), oio,
- SCARG(uap, iovcnt) * sizeof (struct osf1_iovec))) != 0)
- goto punt;
- for (i = 0; i < SCARG(uap, iovcnt); i++) {
- nio[i].iov_base = oio[i].iov_base;
- nio[i].iov_len = oio[i].iov_len;
+ error = sys_wait4(p, &a, retval);
+
+ if (error == 0 && SCARG(&a, rusage) != NULL) {
+ error = copyin((caddr_t)SCARG(&a, rusage),
+ (caddr_t)&netbsd_rusage, sizeof netbsd_rusage);
+ if (error == 0) {
+ osf1_cvt_rusage_from_native(&netbsd_rusage,
+ &osf1_rusage);
+ error = copyout((caddr_t)&osf1_rusage,
+ (caddr_t)SCARG(uap, rusage), sizeof osf1_rusage);
+ }
}
- SCARG(&a, fd) = SCARG(uap, fd);
- SCARG(&a, iovp) = (struct iovec *)STACKGAPBASE;
- SCARG(&a, iovcnt) = SCARG(uap, iovcnt);
-
- if ((error = copyout(nio, (caddr_t)SCARG(&a, iovp),
- SCARG(uap, iovcnt) * sizeof (struct iovec))) != 0)
- goto punt;
- error = sys_writev(p, &a, retval);
-
-punt:
- free(oio, M_TEMP);
- free(nio, M_TEMP);
return (error);
}
-
-/* More of the stupid off_t padding! */
-int
-osf1_sys_truncate(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- struct osf1_sys_truncate_args /* {
- syscallarg(char *) path;
- syscallarg(off_t) length;
- } */ *uap = v;
- struct sys_truncate_args a;
-
- SCARG(&a, path) = SCARG(uap, path);
- SCARG(&a, pad) = 0;
- SCARG(&a, length) = SCARG(uap, length);
-
- return sys_truncate(p, &a, retval);
-}
-
-int
-osf1_sys_ftruncate(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- struct osf1_sys_ftruncate_args /* {
- syscallarg(int) fd;
- syscallarg(off_t) length;
- } */ *uap = v;
- struct sys_ftruncate_args a;
-
- SCARG(&a, fd) = SCARG(uap, fd);
- SCARG(&a, pad) = 0;
- SCARG(&a, length) = SCARG(uap, length);
-
- return sys_ftruncate(p, &a, retval);
-}
-
-int
-osf1_sys_getsid(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- struct osf1_sys_getsid_args /* {
- syscallarg(pid_t) pid;
- } */ *uap = v;
- struct proc *t;
-
- if (SCARG(uap, pid) == 0)
- t = p;
- else if ((t = pfind(SCARG(uap, pid))) == NULL)
- return (ESRCH);
-
- *retval = t->p_session->s_leader->p_pid;
- return (0);
-}
-
-int
-osf1_sys_getrusage(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
-
- /* XXX */
- return EINVAL;
-}
-
-int
-osf1_sys_madvise(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
-
- /* XXX */
- return EINVAL;
-}
-
-int
-osf1_sys_execve(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- struct osf1_sys_execve_args *uap = v;
-#if 0
- caddr_t sg = stackgap_init(p->p_emul);
-
- OSF1_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
-#endif
-
- return (sys_execve(p, (struct sys_execve_args *)&uap, retval));
-}
diff --git a/sys/compat/osf1/osf1_mmap.c b/sys/compat/osf1/osf1_mmap.c
new file mode 100644
index 00000000000..8db88e47986
--- /dev/null
+++ b/sys/compat/osf1/osf1_mmap.c
@@ -0,0 +1,282 @@
+/* $OpenBSD: osf1_mmap.c,v 1.1 2000/08/04 15:47:55 ericj Exp $ */
+/* $NetBSD: osf1_mmap.c,v 1.5 2000/04/11 05:26:27 chs Exp $ */
+
+/*
+ * Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Christopher G. Demetriou
+ * for the NetBSD Project.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/proc.h>
+#include <sys/mman.h>
+#include <sys/mount.h>
+#include <sys/syscallargs.h>
+#include <vm/vm.h> /* XXX see mmap emulation */
+
+#include <compat/osf1/osf1.h>
+#include <compat/osf1/osf1_syscallargs.h>
+#include <compat/osf1/osf1_cvt.h>
+
+int
+osf1_sys_madvise(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_madvise_args *uap = v;
+ struct sys_madvise_args a;
+ int error;
+
+ SCARG(&a, addr) = SCARG(uap, addr);
+ SCARG(&a, len) = SCARG(uap, len);
+
+ error = 0;
+ switch (SCARG(uap, behav)) {
+ case OSF1_MADV_NORMAL:
+ SCARG(&a, behav) = MADV_NORMAL;
+ break;
+
+ case OSF1_MADV_RANDOM:
+ SCARG(&a, behav) = MADV_RANDOM;
+ break;
+
+ case OSF1_MADV_SEQUENTIAL:
+ SCARG(&a, behav) = MADV_SEQUENTIAL;
+ break;
+
+ case OSF1_MADV_WILLNEED:
+ SCARG(&a, behav) = MADV_WILLNEED;
+ break;
+
+ case OSF1_MADV_DONTNEED_COMPAT:
+ SCARG(&a, behav) = MADV_DONTNEED;
+ break;
+#if 0
+ case OSF1_MADV_SPACEAVAIL:
+ SCARG(&a, behav) = MADV_SPACEAVAIL;
+ break;
+#endif
+ case OSF1_MADV_DONTNEED:
+ /*
+ * XXX not supported. In Digital UNIX, this flushes all
+ * XXX data in the region and replaces it with ZFOD pages.
+ */
+ error = EINVAL;
+ break;
+
+ default:
+ error = EINVAL;
+ break;
+ }
+
+ if (error == 0) {
+ error = sys_madvise(p, &a, retval);
+
+ /*
+ * NetBSD madvise() currently always returns ENOSYS.
+ * Digital UNIX says that non-operational requests (i.e.
+ * valid, but unimplemented 'behav') will return success.
+ */
+ if (error == ENOSYS)
+ error = 0;
+ }
+ return (error);
+}
+
+int
+osf1_sys_mmap(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+#if defined(UVM)
+ struct osf1_sys_mmap_args *uap = v;
+ struct sys_mmap_args a;
+ unsigned long leftovers;
+
+ SCARG(&a, addr) = SCARG(uap, addr);
+ SCARG(&a, len) = SCARG(uap, len);
+ SCARG(&a, fd) = SCARG(uap, fd);
+ SCARG(&a, pad) = 0;
+ SCARG(&a, pos) = SCARG(uap, pos);
+
+ /* translate prot */
+ SCARG(&a, prot) = emul_flags_translate(osf1_mmap_prot_xtab,
+ SCARG(uap, prot), &leftovers);
+ if (leftovers != 0)
+ return (EINVAL);
+
+ /* translate flags */
+ SCARG(&a, flags) = emul_flags_translate(osf1_mmap_flags_xtab,
+ SCARG(uap, flags), &leftovers);
+ if (leftovers != 0)
+ return (EINVAL);
+
+ /*
+ * XXX The following code is evil.
+ *
+ * The OSF/1 mmap() function attempts to map non-fixed entries
+ * near the address that the user specified. Therefore, for
+ * non-fixed entires we try to find space in the address space
+ * starting at that address. If the user specified zero, we
+ * start looking at at least NBPG, so that programs can't
+ * accidentally live through deferencing NULL.
+ *
+ * The need for this kludgery is increased by the fact that
+ * the loader data segment is mapped at
+ * (end of user address space) - 1G, MAXDSIZ is 1G, and
+ * the VM system tries allocate non-fixed mappings _AFTER_
+ * (start of data) + MAXDSIZ. With the loader, of course,
+ * that means that it'll start trying at
+ * (end of user address space), and will never succeed!
+ *
+ * Notes:
+ *
+ * * Though we find space here, if something else (e.g. a second
+ * thread) were mucking with the address space the mapping
+ * we found might be used by another mmap(), and this call
+ * would clobber that region.
+ *
+ * * In general, tricks like this only work for MAP_ANON mappings,
+ * because of sharing/cache issues. That's not a problem on
+ * the Alpha, and though it's not good style to abuse that fact,
+ * there's little choice.
+ *
+ * * In order for this to be done right, the VM system should
+ * really try to use the requested 'addr' passed in to mmap()
+ * as a hint, even if non-fixed. If it's passed as zero,
+ * _maybe_ then try (start of data) + MAXDSIZ, or maybe
+ * provide a better way to avoid the data region altogether.
+ */
+ if ((SCARG(&a, flags) & MAP_FIXED) == 0) {
+ vaddr_t addr = round_page((vaddr_t)SCARG(&a, addr));
+ vsize_t size = round_page((vsize_t)SCARG(&a, len));
+ int fixed = 0;
+
+ vm_map_lock(&p->p_vmspace->vm_map);
+
+ /* if non-NULL address given, start looking there */
+ /* XXX - UVM */
+ if (addr != 0 && vm_map_findspace(&p->p_vmspace->vm_map,
+ addr, size, &addr, NULL, 0, 0) != NULL) {
+ fixed = 1;
+ goto done;
+ }
+
+ /* didn't find anything. take it again from the top. */
+ if (uvm_map_findspace(&p->p_vmspace->vm_map, NBPG, size, &addr,
+ NULL, 0, 0) != NULL) {
+ fixed = 1;
+ goto done;
+ }
+
+done:
+ vm_map_unlock(&p->p_vmspace->vm_map);
+ if (fixed) {
+ SCARG(&a, flags) |= MAP_FIXED;
+ SCARG(&a, addr) = (void *)addr;
+ }
+ }
+
+ return sys_mmap(p, &a, retval);
+#else
+ struct osf1_sys_mmap_args /* {
+ syscallarg(caddr_t) addr;
+ syscallarg(size_t) len;
+ syscallarg(int) prot;
+ syscallarg(int) flags;
+ syscallarg(int) fd;
+ syscallarg(off_t) pos;
+ } */ *uap = v;
+ struct sys_mmap_args /* {
+ syscallarg(caddr_t) addr;
+ syscallarg(size_t) len;
+ syscallarg(int) prot;
+ syscallarg(int) flags;
+ syscallarg(int) fd;
+ syscallarg(long) pad;
+ syscallarg(off_t) pos;
+ } */ a;
+
+ SCARG(&a, addr) = SCARG(uap, addr);
+ SCARG(&a, len) = SCARG(uap, len);
+ SCARG(&a, prot) = SCARG(uap, prot);
+ SCARG(&a, fd) = SCARG(uap, fd);
+ SCARG(&a, pad) = 0;
+ SCARG(&a, pos) = SCARG(uap, pos);
+
+ SCARG(&a, flags) = 0;
+ if (SCARG(uap, flags) & OSF1_MAP_SHARED)
+ SCARG(&a, flags) |= MAP_SHARED;
+ if (SCARG(uap, flags) & OSF1_MAP_PRIVATE)
+ SCARG(&a, flags) |= MAP_PRIVATE;
+ switch (SCARG(uap, flags) & OSF1_MAP_TYPE) {
+ case OSF1_MAP_ANON:
+ SCARG(&a, flags) |= MAP_ANON;
+ break;
+ case OSF1_MAP_FILE:
+ SCARG(&a, flags) |= MAP_FILE;
+ break;
+ default:
+ return (EINVAL);
+ }
+ if (SCARG(uap, flags) & OSF1_MAP_FIXED)
+ SCARG(&a, flags) |= MAP_FIXED;
+ if (SCARG(uap, flags) & OSF1_MAP_HASSEMAPHORE)
+ SCARG(&a, flags) |= MAP_HASSEMAPHORE;
+ if (SCARG(uap, flags) & OSF1_MAP_INHERIT)
+ SCARG(&a, flags) |= MAP_INHERIT;
+ if (SCARG(uap, flags) & OSF1_MAP_UNALIGNED)
+ return (EINVAL);
+
+ return sys_mmap(p, &a, retval);
+#endif
+}
+
+int
+osf1_sys_mprotect(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_mprotect_args *uap = v;
+ struct sys_mprotect_args a;
+ unsigned long leftovers;
+
+ SCARG(&a, addr) = SCARG(uap, addr);
+ SCARG(&a, len) = SCARG(uap, len);
+
+ /* translate prot */
+ SCARG(&a, prot) = emul_flags_translate(osf1_mmap_prot_xtab,
+ SCARG(uap, prot), &leftovers);
+ if (leftovers != 0)
+ return (EINVAL);
+
+ return sys_mprotect(p, &a, retval);
+}
diff --git a/sys/compat/osf1/osf1_mount.c b/sys/compat/osf1/osf1_mount.c
index a591c6014ab..2872db884eb 100644
--- a/sys/compat/osf1/osf1_mount.c
+++ b/sys/compat/osf1/osf1_mount.c
@@ -1,5 +1,35 @@
-/* $OpenBSD: osf1_mount.c,v 1.4 1996/10/30 16:37:20 niklas Exp $ */
-/* $NetBSD: osf1_mount.c,v 1.6 1996/02/17 23:08:36 jtk Exp $ */
+/* $OpenBSD: osf1_mount.c,v 1.5 2000/08/04 15:47:55 ericj Exp $ */
+/* $NetBSD: osf1_mount.c,v 1.14 1999/05/05 01:51:34 cgd Exp $ */
+
+/*
+ * Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Christopher G. Demetriou
+ * for the NetBSD Project.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
/*
* Copyright (c) 1994, 1995 Carnegie-Mellon University.
@@ -33,38 +63,29 @@
#include <sys/namei.h>
#include <sys/proc.h>
#include <sys/file.h>
+#include <sys/filedesc.h>
#include <sys/kernel.h>
#include <sys/mount.h>
#include <sys/vnode.h>
#include <sys/syscallargs.h>
+#include <compat/osf1/osf1.h>
#include <compat/osf1/osf1_syscallargs.h>
#include <compat/osf1/osf1_util.h>
+#include <compat/osf1/osf1_cvt.h>
#include <net/if.h>
#include <netinet/in.h>
+#include <nfs/rpcv2.h>
#include <nfs/nfsproto.h>
+#include <nfs/nfs.h>
+#include <nfs/nfsmount.h>
-#include <machine/vmparam.h>
+#include <ufs/ufs/quota.h>
+#include <ufs/ufs/ufsmount.h>
-/* File system type numbers. */
-#define OSF1_MOUNT_NONE 0
-#define OSF1_MOUNT_UFS 1
-#define OSF1_MOUNT_NFS 2
-#define OSF1_MOUNT_MFS 3
-#define OSF1_MOUNT_PC 4
-#define OSF1_MOUNT_S5FS 5
-#define OSF1_MOUNT_CDFS 6
-#define OSF1_MOUNT_DFS 7
-#define OSF1_MOUNT_EFS 8
-#define OSF1_MOUNT_PROCFS 9
-#define OSF1_MOUNT_MSFS 10
-#define OSF1_MOUNT_FFM 11
-#define OSF1_MOUNT_FDFS 12
-#define OSF1_MOUNT_ADDON 13
-#define OSF1_MOUNT_NFSV3 14
-#define OSF1_MOUNT_MAXTYPE 15
+#include <machine/vmparam.h>
#define OSF1_MNT_WAIT 0x1
#define OSF1_MNT_NOWAIT 0x2
@@ -77,154 +98,11 @@
#define OSF1_MOUNT_FLAGS 0xffffffff /* XXX */
#define OSF1_UNMOUNT_FLAGS (OSF1_MNT_FORCE|OSF1_MNT_NOFORCE)
-struct osf1_statfs {
- int16_t f_type; /* 0 */
- int16_t f_flags; /* 2 */
- int32_t f_fsize; /* 4 */
- int32_t f_bsize; /* 8 */
- int32_t f_blocks; /* 12 */
- int32_t f_bfree; /* 16 */
- int32_t f_bavail; /* 20 */
- int32_t f_files; /* 24 */
- int32_t f_ffree; /* 28 */
- int64_t f_fsid; /* 32 */
- int32_t f_spare[9]; /* 40 (36 bytes) */
- char f_mntonname[90]; /* 76 (90 bytes) */
- char f_mntfromname[90]; /* 166 (90 bytes) */
- char f_xxx[80]; /* 256 (80 bytes) XXX */
-};
-
-/* Arguments to mount() for various FS types. */
-#ifdef notyet /* XXX */
-struct osf1_ufs_args {
- char *fspec;
- int32_t exflags;
- u_int32_t exroot;
-};
-
-struct osf1_cdfs_args {
- char *fspec;
- int32_t exflags;
- u_int32_t exroot;
- int32_t flags;
-};
-#endif
-
-struct osf1_mfs_args {
- char *name;
- caddr_t base;
- u_int size;
-};
-
-struct osf1_nfs_args {
- struct sockaddr_in *addr;
- caddr_t fh;
- int32_t flags;
- int32_t wsize;
- int32_t rsize;
- int32_t timeo;
- int32_t retrans;
- char *hostname;
- int32_t acregmin;
- int32_t acregmax;
- int32_t acdirmin;
- int32_t acdirmax;
- char *netname;
- void *pathconf;
-};
-
-#define OSF1_NFSMNT_SOFT 0x00001
-#define OSF1_NFSMNT_WSIZE 0x00002
-#define OSF1_NFSMNT_RSIZE 0x00004
-#define OSF1_NFSMNT_TIMEO 0x00008
-#define OSF1_NFSMNT_RETRANS 0x00010
-#define OSF1_NFSMNT_HOSTNAME 0x00020
-#define OSF1_NFSMNT_INT 0x00040
-#define OSF1_NFSMNT_NOCONN 0x00080
-#define OSF1_NFSMNT_NOAC 0x00100 /* ??? */
-#define OSF1_NFSMNT_ACREGMIN 0x00200 /* ??? */
-#define OSF1_NFSMNT_ACREGMAX 0x00400 /* ??? */
-#define OSF1_NFSMNT_ACDIRMIN 0x00800 /* ??? */
-#define OSF1_NFSMNT_ACDIRMAX 0x01000 /* ??? */
-#define OSF1_NFSMNT_NOCTO 0x02000 /* ??? */
-#define OSF1_NFSMNT_POSIX 0x04000 /* ??? */
-#define OSF1_NFSMNT_AUTO 0x08000 /* ??? */
-
-#define OSF1_NFSMNT_FLAGS \
- (OSF1_NFSMNT_SOFT|OSF1_NFSMNT_WSIZE|OSF1_NFSMNT_RSIZE| \
- OSF1_NFSMNT_TIMEO|OSF1_NFSMNT_RETRANS|OSF1_NFSMNT_HOSTNAME| \
- OSF1_NFSMNT_INT|OSF1_NFSMNT_NOCONN)
-
-void bsd2osf_statfs __P((struct statfs *, struct osf1_statfs *));
-int osf1_mount_mfs __P((struct proc *, struct osf1_sys_mount_args *,
- struct sys_mount_args *));
-int osf1_mount_nfs __P((struct proc *, struct osf1_sys_mount_args *,
- struct sys_mount_args *));
-
-void
-bsd2osf_statfs(bsfs, osfs)
- struct statfs *bsfs;
- struct osf1_statfs *osfs;
-{
-
- bzero(osfs, sizeof (struct osf1_statfs));
- if (!strncmp(MOUNT_FFS, bsfs->f_fstypename, MFSNAMELEN))
- osfs->f_type = OSF1_MOUNT_UFS;
- else if (!strncmp(MOUNT_NFS, bsfs->f_fstypename, MFSNAMELEN))
- osfs->f_type = OSF1_MOUNT_NFS;
- else if (!strncmp(MOUNT_MFS, bsfs->f_fstypename, MFSNAMELEN))
- osfs->f_type = OSF1_MOUNT_MFS;
- else
- /* uh oh... XXX = PC, CDFS, PROCFS, etc. */
- osfs->f_type = OSF1_MOUNT_ADDON;
- osfs->f_flags = bsfs->f_flags; /* XXX translate */
- osfs->f_fsize = bsfs->f_bsize;
- osfs->f_bsize = bsfs->f_iosize;
- osfs->f_blocks = bsfs->f_blocks;
- osfs->f_bfree = bsfs->f_bfree;
- osfs->f_bavail = bsfs->f_bavail;
- osfs->f_files = bsfs->f_files;
- osfs->f_ffree = bsfs->f_ffree;
- bcopy(&bsfs->f_fsid, &osfs->f_fsid,
- max(sizeof bsfs->f_fsid, sizeof osfs->f_fsid));
- /* osfs->f_spare zeroed above */
- bcopy(bsfs->f_mntonname, osfs->f_mntonname,
- max(sizeof bsfs->f_mntonname, sizeof osfs->f_mntonname));
- bcopy(bsfs->f_mntfromname, osfs->f_mntfromname,
- max(sizeof bsfs->f_mntfromname, sizeof osfs->f_mntfromname));
- /* XXX osfs->f_xxx should be filled in... */
-}
-
-int
-osf1_sys_statfs(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- struct osf1_sys_statfs_args /* {
- syscallarg(char *) path;
- syscallarg(struct osf1_statfs *) buf;
- syscallarg(int) len;
- } */ *uap = v;
- struct mount *mp;
- struct statfs *sp;
- struct osf1_statfs osfs;
- int error;
- struct nameidata nd;
- NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, SCARG(uap, path), p);
- if ((error = namei(&nd)) != 0)
- return (error);
- mp = nd.ni_vp->v_mount;
- sp = &mp->mnt_stat;
- vrele(nd.ni_vp);
- if ((error = VFS_STATFS(mp, sp, p)) != 0)
- return (error);
- sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
- bsd2osf_statfs(sp, &osfs);
- return copyout(&osfs, SCARG(uap, buf), min(sizeof osfs,
- SCARG(uap, len)));
-}
+static int osf1_mount_mfs __P((struct proc *,
+ struct osf1_sys_mount_args *, struct sys_mount_args *));
+static int osf1_mount_nfs __P((struct proc *,
+ struct osf1_sys_mount_args *, struct sys_mount_args *));
int
osf1_sys_fstatfs(p, v, retval)
@@ -232,27 +110,26 @@ osf1_sys_fstatfs(p, v, retval)
void *v;
register_t *retval;
{
- struct osf1_sys_fstatfs_args /* {
- syscallarg(int) fd;
- syscallarg(struct osf1_statfs *) buf;
- syscallarg(int) len;
- } */ *uap = v;
+ struct osf1_sys_fstatfs_args *uap = v;
struct file *fp;
struct mount *mp;
struct statfs *sp;
struct osf1_statfs osfs;
int error;
- if ((error = getvnode(p->p_fd, SCARG(uap, fd), &fp)) != 0)
+ /* getvnode() will use the descriptor for us */
+ if ((error = getvnode(p->p_fd, SCARG(uap, fd), &fp)))
return (error);
mp = ((struct vnode *)fp->f_data)->v_mount;
sp = &mp->mnt_stat;
- if ((error = VFS_STATFS(mp, sp, p)) != 0)
- return (error);
+ if ((error = VFS_STATFS(mp, sp, p)))
+ goto out;
sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
- bsd2osf_statfs(sp, &osfs);
- return copyout(&osfs, SCARG(uap, buf), min(sizeof osfs,
+ osf1_cvt_statfs_from_native(sp, &osfs);
+ error = copyout(&osfs, SCARG(uap, buf), min(sizeof osfs,
SCARG(uap, len)));
+ out:
+ return (error);
}
int
@@ -261,11 +138,7 @@ osf1_sys_getfsstat(p, v, retval)
void *v;
register_t *retval;
{
- register struct osf1_sys_getfsstat_args /* {
- syscallarg(struct osf1_statfs *) buf;
- syscallarg(long) bufsize;
- syscallarg(int) flags;
- } */ *uap = v;
+ struct osf1_sys_getfsstat_args *uap = v;
struct mount *mp, *nmp;
struct statfs *sp;
struct osf1_statfs osfs;
@@ -280,8 +153,7 @@ osf1_sys_getfsstat(p, v, retval)
for (count = 0, mp = mountlist.cqh_first; mp != (void *)&mountlist;
mp = nmp) {
nmp = mp->mnt_list.cqe_next;
- if (osf_sfsp && count < maxcount &&
- ((mp->mnt_flag & MNT_MLOCK) == 0)) {
+ if (osf_sfsp && count < maxcount) {
sp = &mp->mnt_stat;
/*
* If OSF1_MNT_NOWAIT is specified, do not refresh the
@@ -293,9 +165,9 @@ osf1_sys_getfsstat(p, v, retval)
(error = VFS_STATFS(mp, sp, p)))
continue;
sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
- bsd2osf_statfs(sp, &osfs);
+ osf1_cvt_statfs_from_native(sp, &osfs);
if ((error = copyout(&osfs, osf_sfsp,
- sizeof (struct osf1_statfs))) != 0)
+ sizeof (struct osf1_statfs))))
return (error);
osf_sfsp += sizeof (struct osf1_statfs);
}
@@ -309,41 +181,12 @@ osf1_sys_getfsstat(p, v, retval)
}
int
-osf1_sys_unmount(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- struct osf1_sys_unmount_args /* {
- syscallarg(char *) path;
- syscallarg(int) flags;
- } */ *uap = v;
- struct sys_unmount_args a;
-
- SCARG(&a, path) = SCARG(uap, path);
-
- if (SCARG(uap, flags) & ~OSF1_UNMOUNT_FLAGS)
- return (EINVAL);
- SCARG(&a, flags) = 0;
- if ((SCARG(uap, flags) & OSF1_MNT_FORCE) &&
- (SCARG(uap, flags) & OSF1_MNT_NOFORCE) == 0)
- SCARG(&a, flags) |= MNT_FORCE;
-
- return sys_unmount(p, &a, retval);
-}
-
-int
osf1_sys_mount(p, v, retval)
struct proc *p;
void *v;
register_t *retval;
{
- struct osf1_sys_mount_args /* {
- syscallarg(int) type;
- syscallarg(char *) path;
- syscallarg(int) flags;
- syscallarg(caddr_t) data;
- } */ *uap = v;
+ struct osf1_sys_mount_args *uap = v;
struct sys_mount_args a;
int error;
@@ -354,37 +197,16 @@ osf1_sys_mount(p, v, retval)
SCARG(&a, flags) = SCARG(uap, flags); /* XXX - xlate */
switch (SCARG(uap, type)) {
- case OSF1_MOUNT_UFS: /* XXX */
- return (EINVAL);
- break;
-
- case OSF1_MOUNT_NFS: /* XXX */
- if ((error = osf1_mount_nfs(p, uap, &a)) != 0)
+ case OSF1_MOUNT_NFS:
+ if ((error = osf1_mount_nfs(p, uap, &a)))
return error;
break;
- case OSF1_MOUNT_MFS: /* XXX */
- if ((error = osf1_mount_mfs(p, uap, &a)) != 0)
+ case OSF1_MOUNT_MFS:
+ if ((error = osf1_mount_mfs(p, uap, &a)))
return error;
break;
- case OSF1_MOUNT_CDFS: /* XXX */
- return (EINVAL);
- break;
-
- case OSF1_MOUNT_PROCFS: /* XXX */
- return (EINVAL);
- break;
-
- case OSF1_MOUNT_NONE:
- case OSF1_MOUNT_PC:
- case OSF1_MOUNT_S5FS:
- case OSF1_MOUNT_DFS:
- case OSF1_MOUNT_EFS:
- case OSF1_MOUNT_MSFS:
- case OSF1_MOUNT_FFM:
- case OSF1_MOUNT_FDFS:
- case OSF1_MOUNT_ADDON:
default:
return (EINVAL);
}
@@ -393,99 +215,144 @@ osf1_sys_mount(p, v, retval)
}
int
+osf1_sys_statfs(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_statfs_args *uap = v;
+ struct mount *mp;
+ struct statfs *sp;
+ struct osf1_statfs osfs;
+ int error;
+ struct nameidata nd;
+
+ NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, SCARG(uap, path), p);
+ if ((error = namei(&nd)))
+ return (error);
+ mp = nd.ni_vp->v_mount;
+ sp = &mp->mnt_stat;
+ vrele(nd.ni_vp);
+ if ((error = VFS_STATFS(mp, sp, p)))
+ return (error);
+ sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
+ osf1_cvt_statfs_from_native(sp, &osfs);
+ return copyout(&osfs, SCARG(uap, buf), min(sizeof osfs,
+ SCARG(uap, len)));
+}
+
+int
+osf1_sys_unmount(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_unmount_args *uap = v;
+ struct sys_unmount_args a;
+
+ SCARG(&a, path) = SCARG(uap, path);
+
+ if (SCARG(uap, flags) & ~OSF1_UNMOUNT_FLAGS)
+ return (EINVAL);
+ SCARG(&a, flags) = 0;
+ if ((SCARG(uap, flags) & OSF1_MNT_FORCE) &&
+ (SCARG(uap, flags) & OSF1_MNT_NOFORCE) == 0)
+ SCARG(&a, flags) |= MNT_FORCE;
+
+ return sys_unmount(p, &a, retval);
+}
+
+static int
osf1_mount_mfs(p, osf_argp, bsd_argp)
struct proc *p;
struct osf1_sys_mount_args *osf_argp;
struct sys_mount_args *bsd_argp;
{
- struct emul *e = p->p_emul;
struct osf1_mfs_args osf_ma;
struct mfs_args bsd_ma;
- caddr_t cp;
- int error;
+ caddr_t sg = stackgap_init(p->p_emul);
+ int error, len;
+ static const char mfs_name[] = MOUNT_MFS;
- error = copyin(SCARG(osf_argp, data), &osf_ma, sizeof osf_ma);
- if (error)
+ if ((error = copyin(SCARG(osf_argp, data), &osf_ma, sizeof osf_ma)))
return error;
- bzero(&bsd_ma, sizeof bsd_ma);
+ memset(&bsd_ma, 0, sizeof bsd_ma);
bsd_ma.fspec = osf_ma.name;
/* XXX export args */
bsd_ma.base = osf_ma.base;
bsd_ma.size = osf_ma.size;
- cp = STACKGAPBASE;
- SCARG(bsd_argp, data) = cp;
- if ((error = copyout(&bsd_ma, cp, sizeof bsd_ma)) != 0)
+ SCARG(bsd_argp, data) = stackgap_alloc(&sg, sizeof bsd_ma);
+ if ((error = copyout(&bsd_ma, SCARG(bsd_argp, data), sizeof bsd_ma)))
return error;
- cp += ALIGN(sizeof bsd_ma);
- SCARG(bsd_argp, type) = cp;
- if ((error = copyout(MOUNT_MFS, cp, strlen(MOUNT_MFS) + 1)) != 0)
+ len = strlen(mfs_name) + 1;
+ SCARG(bsd_argp, type) = stackgap_alloc(&sg, len);
+ if ((error = copyout(mfs_name, (void *)SCARG(bsd_argp, type), len)))
return error;
return 0;
}
-int
+static int
osf1_mount_nfs(p, osf_argp, bsd_argp)
struct proc *p;
struct osf1_sys_mount_args *osf_argp;
struct sys_mount_args *bsd_argp;
{
- struct emul *e = p->p_emul;
struct osf1_nfs_args osf_na;
struct nfs_args bsd_na;
- caddr_t cp;
- int error;
+ caddr_t sg = stackgap_init(p->p_emul);
+ int error, len;
+ static const char nfs_name[] = MOUNT_NFS;
+ unsigned long leftovers;
- error = copyin(SCARG(osf_argp, data), &osf_na, sizeof osf_na);
- if (error)
+ if ((error = copyin(SCARG(osf_argp, data), &osf_na, sizeof osf_na)))
return error;
- bzero(&bsd_na, sizeof bsd_na);
- bsd_na.version = 2;
+ memset(&bsd_na, 0, sizeof bsd_na);
bsd_na.addr = (struct sockaddr *)osf_na.addr;
bsd_na.addrlen = sizeof (struct sockaddr_in);
- bsd_na.sotype = SOCK_DGRAM;
- bsd_na.proto = 0;
- bsd_na.fh = (char *)osf_na.fh;
-
- if (osf_na.flags & ~OSF1_NFSMNT_FLAGS)
- return EINVAL;
- if (osf_na.flags & OSF1_NFSMNT_SOFT)
- bsd_na.flags |= NFSMNT_SOFT;
- if (osf_na.flags & OSF1_NFSMNT_WSIZE) {
- bsd_na.wsize = osf_na.wsize;
- bsd_na.flags |= NFSMNT_WSIZE;
+ bsd_na.fh = osf_na.fh;
+
+ /* translate flags */
+ bsd_na.flags = emul_flags_translate(osf1_nfs_mount_flags_xtab,
+ osf_na.flags, &leftovers);
+ if (leftovers & OSF1_NFSMNT_HOSTNAME) {
+ leftovers &= ~OSF1_NFSMNT_HOSTNAME;
+ bsd_na.hostname = osf_na.hostname;
+ } else {
+ /* XXX FILL IN HOST NAME WITH IPADDR? */
}
- if (osf_na.flags & OSF1_NFSMNT_RSIZE) {
- bsd_na.rsize = osf_na.rsize;
- bsd_na.flags |= NFSMNT_RSIZE;
+ if (leftovers & OSF1_NFSMNT_TCP) {
+ leftovers &= ~OSF1_NFSMNT_TCP;
+ bsd_na.sotype = SOCK_DGRAM;
+ bsd_na.proto = 0;
+ } else {
+ bsd_na.sotype = SOCK_STREAM;
+ bsd_na.proto = 0;
}
- if (osf_na.flags & OSF1_NFSMNT_TIMEO) {
+ if (leftovers != 0)
+ return (EINVAL);
+
+ /* copy structure elements based on flags */
+ if (bsd_na.flags & NFSMNT_WSIZE)
+ bsd_na.wsize = osf_na.wsize;
+ if (bsd_na.flags & NFSMNT_RSIZE)
+ bsd_na.rsize = osf_na.rsize;
+ if (bsd_na.flags & NFSMNT_TIMEO)
bsd_na.timeo = osf_na.timeo;
- bsd_na.flags |= NFSMNT_TIMEO;
- }
- if (osf_na.flags & OSF1_NFSMNT_RETRANS) {
+ if (bsd_na.flags & NFSMNT_RETRANS)
bsd_na.retrans = osf_na.retrans;
- bsd_na.flags |= NFSMNT_RETRANS;
- }
- if (osf_na.flags & OSF1_NFSMNT_HOSTNAME)
- bsd_na.hostname = osf_na.hostname;
- if (osf_na.flags & OSF1_NFSMNT_INT)
- bsd_na.flags |= NFSMNT_INT;
- if (osf_na.flags & OSF1_NFSMNT_NOCONN)
- bsd_na.flags |= NFSMNT_NOCONN;
-
- cp = STACKGAPBASE;
- SCARG(bsd_argp, data) = cp;
- if ((error = copyout(&bsd_na, cp, sizeof bsd_na)) != 0)
+
+ SCARG(bsd_argp, data) = stackgap_alloc(&sg, sizeof bsd_na);
+ if ((error = copyout(&bsd_na, SCARG(bsd_argp, data), sizeof bsd_na)))
return error;
- cp += ALIGN(sizeof bsd_na);
- SCARG(bsd_argp, type) = cp;
- if ((error = copyout(MOUNT_NFS, cp, strlen(MOUNT_NFS) + 1)) != 0)
+ len = strlen(nfs_name) + 1;
+ SCARG(bsd_argp, type) = stackgap_alloc(&sg, len);
+ if ((error = copyout(MOUNT_NFS, (void *)SCARG(bsd_argp, type), len)))
return error;
return 0;
diff --git a/sys/compat/osf1/osf1_prot.c b/sys/compat/osf1/osf1_prot.c
new file mode 100644
index 00000000000..9385ab48f24
--- /dev/null
+++ b/sys/compat/osf1/osf1_prot.c
@@ -0,0 +1,142 @@
+/* $OpenBSD: osf1_prot.c,v 1.1 2000/08/04 15:47:55 ericj Exp $ */
+/* $NetBSD: osf1_prot.c,v 1.2 1999/05/05 01:51:35 cgd Exp $ */
+
+/*
+ * Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Christopher G. Demetriou
+ * for the NetBSD Project.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Copyright (c) 1994, 1995 Carnegie-Mellon University.
+ * All rights reserved.
+ *
+ * Author: Chris G. Demetriou
+ *
+ * Permission to use, copy, modify and distribute this software and
+ * its documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ *
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
+ * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ *
+ * Carnegie Mellon requests users of this software to return to
+ *
+ * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
+ * School of Computer Science
+ * Carnegie Mellon University
+ * Pittsburgh PA 15213-3890
+ *
+ * any improvements or extensions that they make and grant Carnegie the
+ * rights to redistribute these changes.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/proc.h>
+#include <sys/mount.h>
+#include <sys/syscallargs.h>
+
+#include <compat/osf1/osf1.h>
+#include <compat/osf1/osf1_syscallargs.h>
+#include <compat/osf1/osf1_cvt.h>
+
+/*
+ * OSF/1 defines _POSIX_SAVED_IDS, which means that our normal
+ * setgid() won't work.
+ *
+ * If you change "uid" to "gid" in the discussion, below, about
+ * setuid(), you'll get a correct description of setgid().
+ */
+int
+osf1_sys_setgid(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_setgid_args *uap = v;
+ struct pcred *pc = p->p_cred;
+ gid_t gid = SCARG(uap, gid);
+ int error;
+
+ if ((error = suser(pc->pc_ucred, &p->p_acflag)) != 0 &&
+ gid != pc->p_rgid && gid != pc->p_svgid)
+ return (error);
+
+ pc->pc_ucred = crcopy(pc->pc_ucred);
+ pc->pc_ucred->cr_gid = gid;
+ if (error == 0) {
+ pc->p_rgid = gid;
+ pc->p_svgid = gid;
+ }
+ p->p_flag |= P_SUGID;
+ return (0);
+}
+
+/*
+ * OSF/1 defines _POSIX_SAVED_IDS, which means that our normal
+ * setuid() won't work.
+ *
+ * Instead, by P1003.1b-1993, setuid() is supposed to work like:
+ * If the process has appropriate [super-user] privileges, the
+ * setuid() function sets the real user ID, effective user
+ * ID, and the saved set-user-ID to uid.
+ * If the process does not have appropriate privileges, but uid
+ * is equal to the real user ID or the saved set-user-ID, the
+ * setuid() function sets the effective user ID to uid; the
+ * real user ID and saved set-user-ID remain unchanged by
+ * this function call.
+ */
+int
+osf1_sys_setuid(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_setuid_args *uap = v;
+ struct pcred *pc = p->p_cred;
+ uid_t uid = SCARG(uap, uid);
+ int error;
+
+ if ((error = suser(pc->pc_ucred, &p->p_acflag)) != 0 &&
+ uid != pc->p_ruid && uid != pc->p_svuid)
+ return (error);
+
+ pc->pc_ucred = crcopy(pc->pc_ucred);
+ pc->pc_ucred->cr_uid = uid;
+ if (error == 0) {
+ (void)chgproccnt(pc->p_ruid, -1);
+ (void)chgproccnt(uid, 1);
+ pc->p_ruid = uid;
+ pc->p_svuid = uid;
+ }
+ p->p_flag |= P_SUGID;
+ return (0);
+}
diff --git a/sys/compat/osf1/osf1_resource.c b/sys/compat/osf1/osf1_resource.c
new file mode 100644
index 00000000000..7285af7ee50
--- /dev/null
+++ b/sys/compat/osf1/osf1_resource.c
@@ -0,0 +1,171 @@
+/* $OpenBSD: osf1_resource.c,v 1.1 2000/08/04 15:47:55 ericj Exp $ */
+/* $NetBSD: osf1_resource.c,v 1.1 1999/05/01 05:41:56 cgd Exp $ */
+
+/*
+ * Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Christopher G. Demetriou
+ * for the NetBSD Project.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/proc.h>
+#include <sys/mount.h>
+#include <sys/syscallargs.h>
+#include <sys/resource.h>
+#include <sys/resourcevar.h>
+
+#include <compat/osf1/osf1.h>
+#include <compat/osf1/osf1_syscallargs.h>
+#include <compat/osf1/osf1_cvt.h>
+
+int
+osf1_sys_getrlimit(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_getrlimit_args *uap = v;
+ struct sys_getrlimit_args a;
+
+ switch (SCARG(uap, which)) {
+ case OSF1_RLIMIT_CPU:
+ SCARG(&a, which) = RLIMIT_CPU;
+ break;
+ case OSF1_RLIMIT_FSIZE:
+ SCARG(&a, which) = RLIMIT_FSIZE;
+ break;
+ case OSF1_RLIMIT_DATA:
+ SCARG(&a, which) = RLIMIT_DATA;
+ break;
+ case OSF1_RLIMIT_STACK:
+ SCARG(&a, which) = RLIMIT_STACK;
+ break;
+ case OSF1_RLIMIT_CORE:
+ SCARG(&a, which) = RLIMIT_CORE;
+ break;
+ case OSF1_RLIMIT_RSS:
+ SCARG(&a, which) = RLIMIT_RSS;
+ break;
+ case OSF1_RLIMIT_NOFILE:
+ SCARG(&a, which) = RLIMIT_NOFILE;
+ break;
+ case OSF1_RLIMIT_AS: /* unhandled */
+ default:
+ return (EINVAL);
+ }
+
+ /* XXX should translate */
+ SCARG(&a, rlp) = SCARG(uap, rlp);
+
+ return sys_getrlimit(p, &a, retval);
+}
+
+int
+osf1_sys_getrusage(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_getrusage_args *uap = v;
+ struct sys_getrusage_args a;
+ struct osf1_rusage osf1_rusage;
+ struct rusage netbsd_rusage;
+ caddr_t sg;
+ int error;
+
+ switch (SCARG(uap, who)) {
+ case OSF1_RUSAGE_SELF:
+ SCARG(&a, who) = RUSAGE_SELF;
+ break;
+
+ case OSF1_RUSAGE_CHILDREN:
+ SCARG(&a, who) = RUSAGE_CHILDREN;
+ break;
+
+ case OSF1_RUSAGE_THREAD: /* XXX not supported */
+ default:
+ return (EINVAL);
+ }
+
+ sg = stackgap_init(p->p_emul);
+ SCARG(&a, rusage) = stackgap_alloc(&sg, sizeof netbsd_rusage);
+
+ error = sys_getrusage(p, &a, retval);
+ if (error == 0)
+ error = copyin((caddr_t)SCARG(&a, rusage),
+ (caddr_t)&netbsd_rusage, sizeof netbsd_rusage);
+ if (error == 0) {
+ osf1_cvt_rusage_from_native(&netbsd_rusage, &osf1_rusage);
+ error = copyout((caddr_t)&osf1_rusage,
+ (caddr_t)SCARG(uap, rusage), sizeof osf1_rusage);
+ }
+
+ return (error);
+}
+
+int
+osf1_sys_setrlimit(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_setrlimit_args *uap = v;
+ struct sys_setrlimit_args a;
+
+ switch (SCARG(uap, which)) {
+ case OSF1_RLIMIT_CPU:
+ SCARG(&a, which) = RLIMIT_CPU;
+ break;
+ case OSF1_RLIMIT_FSIZE:
+ SCARG(&a, which) = RLIMIT_FSIZE;
+ break;
+ case OSF1_RLIMIT_DATA:
+ SCARG(&a, which) = RLIMIT_DATA;
+ break;
+ case OSF1_RLIMIT_STACK:
+ SCARG(&a, which) = RLIMIT_STACK;
+ break;
+ case OSF1_RLIMIT_CORE:
+ SCARG(&a, which) = RLIMIT_CORE;
+ break;
+ case OSF1_RLIMIT_RSS:
+ SCARG(&a, which) = RLIMIT_RSS;
+ break;
+ case OSF1_RLIMIT_NOFILE:
+ SCARG(&a, which) = RLIMIT_NOFILE;
+ break;
+ case OSF1_RLIMIT_AS: /* unhandled */
+ default:
+ return (EINVAL);
+ }
+
+ /* XXX should translate */
+ SCARG(&a, rlp) = SCARG(uap, rlp);
+
+ return sys_setrlimit(p, &a, retval);
+}
diff --git a/sys/compat/osf1/osf1_signal.c b/sys/compat/osf1/osf1_signal.c
index 5e5b9e1a7f9..40165280f70 100644
--- a/sys/compat/osf1/osf1_signal.c
+++ b/sys/compat/osf1/osf1_signal.c
@@ -1,4 +1,35 @@
-/* $OpenBSD: osf1_signal.c,v 1.8 1998/12/23 16:23:47 millert Exp $ */
+/* $OpenBSD: osf1_signal.c,v 1.9 2000/08/04 15:47:55 ericj Exp $ */
+/* $NetBSD: osf1_signal.c,v 1.15 1999/05/05 00:57:43 cgd Exp $ */
+
+/*
+ * Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Christopher G. Demetriou
+ * for the NetBSD Project.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
#include <sys/param.h>
#include <sys/systm.h>
@@ -14,213 +45,27 @@
#include <sys/syscallargs.h>
+#include <compat/osf1/osf1.h>
#include <compat/osf1/osf1_signal.h>
#include <compat/osf1/osf1_syscallargs.h>
#include <compat/osf1/osf1_util.h>
+#include <compat/osf1/osf1_cvt.h>
-static void bsd_to_osf1_sigaction __P((const struct sigaction *bsa,
- struct osf1_sigaction *osa));
-static void osf1_to_bsd_sigaction __P((const struct osf1_sigaction *osa,
- struct sigaction *bsa));
-
-#define sigemptyset(s) bzero((s), sizeof(*(s)))
-#define sigismember(s, n) (*(s) & sigmask(n))
-#define sigaddset(s, n) (*(s) |= sigmask(n))
-
-#define osf1_sigmask(n) (1 << ((n) - 1))
-#define osf1_sigemptyset(s) bzero((s), sizeof(*(s)))
-#define osf1_sigismember(s, n) (*(s) & sigmask(n))
-#define osf1_sigaddset(s, n) (*(s) |= sigmask(n))
-
-int bsd_to_osf1_sig[] = {
- 0,
- OSF1_SIGHUP,
- OSF1_SIGINT,
- OSF1_SIGQUIT,
- OSF1_SIGILL,
- OSF1_SIGTRAP,
- OSF1_SIGABRT,
- OSF1_SIGEMT,
- OSF1_SIGFPE,
- OSF1_SIGKILL,
- OSF1_SIGBUS,
- OSF1_SIGSEGV,
- OSF1_SIGSYS,
- OSF1_SIGPIPE,
- OSF1_SIGALRM,
- OSF1_SIGTERM,
- OSF1_SIGURG,
- OSF1_SIGSTOP,
- OSF1_SIGTSTP,
- OSF1_SIGCONT,
- OSF1_SIGCHLD,
- OSF1_SIGTTIN,
- OSF1_SIGTTOU,
- OSF1_SIGIO,
- OSF1_SIGXCPU,
- OSF1_SIGXFSZ,
- OSF1_SIGVTALRM,
- OSF1_SIGPROF,
- OSF1_SIGWINCH,
- OSF1_SIGINFO,
- OSF1_SIGUSR1,
- OSF1_SIGUSR2,
-};
-
-int osf1_to_bsd_sig[] = {
- 0,
- SIGHUP,
- SIGINT,
- SIGQUIT,
- SIGILL,
- SIGTRAP,
- SIGABRT,
- SIGEMT,
- SIGFPE,
- SIGKILL,
- SIGBUS,
- SIGSEGV,
- SIGSYS,
- SIGPIPE,
- SIGALRM,
- SIGTERM,
- SIGURG,
- SIGSTOP,
- SIGTSTP,
- SIGCONT,
- SIGCHLD,
- SIGTTIN,
- SIGTTOU,
- SIGIO,
- SIGXCPU,
- SIGXFSZ,
- SIGVTALRM,
- SIGPROF,
- SIGWINCH,
- SIGINFO,
- SIGUSR1,
- SIGUSR2,
-};
-
-void
-osf1_to_bsd_sigset(oss, bss)
- const osf1_sigset_t *oss;
- sigset_t *bss;
-{
- int i, newsig;
-
- sigemptyset(bss);
- for (i = 1; i < OSF1_NSIG; i++) {
- if (osf1_sigismember(oss, i)) {
- newsig = osf1_to_bsd_sig[i];
- if (newsig)
- sigaddset(bss, newsig);
- }
- }
-}
-
-
-void
-bsd_to_osf1_sigset(bss, oss)
- const sigset_t *bss;
- osf1_sigset_t *oss;
-{
- int i, newsig;
-
- osf1_sigemptyset(oss);
- for (i = 1; i < NSIG; i++) {
- if (sigismember(bss, i)) {
- newsig = bsd_to_osf1_sig[i];
- if (newsig)
- osf1_sigaddset(oss, newsig);
- }
- }
-}
-
-/*
- * XXX: Only a subset of the flags is currently implemented.
- */
-void
-osf1_to_bsd_sigaction(osa, bsa)
- const struct osf1_sigaction *osa;
- struct sigaction *bsa;
-{
-
- bsa->sa_handler = osa->sa__handler;
- osf1_to_bsd_sigset(&osa->sa_mask, &bsa->sa_mask);
- bsa->sa_flags = 0;
- if ((osa->sa_flags & OSF1_SA_ONSTACK) != 0)
- bsa->sa_flags |= SA_ONSTACK;
- if ((osa->sa_flags & OSF1_SA_RESTART) != 0)
- bsa->sa_flags |= SA_RESTART;
- if ((osa->sa_flags & OSF1_SA_RESETHAND) != 0)
- bsa->sa_flags |= SA_RESETHAND;
- if ((osa->sa_flags & OSF1_SA_NOCLDSTOP) != 0)
- bsa->sa_flags |= SA_NOCLDSTOP;
- if ((osa->sa_flags & OSF1_SA_NOCLDWAIT) != 0)
- bsa->sa_flags |= SA_NOCLDWAIT;
- if ((osa->sa_flags & OSF1_SA_NODEFER) != 0)
- bsa->sa_flags |= SA_NODEFER;
- if ((osa->sa_flags & OSF1_SA_SIGINFO) != 0)
- bsa->sa_flags |= SA_SIGINFO;
-}
-
-void
-bsd_to_osf1_sigaction(bsa, osa)
- const struct sigaction *bsa;
- struct osf1_sigaction *osa;
-{
-
- osa->sa__handler = bsa->sa_handler;
- bsd_to_osf1_sigset(&bsa->sa_mask, &osa->sa_mask);
- osa->sa_flags = 0;
- if ((bsa->sa_flags & SA_ONSTACK) != 0)
- osa->sa_flags |= OSF1_SA_ONSTACK;
- if ((bsa->sa_flags & SA_RESTART) != 0)
- osa->sa_flags |= OSF1_SA_RESTART;
- if ((bsa->sa_flags & SA_NOCLDSTOP) != 0)
- osa->sa_flags |= OSF1_SA_NOCLDSTOP;
- if ((bsa->sa_flags & SA_NOCLDWAIT) != 0)
- osa->sa_flags |= OSF1_SA_NOCLDWAIT;
- if ((bsa->sa_flags & SA_NODEFER) != 0)
- osa->sa_flags |= OSF1_SA_NODEFER;
- if ((bsa->sa_flags & SA_RESETHAND) != 0)
- osa->sa_flags |= OSF1_SA_RESETHAND;
- if ((bsa->sa_flags & SA_SIGINFO) != 0)
- osa->sa_flags |= OSF1_SA_SIGINFO;
-}
-
-void
-osf1_to_bsd_sigaltstack(oss, bss)
- const struct osf1_sigaltstack *oss;
- struct sigaltstack *bss;
-{
-
- bss->ss_sp = oss->ss_sp;
- bss->ss_size = oss->ss_size;
- bss->ss_flags = 0;
-
- if ((oss->ss_flags & OSF1_SS_DISABLE) != 0)
- bss->ss_flags |= SS_DISABLE;
- if ((oss->ss_flags & OSF1_SS_ONSTACK) != 0)
- bss->ss_flags |= SS_ONSTACK;
-}
-
-void
-bsd_to_osf1_sigaltstack(bss, oss)
- const struct sigaltstack *bss;
- struct osf1_sigaltstack *oss;
+#if 0
+int
+osf1_sys_kill(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
{
+ struct osf1_sys_kill_args *uap = v;
+ struct sys_kill_args ka;
- oss->ss_sp = bss->ss_sp;
- oss->ss_size = bss->ss_size;
- oss->ss_flags = 0;
-
- if ((bss->ss_flags & SS_DISABLE) != 0)
- oss->ss_flags |= OSF1_SS_DISABLE;
- if ((bss->ss_flags & SS_ONSTACK) != 0)
- oss->ss_flags |= OSF1_SS_ONSTACK;
+ SCARG(&ka, pid) = SCARG(uap, pid);
+ SCARG(&ka, signum) = osf1_signal_xlist[SCARG(uap, signum)];
+ return sys_kill(p, &ka, retval);
}
+#endif
int
osf1_sys_sigaction(p, v, retval)
@@ -228,20 +73,13 @@ osf1_sys_sigaction(p, v, retval)
void *v;
register_t *retval;
{
- struct osf1_sys_sigaction_args /* {
- syscallarg(int) signum;
- syscallarg(struct osf1_sigaction *) nsa;
- syscallarg(struct osf1_sigaction *) osa;
- } */ *uap = v;
+ struct osf1_sys_sigaction_args *uap = v;
struct osf1_sigaction *nosa, *oosa, tmposa;
struct sigaction *nbsa, *obsa, tmpbsa;
struct sys_sigaction_args sa;
caddr_t sg;
int error;
- if (SCARG(uap, signum) < 0 || SCARG(uap, signum) >= OSF1_NSIG)
- return (EINVAL);
-
sg = stackgap_init(p->p_emul);
nosa = SCARG(uap, nsa);
oosa = SCARG(uap, osa);
@@ -255,23 +93,24 @@ osf1_sys_sigaction(p, v, retval)
nbsa = stackgap_alloc(&sg, sizeof(struct sigaction));
if ((error = copyin(nosa, &tmposa, sizeof(tmposa))) != 0)
return error;
- osf1_to_bsd_sigaction(&tmposa, &tmpbsa);
+ osf1_cvt_sigaction_to_native(&tmposa, &tmpbsa);
if ((error = copyout(&tmpbsa, nbsa, sizeof(tmpbsa))) != 0)
return error;
} else
nbsa = NULL;
- SCARG(&sa, signum) = osf1_to_bsd_sig[SCARG(uap, signum)];
+ SCARG(&sa, signum) = osf1_signal_xlist[SCARG(uap, signum)];
SCARG(&sa, nsa) = nbsa;
SCARG(&sa, osa) = obsa;
+ /* XXX */
if ((error = sys_sigaction(p, &sa, retval)) != 0)
return error;
if (oosa != NULL) {
if ((error = copyin(obsa, &tmpbsa, sizeof(tmpbsa))) != 0)
return error;
- bsd_to_osf1_sigaction(&tmpbsa, &tmposa);
+ osf1_cvt_sigaction_from_native(&tmpbsa, &tmposa);
if ((error = copyout(&tmposa, oosa, sizeof(tmposa))) != 0)
return error;
}
@@ -281,14 +120,11 @@ osf1_sys_sigaction(p, v, retval)
int
osf1_sys_sigaltstack(p, v, retval)
- register struct proc *p;
+ struct proc *p;
void *v;
register_t *retval;
{
- struct osf1_sys_sigaltstack_args /* {
- syscallarg(struct osf1_sigaltstack *) nss;
- syscallarg(struct osf1_sigaltstack *) oss;
- } */ *uap = v;
+ struct osf1_sys_sigaltstack_args *uap = v;
struct osf1_sigaltstack *noss, *ooss, tmposs;
struct sigaltstack *nbss, *obss, tmpbss;
struct sys_sigaltstack_args sa;
@@ -308,7 +144,8 @@ osf1_sys_sigaltstack(p, v, retval)
nbss = stackgap_alloc(&sg, sizeof(struct sigaltstack));
if ((error = copyin(noss, &tmposs, sizeof(tmposs))) != 0)
return error;
- osf1_to_bsd_sigaltstack(&tmposs, &tmpbss);
+ if ((error = osf1_cvt_sigaltstack_to_native(&tmposs, &tmpbss)) != 0)
+ return error;
if ((error = copyout(&tmpbss, nbss, sizeof(tmpbss))) != 0)
return error;
} else
@@ -317,13 +154,14 @@ osf1_sys_sigaltstack(p, v, retval)
SCARG(&sa, nss) = nbss;
SCARG(&sa, oss) = obss;
+ /* XXX */
if ((error = sys_sigaltstack(p, &sa, retval)) != 0)
return error;
if (obss != NULL) {
if ((error = copyin(obss, &tmpbss, sizeof(tmpbss))) != 0)
return error;
- bsd_to_osf1_sigaltstack(&tmpbss, &tmposs);
+ osf1_cvt_sigaltstack_from_native(&tmpbss, &tmposs);
if ((error = copyout(&tmposs, ooss, sizeof(tmposs))) != 0)
return error;
}
@@ -334,24 +172,21 @@ osf1_sys_sigaltstack(p, v, retval)
#if 0
int
osf1_sys_signal(p, v, retval)
- register struct proc *p;
+ struct proc *p;
void *v;
register_t *retval;
{
- struct osf1_sys_signal_args /* {
- syscallarg(int) signum;
- syscallarg(osf1_sig_t) handler;
- } */ *uap = v;
- int signum, error;
+ struct osf1_sys_signal_args *uap = v;
+ int signum = osf1_signal_xlist[OSF1_SIGNO(SCARG(uap, signum))];
+ int error;
caddr_t sg = stackgap_init(p->p_emul);
- if (SCARG(uap, signum) < 0 || SCARG(uap, signum) >= OSF1_NSIG)
+ if (signum <= 0 || signum >= OSF1_NSIG) {
if (OSF1_SIGCALL(SCARG(uap, signum)) == OSF1_SIGNAL_MASK ||
OSF1_SIGCALL(SCARG(uap, signum)) == OSF1_SIGDEFER_MASK)
*retval = (int)OSF1_SIG_ERR;
return EINVAL;
}
- int signum = osf1_to_bsd_sig[signum];
switch (OSF1_SIGCALL(SCARG(uap, signum))) {
case OSF1_SIGDEFER_MASK:
@@ -455,23 +290,35 @@ osf1_sys_signal(p, v, retval)
}
int
+osf1_sys_sigpending(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_sigpending_args *uap = v;
+ sigset_t bss;
+ osf1_sigset_t oss;
+
+ bss = p->p_siglist & p->p_sigmask;
+ osf1_cvt_sigset_from_native(&bss, &oss);
+
+ return copyout(&oss, SCARG(uap, mask), sizeof(oss));
+}
+
+int
osf1_sys_sigprocmask(p, v, retval)
- register struct proc *p;
+ struct proc *p;
void *v;
register_t *retval;
{
- struct osf1_sys_sigprocmask_args /* {
- syscallarg(int) how;
- syscallarg(osf1_sigset_t *) set;
- syscallarg(osf1_sigset_t *) oset;
- } */ *uap = v;
+ struct osf1_sys_sigprocmask_args *uap = v;
osf1_sigset_t oss;
sigset_t bss;
int error = 0;
if (SCARG(uap, oset) != NULL) {
/* Fix the return value first if needed */
- bsd_to_osf1_sigset(&p->p_sigmask, &oss);
+ osf1_cvt_sigset_from_native(&p->p_sigmask, &oss);
if ((error = copyout(&oss, SCARG(uap, oset), sizeof(oss))) != 0)
return error;
}
@@ -483,7 +330,7 @@ osf1_sys_sigprocmask(p, v, retval)
if ((error = copyin(SCARG(uap, set), &oss, sizeof(oss))) != 0)
return error;
- osf1_to_bsd_sigset(&oss, &bss);
+ osf1_cvt_sigset_to_native(&oss, &bss);
(void) splhigh();
@@ -511,32 +358,12 @@ osf1_sys_sigprocmask(p, v, retval)
}
int
-osf1_sys_sigpending(p, v, retval)
- register struct proc *p;
- void *v;
- register_t *retval;
-{
- struct osf1_sys_sigpending_args /* {
- syscallarg(osf1_sigset_t *) mask;
- } */ *uap = v;
- sigset_t bss;
- osf1_sigset_t oss;
-
- bss = p->p_siglist & p->p_sigmask;
- bsd_to_osf1_sigset(&bss, &oss);
-
- return copyout(&oss, SCARG(uap, mask), sizeof(oss));
-}
-
-int
osf1_sys_sigsuspend(p, v, retval)
- register struct proc *p;
+ struct proc *p;
void *v;
register_t *retval;
{
- struct osf1_sys_sigsuspend_args /* {
- syscallarg(osf1_sigset_t *) ss;
- } */ *uap = v;
+ struct osf1_sys_sigsuspend_args *uap = v;
osf1_sigset_t oss;
sigset_t bss;
struct sys_sigsuspend_args sa;
@@ -545,28 +372,9 @@ osf1_sys_sigsuspend(p, v, retval)
if ((error = copyin(SCARG(uap, ss), &oss, sizeof(oss))) != 0)
return error;
- osf1_to_bsd_sigset(&oss, &bss);
+ osf1_cvt_sigset_to_native(&oss, &bss);
SCARG(&sa, mask) = bss;
return sys_sigsuspend(p, &sa, retval);
}
-
-int
-osf1_sys_kill(p, v, retval)
- register struct proc *p;
- void *v;
- register_t *retval;
-{
- struct osf1_sys_kill_args /* {
- syscallarg(int) pid;
- syscallarg(int) signum;
- } */ *uap = v;
- struct sys_kill_args ka;
-
- if (SCARG(uap, signum) < 0 || SCARG(uap, signum) >= OSF1_NSIG)
- return (EINVAL);
- SCARG(&ka, pid) = SCARG(uap, pid);
- SCARG(&ka, signum) = osf1_to_bsd_sig[SCARG(uap, signum)];
- return sys_kill(p, &ka, retval);
-}
#endif
diff --git a/sys/compat/osf1/osf1_signal.h b/sys/compat/osf1/osf1_signal.h
index 08183d59579..a224df51cb6 100644
--- a/sys/compat/osf1/osf1_signal.h
+++ b/sys/compat/osf1/osf1_signal.h
@@ -1,4 +1,7 @@
-/* $OpenBSD: osf1_signal.h,v 1.3 1998/02/17 01:48:08 millert Exp $ */
+/* $OpenBSD: osf1_signal.h,v 1.4 2000/08/04 15:47:55 ericj Exp $ */
+/* $NetBSD: osf1_signal.h,v 1.5 1999/05/01 02:57:11 cgd Exp $ */
+
+/* XXX OUT OF DATE, some of the non-signal number bits here don't belong */
#ifndef _OSF1_SIGNAL_H
#define _OSF1_SIGNAL_H
@@ -45,38 +48,4 @@
#define OSF1_SIG_UNBLOCK 2
#define OSF1_SIG_SETMASK 3
-typedef u_long osf1_sigset_t;
-typedef void (*osf1_handler_t) __P((int));
-
-struct osf1_sigaction {
- osf1_handler_t sa__handler;
- osf1_sigset_t sa_mask;
- int sa_flags;
-};
-
-struct osf1_sigaltstack {
- caddr_t ss_sp;
- int ss_flags;
- size_t ss_size;
-};
-
-/* sa_flags */
-#define OSF1_SA_ONSTACK 0x00000001
-#define OSF1_SA_RESTART 0x00000002
-#define OSF1_SA_NOCLDSTOP 0x00000004
-#define OSF1_SA_NODEFER 0x00000008
-#define OSF1_SA_RESETHAND 0x00000010
-#define OSF1_SA_NOCLDWAIT 0x00000020
-#define OSF1_SA_SIGINFO 0x00000040
-
-/* ss_flags */
-#define OSF1_SS_ONSTACK 0x00000001
-#define OSF1_SS_DISABLE 0x00000002
-
-extern int osf1_to_bsd_sig[];
-void bsd_to_osf1_sigaltstack __P((const struct sigaltstack *, struct osf1_sigaltstack *));
-void bsd_to_osf1_sigset __P((const sigset_t *, osf1_sigset_t *));
-void osf1_to_bsd_sigaltstack __P((const struct osf1_sigaltstack *, struct sigaltstack *));
-void osf1_to_bsd_sigset __P((const osf1_sigset_t *, sigset_t *));
-
#endif /* !_OSF1_SIGNAL_H */
diff --git a/sys/compat/osf1/osf1_socket.c b/sys/compat/osf1/osf1_socket.c
new file mode 100644
index 00000000000..846ee8090ed
--- /dev/null
+++ b/sys/compat/osf1/osf1_socket.c
@@ -0,0 +1,229 @@
+/* $OpenBSD: osf1_socket.c,v 1.1 2000/08/04 15:47:55 ericj Exp $ */
+/* $NetBSD: osf1_socket.c,v 1.4 1999/05/10 01:58:37 cgd Exp $ */
+
+/*
+ * Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Christopher G. Demetriou
+ * for the NetBSD Project.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Copyright (c) 1994, 1995 Carnegie-Mellon University.
+ * All rights reserved.
+ *
+ * Author: Chris G. Demetriou
+ *
+ * Permission to use, copy, modify and distribute this software and
+ * its documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ *
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
+ * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ *
+ * Carnegie Mellon requests users of this software to return to
+ *
+ * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
+ * School of Computer Science
+ * Carnegie Mellon University
+ * Pittsburgh PA 15213-3890
+ *
+ * any improvements or extensions that they make and grant Carnegie the
+ * rights to redistribute these changes.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/namei.h>
+#include <sys/proc.h>
+#include <sys/file.h>
+#include <sys/mount.h>
+#include <sys/syscallargs.h>
+#include <sys/socketvar.h>
+#include <sys/exec.h>
+
+#include <compat/osf1/osf1.h>
+#include <compat/osf1/osf1_syscallargs.h>
+#include <compat/osf1/osf1_util.h>
+#include <compat/osf1/osf1_cvt.h>
+
+int
+osf1_sys_recvmsg_xopen(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+
+ /* XXX */
+ return (EINVAL);
+}
+
+int
+osf1_sys_sendmsg_xopen(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_sendmsg_xopen_args *uap = v;
+ struct sys_sendmsg_args a;
+ struct osf1_msghdr_xopen osf_msghdr;
+ struct osf1_iovec_xopen osf_iovec, *osf_iovec_ptr;
+ struct msghdr bsd_msghdr;
+ struct iovec bsd_iovec, *bsd_iovec_ptr;
+ unsigned long leftovers;
+ caddr_t sg;
+ unsigned int i;
+ int error;
+
+ sg = stackgap_init(p->p_emul);
+
+ SCARG(&a, s) = SCARG(uap, s);
+
+ /*
+ * translate msghdr structure
+ */
+ if ((error = copyin(SCARG(uap, msg), &osf_msghdr,
+ sizeof osf_msghdr)) != 0)
+ return (error);
+
+ error = osf1_cvt_msghdr_xopen_to_native(&osf_msghdr, &bsd_msghdr);
+ if (error != 0)
+ return (error);
+
+ if (STACKGAPLEN < (bsd_msghdr.msg_iovlen * sizeof (struct iovec) +
+ sizeof (struct msghdr)))
+{
+printf("sendmsg space\n");
+ return (EINVAL);
+}
+
+ SCARG(&a, msg) = stackgap_alloc(&sg, sizeof bsd_msghdr);
+ bsd_msghdr.msg_iov = stackgap_alloc(&sg,
+ bsd_msghdr.msg_iovlen * sizeof (struct iovec));
+
+ if ((error = copyout(&bsd_msghdr, (caddr_t)SCARG(&a, msg),
+ sizeof bsd_msghdr)) != 0)
+ return (error);
+
+ osf_iovec_ptr = osf_msghdr.msg_iov;
+ bsd_iovec_ptr = bsd_msghdr.msg_iov;
+ for (i = 0; i < bsd_msghdr.msg_iovlen; i++) {
+ if ((error = copyin(&osf_iovec_ptr[i], &osf_iovec,
+ sizeof osf_iovec)) != 0)
+ return (error);
+
+ bsd_iovec.iov_base = osf_iovec.iov_base;
+ bsd_iovec.iov_len = osf_iovec.iov_len;
+
+ if ((error = copyout(&bsd_iovec, &bsd_iovec_ptr[i],
+ sizeof bsd_iovec)) != 0)
+ return (error);
+ }
+
+ /*
+ * translate flags
+ */
+ SCARG(&a, flags) = emul_flags_translate(osf1_sendrecv_msg_flags_xtab,
+ SCARG(uap, flags), &leftovers);
+ if (leftovers != 0)
+{
+printf("sendmsg flags leftover: 0x%lx\n", leftovers);
+ return (EINVAL);
+}
+
+ return sys_sendmsg(p, &a, retval);
+}
+
+int
+osf1_sys_sendto(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_sendto_args *uap = v;
+ struct sys_sendto_args a;
+ unsigned long leftovers;
+
+ SCARG(&a, s) = SCARG(uap, s);
+ SCARG(&a, buf) = SCARG(uap, buf);
+ SCARG(&a, len) = SCARG(uap, len);
+ SCARG(&a, to) = SCARG(uap, to);
+ SCARG(&a, tolen) = SCARG(uap, tolen);
+
+ /* translate flags */
+ SCARG(&a, flags) = emul_flags_translate(osf1_sendrecv_msg_flags_xtab,
+ SCARG(uap, flags), &leftovers);
+ if (leftovers != 0)
+ return (EINVAL);
+
+ return sys_sendto(p, &a, retval);
+}
+
+int
+osf1_sys_socket(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_socket_args *uap = v;
+ struct sys_socket_args a;
+
+ /* XXX TRANSLATE */
+
+ if (SCARG(uap, domain) > AF_LINK)
+ return (EINVAL); /* XXX After AF_LINK, divergence. */
+
+ SCARG(&a, domain) = SCARG(uap, domain);
+ SCARG(&a, type) = SCARG(uap, type);
+ SCARG(&a, protocol) = SCARG(uap, protocol);
+
+ return sys_socket(p, &a, retval);
+}
+
+int
+osf1_sys_socketpair(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_socketpair_args *uap = v;
+ struct sys_socketpair_args a;
+
+ /* XXX TRANSLATE */
+
+ if (SCARG(uap, domain) > AF_LINK)
+ return (EINVAL); /* XXX After AF_LINK, divergence. */
+
+ SCARG(&a, domain) = SCARG(uap, domain);
+ SCARG(&a, type) = SCARG(uap, type);
+ SCARG(&a, protocol) = SCARG(uap, protocol);
+ SCARG(&a, rsv) = SCARG(uap, rsv);
+
+ return sys_socketpair(p, &a, retval);
+}
diff --git a/sys/compat/osf1/osf1_sysv_ipc.c b/sys/compat/osf1/osf1_sysv_ipc.c
new file mode 100644
index 00000000000..ae9debabb48
--- /dev/null
+++ b/sys/compat/osf1/osf1_sysv_ipc.c
@@ -0,0 +1,88 @@
+/* $OpenBSD: osf1_sysv_ipc.c,v 1.1 2000/08/04 15:47:55 ericj Exp $ */
+/* $NetBSD: osf1_sysv_ipc.c,v 1.1 1999/05/04 04:59:21 cgd Exp $ */
+
+/*
+ * Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Christopher G. Demetriou
+ * for the NetBSD Project.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/namei.h>
+#include <sys/proc.h>
+#include <sys/file.h>
+#include <sys/mount.h>
+#include <sys/syscallargs.h>
+
+#include <compat/osf1/osf1.h>
+#include <compat/osf1/osf1_syscallargs.h>
+#include <compat/osf1/osf1_cvt.h>
+
+int
+osf1_sys_shmat(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+
+ /* XXX */
+ return (ENOSYS);
+}
+
+int
+osf1_sys_shmctl(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+
+ /* XXX */
+ return (ENOSYS);
+}
+
+int
+osf1_sys_shmdt(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+
+ /* XXX */
+ return (ENOSYS);
+}
+
+int
+osf1_sys_shmget(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+
+ /* XXX */
+ return (ENOSYS);
+}
diff --git a/sys/compat/osf1/osf1_time.c b/sys/compat/osf1/osf1_time.c
new file mode 100644
index 00000000000..813e4f2d8fd
--- /dev/null
+++ b/sys/compat/osf1/osf1_time.c
@@ -0,0 +1,238 @@
+/* $NetBSD: osf1_time.c,v 1.1 1999/05/01 05:25:37 cgd Exp $ */
+
+/*
+ * Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Christopher G. Demetriou
+ * for the NetBSD Project.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/namei.h>
+#include <sys/proc.h>
+#include <sys/file.h>
+#include <sys/mount.h>
+#include <sys/syscallargs.h>
+
+#include <compat/osf1/osf1.h>
+#include <compat/osf1/osf1_syscallargs.h>
+#include <compat/osf1/osf1_cvt.h>
+
+int
+osf1_sys_gettimeofday(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_gettimeofday_args *uap = v;
+ struct sys_gettimeofday_args a;
+ struct osf1_timeval otv;
+ struct osf1_timezone otz;
+ struct timeval tv;
+ struct timezone tz;
+ int error;
+ caddr_t sg;
+
+ sg = stackgap_init(p->p_emul);
+ if (SCARG(uap, tp) == NULL)
+ SCARG(&a, tp) = NULL;
+ else
+ SCARG(&a, tp) = stackgap_alloc(&sg, sizeof tv);
+ if (SCARG(uap, tzp) == NULL)
+ SCARG(&a, tzp) = NULL;
+ else
+ SCARG(&a, tzp) = stackgap_alloc(&sg, sizeof tz);
+
+ error = sys_gettimeofday(p, &a, retval);
+
+ if (error == 0 && SCARG(uap, tp) != NULL) {
+ error = copyin((caddr_t)SCARG(&a, tp),
+ (caddr_t)&tv, sizeof tv);
+ if (error == 0) {
+ memset(&otv, 0, sizeof otv);
+ otv.tv_sec = tv.tv_sec;
+ otv.tv_usec = tv.tv_usec;
+
+ error = copyout((caddr_t)&otv,
+ (caddr_t)SCARG(uap, tp), sizeof otv);
+ }
+ }
+ if (error == 0 && SCARG(uap, tzp) != NULL) {
+ error = copyin((caddr_t)SCARG(&a, tzp),
+ (caddr_t)&tz, sizeof tz);
+ if (error == 0) {
+ memset(&otz, 0, sizeof otz);
+ otz.tz_minuteswest = tz.tz_minuteswest;
+ otz.tz_dsttime = tz.tz_dsttime;
+
+ error = copyout((caddr_t)&otz,
+ (caddr_t)SCARG(uap, tzp), sizeof otz);
+ }
+ }
+ return (error);
+}
+
+int
+osf1_sys_setitimer(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_setitimer_args *uap = v;
+ struct sys_setitimer_args a;
+ struct osf1_itimerval o_itv, o_oitv;
+ struct itimerval b_itv, b_oitv;
+ caddr_t sg;
+ int error;
+
+ switch (SCARG(uap, which)) {
+ case OSF1_ITIMER_REAL:
+ SCARG(&a, which) = ITIMER_REAL;
+ break;
+
+ case OSF1_ITIMER_VIRTUAL:
+ SCARG(&a, which) = ITIMER_VIRTUAL;
+ break;
+
+ case OSF1_ITIMER_PROF:
+ SCARG(&a, which) = ITIMER_PROF;
+ break;
+
+ default:
+ return (EINVAL);
+ }
+
+ sg = stackgap_init(p->p_emul);
+
+ SCARG(&a, itv) = stackgap_alloc(&sg, sizeof b_itv);
+
+ /* get the OSF/1 itimerval argument */
+ error = copyin((caddr_t)SCARG(uap, itv), (caddr_t)&o_itv,
+ sizeof o_itv);
+ if (error == 0) {
+
+ /* fill in and copy out the NetBSD timeval */
+ memset(&b_itv, 0, sizeof b_itv);
+ b_itv.it_interval.tv_sec = o_itv.it_interval.tv_sec;
+ b_itv.it_interval.tv_usec = o_itv.it_interval.tv_usec;
+ b_itv.it_value.tv_sec = o_itv.it_value.tv_sec;
+ b_itv.it_value.tv_usec = o_itv.it_value.tv_usec;
+
+ error = copyout((caddr_t)&b_itv,
+ (caddr_t)SCARG(&a, itv), sizeof b_itv);
+ }
+
+ if (SCARG(uap, oitv) == NULL)
+ SCARG(&a, oitv) = NULL;
+ else
+ SCARG(&a, oitv) = stackgap_alloc(&sg, sizeof b_oitv);
+
+ if (error == 0)
+ error = sys_setitimer(p, &a, retval);
+
+ if (error == 0 && SCARG(uap, oitv) != NULL) {
+ /* get the NetBSD itimerval return value */
+ error = copyin((caddr_t)SCARG(&a, oitv), (caddr_t)&b_oitv,
+ sizeof b_oitv);
+ if (error == 0) {
+
+ /* fill in and copy out the NetBSD timeval */
+ memset(&o_oitv, 0, sizeof o_oitv);
+ o_oitv.it_interval.tv_sec = b_oitv.it_interval.tv_sec;
+ o_oitv.it_interval.tv_usec = b_oitv.it_interval.tv_usec;
+ o_oitv.it_value.tv_sec = b_oitv.it_value.tv_sec;
+ o_oitv.it_value.tv_usec = b_oitv.it_value.tv_usec;
+
+ error = copyout((caddr_t)&o_oitv,
+ (caddr_t)SCARG(uap, oitv), sizeof o_oitv);
+ }
+ }
+
+ return (error);
+}
+
+int
+osf1_sys_settimeofday(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct osf1_sys_settimeofday_args *uap = v;
+ struct sys_settimeofday_args a;
+ struct osf1_timeval otv;
+ struct osf1_timezone otz;
+ struct timeval tv;
+ struct timezone tz;
+ int error;
+ caddr_t sg;
+
+ sg = stackgap_init(p->p_emul);
+ if (SCARG(uap, tv) == NULL)
+ SCARG(&a, tv) = NULL;
+ else {
+ SCARG(&a, tv) = stackgap_alloc(&sg, sizeof tv);
+
+ /* get the OSF/1 timeval argument */
+ error = copyin((caddr_t)SCARG(uap, tv),
+ (caddr_t)&otv, sizeof otv);
+ if (error == 0) {
+
+ /* fill in and copy out the NetBSD timeval */
+ memset(&tv, 0, sizeof tv);
+ tv.tv_sec = otv.tv_sec;
+ tv.tv_usec = otv.tv_usec;
+
+ error = copyout((caddr_t)&tv,
+ (caddr_t)SCARG(&a, tv), sizeof tv);
+ }
+ }
+
+ if (SCARG(uap, tzp) == NULL)
+ SCARG(&a, tzp) = NULL;
+ else {
+ SCARG(&a, tzp) = stackgap_alloc(&sg, sizeof tz);
+
+ /* get the OSF/1 timeval argument */
+ error = copyin((caddr_t)SCARG(uap, tzp),
+ (caddr_t)&otz, sizeof otz);
+ if (error == 0) {
+
+ /* fill in and copy out the NetBSD timezone */
+ memset(&tz, 0, sizeof tz);
+ tz.tz_minuteswest = otz.tz_minuteswest;
+ tz.tz_dsttime = otz.tz_dsttime;
+
+ error = copyout((caddr_t)&tz,
+ (caddr_t)SCARG(&a, tzp), sizeof tz);
+ }
+ }
+
+ if (error == 0)
+ error = sys_settimeofday(p, &a, retval);
+
+ return (error);
+}
diff --git a/sys/compat/osf1/osf1_util.h b/sys/compat/osf1/osf1_util.h
index 87cc309774d..1470b8b7a25 100644
--- a/sys/compat/osf1/osf1_util.h
+++ b/sys/compat/osf1/osf1_util.h
@@ -1,3 +1,17 @@
-/* $OpenBSD: osf1_util.h,v 1.2 1996/08/02 20:35:29 niklas Exp $ */
+/* $OpenBSD: osf1_util.h,v 1.3 2000/08/04 15:47:55 ericj Exp $ */
+/* $NetBSD: osf1_util.h,v 1.4 1999/04/23 05:55:13 cgd Exp $ */
+
+#ifndef _COMPAT_OSF1_OSF1_UTIL_H_
+#define _COMPAT_OSF1_OSF1_UTIL_H_
#include <compat/common/compat_util.h>
+
+extern const char osf1_emul_path[];
+
+#define OSF1_CHECK_ALT_EXIST(p, sgp, path) \
+ CHECK_ALT_EXIST(p, sgp, osf1_emul_path, path)
+
+#define OSF1_CHECK_ALT_CREAT(p, sgp, path) \
+ CHECK_ALT_CREAT(p, sgp, osf1_emul_path, path)
+
+#endif /* _COMPAT_OSF1_OSF1_UTIL_H_ */
diff --git a/sys/compat/osf1/syscalls.conf b/sys/compat/osf1/syscalls.conf
index aa6d4a59c92..51dfa388f60 100644
--- a/sys/compat/osf1/syscalls.conf
+++ b/sys/compat/osf1/syscalls.conf
@@ -1,5 +1,5 @@
-# $OpenBSD: syscalls.conf,v 1.2 1996/08/02 20:35:30 niklas Exp $
-# $NetBSD: syscalls.conf,v 1.1 1995/02/13 21:39:08 cgd Exp $
+# $OpenBSD: syscalls.conf,v 1.3 2000/08/04 15:47:55 ericj Exp $
+# $NetBSD: syscalls.conf,v 1.1 1994/08/21 19:27:06 cgd Exp $
sysnames="osf1_syscalls.c"
sysnumhdr="osf1_syscall.h"
diff --git a/sys/compat/osf1/syscalls.master b/sys/compat/osf1/syscalls.master
index 3b10ea400bb..c91e636465b 100644
--- a/sys/compat/osf1/syscalls.master
+++ b/sys/compat/osf1/syscalls.master
@@ -1,9 +1,9 @@
-; $OpenBSD: syscalls.master,v 1.7 2000/07/21 19:26:39 ericj Exp $
-; $NetBSD: syscalls.master,v 1.2 1995/10/07 06:27:28 mycroft Exp $
+ $OpenBSD: syscalls.master,v 1.8 2000/08/04 15:47:55 ericj Exp $
+; $NetBSD: syscalls.master,v 1.29 1999/05/10 03:33:04 cgd Exp $
; @(#)syscalls.master 8.1 (Berkeley) 7/19/93
-; OpenBSD COMPAT_OSF1 system call name/number "master" file.
+; NetBSD COMPAT_OSF1 system call name/number "master" file.
; (See syscalls.conf to see what it is processed into.)
;
; Fields: number type [type-dependent ...]
@@ -30,7 +30,7 @@
; [comment]
;
; #ifdef's, etc. may be included, and are copied to the output files.
-; #include's are copied to the syscall switch definition file only.
+; #include's are copied to the syscall names and switch definition files only.
#include <sys/param.h>
#include <sys/systm.h>
@@ -39,46 +39,52 @@
#include <sys/poll.h>
#include <sys/syscallargs.h>
+#include <compat/osf1/osf1.h>
#include <compat/osf1/osf1_syscallargs.h>
0 NOARGS { int sys_nosys(void); } syscall
1 NOARGS { int sys_exit(int rval); }
2 NOARGS { int sys_fork(void); }
3 NOARGS { int sys_read(int fd, char *buf, u_int nbyte); }
-4 NOARGS { int sys_write(int fd, char *buf, u_int nbyte); }
+4 NOARGS { int sys_write(int fd, const char *buf, \
+ u_int nbyte); }
5 UNIMPL old open
6 NOARGS { int sys_close(int fd); }
-7 NOARGS { int sys_wait4(int pid, int *status, int options, \
- struct rusage *rusage); }
+7 STD { int osf1_sys_wait4(int pid, int *status, \
+ int options, struct osf1_rusage *rusage); }
8 UNIMPL old creat
-9 NOARGS { int sys_link(char *path, char *link); }
-10 NOARGS { int sys_unlink(char *path); }
+9 NOARGS { int sys_link(const char *path, const char *link); }
+10 NOARGS { int sys_unlink(const char *path); }
11 UNIMPL execv
-12 NOARGS { int sys_chdir(char *path); }
+12 NOARGS { int sys_chdir(const char *path); }
13 NOARGS { int sys_fchdir(int fd); }
-14 STD { int osf1_sys_mknod(char *path, int mode, int dev); }
-15 NOARGS { int sys_chmod(char *path, int mode); }
-16 NOARGS { int sys_chown(char *path, int uid, int gid); }
+14 STD { int osf1_sys_mknod(char *path, int mode, \
+ int dev); }
+15 NOARGS { int sys_chmod(const char *path, int mode); }
+16 NOARGS { int sys_chown(const char *path, int uid, \
+ int gid); }
17 NOARGS { int sys_obreak(char *nsize); }
18 STD { int osf1_sys_getfsstat(struct osf1_statfs *buf, \
long bufsize, int flags); }
19 STD { off_t osf1_sys_lseek(int fd, off_t offset, \
int whence); }
20 NOARGS { pid_t sys_getpid(void); }
-21 STD { int osf1_sys_mount(int type, char *path, int flags, \
- caddr_t data); }
-22 STD { int osf1_sys_unmount(char *path, int flags); }
+21 STD { int osf1_sys_mount(int type, const char *path, \
+ int flags, caddr_t data); }
+22 STD { int osf1_sys_unmount(const char *path, int flags); }
23 STD { int osf1_sys_setuid(uid_t uid); }
24 NOARGS { uid_t sys_getuid(void); }
25 UNIMPL exec_with_loader
26 UNIMPL ptrace
-27 UNIMPL recvmsg
-28 UNIMPL sendmsg
+27 STD { int osf1_sys_recvmsg_xopen(int s, \
+ struct osf1_msghdr_xopen *msg, int flags); }
+28 STD { int osf1_sys_sendmsg_xopen(int s, \
+ const struct osf1_msghdr_xopen *msg, int flags); }
29 UNIMPL recvfrom
30 UNIMPL accept
31 UNIMPL getpeername
32 UNIMPL getsockname
-33 NOARGS { int sys_access(char *path, int flags); }
+33 STD { int osf1_sys_access(char *path, int flags); }
34 UNIMPL chflags
35 UNIMPL fchflags
36 NOARGS { int sys_sync(void); }
@@ -87,33 +93,41 @@
39 NOARGS { int sys_setpgid(int pid, int pgid); }
40 UNIMPL old lstat
41 NOARGS { int sys_dup(u_int fd); }
-42 NOARGS { int sys_opipe(void); }
-43 UNIMPL set_program_attributes
+42 NOARGS { int sys_pipe(void); }
+43 STD { int osf1_sys_set_program_attributes( \
+ caddr_t taddr, unsigned long tsize, \
+ caddr_t daddr, unsigned long dsize); }
44 UNIMPL profil
-45 STD { int osf1_sys_open(char *path, int flags, int mode); }
+45 STD { int osf1_sys_open(char *path, int flags, \
+ int mode); }
46 OBSOL sigaction
47 NOARGS { gid_t sys_getgid(void); }
+; XXX
48 NOARGS { int sys_sigprocmask(int how, sigset_t mask); }
49 NOARGS { int sys_getlogin(char *namebuf, u_int namelen); }
-50 NOARGS { int sys_setlogin(char *namebuf); }
-51 NOARGS { int sys_acct(char *path); }
+50 NOARGS { int sys_setlogin(const char *namebuf); }
+51 NOARGS { int sys_acct(const char *path); }
52 UNIMPL sigpending
-53 UNIMPL
+53 STD { int osf1_sys_classcntl(int opcode, int arg1, \
+ int arg2, int arg3); }
54 STD { int osf1_sys_ioctl(int fd, int com, caddr_t data); }
55 STD { int osf1_sys_reboot(int opt); }
-56 NOARGS { int sys_revoke(char *path); }
-57 NOARGS { int sys_symlink(char *path, char *link); }
-58 NOARGS { int sys_readlink(char *path, char *buf, int count); }
-59 STD { int osf1_sys_execve(char *path, char **argp, \
- char **envp); }
+56 NOARGS { int sys_revoke(const char *path); }
+57 NOARGS { int sys_symlink(const char *path, \
+ const char *link); }
+58 NOARGS { int sys_readlink(const char *path, char *buf, \
+ int count); }
+59 STD { int osf1_sys_execve(char *path, \
+ char * const *argp, char * const *envp); }
60 NOARGS { int sys_umask(int newmask); }
-61 NOARGS { int sys_chroot(char *path); }
+61 NOARGS { int sys_chroot(const char *path); }
62 UNIMPL old fstat
63 NOARGS { int sys_getpgrp(void); }
64 NOARGS { int compat_43_sys_getpagesize(void); }
65 UNIMPL mremap
66 NOARGS { int sys_vfork(void); }
-67 STD { int osf1_sys_stat(char *path, struct osf1_stat *ub); }
+67 STD { int osf1_sys_stat(char *path, \
+ struct osf1_stat *ub); }
68 STD { int osf1_sys_lstat(char *path, \
struct osf1_stat *ub); }
69 UNIMPL sbrk
@@ -122,9 +136,10 @@
int prot, int flags, int fd, off_t pos); }
72 UNIMPL ovadvise
73 NOARGS { int sys_munmap(caddr_t addr, size_t len); }
-74 UNIMPL mprotect
-; XXX
-75 STD { int osf1_sys_madvise(void); }
+74 STD { int osf1_sys_mprotect(void *addr, size_t len, \
+ int prot); }
+75 STD { int osf1_sys_madvise(void *addr, size_t len, \
+ int behav); }
76 UNIMPL old vhangup
77 UNIMPL kmodcall
78 UNIMPL mincore
@@ -133,23 +148,25 @@
81 UNIMPL old getpgrp
; OSF/1 setpgrp(); identical in function to setpgid(). XXX
82 NOARGS { int sys_setpgid(int pid, int pgid); } setpgrp
-83 NOARGS { int sys_setitimer(u_int which, \
- struct itimerval *itv, struct itimerval *oitv); }
+83 STD { int osf1_sys_setitimer(u_int which, \
+ struct osf1_itimerval *itv, \
+ struct osf1_itimerval *oitv); }
84 UNIMPL old wait
85 UNIMPL table
86 UNIMPL getitimer
87 NOARGS { int compat_43_sys_gethostname(char *hostname, \
u_int len); }
-88 NOARGS { int compat_43_sys_sethostname(char *hostname, \
+88 NOARGS { int compat_43_sys_sethostname(const char *hostname, \
u_int len); }
89 NOARGS { int compat_43_sys_getdtablesize(void); }
90 NOARGS { int sys_dup2(u_int from, u_int to); }
91 STD { int osf1_sys_fstat(int fd, void *sb); }
92 STD { int osf1_sys_fcntl(int fd, int cmd, void *arg); }
-93 NOARGS { int sys_select(u_int nd, fd_set *in, fd_set *ou, \
- fd_set *ex, struct timeval *tv); }
-94 STD { int osf1_sys_poll(struct pollfd *fds, \
- unsigned int nfds, int timeout); }
+93 STD { int osf1_sys_select(u_int nd, fd_set *in, \
+ fd_set *ou, fd_set *ex, struct osf1_timeval *tv); }
+; maybe XXX
+94 NOARGS { int sys_poll(struct pollfd *fds, u_int nfds, \
+ int timeout); }
95 NOARGS { int sys_fsync(int fd); }
96 NOARGS { int sys_setpriority(int which, int who, int prio); }
97 STD { int osf1_sys_socket(int domain, int type, \
@@ -165,7 +182,7 @@
103 NOARGS { int sys_sigreturn(struct sigcontext *sigcntxp); }
104 NOARGS { int sys_bind(int s, caddr_t name, int namelen); }
105 NOARGS { int sys_setsockopt(int s, int level, int name, \
- caddr_t val, int valsize); }
+ caddr_t val, int valsize); }
106 NOARGS { int sys_listen(int s, int backlog); }
107 UNIMPL plock
108 UNIMPL old sigvec
@@ -176,20 +193,21 @@
struct sigstack *oss); }
113 UNIMPL old recvmsg
114 UNIMPL old sendmsg
-115 UNIMPL vtrace
-116 NOARGS { int sys_gettimeofday(struct timeval *tp, \
- struct timezone *tzp); }
+115 OBSOL vtrace
+116 STD { int osf1_sys_gettimeofday(struct osf1_timeval *tp, \
+ struct osf1_timezone *tzp); }
+117 STD { int osf1_sys_getrusage(int who, \
+ struct osf1_rusage *rusage); }
; XXX
-117 STD { int osf1_sys_getrusage(void); }
118 NOARGS { int sys_getsockopt(int s, int level, int name, \
- caddr_t val, int *avalsize); }
+ caddr_t val, int *avalsize); }
119 UNIMPL
-120 STD { int osf1_sys_readv(int fd, struct osf1_iovec *iovp, \
- u_int iovcnt); }
-121 STD { int osf1_sys_writev(int fd, struct osf1_iovec *iovp, \
- u_int iovcnt); }
-122 NOARGS { int sys_settimeofday(struct timeval *tv, \
- struct timezone *tzp); }
+120 STD { int osf1_sys_readv(int fd, \
+ struct osf1_iovec *iovp, u_int iovcnt); }
+121 STD { int osf1_sys_writev(int fd, \
+ struct osf1_iovec *iovp, u_int iovcnt); }
+122 STD { int osf1_sys_settimeofday(struct osf1_timeval *tv, \
+ struct osf1_timezone *tzp); }
123 NOARGS { int sys_fchown(int fd, int uid, int gid); }
124 NOARGS { int sys_fchmod(int fd, int mode); }
125 NOARGS { int compat_43_sys_recvfrom(int s, caddr_t buf, \
@@ -197,54 +215,63 @@
int *fromlenaddr); }
126 UNIMPL setreuid
127 UNIMPL setregid
-128 NOARGS { int sys_rename(char *from, char *to); }
-129 STD { int osf1_sys_truncate(char *path, off_t length); }
+128 NOARGS { int sys_rename(const char *from, \
+ const char *to); }
+129 STD { int osf1_sys_truncate(char *path, \
+ off_t length); }
130 STD { int osf1_sys_ftruncate(int fd, off_t length); }
131 UNIMPL flock
132 STD { int osf1_sys_setgid(gid_t gid); }
-133 STD { int osf1_sys_sendto(int s, const void *buf, \
- size_t len, int flags, const struct sockaddr *to, \
- int tolen); }
+133 STD { int osf1_sys_sendto(int s, caddr_t buf, size_t len, \
+ int flags, struct sockaddr *to, int tolen); }
134 NOARGS { int sys_shutdown(int s, int how); }
-135 UNIMPL socketpair
-136 NOARGS { int sys_mkdir(char *path, int mode); }
-137 NOARGS { int sys_rmdir(char *path); }
-138 NOARGS { int sys_utimes(char *path, struct timeval *tptr); }
+135 STD { int osf1_sys_socketpair(int domain, int type, \
+ int protocol, int *rsv); }
+136 NOARGS { int sys_mkdir(const char *path, int mode); }
+137 NOARGS { int sys_rmdir(const char *path); }
+138 STD { int osf1_sys_utimes(char *path, \
+ const struct osf1_timeval *tptr); }
139 OBSOL 4.2 sigreturn
140 UNIMPL adjtime
-141 UNIMPL old getpeername
+141 NOARGS { int compat_43_sys_getpeername(int fdes, \
+ caddr_t asa, int *alen); }
142 NOARGS { int32_t compat_43_sys_gethostid(void); }
143 NOARGS { int compat_43_sys_sethostid(int32_t hostid); }
+; XXX
144 STD { int osf1_sys_getrlimit(u_int which, \
struct rlimit *rlp); }
+; XXX
145 STD { int osf1_sys_setrlimit(u_int which, \
struct rlimit *rlp); }
146 UNIMPL old killpg
147 NOARGS { int sys_setsid(void); }
148 UNIMPL quotactl
149 NOARGS { int compat_43_sys_quota(void); }
-150 UNIMPL old getsockname
-151 UNIMPL
-152 UNIMPL
-153 UNIMPL
-154 UNIMPL
-155 UNIMPL
+150 NOARGS { int compat_43_sys_getsockname(int fdec, \
+ caddr_t asa, int *alen); }
+151 UNIMPL pread
+152 UNIMPL pwrite
+153 UNIMPL pid_block
+154 UNIMPL pid_unblock
+155 UNIMPL signal_urti
156 STD { int osf1_sys_sigaction(int signum, \
struct osf1_sigaction *nsa, \
struct osf1_sigaction *osa); }
-157 UNIMPL
+157 UNIMPL sigwaitprim
158 UNIMPL nfssvc
159 NOARGS { int compat_43_sys_getdirentries(int fd, char *buf, \
u_int count, long *basep); }
-160 STD { int osf1_sys_statfs(char *path, \
+160 STD { int osf1_sys_statfs(const char *path, \
struct osf1_statfs *buf, int len); }
-161 STD { int osf1_sys_fstatfs(int fd, \
+161 STD { int osf1_sys_fstatfs(int fd, \
struct osf1_statfs *buf, int len); }
162 UNIMPL
163 UNIMPL async_daemon
164 UNIMPL getfh
-165 UNIMPL getdomainname
-166 UNIMPL setdomainname
+165 NOARGS { int compat_09_sys_getdomainname(char *domainname, \
+ int len); }
+166 NOARGS { int compat_09_sys_setdomainname(char *domainname, \
+ int len); }
167 UNIMPL
168 UNIMPL
169 UNIMPL exportfs
@@ -285,12 +312,16 @@
204 UNIMPL semctl
205 UNIMPL semget
206 UNIMPL semop
-207 UNIMPL uname
-208 NOARGS { int sys_lchown(char *path, int uid, int gid); }
-209 UNIMPL shmat
-210 UNIMPL shmctl
-211 UNIMPL shmdt
-212 UNIMPL shmget
+207 STD { int osf1_sys_uname(struct osf1_uname *name); }
+208 NOARGS { int sys_lchown(const char *path, int uid, \
+ int gid); }
+209 STD { void *osf1_sys_shmat(int shmid, \
+ const void *shmaddr, int shmflg); }
+210 STD { int osf1_sys_shmctl(int shmid, int cmd, \
+ struct osf1_shmid_ds *buf); }
+211 STD { int osf1_sys_shmdt(const void *shmaddr); }
+212 STD { int osf1_sys_shmget(osf1_key_t key, size_t size, \
+ int flags); }
213 UNIMPL mvalid
214 UNIMPL getaddressconf
215 UNIMPL msleep
@@ -312,33 +343,36 @@
231 UNIMPL
232 UNIMPL
233 UNIMPL getpgid
-234 STD { pid_t osf1_sys_getsid(pid_t pid); }
-235 STD { int osf1_sys_sigaltstack(struct osf1_sigaltstack *nss, \
+234 NOARGS { pid_t sys_getsid(pid_t pid); }
+235 STD { int osf1_sys_sigaltstack( \
+ struct osf1_sigaltstack *nss, \
struct osf1_sigaltstack *oss); }
236 UNIMPL waitid
237 UNIMPL priocntlset
238 UNIMPL sigsendset
-239 UNIMPL
+239 UNIMPL set_speculative
240 UNIMPL msfs_syscall
-241 UNIMPL sysinfo
+241 STD { int osf1_sys_sysinfo(int cmd, char *buf, long len); }
242 UNIMPL uadmin
243 UNIMPL fuser
-244 UNIMPL
-245 UNIMPL
-246 UNIMPL
-247 UNIMPL
-248 UNIMPL
+244 UNIMPL proplist_syscall
+245 UNIMPL ntp_adjtime
+246 UNIMPL ntp_gettime
+247 STD { long osf1_sys_pathconf(char *path, int name); }
+248 STD { long osf1_sys_fpathconf(int fd, int name); }
249 UNIMPL
250 UNIMPL uswitch
-251 STD { int osf1_sys_usleep_thread(struct timeval *sleep, \
- struct timeval *slept); }
+251 STD { int osf1_sys_usleep_thread( \
+ struct osf1_timeval *sleep, \
+ struct osf1_timeval *slept); }
252 UNIMPL audcntl
253 UNIMPL audgen
254 UNIMPL sysfs
-255 UNIMPL
+255 UNIMPL subsys_info
256 UNIMPL getsysinfo
257 STD { int osf1_sys_setsysinfo(u_long op, caddr_t buffer, \
u_long nbytes, caddr_t arg, u_long flag); }
258 UNIMPL afs_syscall
259 UNIMPL swapctl
260 UNIMPL memcntl
+261 UNIMPL fdatasync