e5a8a9b897
systems running a BSD-ish server. No dynamically linked executable support (it requires weird execve() hacks...), nor any Mach trap support. But it ran lots of statically linked binaries well enough for me to get bootstrapped.
161 lines
5.9 KiB
Plaintext
161 lines
5.9 KiB
Plaintext
$NetBSD: README.syscalls,v 1.1 1995/02/13 21:39:03 cgd Exp $
|
|
|
|
Once the new syscall argument-handling method was implemented, most
|
|
OSF/1 syscalls boiled down to their NetBSD equivalents. The
|
|
differences are detailed in this file.
|
|
|
|
Note that some OSF/1 syscalls, including some of those that map
|
|
directly to equivalent NetBSD syscalls, are not implemented; they
|
|
were not needed, so the effort to implement and check them was not
|
|
expended.
|
|
|
|
Finally, there are some OSF/1 syscalls which were left unimplemented,
|
|
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
|
|
sigreturn(), as well.
|
|
|
|
The system calls are split out among the three files:
|
|
osf1_ioctl.c
|
|
osf1_misc.c
|
|
osf1_mount.c
|
|
as follows:
|
|
osf1_ioctl.c contains all osf1_ioctl() handling code.
|
|
osf1_mount.c contains all code dealing with mounting and
|
|
unmounting file systems, and with mount points in
|
|
general (e.g. osf1_getfsstat()).
|
|
osf1_misc.c contains the rest of the emulation functions.
|
|
|
|
The emulation functions as follows:
|
|
|
|
osf1_mknod()
|
|
dev_t's are different between OSF/1 and NetBSD. In OSF/1 a
|
|
dev_t has 12 bits of major number and 20 bits of minor number.
|
|
Under NetBSD, it's 24 bits of major, 8 bits of minor (but the
|
|
top 16 bits of the major number are unused, and may be
|
|
rearranged later). In any case, it was decided that the
|
|
primary use for OSF/1 binaries would be to complement native
|
|
NetBSD binaries, so file system dev_t's are assumed to be in
|
|
the NetBSD format, and osf1_mknod() translates from the OSF/1
|
|
format to the NetBSD format.
|
|
|
|
osf1_getfsstat()
|
|
The statfs structure is different between NetBSD and OSF/1,
|
|
and the way file system types are denoted is different, as
|
|
well. This routine is the same as getfsstat(), except it
|
|
converts the statfs structures before returning them to the
|
|
OSF/1 process.
|
|
|
|
osf1_lseek()
|
|
To compensate for quad alignment on 32-bit machines, the
|
|
NetBSD lseek() needs an extra argument of padding, before the
|
|
off_t 'offset' argument. This wrapper inserts the padding,
|
|
and calls the NetBSD routine.
|
|
|
|
osf1_mount()
|
|
The file system type specification and the way you specify
|
|
mount options differs substantially between NetBSD and OSF/1.
|
|
This routine (and its callees) fakes up NetBSD arguments, and
|
|
calls the NetBSD routine.
|
|
|
|
osf1_unmount()
|
|
Probably not necessary, but safe; translates flags, in case
|
|
the NetBSD unmount flags ever change.
|
|
|
|
osf1_exec_with_loader() [UNIMPLEMENTED]
|
|
From the description in the OSF/1 manual page, this executes a
|
|
file with a named loader, or "/sbin/loader" if none is named.
|
|
It appears to be used in some way, when executing dynamically
|
|
linked binaries, but is _not_ called directly from user space
|
|
in the normal case. The interface by which it passes the name
|
|
of the file to be executed, its arguments, etc., to the loader
|
|
is unspecified, and, from experimental evidence, doesn't seem
|
|
to be the normal UN*X argument-passing convention (i.e.
|
|
argc/argv). For proper dynamically linked binary support,
|
|
this function will probably have to be implemented, but it's
|
|
unclear how that can be done (short of disassembling a lot of
|
|
code).
|
|
|
|
osf1_open()
|
|
Translates OSF/1 flags to NetBSD flags.
|
|
|
|
osf1_ioctl()
|
|
Screens out ioctl requests that aren't known to work, and
|
|
translates those that differ between NetBSD and OSF/1.
|
|
|
|
osf1_reboot()
|
|
Translates OSF/1 flags to NetBSD flags.
|
|
|
|
osf1_stat()
|
|
The stat structure differs between NetBSD and OSF/1, both in
|
|
terms of field sizes, and in the dev_t representation.
|
|
This does a NetBSD stat(), translates the results, and returns
|
|
them to the OSF/1 process.
|
|
|
|
osf1_lstat()
|
|
Same as osf1_stat(), but for lstat().
|
|
|
|
osf1_mmap()
|
|
The NetBSD version needs 4 bytes of padding before the off_t
|
|
'pos' argument, and also uses different flags than the OSF/1
|
|
version. This wrapper translates the flags and deals with the
|
|
argument struct padding differences, then calls the NetBSD
|
|
routine.
|
|
|
|
osf1_fstat()
|
|
Same as osf1_stat(), but for fstat().
|
|
|
|
osf1_fcntl()
|
|
Translates OSF/1 fcntl() requests into their NetBSD
|
|
counterparts, then calls the NetBSD fcntl() to do the
|
|
operations.
|
|
|
|
osf1_socket()
|
|
Makes sure that the socket type is valid for NetBSD, and if
|
|
so, calls NetBSD's socket().
|
|
|
|
osf1_sendto()
|
|
Makes sure that the 'flags' argument doesn't use flags that
|
|
NetBSD can't handle, and calls NetBSD's sendto().
|
|
|
|
osf1_getrlimit()
|
|
Makes sure that the 'which' selector is one that NetBSD can
|
|
deal with, and calls NetBSD's getrlimit().
|
|
|
|
osf1_setrlimit()
|
|
Same as osf1_getrlimit(), but for setrlimit().
|
|
|
|
osf1_sigaction()
|
|
Deals with the differences in the NetBSD and OSF/1 sigaction
|
|
structures, and calls NetBSD's sigaction with the appropriate
|
|
arguments. If the call requests that the old sigaction be
|
|
passed back, osf1_sigaction() translates it back to the OSF/1
|
|
form, and returns it appropriately.
|
|
|
|
osf1_statfs()
|
|
Does that statfs() on the given pathname, then translates the
|
|
NetBSD statfs structure into the one that OSF/1 uses and
|
|
returns it. Makes a best effort on the mount type, because
|
|
there's not a one-to-one mapping between NetBSD and OSF/1
|
|
mount types.
|
|
|
|
osf1_fstatfs()
|
|
Same as osf1_statfs(), but for fstatfs().
|
|
|
|
osf1_usleep_thread()
|
|
This function is how sleep() and usleep() (and possibly other
|
|
functions) are implemented in OSF/1. Its usage was discovered
|
|
by disassembling the library routines that use it. It takes
|
|
two pointers to timeval structures as arguments. The first
|
|
contains the amount of time (in seconds and microseconds) to
|
|
sleep. If the second pointer is non-null, if the process
|
|
wakes up early, the amount of time "unslept" is returned. If
|
|
the process doesn't wake up early, zero is returned.
|
|
|
|
osf1_setsysinfo()
|
|
A null-op; used early on, but nothing cares that it actually
|
|
does anything.
|