freebsd-skq/sys/alpha/osf1/osf1.h
gallatin 1b39d5d377 Finally add the Alpha OSF/1 compat code. I will add it to the
sys/modules Makefile after completing a buildworld.

History:

The bulk of this code was obtained from NetBSD approximately one year
ago (I have taken care to preserve the original NetBSD copyrights and
I thank the authors for their work.) At that time, the OSF/1 code was
what was left over from their initial bootstrapping off of OSF/1 and
did not provide support for executing shared binaries.

I have independently added support for shared libraries, and support
for some of the more obscure system calls.  This code has been
available for testing and comment since January of 1999 and running on
production machines here at Duke since April.

Known working applications include:

- Netscape (all versions I've tried)
- Mathematica 3.0.2
- Splus 3.4
- ArcInfo 7.1
- Matlab (version unknown)
- SimOS
- Atom instrumented binaries (built on a real OSF/1 system)

Applications which are known not to work:

- All applications linking to libmach
- Adobe Acrobat  (uses libmach)

This has been tested with applications running against shared
libraries from OSF/1 (aka Tru64) 4.0D and 4.0F.

Reviewed by: marcel, obrien
BDE-lint by: obrien
Agreed in principal to by: msmith
1999-12-14 22:35:36 +00:00

275 lines
8.2 KiB
C

/*
* Copyright (c) 1998-1999 Andrew Gallatin
*
* 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
* in this position and unchanged.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software withough 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.
*
* $FreeBSD$
*/
extern struct sysent osf1_sysent[];
extern int bsd_to_osf1_sig[];
extern int bsd_to_osf1_errno[];
/* osf/1 ioctls */
#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)
/* for get/set sysinfo */
#define OSF_SET_IEEE_FP_CONTROL 14
#define OSF_GET_IEEE_FP_CONTROL 45
#define OSF_GET_PROC_TYPE 60
#define OSF_GET_HWRPB 101
/* for rlimit */
#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 */
/* mmap flags */
#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
/* msync flags */
#define OSF1_MS_ASYNC 1
#define OSF1_MS_SYNC 2
#define OSF1_MS_INVALIDATE 4
#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_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
#define OSF1_FNONBLOCK 0x00004 /* XXX OSF1_O_NONBLOCK */
#define OSF1_FAPPEND 0x00008 /* XXX OSF1_O_APPEND */
#define OSF1_FDEFER 0x00020
#define OSF1_FASYNC 0x00040
#define OSF1_FCREAT 0x00200
#define OSF1_FTRUNC 0x00400
#define OSF1_FEXCL 0x00800
#define OSF1_FSYNC 0x04000 /* XXX OSF1_O_SYNC */
#define OSF1_FNDELAY 0x08000
#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 */
/*
* osf/1 uses ints in its struct timeval, this means that
* any syscalls which means that any system calls using
* timevals need to be intercepted.
*/
struct osf1_timeval {
int tv_sec; /* seconds */
int tv_usec; /* microseconds */
};
struct osf1_itimerval {
struct osf1_timeval it_interval; /* timer interval */
struct osf1_timeval it_value; /* current value */
};
#define TV_CP(src,dst) {dst.tv_usec = src.tv_usec; dst.tv_sec = src.tv_sec;}
#define timersub(tvp, uvp, vvp) \
do { \
(vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \
(vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \
if ((vvp)->tv_usec < 0) { \
(vvp)->tv_sec--; \
(vvp)->tv_usec += 1000000; \
} \
} while (0)
struct osf1_rusage {
struct osf1_timeval ru_utime; /* user time used */
struct osf1_timeval ru_stime; /* system time used */
long ru_maxrss; /* max resident set size */
#define ru_first ru_ixrss
long ru_ixrss; /* integral shared memory size */
long ru_idrss; /* integral unshared data " */
long ru_isrss; /* integral unshared stack " */
long ru_minflt; /* page reclaims */
long ru_majflt; /* page faults */
long ru_nswap; /* swaps */
long ru_inblock; /* block input operations */
long ru_oublock; /* block output operations */
long ru_msgsnd; /* messages sent */
long ru_msgrcv; /* messages received */
long ru_nsignals; /* signals received */
long ru_nvcsw; /* voluntary context switches */
long ru_nivcsw; /* involuntary " */
#define ru_last ru_nivcsw
};
#define OSF1_USC_GET 1
#define OSF1_USC_SET 2
#define OSF1_USW_NULLP 0x100
/* 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_MAXTYPE OSF1_MOUNT_ADDON
#define OSF1_MNT_WAIT 0x1
#define OSF1_MNT_NOWAIT 0x2
#define OSF1_MNT_FORCE 0x1
#define OSF1_MNT_NOFORCE 0x2
/* acceptable flags for various calls */
#define OSF1_GETFSSTAT_FLAGS (OSF1_MNT_WAIT|OSF1_MNT_NOWAIT)
#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;
void *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)
#define memset(x,y,z) bzero((x),(z))