/* $NetBSD: osf1.h,v 1.27 2005/12/11 12:20:23 christos 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 u_int64_t	osf1_blksize_t;
typedef u_int64_t	osf1_blkcnt_t;

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) */

struct osf1_sigaction {
	osf1_fcn_ptr	osf1_sa_handler;
	osf1_sigset_t	osf1_sa_mask;
	osf1_int	osf1_sa_flags;
	osf1_int	osf1_sa_signo;
};

/* 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;
};

struct osf1_stat2 {
	osf1_dev_t	st_dev;
	osf1_int	st_dead1;	/* was st_ino */
	osf1_mode_t	st_mode;
	osf1_nlink_t	st_nlink;
	osf1_short	st_dead2;	/* something to do with nlink? */
	osf1_uid_t	st_uid;
	osf1_gid_t	st_gid;
	osf1_dev_t	st_rdev;
	osf1_dev_t	st_rdev2;
	osf1_off_t	st_size;
	osf1_time_t	st_dead3;
	osf1_int	st_uatime;
	osf1_time_t	st_dead4;
	osf1_int	st_umtime;
	osf1_time_t	st_dead5;
	osf1_int	st_uctime;
	osf1_int	st_dead6;
	osf1_int	st_dead7;
	osf1_uint_t	st_flags;
	osf1_uint_t	st_generation;
	osf1_long	st_unused1[4];
	osf1_ino_t	st_ino;
	osf1_int	st_unused;
	osf1_time_t	st_atime_sec;
	osf1_int	st_unused2;
	osf1_time_t	st_mtime_sec;
	osf1_int	st_unused3;
	osf1_time_t	st_ctime_sec;
	osf1_int	st_unused4;
	osf1_blksize_t	st_blocksize;
	osf1_blkcnt_t	st_blocks;
};

/* 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 */


/* for set/get sysinfo */

struct	osf1_cpu_info {
	int		current_cpu;
	int     	cpus_in_box;
	int		cpu_type;
	int		ncpus;
	u_int64_t	cpus_present;
	u_int64_t 	cpus_running;
	u_int64_t	cpu_binding;
	u_int64_t	cpu_ex_binding;
	int  		mhz;
	int  		unused[3];
};

#define	OSF_SET_IEEE_FP_CONTROL  14

#define OSF_GET_MAX_UPROCS      2
#define OSF_GET_PHYSMEM         19
#define OSF_GET_MAX_CPU         30
#define OSF_GET_IEEE_FP_CONTROL 45
#define OSF_GET_CPUS_IN_BOX     55
#define OSF_GET_CPU_INFO        59
#define OSF_GET_PROC_TYPE       60
#define OSF_GET_HWRPB           101
#define OSF_GET_PLATFORM_NAME   103

#endif /* _COMPAT_OSF1_OSF1_H_ */
