19313Ssos/*-
2230132Suqs * Copyright (c) 1994-1996 S��ren Schmidt
39313Ssos * All rights reserved.
49313Ssos *
59313Ssos * Redistribution and use in source and binary forms, with or without
69313Ssos * modification, are permitted provided that the following conditions
79313Ssos * are met:
89313Ssos * 1. Redistributions of source code must retain the above copyright
9167157Sjkim *    notice, this list of conditions and the following disclaimer
109313Ssos *    in this position and unchanged.
119313Ssos * 2. Redistributions in binary form must reproduce the above copyright
129313Ssos *    notice, this list of conditions and the following disclaimer in the
139313Ssos *    documentation and/or other materials provided with the distribution.
149313Ssos * 3. The name of the author may not be used to endorse or promote products
1513765Smpp *    derived from this software without specific prior written permission
169313Ssos *
179313Ssos * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
189313Ssos * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
199313Ssos * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
209313Ssos * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
219313Ssos * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
229313Ssos * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
239313Ssos * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
249313Ssos * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
259313Ssos * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
269313Ssos * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
279313Ssos *
2850477Speter * $FreeBSD$
299313Ssos */
309313Ssos
31167157Sjkim#ifndef _I386_LINUX_H_
32167157Sjkim#define	_I386_LINUX_H_
339313Ssos
34167157Sjkim#include <sys/signal.h>	/* for sigval union */
3567234Sgallatin
36293575Sdchagin#include <compat/linux/linux.h>
3768583Smarcel#include <i386/linux/linux_syscall.h>
3818946Sbde
3972543Sjlemon/*
4072543Sjlemon * debugging support
4172543Sjlemon */
4283221Smarcelextern u_char linux_debug_map[];
43167157Sjkim#define	ldebug(name)	isclr(linux_debug_map, LINUX_SYS_linux_ ## name)
44293477Sdchagin#define	ARGS(nm, fmt)	"linux(%ld/%ld): "#nm"("fmt")\n",			\
45293477Sdchagin			(long)td->td_proc->p_pid, (long)td->td_tid
46293477Sdchagin#define	LMSG(fmt)	"linux(%ld/%ld): "fmt"\n",				\
47293477Sdchagin			(long)td->td_proc->p_pid, (long)td->td_tid
48235063Snetchild#define	LINUX_DTRACE	linuxulator
4972543Sjlemon
50219609Sdchagin#define	LINUX_SHAREDPAGE	(VM_MAXUSER_ADDRESS - PAGE_SIZE)
51219609Sdchagin#define	LINUX_USRSTACK		LINUX_SHAREDPAGE
52219609Sdchagin
53133815Stjr#define	PTRIN(v)	(void *)(v)
54133815Stjr#define	PTROUT(v)	(l_uintptr_t)(v)
55133815Stjr
56272020Sbz#define	CP(src,dst,fld) do { (dst).fld = (src).fld; } while (0)
57272020Sbz#define	CP2(src,dst,sfld,dfld) do { (dst).dfld = (src).sfld; } while (0)
58272020Sbz#define	PTRIN_CP(src,dst,fld) \
59272020Sbz	do { (dst).fld = PTRIN((src).fld); } while (0)
60272020Sbz
6154122Smarcel/*
6293842Seric * Provide a separate set of types for the Linux types.
6383221Smarcel */
6483221Smarceltypedef int		l_int;
6583221Smarceltypedef int32_t		l_long;
6683221Smarceltypedef int64_t		l_longlong;
6783221Smarceltypedef short		l_short;
6883221Smarceltypedef unsigned int	l_uint;
6983221Smarceltypedef uint32_t	l_ulong;
7083221Smarceltypedef uint64_t	l_ulonglong;
7183221Smarceltypedef unsigned short	l_ushort;
7283221Smarcel
7383221Smarceltypedef char		*l_caddr_t;
74133815Stjrtypedef l_ulong		l_uintptr_t;
7583221Smarceltypedef l_long		l_clock_t;
7683221Smarceltypedef l_int		l_daddr_t;
7783221Smarceltypedef l_ushort	l_dev_t;
7883221Smarceltypedef l_uint		l_gid_t;
7983221Smarceltypedef l_ushort	l_gid16_t;
8083221Smarceltypedef l_ulong		l_ino_t;
8183221Smarceltypedef l_int		l_key_t;
8283221Smarceltypedef l_longlong	l_loff_t;
8383221Smarceltypedef l_ushort	l_mode_t;
8483221Smarceltypedef l_long		l_off_t;
8583221Smarceltypedef l_int		l_pid_t;
8683221Smarceltypedef l_uint		l_size_t;
8783221Smarceltypedef l_long		l_suseconds_t;
8883221Smarceltypedef l_long		l_time_t;
8983221Smarceltypedef l_uint		l_uid_t;
9083221Smarceltypedef l_ushort	l_uid16_t;
91184058Skibtypedef l_int		l_timer_t;
92184058Skibtypedef l_int		l_mqd_t;
93293548Sdchagintypedef	l_ulong		l_fd_mask;
9483221Smarcel
9583221Smarceltypedef struct {
9683221Smarcel	l_int		val[2];
9783221Smarcel} l_fsid_t;
9883221Smarcel
9983221Smarceltypedef struct {
10083221Smarcel	l_time_t	tv_sec;
10183221Smarcel	l_suseconds_t	tv_usec;
10283221Smarcel} l_timeval;
10383221Smarcel
10483221Smarcel#define	l_fd_set	fd_set
10583221Smarcel
10683221Smarcel/*
10754122Smarcel * Miscellaneous
10854122Smarcel */
109293535Sdchagin#define LINUX_AT_COUNT		20	/* Count of used aux entry types.
110189362Sdchagin					 * Keep this synchronized with
111189362Sdchagin					 * elf_linux_fixup() code.
112189362Sdchagin					 */
11383221Smarcelstruct l___sysctl_args
11483221Smarcel{
11583221Smarcel	l_int		*name;
11683221Smarcel	l_int		nlen;
11783221Smarcel	void		*oldval;
11883221Smarcel	l_size_t	*oldlenp;
11983221Smarcel	void		*newval;
12083221Smarcel	l_size_t	newlen;
12183221Smarcel	l_ulong		__spare[4];
12283221Smarcel};
12383221Smarcel
12454122Smarcel/* Resource limits */
12554122Smarcel#define	LINUX_RLIMIT_CPU	0
12654122Smarcel#define	LINUX_RLIMIT_FSIZE	1
12754122Smarcel#define	LINUX_RLIMIT_DATA	2
12854122Smarcel#define	LINUX_RLIMIT_STACK	3
12954122Smarcel#define	LINUX_RLIMIT_CORE	4
13054122Smarcel#define	LINUX_RLIMIT_RSS	5
13154122Smarcel#define	LINUX_RLIMIT_NPROC	6
13254122Smarcel#define	LINUX_RLIMIT_NOFILE	7
13354122Smarcel#define	LINUX_RLIMIT_MEMLOCK	8
134167157Sjkim#define	LINUX_RLIMIT_AS		9	/* Address space limit */
13554122Smarcel
13654122Smarcel#define	LINUX_RLIM_NLIMITS	10
13754122Smarcel
13883221Smarcelstruct l_rlimit {
13983221Smarcel	l_ulong rlim_cur;
14083221Smarcel	l_ulong rlim_max;
14183221Smarcel};
14283221Smarcel
143166727Sjkimstruct l_mmap_argv {
144166727Sjkim	l_uintptr_t	addr;
145166727Sjkim	l_size_t	len;
146166727Sjkim	l_int		prot;
147166727Sjkim	l_int		flags;
148166727Sjkim	l_int		fd;
149166727Sjkim	l_off_t		pgoff;
150166727Sjkim} __packed;
151166727Sjkim
15283221Smarcel/*
15383221Smarcel * stat family of syscalls
15483221Smarcel */
15583221Smarcelstruct l_timespec {
156165408Sjkim	l_time_t	tv_sec;
157165408Sjkim	l_long		tv_nsec;
15883221Smarcel};
15954122Smarcel
16083221Smarcelstruct l_newstat {
16183221Smarcel	l_ushort	st_dev;
16283221Smarcel	l_ushort	__pad1;
16383221Smarcel	l_ulong		st_ino;
16483221Smarcel	l_ushort	st_mode;
16583221Smarcel	l_ushort	st_nlink;
16683221Smarcel	l_ushort	st_uid;
16783221Smarcel	l_ushort	st_gid;
16883221Smarcel	l_ushort	st_rdev;
16983221Smarcel	l_ushort	__pad2;
17083221Smarcel	l_ulong		st_size;
17183221Smarcel	l_ulong		st_blksize;
17283221Smarcel	l_ulong		st_blocks;
173205792Sed	struct l_timespec	st_atim;
174205792Sed	struct l_timespec	st_mtim;
175205792Sed	struct l_timespec	st_ctim;
17683221Smarcel	l_ulong		__unused4;
17783221Smarcel	l_ulong		__unused5;
17883221Smarcel};
17951793Smarcel
180156843Snetchildstruct l_stat {
181167157Sjkim	l_ushort	st_dev;
182167157Sjkim	l_ulong		st_ino;
183167157Sjkim	l_ushort	st_mode;
184167157Sjkim	l_ushort	st_nlink;
185167157Sjkim	l_ushort	st_uid;
186167157Sjkim	l_ushort	st_gid;
187167157Sjkim	l_ushort	st_rdev;
188167157Sjkim	l_long		st_size;
189205792Sed	struct l_timespec	st_atim;
190205792Sed	struct l_timespec	st_mtim;
191205792Sed	struct l_timespec	st_ctim;
192167157Sjkim	l_long		st_blksize;
193167157Sjkim	l_long		st_blocks;
194167157Sjkim	l_ulong		st_flags;
195167157Sjkim	l_ulong		st_gen;
196156843Snetchild};
197156843Snetchild
19883221Smarcelstruct l_stat64 {
19983221Smarcel	l_ushort	st_dev;
20083221Smarcel	u_char		__pad0[10];
20183221Smarcel	l_ulong		__st_ino;
20283221Smarcel	l_uint		st_mode;
20383221Smarcel	l_uint		st_nlink;
20483221Smarcel	l_ulong		st_uid;
20583221Smarcel	l_ulong		st_gid;
20683221Smarcel	l_ushort	st_rdev;
20783221Smarcel	u_char		__pad3[10];
20883221Smarcel	l_longlong	st_size;
20983221Smarcel	l_ulong		st_blksize;
21083221Smarcel	l_ulong		st_blocks;
21183221Smarcel	l_ulong		__pad4;
212205792Sed	struct l_timespec	st_atim;
213205792Sed	struct l_timespec	st_mtim;
214205792Sed	struct l_timespec	st_ctim;
21583221Smarcel	l_ulonglong	st_ino;
21683221Smarcel};
21783221Smarcel
218172220Sdwmalonestruct l_statfs64 {
219172220Sdwmalone        l_int           f_type;
220172220Sdwmalone        l_int           f_bsize;
221172220Sdwmalone        uint64_t        f_blocks;
222172220Sdwmalone        uint64_t        f_bfree;
223172220Sdwmalone        uint64_t        f_bavail;
224172220Sdwmalone        uint64_t        f_files;
225172220Sdwmalone        uint64_t        f_ffree;
226172220Sdwmalone        l_fsid_t        f_fsid;
227172220Sdwmalone        l_int           f_namelen;
228172220Sdwmalone        l_int           f_spare[6];
229172220Sdwmalone};
230172220Sdwmalone
23168689Sgallatin#define	LINUX_NSIG_WORDS	2
23251793Smarcel
23354122Smarcel/* sigaction flags */
23454122Smarcel#define	LINUX_SA_NOCLDSTOP	0x00000001
23554122Smarcel#define	LINUX_SA_NOCLDWAIT	0x00000002
23654122Smarcel#define	LINUX_SA_SIGINFO	0x00000004
23754122Smarcel#define	LINUX_SA_RESTORER	0x04000000
23854122Smarcel#define	LINUX_SA_ONSTACK	0x08000000
23954122Smarcel#define	LINUX_SA_RESTART	0x10000000
24054122Smarcel#define	LINUX_SA_INTERRUPT	0x20000000
24154122Smarcel#define	LINUX_SA_NOMASK		0x40000000
24254122Smarcel#define	LINUX_SA_ONESHOT	0x80000000
24354122Smarcel
24454122Smarcel/* sigprocmask actions */
24554122Smarcel#define	LINUX_SIG_BLOCK		0
24654122Smarcel#define	LINUX_SIG_UNBLOCK	1
24754122Smarcel#define	LINUX_SIG_SETMASK	2
24854122Smarcel
24965506Smarcel/* sigaltstack */
250167157Sjkim#define	LINUX_MINSIGSTKSZ	2048
25165506Smarcel
25283221Smarceltypedef void	(*l_handler_t)(l_int);
25383221Smarceltypedef l_ulong	l_osigset_t;
25467051Sgallatin
2559313Ssostypedef struct {
25683221Smarcel	l_handler_t	lsa_handler;
25783221Smarcel	l_osigset_t	lsa_mask;
25883221Smarcel	l_ulong		lsa_flags;
25954122Smarcel	void	(*lsa_restorer)(void);
26083221Smarcel} l_osigaction_t;
26151793Smarcel
26249786Smarceltypedef struct {
26383221Smarcel	l_handler_t	lsa_handler;
26483221Smarcel	l_ulong		lsa_flags;
26554122Smarcel	void	(*lsa_restorer)(void);
26683221Smarcel	l_sigset_t	lsa_mask;
26783221Smarcel} l_sigaction_t;
26849786Smarcel
26954122Smarceltypedef struct {
27083221Smarcel	void		*ss_sp;
27183221Smarcel	l_int		ss_flags;
27283221Smarcel	l_size_t	ss_size;
27383221Smarcel} l_stack_t;
27453954Smarcel
27554122Smarcel/* The Linux sigcontext, pretty much a standard 386 trapframe. */
27683221Smarcelstruct l_sigcontext {
27783221Smarcel	l_int		sc_gs;
27883221Smarcel	l_int		sc_fs;
27983221Smarcel	l_int		sc_es;
28083221Smarcel	l_int		sc_ds;
28183221Smarcel	l_int		sc_edi;
28283221Smarcel	l_int		sc_esi;
28383221Smarcel	l_int		sc_ebp;
28483221Smarcel	l_int		sc_esp;
28583221Smarcel	l_int		sc_ebx;
28683221Smarcel	l_int		sc_edx;
28783221Smarcel	l_int		sc_ecx;
28883221Smarcel	l_int		sc_eax;
28983221Smarcel	l_int		sc_trapno;
29083221Smarcel	l_int		sc_err;
29183221Smarcel	l_int		sc_eip;
29283221Smarcel	l_int		sc_cs;
29383221Smarcel	l_int		sc_eflags;
29483221Smarcel	l_int		sc_esp_at_signal;
29583221Smarcel	l_int		sc_ss;
29683221Smarcel	l_int		sc_387;
29783221Smarcel	l_int		sc_mask;
29883221Smarcel	l_int		sc_cr2;
29914331Speter};
30014331Speter
30183221Smarcelstruct l_ucontext {
30283221Smarcel	l_ulong		uc_flags;
30383221Smarcel	void		*uc_link;
30483221Smarcel	l_stack_t	uc_stack;
30583221Smarcel	struct l_sigcontext	uc_mcontext;
306167157Sjkim	l_sigset_t	uc_sigmask;
30767234Sgallatin};
30867234Sgallatin
309167157Sjkim#define	LINUX_SI_MAX_SIZE	128
310167157Sjkim#define	LINUX_SI_PAD_SIZE	((LINUX_SI_MAX_SIZE/sizeof(l_int)) - 3)
31167234Sgallatin
312184058Skibtypedef union l_sigval {
313184058Skib	l_int		sival_int;
314184058Skib	l_uintptr_t	sival_ptr;
315184058Skib} l_sigval_t;
316184058Skib
31783221Smarceltypedef struct l_siginfo {
31883221Smarcel	l_int		lsi_signo;
31983221Smarcel	l_int		lsi_errno;
32083221Smarcel	l_int		lsi_code;
32183221Smarcel	union {
32283221Smarcel		l_int	_pad[LINUX_SI_PAD_SIZE];
32367234Sgallatin
32467234Sgallatin		struct {
32583221Smarcel			l_pid_t		_pid;
326184058Skib			l_uid_t		_uid;
32767234Sgallatin		} _kill;
32867234Sgallatin
32967234Sgallatin		struct {
330184058Skib			l_timer_t	_tid;
331184058Skib			l_int		_overrun;
332184058Skib			char		_pad[sizeof(l_uid_t) - sizeof(l_int)];
333184058Skib			l_sigval_t	_sigval;
334184058Skib			l_int		_sys_private;
33567234Sgallatin		} _timer;
33683221Smarcel
33767234Sgallatin		struct {
33883221Smarcel			l_pid_t		_pid;		/* sender's pid */
339184058Skib			l_uid_t		_uid;		/* sender's uid */
340184058Skib			l_sigval_t	_sigval;
34167234Sgallatin		} _rt;
34267234Sgallatin
34367234Sgallatin		struct {
34483221Smarcel			l_pid_t		_pid;		/* which child */
345184058Skib			l_uid_t		_uid;		/* sender's uid */
34683221Smarcel			l_int		_status;	/* exit code */
34783221Smarcel			l_clock_t	_utime;
34883221Smarcel			l_clock_t	_stime;
34967234Sgallatin		} _sigchld;
35067234Sgallatin
35167234Sgallatin		struct {
352184058Skib			l_uintptr_t	_addr;	/* Faulting insn/memory ref. */
35367234Sgallatin		} _sigfault;
35467234Sgallatin
35567234Sgallatin		struct {
356184058Skib			l_long		_band;	/* POLL_IN,POLL_OUT,POLL_MSG */
35783221Smarcel			l_int		_fd;
35867234Sgallatin		} _sigpoll;
35967234Sgallatin	} _sifields;
36083221Smarcel} l_siginfo_t;
36167234Sgallatin
362167157Sjkim#define	lsi_pid		_sifields._kill._pid
363167157Sjkim#define	lsi_uid		_sifields._kill._uid
364184058Skib#define	lsi_tid		_sifields._timer._tid
365184058Skib#define	lsi_overrun	_sifields._timer._overrun
366184058Skib#define	lsi_sys_private	_sifields._timer._sys_private
367167157Sjkim#define	lsi_status	_sifields._sigchld._status
368167157Sjkim#define	lsi_utime	_sifields._sigchld._utime
369167157Sjkim#define	lsi_stime	_sifields._sigchld._stime
370167157Sjkim#define	lsi_value	_sifields._rt._sigval
371167157Sjkim#define	lsi_int		_sifields._rt._sigval.sival_int
372167157Sjkim#define	lsi_ptr		_sifields._rt._sigval.sival_ptr
373167157Sjkim#define	lsi_addr	_sifields._sigfault._addr
374167157Sjkim#define	lsi_band	_sifields._sigpoll._band
375167157Sjkim#define	lsi_fd		_sifields._sigpoll._fd
37667234Sgallatin
37783221Smarcelstruct l_fpreg {
378167157Sjkim	u_int16_t	significand[4];
379167157Sjkim	u_int16_t	exponent;
38068689Sgallatin};
38167234Sgallatin
38283221Smarcelstruct l_fpxreg {
383167157Sjkim	u_int16_t	significand[4];
384167157Sjkim	u_int16_t	exponent;
385167157Sjkim	u_int16_t	padding[3];
38668689Sgallatin};
38768689Sgallatin
38883221Smarcelstruct l_xmmreg {
389167157Sjkim	u_int32_t	element[4];
39068689Sgallatin};
39168689Sgallatin
39283221Smarcelstruct l_fpstate {
39368689Sgallatin	/* Regular FPU environment */
39468689Sgallatin	u_int32_t		cw;
39568689Sgallatin	u_int32_t		sw;
39668689Sgallatin	u_int32_t		tag;
39768689Sgallatin	u_int32_t		ipoff;
39868689Sgallatin	u_int32_t		cssel;
39968689Sgallatin	u_int32_t		dataoff;
40068689Sgallatin	u_int32_t		datasel;
40183221Smarcel	struct l_fpreg		_st[8];
40268689Sgallatin	u_int16_t		status;
403167157Sjkim	u_int16_t		magic;		/* 0xffff = regular FPU data */
40468689Sgallatin
40568689Sgallatin	/* FXSR FPU environment */
406167157Sjkim	u_int32_t		_fxsr_env[6];	/* env is ignored. */
40768689Sgallatin	u_int32_t		mxcsr;
40868689Sgallatin	u_int32_t		reserved;
409167157Sjkim	struct l_fpxreg		_fxsr_st[8];	/* reg data is ignored. */
41083221Smarcel	struct l_xmmreg		_xmm[8];
41168689Sgallatin	u_int32_t		padding[56];
41268689Sgallatin};
41368689Sgallatin
41414331Speter/*
41514331Speter * We make the stack look like Linux expects it when calling a signal
41614331Speter * handler, but use the BSD way of calling the handler and sigreturn().
41714331Speter * This means that we need to pass the pointer to the handler too.
41814331Speter * It is appended to the frame to not interfere with the rest of it.
41914331Speter */
42083221Smarcelstruct l_sigframe {
42183221Smarcel	l_int			sf_sig;
42283221Smarcel	struct l_sigcontext	sf_sc;
42383221Smarcel	struct l_fpstate	sf_fpstate;
42483221Smarcel	l_uint			sf_extramask[LINUX_NSIG_WORDS-1];
42583221Smarcel	l_handler_t		sf_handler;
42614331Speter};
42714331Speter
42883221Smarcelstruct l_rt_sigframe {
42983221Smarcel	l_int			sf_sig;
43083221Smarcel	l_siginfo_t 		*sf_siginfo;
43183221Smarcel	struct l_ucontext	*sf_ucontext;
43283221Smarcel	l_siginfo_t		sf_si;
43383221Smarcel	struct l_ucontext 	sf_sc;
43483221Smarcel	l_handler_t 		sf_handler;
43567234Sgallatin};
43667234Sgallatin
43759663Sdillonextern struct sysentvec linux_sysvec;
4389313Ssos
43954122Smarcel/*
440293541Sdchagin * arch specific open/fcntl flags
44154122Smarcel */
44299670Srobert#define	LINUX_F_GETLK64		12
44399670Srobert#define	LINUX_F_SETLK64		13
44499670Srobert#define	LINUX_F_SETLKW64	14
44599670Srobert
44683221Smarcelunion l_semun {
44783221Smarcel	l_int		val;
44883221Smarcel	struct l_semid_ds	*buf;
44983221Smarcel	l_ushort	*array;
45083221Smarcel	struct l_seminfo	*__buf;
45183221Smarcel	void		*__pad;
45283221Smarcel};
45383221Smarcel
454293522Sdchaginstruct l_ipc_perm {
455293522Sdchagin	l_key_t		key;
456293522Sdchagin	l_uid16_t	uid;
457293522Sdchagin	l_gid16_t	gid;
458293522Sdchagin	l_uid16_t	cuid;
459293522Sdchagin	l_gid16_t	cgid;
460293522Sdchagin	l_ushort	mode;
461293522Sdchagin	l_ushort	seq;
462293522Sdchagin};
463293522Sdchagin
46454122Smarcel/*
46554122Smarcel * Socket defines
46654122Smarcel */
46754122Smarcel#define	LINUX_SOL_SOCKET	1
46854122Smarcel#define	LINUX_SOL_IP		0
46954122Smarcel#define	LINUX_SOL_IPX		256
47054122Smarcel#define	LINUX_SOL_AX25		257
47154122Smarcel#define	LINUX_SOL_TCP		6
47254122Smarcel#define	LINUX_SOL_UDP		17
4739313Ssos
47454122Smarcel#define	LINUX_SO_DEBUG		1
47554122Smarcel#define	LINUX_SO_REUSEADDR	2
47654122Smarcel#define	LINUX_SO_TYPE		3
47754122Smarcel#define	LINUX_SO_ERROR		4
47854122Smarcel#define	LINUX_SO_DONTROUTE	5
47954122Smarcel#define	LINUX_SO_BROADCAST	6
48054122Smarcel#define	LINUX_SO_SNDBUF		7
48154122Smarcel#define	LINUX_SO_RCVBUF		8
48254122Smarcel#define	LINUX_SO_KEEPALIVE	9
48354122Smarcel#define	LINUX_SO_OOBINLINE	10
48454122Smarcel#define	LINUX_SO_NO_CHECK	11
48554122Smarcel#define	LINUX_SO_PRIORITY	12
48654122Smarcel#define	LINUX_SO_LINGER		13
487166398Skib#define	LINUX_SO_PEERCRED	17
488166398Skib#define	LINUX_SO_RCVLOWAT	18
489166398Skib#define	LINUX_SO_SNDLOWAT	19
490166398Skib#define	LINUX_SO_RCVTIMEO	20
491166398Skib#define	LINUX_SO_SNDTIMEO	21
492166398Skib#define	LINUX_SO_TIMESTAMP	29
493166398Skib#define	LINUX_SO_ACCEPTCONN	30
4949313Ssos
49583221Smarcelstruct l_sockaddr {
49683221Smarcel	l_ushort	sa_family;
49783221Smarcel	char		sa_data[14];
49826364Smsmith};
49926364Smsmith
50083221Smarcelstruct l_ifmap {
50183221Smarcel	l_ulong		mem_start;
50283221Smarcel	l_ulong		mem_end;
50383221Smarcel	l_ushort	base_addr;
50483221Smarcel	u_char		irq;
50583221Smarcel	u_char		dma;
50683221Smarcel	u_char		port;
50726364Smsmith};
50826364Smsmith
50954122Smarcel#define	LINUX_IFHWADDRLEN	6
51054122Smarcel#define	LINUX_IFNAMSIZ		16
51126364Smsmith
51283221Smarcelstruct l_ifreq {
51354122Smarcel	union {
51454122Smarcel		char	ifrn_name[LINUX_IFNAMSIZ];
51554122Smarcel	} ifr_ifrn;
51626364Smsmith
51754122Smarcel	union {
51883221Smarcel		struct l_sockaddr	ifru_addr;
51983221Smarcel		struct l_sockaddr	ifru_dstaddr;
52083221Smarcel		struct l_sockaddr	ifru_broadaddr;
52183221Smarcel		struct l_sockaddr	ifru_netmask;
52283221Smarcel		struct l_sockaddr	ifru_hwaddr;
52385008Sdes		l_short		ifru_flags[1];
52483221Smarcel		l_int		ifru_metric;
52583221Smarcel		l_int		ifru_mtu;
52683221Smarcel		struct l_ifmap	ifru_map;
52783221Smarcel		char		ifru_slave[LINUX_IFNAMSIZ];
52883221Smarcel		l_caddr_t	ifru_data;
52954122Smarcel	} ifr_ifru;
53054122Smarcel};
53126364Smsmith
532167157Sjkim#define	ifr_name	ifr_ifrn.ifrn_name	/* Interface name */
53354122Smarcel#define	ifr_hwaddr	ifr_ifru.ifru_hwaddr	/* MAC address */
53414466Speter
53583221Smarcel/*
53683221Smarcel * poll()
53783221Smarcel */
53883221Smarcel#define	LINUX_POLLIN		0x0001
53983221Smarcel#define	LINUX_POLLPRI		0x0002
54083221Smarcel#define	LINUX_POLLOUT		0x0004
54183221Smarcel#define	LINUX_POLLERR		0x0008
54283221Smarcel#define	LINUX_POLLHUP		0x0010
54383221Smarcel#define	LINUX_POLLNVAL		0x0020
54483221Smarcel#define	LINUX_POLLRDNORM	0x0040
54583221Smarcel#define	LINUX_POLLRDBAND	0x0080
54683221Smarcel#define	LINUX_POLLWRNORM	0x0100
54783221Smarcel#define	LINUX_POLLWRBAND	0x0200
54883221Smarcel#define	LINUX_POLLMSG		0x0400
54983221Smarcel
55083221Smarcelstruct l_pollfd {
55183221Smarcel	l_int		fd;
55283221Smarcel	l_short		events;
55383221Smarcel	l_short		revents;
55483221Smarcel};
55583221Smarcel
556161310Snetchildstruct l_user_desc {
557161310Snetchild	l_uint		entry_number;
558161310Snetchild	l_uint		base_addr;
559161310Snetchild	l_uint		limit;
560161310Snetchild	l_uint		seg_32bit:1;
561161310Snetchild	l_uint		contents:2;
562161310Snetchild	l_uint		read_exec_only:1;
563161310Snetchild	l_uint		limit_in_pages:1;
564161310Snetchild	l_uint		seg_not_present:1;
565161310Snetchild	l_uint		useable:1;
566161310Snetchild};
567161310Snetchild
568161310Snetchildstruct l_desc_struct {
569167157Sjkim	unsigned long	a, b;
570161310Snetchild};
571161310Snetchild
572161310Snetchild
573167157Sjkim#define	LINUX_LOWERWORD	0x0000ffff
574161310Snetchild
575167157Sjkim/*
576167157Sjkim * Macros which does the same thing as those in Linux include/asm-um/ldt-i386.h.
577167157Sjkim * These convert Linux user space descriptor to machine one.
578161310Snetchild */
579167157Sjkim#define	LINUX_LDT_entry_a(info)					\
580167157Sjkim	((((info)->base_addr & LINUX_LOWERWORD) << 16) |	\
581167157Sjkim	((info)->limit & LINUX_LOWERWORD))
582161310Snetchild
583167157Sjkim#define	LINUX_ENTRY_B_READ_EXEC_ONLY	9
584167157Sjkim#define	LINUX_ENTRY_B_CONTENTS		10
585167157Sjkim#define	LINUX_ENTRY_B_SEG_NOT_PRESENT	15
586167157Sjkim#define	LINUX_ENTRY_B_BASE_ADDR		16
587167157Sjkim#define	LINUX_ENTRY_B_USEABLE		20
588167157Sjkim#define	LINUX_ENTRY_B_SEG32BIT		22
589167157Sjkim#define	LINUX_ENTRY_B_LIMIT		23
590161310Snetchild
591167157Sjkim#define	LINUX_LDT_entry_b(info)							\
592167157Sjkim	(((info)->base_addr & 0xff000000) |					\
593167157Sjkim	((info)->limit & 0xf0000) |						\
594167157Sjkim	((info)->contents << LINUX_ENTRY_B_CONTENTS) |				\
595167157Sjkim	(((info)->seg_not_present == 0) << LINUX_ENTRY_B_SEG_NOT_PRESENT) |	\
596167157Sjkim	(((info)->base_addr & 0x00ff0000) >> LINUX_ENTRY_B_BASE_ADDR) |		\
597167157Sjkim	(((info)->read_exec_only == 0) << LINUX_ENTRY_B_READ_EXEC_ONLY) |	\
598167157Sjkim	((info)->seg_32bit << LINUX_ENTRY_B_SEG32BIT) |				\
599167157Sjkim	((info)->useable << LINUX_ENTRY_B_USEABLE) |				\
600167157Sjkim	((info)->limit_in_pages << LINUX_ENTRY_B_LIMIT) | 0x7000)
601161310Snetchild
602167157Sjkim#define	LINUX_LDT_empty(info)		\
603167157Sjkim	((info)->base_addr == 0 &&	\
604167157Sjkim	(info)->limit == 0 &&		\
605167157Sjkim	(info)->contents == 0 &&	\
606167157Sjkim	(info)->seg_not_present == 1 &&	\
607167157Sjkim	(info)->read_exec_only == 1 &&	\
608167157Sjkim	(info)->seg_32bit == 0 &&	\
609167157Sjkim	(info)->limit_in_pages == 0 &&	\
610167157Sjkim	(info)->useable == 0)
611161310Snetchild
612167157Sjkim/*
613167157Sjkim * Macros for converting segments.
614167157Sjkim * They do the same as those in arch/i386/kernel/process.c in Linux.
615167157Sjkim */
616167157Sjkim#define	LINUX_GET_BASE(desc)				\
617167157Sjkim	((((desc)->a >> 16) & LINUX_LOWERWORD) |	\
618167157Sjkim	(((desc)->b << 16) & 0x00ff0000) |		\
619167157Sjkim	((desc)->b & 0xff000000))
620161310Snetchild
621167157Sjkim#define	LINUX_GET_LIMIT(desc)			\
622167157Sjkim	(((desc)->a & LINUX_LOWERWORD) |	\
623167157Sjkim	((desc)->b & 0xf0000))
624161310Snetchild
625167157Sjkim#define	LINUX_GET_32BIT(desc)		\
626167157Sjkim	(((desc)->b >> LINUX_ENTRY_B_SEG32BIT) & 1)
627167157Sjkim#define	LINUX_GET_CONTENTS(desc)	\
628167157Sjkim	(((desc)->b >> LINUX_ENTRY_B_CONTENTS) & 3)
629167157Sjkim#define	LINUX_GET_WRITABLE(desc)	\
630167157Sjkim	(((desc)->b >> LINUX_ENTRY_B_READ_EXEC_ONLY) & 1)
631167157Sjkim#define	LINUX_GET_LIMIT_PAGES(desc)	\
632167157Sjkim	(((desc)->b >> LINUX_ENTRY_B_LIMIT) & 1)
633167157Sjkim#define	LINUX_GET_PRESENT(desc)		\
634167157Sjkim	(((desc)->b >> LINUX_ENTRY_B_SEG_NOT_PRESENT) & 1)
635167157Sjkim#define	LINUX_GET_USEABLE(desc)		\
636167157Sjkim	(((desc)->b >> LINUX_ENTRY_B_USEABLE) & 1)
637161310Snetchild
638293500Sdchagin#define	linux_copyout_rusage(r, u)	copyout(r, u, sizeof(*r))
639293500Sdchagin
640183871Skib/* robust futexes */
641183871Skibstruct linux_robust_list {
642183871Skib	struct linux_robust_list	*next;
643183871Skib};
644183871Skib
645183871Skibstruct linux_robust_list_head {
646183871Skib	struct linux_robust_list	list;
647185002Skib	l_long				futex_offset;
648183871Skib	struct linux_robust_list	*pending_list;
649183871Skib};
650183871Skib
651167157Sjkim#endif /* !_I386_LINUX_H_ */
652