xref: /freebsd/sys/i386/linux/linux.h (revision 1e413cf93298b5b97441a21d9a50fdcd0ee9945e)
1 /*-
2  * Copyright (c) 1994-1996 S�ren Schmidt
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer
10  *    in this position and unchanged.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. The name of the author may not be used to endorse or promote products
15  *    derived from this software without specific prior written permission
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  *
28  * $FreeBSD$
29  */
30 
31 #ifndef _I386_LINUX_H_
32 #define	_I386_LINUX_H_
33 
34 #include <sys/signal.h>	/* for sigval union */
35 
36 #include <i386/linux/linux_syscall.h>
37 
38 /*
39  * debugging support
40  */
41 extern u_char linux_debug_map[];
42 #define	ldebug(name)	isclr(linux_debug_map, LINUX_SYS_linux_ ## name)
43 #define	ARGS(nm, fmt)	"linux(%ld): "#nm"("fmt")\n", (long)td->td_proc->p_pid
44 #define	LMSG(fmt)	"linux(%ld): "fmt"\n", (long)td->td_proc->p_pid
45 
46 #ifdef MALLOC_DECLARE
47 MALLOC_DECLARE(M_LINUX);
48 #endif
49 
50 #define	PTRIN(v)	(void *)(v)
51 #define	PTROUT(v)	(l_uintptr_t)(v)
52 
53 /*
54  * Provide a separate set of types for the Linux types.
55  */
56 typedef int		l_int;
57 typedef int32_t		l_long;
58 typedef int64_t		l_longlong;
59 typedef short		l_short;
60 typedef unsigned int	l_uint;
61 typedef uint32_t	l_ulong;
62 typedef uint64_t	l_ulonglong;
63 typedef unsigned short	l_ushort;
64 
65 typedef char		*l_caddr_t;
66 typedef l_ulong		l_uintptr_t;
67 typedef l_long		l_clock_t;
68 typedef l_int		l_daddr_t;
69 typedef l_ushort	l_dev_t;
70 typedef l_uint		l_gid_t;
71 typedef l_ushort	l_gid16_t;
72 typedef l_ulong		l_ino_t;
73 typedef l_int		l_key_t;
74 typedef l_longlong	l_loff_t;
75 typedef l_ushort	l_mode_t;
76 typedef l_long		l_off_t;
77 typedef l_int		l_pid_t;
78 typedef l_uint		l_size_t;
79 typedef l_long		l_suseconds_t;
80 typedef l_long		l_time_t;
81 typedef l_uint		l_uid_t;
82 typedef l_ushort	l_uid16_t;
83 
84 typedef struct {
85 	l_int		val[2];
86 } l_fsid_t;
87 
88 typedef struct {
89 	l_time_t	tv_sec;
90 	l_suseconds_t	tv_usec;
91 } l_timeval;
92 
93 #define	l_fd_set	fd_set
94 
95 /*
96  * Miscellaneous
97  */
98 #define	LINUX_NAME_MAX		255
99 #define	LINUX_MAX_UTSNAME	65
100 
101 #define	LINUX_CTL_MAXNAME	10
102 
103 struct l___sysctl_args
104 {
105 	l_int		*name;
106 	l_int		nlen;
107 	void		*oldval;
108 	l_size_t	*oldlenp;
109 	void		*newval;
110 	l_size_t	newlen;
111 	l_ulong		__spare[4];
112 };
113 
114 /* Scheduling policies */
115 #define	LINUX_SCHED_OTHER	0
116 #define	LINUX_SCHED_FIFO	1
117 #define	LINUX_SCHED_RR		2
118 
119 /* Resource limits */
120 #define	LINUX_RLIMIT_CPU	0
121 #define	LINUX_RLIMIT_FSIZE	1
122 #define	LINUX_RLIMIT_DATA	2
123 #define	LINUX_RLIMIT_STACK	3
124 #define	LINUX_RLIMIT_CORE	4
125 #define	LINUX_RLIMIT_RSS	5
126 #define	LINUX_RLIMIT_NPROC	6
127 #define	LINUX_RLIMIT_NOFILE	7
128 #define	LINUX_RLIMIT_MEMLOCK	8
129 #define	LINUX_RLIMIT_AS		9	/* Address space limit */
130 
131 #define	LINUX_RLIM_NLIMITS	10
132 
133 struct l_rlimit {
134 	l_ulong rlim_cur;
135 	l_ulong rlim_max;
136 };
137 
138 /* mmap options */
139 #define	LINUX_MAP_SHARED	0x0001
140 #define	LINUX_MAP_PRIVATE	0x0002
141 #define	LINUX_MAP_FIXED		0x0010
142 #define	LINUX_MAP_ANON		0x0020
143 #define	LINUX_MAP_GROWSDOWN	0x0100
144 
145 struct l_mmap_argv {
146 	l_uintptr_t	addr;
147 	l_size_t	len;
148 	l_int		prot;
149 	l_int		flags;
150 	l_int		fd;
151 	l_off_t		pgoff;
152 } __packed;
153 
154 /*
155  * stat family of syscalls
156  */
157 struct l_timespec {
158 	l_time_t	tv_sec;
159 	l_long		tv_nsec;
160 };
161 
162 struct l_newstat {
163 	l_ushort	st_dev;
164 	l_ushort	__pad1;
165 	l_ulong		st_ino;
166 	l_ushort	st_mode;
167 	l_ushort	st_nlink;
168 	l_ushort	st_uid;
169 	l_ushort	st_gid;
170 	l_ushort	st_rdev;
171 	l_ushort	__pad2;
172 	l_ulong		st_size;
173 	l_ulong		st_blksize;
174 	l_ulong		st_blocks;
175 	struct l_timespec	st_atimespec;
176 	struct l_timespec	st_mtimespec;
177 	struct l_timespec	st_ctimespec;
178 	l_ulong		__unused4;
179 	l_ulong		__unused5;
180 };
181 
182 struct l_stat {
183 	l_ushort	st_dev;
184 	l_ulong		st_ino;
185 	l_ushort	st_mode;
186 	l_ushort	st_nlink;
187 	l_ushort	st_uid;
188 	l_ushort	st_gid;
189 	l_ushort	st_rdev;
190 	l_long		st_size;
191 	struct l_timespec	st_atimespec;
192 	struct l_timespec	st_mtimespec;
193 	struct l_timespec	st_ctimespec;
194 	l_long		st_blksize;
195 	l_long		st_blocks;
196 	l_ulong		st_flags;
197 	l_ulong		st_gen;
198 };
199 
200 struct l_stat64 {
201 	l_ushort	st_dev;
202 	u_char		__pad0[10];
203 	l_ulong		__st_ino;
204 	l_uint		st_mode;
205 	l_uint		st_nlink;
206 	l_ulong		st_uid;
207 	l_ulong		st_gid;
208 	l_ushort	st_rdev;
209 	u_char		__pad3[10];
210 	l_longlong	st_size;
211 	l_ulong		st_blksize;
212 	l_ulong		st_blocks;
213 	l_ulong		__pad4;
214 	struct l_timespec	st_atimespec;
215 	struct l_timespec	st_mtimespec;
216 	struct l_timespec	st_ctimespec;
217 	l_ulonglong	st_ino;
218 };
219 
220 struct l_statfs64 {
221         l_int           f_type;
222         l_int           f_bsize;
223         uint64_t        f_blocks;
224         uint64_t        f_bfree;
225         uint64_t        f_bavail;
226         uint64_t        f_files;
227         uint64_t        f_ffree;
228         l_fsid_t        f_fsid;
229         l_int           f_namelen;
230         l_int           f_spare[6];
231 };
232 
233 struct l_new_utsname {
234 	char	sysname[LINUX_MAX_UTSNAME];
235 	char	nodename[LINUX_MAX_UTSNAME];
236 	char	release[LINUX_MAX_UTSNAME];
237 	char	version[LINUX_MAX_UTSNAME];
238 	char	machine[LINUX_MAX_UTSNAME];
239 	char	domainname[LINUX_MAX_UTSNAME];
240 };
241 
242 /*
243  * Signalling
244  */
245 #define	LINUX_SIGHUP		1
246 #define	LINUX_SIGINT		2
247 #define	LINUX_SIGQUIT		3
248 #define	LINUX_SIGILL		4
249 #define	LINUX_SIGTRAP		5
250 #define	LINUX_SIGABRT		6
251 #define	LINUX_SIGIOT		LINUX_SIGABRT
252 #define	LINUX_SIGBUS		7
253 #define	LINUX_SIGFPE		8
254 #define	LINUX_SIGKILL		9
255 #define	LINUX_SIGUSR1		10
256 #define	LINUX_SIGSEGV		11
257 #define	LINUX_SIGUSR2		12
258 #define	LINUX_SIGPIPE		13
259 #define	LINUX_SIGALRM		14
260 #define	LINUX_SIGTERM		15
261 #define	LINUX_SIGSTKFLT		16
262 #define	LINUX_SIGCHLD		17
263 #define	LINUX_SIGCONT		18
264 #define	LINUX_SIGSTOP		19
265 #define	LINUX_SIGTSTP		20
266 #define	LINUX_SIGTTIN		21
267 #define	LINUX_SIGTTOU		22
268 #define	LINUX_SIGURG		23
269 #define	LINUX_SIGXCPU		24
270 #define	LINUX_SIGXFSZ		25
271 #define	LINUX_SIGVTALRM		26
272 #define	LINUX_SIGPROF		27
273 #define	LINUX_SIGWINCH		28
274 #define	LINUX_SIGIO		29
275 #define	LINUX_SIGPOLL		LINUX_SIGIO
276 #define	LINUX_SIGPWR		30
277 #define	LINUX_SIGSYS		31
278 
279 #define	LINUX_SIGTBLSZ		31
280 #define	LINUX_NSIG_WORDS	2
281 #define	LINUX_NBPW		32
282 #define	LINUX_NSIG		(LINUX_NBPW * LINUX_NSIG_WORDS)
283 
284 /* sigaction flags */
285 #define	LINUX_SA_NOCLDSTOP	0x00000001
286 #define	LINUX_SA_NOCLDWAIT	0x00000002
287 #define	LINUX_SA_SIGINFO	0x00000004
288 #define	LINUX_SA_RESTORER	0x04000000
289 #define	LINUX_SA_ONSTACK	0x08000000
290 #define	LINUX_SA_RESTART	0x10000000
291 #define	LINUX_SA_INTERRUPT	0x20000000
292 #define	LINUX_SA_NOMASK		0x40000000
293 #define	LINUX_SA_ONESHOT	0x80000000
294 
295 /* sigprocmask actions */
296 #define	LINUX_SIG_BLOCK		0
297 #define	LINUX_SIG_UNBLOCK	1
298 #define	LINUX_SIG_SETMASK	2
299 
300 /* sigset_t macros */
301 #define	LINUX_SIGEMPTYSET(set)		(set).__bits[0] = (set).__bits[1] = 0
302 #define	LINUX_SIGISMEMBER(set, sig)	SIGISMEMBER(set, sig)
303 #define	LINUX_SIGADDSET(set, sig)	SIGADDSET(set, sig)
304 
305 /* sigaltstack */
306 #define	LINUX_MINSIGSTKSZ	2048
307 #define	LINUX_SS_ONSTACK	1
308 #define	LINUX_SS_DISABLE	2
309 
310 int linux_to_bsd_sigaltstack(int lsa);
311 int bsd_to_linux_sigaltstack(int bsa);
312 
313 typedef void	(*l_handler_t)(l_int);
314 typedef l_ulong	l_osigset_t;
315 
316 typedef struct {
317 	l_uint	__bits[LINUX_NSIG_WORDS];
318 } l_sigset_t;
319 
320 typedef struct {
321 	l_handler_t	lsa_handler;
322 	l_osigset_t	lsa_mask;
323 	l_ulong		lsa_flags;
324 	void	(*lsa_restorer)(void);
325 } l_osigaction_t;
326 
327 typedef struct {
328 	l_handler_t	lsa_handler;
329 	l_ulong		lsa_flags;
330 	void	(*lsa_restorer)(void);
331 	l_sigset_t	lsa_mask;
332 } l_sigaction_t;
333 
334 typedef struct {
335 	void		*ss_sp;
336 	l_int		ss_flags;
337 	l_size_t	ss_size;
338 } l_stack_t;
339 
340 /* The Linux sigcontext, pretty much a standard 386 trapframe. */
341 struct l_sigcontext {
342 	l_int		sc_gs;
343 	l_int		sc_fs;
344 	l_int		sc_es;
345 	l_int		sc_ds;
346 	l_int		sc_edi;
347 	l_int		sc_esi;
348 	l_int		sc_ebp;
349 	l_int		sc_esp;
350 	l_int		sc_ebx;
351 	l_int		sc_edx;
352 	l_int		sc_ecx;
353 	l_int		sc_eax;
354 	l_int		sc_trapno;
355 	l_int		sc_err;
356 	l_int		sc_eip;
357 	l_int		sc_cs;
358 	l_int		sc_eflags;
359 	l_int		sc_esp_at_signal;
360 	l_int		sc_ss;
361 	l_int		sc_387;
362 	l_int		sc_mask;
363 	l_int		sc_cr2;
364 };
365 
366 struct l_ucontext {
367 	l_ulong		uc_flags;
368 	void		*uc_link;
369 	l_stack_t	uc_stack;
370 	struct l_sigcontext	uc_mcontext;
371 	l_sigset_t	uc_sigmask;
372 };
373 
374 #define	LINUX_SI_MAX_SIZE	128
375 #define	LINUX_SI_PAD_SIZE	((LINUX_SI_MAX_SIZE/sizeof(l_int)) - 3)
376 
377 typedef struct l_siginfo {
378 	l_int		lsi_signo;
379 	l_int		lsi_errno;
380 	l_int		lsi_code;
381 	union {
382 		l_int	_pad[LINUX_SI_PAD_SIZE];
383 
384 		struct {
385 			l_pid_t		_pid;
386 			l_uid16_t	_uid;
387 		} _kill;
388 
389 		struct {
390 			l_uint		_timer1;
391 			l_uint		_timer2;
392 		} _timer;
393 
394 		struct {
395 			l_pid_t		_pid;		/* sender's pid */
396 			l_uid16_t	_uid;		/* sender's uid */
397 			union sigval _sigval;
398 		} _rt;
399 
400 		struct {
401 			l_pid_t		_pid;		/* which child */
402 			l_uid16_t	_uid;		/* sender's uid */
403 			l_int		_status;	/* exit code */
404 			l_clock_t	_utime;
405 			l_clock_t	_stime;
406 		} _sigchld;
407 
408 		struct {
409 			void		*_addr;	/* Faulting insn/memory ref. */
410 		} _sigfault;
411 
412 		struct {
413 			l_int		_band;	/* POLL_IN,POLL_OUT,POLL_MSG */
414 			l_int		_fd;
415 		} _sigpoll;
416 	} _sifields;
417 } l_siginfo_t;
418 
419 #define	lsi_pid		_sifields._kill._pid
420 #define	lsi_uid		_sifields._kill._uid
421 #define	lsi_status	_sifields._sigchld._status
422 #define	lsi_utime	_sifields._sigchld._utime
423 #define	lsi_stime	_sifields._sigchld._stime
424 #define	lsi_value	_sifields._rt._sigval
425 #define	lsi_int		_sifields._rt._sigval.sival_int
426 #define	lsi_ptr		_sifields._rt._sigval.sival_ptr
427 #define	lsi_addr	_sifields._sigfault._addr
428 #define	lsi_band	_sifields._sigpoll._band
429 #define	lsi_fd		_sifields._sigpoll._fd
430 
431 struct l_fpreg {
432 	u_int16_t	significand[4];
433 	u_int16_t	exponent;
434 };
435 
436 struct l_fpxreg {
437 	u_int16_t	significand[4];
438 	u_int16_t	exponent;
439 	u_int16_t	padding[3];
440 };
441 
442 struct l_xmmreg {
443 	u_int32_t	element[4];
444 };
445 
446 struct l_fpstate {
447 	/* Regular FPU environment */
448 	u_int32_t		cw;
449 	u_int32_t		sw;
450 	u_int32_t		tag;
451 	u_int32_t		ipoff;
452 	u_int32_t		cssel;
453 	u_int32_t		dataoff;
454 	u_int32_t		datasel;
455 	struct l_fpreg		_st[8];
456 	u_int16_t		status;
457 	u_int16_t		magic;		/* 0xffff = regular FPU data */
458 
459 	/* FXSR FPU environment */
460 	u_int32_t		_fxsr_env[6];	/* env is ignored. */
461 	u_int32_t		mxcsr;
462 	u_int32_t		reserved;
463 	struct l_fpxreg		_fxsr_st[8];	/* reg data is ignored. */
464 	struct l_xmmreg		_xmm[8];
465 	u_int32_t		padding[56];
466 };
467 
468 /*
469  * We make the stack look like Linux expects it when calling a signal
470  * handler, but use the BSD way of calling the handler and sigreturn().
471  * This means that we need to pass the pointer to the handler too.
472  * It is appended to the frame to not interfere with the rest of it.
473  */
474 struct l_sigframe {
475 	l_int			sf_sig;
476 	struct l_sigcontext	sf_sc;
477 	struct l_fpstate	sf_fpstate;
478 	l_uint			sf_extramask[LINUX_NSIG_WORDS-1];
479 	l_handler_t		sf_handler;
480 };
481 
482 struct l_rt_sigframe {
483 	l_int			sf_sig;
484 	l_siginfo_t 		*sf_siginfo;
485 	struct l_ucontext	*sf_ucontext;
486 	l_siginfo_t		sf_si;
487 	struct l_ucontext 	sf_sc;
488 	l_handler_t 		sf_handler;
489 };
490 
491 extern int bsd_to_linux_signal[];
492 extern int linux_to_bsd_signal[];
493 extern struct sysentvec linux_sysvec;
494 extern struct sysentvec elf_linux_sysvec;
495 
496 /*
497  * Pluggable ioctl handlers
498  */
499 struct linux_ioctl_args;
500 struct thread;
501 
502 typedef int linux_ioctl_function_t(struct thread *, struct linux_ioctl_args *);
503 
504 struct linux_ioctl_handler {
505 	linux_ioctl_function_t *func;
506 	int	low, high;
507 };
508 
509 int	linux_ioctl_register_handler(struct linux_ioctl_handler *h);
510 int	linux_ioctl_unregister_handler(struct linux_ioctl_handler *h);
511 
512 /*
513  * open/fcntl flags
514  */
515 #define	LINUX_O_RDONLY		00000000
516 #define	LINUX_O_WRONLY		00000001
517 #define	LINUX_O_RDWR		00000002
518 #define	LINUX_O_ACCMODE		00000003
519 #define	LINUX_O_CREAT		00000100
520 #define	LINUX_O_EXCL		00000200
521 #define	LINUX_O_NOCTTY		00000400
522 #define	LINUX_O_TRUNC		00001000
523 #define	LINUX_O_APPEND		00002000
524 #define	LINUX_O_NONBLOCK	00004000
525 #define	LINUX_O_NDELAY		LINUX_O_NONBLOCK
526 #define	LINUX_O_SYNC		00010000
527 #define	LINUX_FASYNC		00020000
528 #define	LINUX_O_DIRECT		00040000	/* Direct disk access hint */
529 #define	LINUX_O_LARGEFILE	00100000
530 #define	LINUX_O_DIRECTORY	00200000	/* Must be a directory */
531 #define	LINUX_O_NOFOLLOW	00400000	/* Do not follow links */
532 #define	LINUX_O_NOATIME		01000000
533 
534 #define	LINUX_F_DUPFD		0
535 #define	LINUX_F_GETFD		1
536 #define	LINUX_F_SETFD		2
537 #define	LINUX_F_GETFL		3
538 #define	LINUX_F_SETFL		4
539 #define	LINUX_F_GETLK		5
540 #define	LINUX_F_SETLK		6
541 #define	LINUX_F_SETLKW		7
542 #define	LINUX_F_SETOWN		8
543 #define	LINUX_F_GETOWN		9
544 
545 #define	LINUX_F_GETLK64		12
546 #define	LINUX_F_SETLK64		13
547 #define	LINUX_F_SETLKW64	14
548 
549 #define	LINUX_F_RDLCK		0
550 #define	LINUX_F_WRLCK		1
551 #define	LINUX_F_UNLCK		2
552 
553 #define	LINUX_AT_FDCWD		-100
554 
555 /*
556  * mount flags
557  */
558 #define	LINUX_MS_RDONLY		0x0001
559 #define	LINUX_MS_NOSUID		0x0002
560 #define	LINUX_MS_NODEV		0x0004
561 #define	LINUX_MS_NOEXEC		0x0008
562 #define	LINUX_MS_REMOUNT	0x0020
563 
564 /*
565  * SystemV IPC defines
566  */
567 #define	LINUX_SEMOP		1
568 #define	LINUX_SEMGET		2
569 #define	LINUX_SEMCTL		3
570 #define	LINUX_MSGSND		11
571 #define	LINUX_MSGRCV		12
572 #define	LINUX_MSGGET		13
573 #define	LINUX_MSGCTL		14
574 #define	LINUX_SHMAT		21
575 #define	LINUX_SHMDT		22
576 #define	LINUX_SHMGET		23
577 #define	LINUX_SHMCTL		24
578 
579 #define	LINUX_IPC_RMID		0
580 #define	LINUX_IPC_SET		1
581 #define	LINUX_IPC_STAT		2
582 #define	LINUX_IPC_INFO		3
583 
584 #define	LINUX_SHM_LOCK		11
585 #define	LINUX_SHM_UNLOCK	12
586 #define	LINUX_SHM_STAT		13
587 #define	LINUX_SHM_INFO		14
588 
589 #define	LINUX_SHM_RDONLY	0x1000
590 #define	LINUX_SHM_RND		0x2000
591 #define	LINUX_SHM_REMAP		0x4000
592 
593 /* semctl commands */
594 #define	LINUX_GETPID		11
595 #define	LINUX_GETVAL		12
596 #define	LINUX_GETALL		13
597 #define	LINUX_GETNCNT		14
598 #define	LINUX_GETZCNT		15
599 #define	LINUX_SETVAL		16
600 #define	LINUX_SETALL		17
601 #define	LINUX_SEM_STAT		18
602 #define	LINUX_SEM_INFO		19
603 
604 union l_semun {
605 	l_int		val;
606 	struct l_semid_ds	*buf;
607 	l_ushort	*array;
608 	struct l_seminfo	*__buf;
609 	void		*__pad;
610 };
611 
612 /*
613  * Socket defines
614  */
615 #define	LINUX_SOCKET 		1
616 #define	LINUX_BIND		2
617 #define	LINUX_CONNECT 		3
618 #define	LINUX_LISTEN 		4
619 #define	LINUX_ACCEPT 		5
620 #define	LINUX_GETSOCKNAME	6
621 #define	LINUX_GETPEERNAME	7
622 #define	LINUX_SOCKETPAIR	8
623 #define	LINUX_SEND		9
624 #define	LINUX_RECV		10
625 #define	LINUX_SENDTO 		11
626 #define	LINUX_RECVFROM 		12
627 #define	LINUX_SHUTDOWN 		13
628 #define	LINUX_SETSOCKOPT	14
629 #define	LINUX_GETSOCKOPT	15
630 #define	LINUX_SENDMSG		16
631 #define	LINUX_RECVMSG		17
632 
633 #define	LINUX_AF_UNSPEC		0
634 #define	LINUX_AF_UNIX		1
635 #define	LINUX_AF_INET		2
636 #define	LINUX_AF_AX25		3
637 #define	LINUX_AF_IPX		4
638 #define	LINUX_AF_APPLETALK	5
639 #define	LINUX_AF_INET6		10
640 
641 #define	LINUX_SOL_SOCKET	1
642 #define	LINUX_SOL_IP		0
643 #define	LINUX_SOL_IPX		256
644 #define	LINUX_SOL_AX25		257
645 #define	LINUX_SOL_TCP		6
646 #define	LINUX_SOL_UDP		17
647 
648 #define	LINUX_SO_DEBUG		1
649 #define	LINUX_SO_REUSEADDR	2
650 #define	LINUX_SO_TYPE		3
651 #define	LINUX_SO_ERROR		4
652 #define	LINUX_SO_DONTROUTE	5
653 #define	LINUX_SO_BROADCAST	6
654 #define	LINUX_SO_SNDBUF		7
655 #define	LINUX_SO_RCVBUF		8
656 #define	LINUX_SO_KEEPALIVE	9
657 #define	LINUX_SO_OOBINLINE	10
658 #define	LINUX_SO_NO_CHECK	11
659 #define	LINUX_SO_PRIORITY	12
660 #define	LINUX_SO_LINGER		13
661 #define	LINUX_SO_PEERCRED	17
662 #define	LINUX_SO_RCVLOWAT	18
663 #define	LINUX_SO_SNDLOWAT	19
664 #define	LINUX_SO_RCVTIMEO	20
665 #define	LINUX_SO_SNDTIMEO	21
666 #define	LINUX_SO_TIMESTAMP	29
667 #define	LINUX_SO_ACCEPTCONN	30
668 
669 #define	LINUX_IP_TOS		1
670 #define	LINUX_IP_TTL		2
671 #define	LINUX_IP_HDRINCL	3
672 #define	LINUX_IP_OPTIONS	4
673 
674 #define	LINUX_IP_MULTICAST_IF		32
675 #define	LINUX_IP_MULTICAST_TTL		33
676 #define	LINUX_IP_MULTICAST_LOOP		34
677 #define	LINUX_IP_ADD_MEMBERSHIP		35
678 #define	LINUX_IP_DROP_MEMBERSHIP	36
679 
680 struct l_sockaddr {
681 	l_ushort	sa_family;
682 	char		sa_data[14];
683 };
684 
685 struct l_ifmap {
686 	l_ulong		mem_start;
687 	l_ulong		mem_end;
688 	l_ushort	base_addr;
689 	u_char		irq;
690 	u_char		dma;
691 	u_char		port;
692 };
693 
694 #define	LINUX_IFHWADDRLEN	6
695 #define	LINUX_IFNAMSIZ		16
696 
697 struct l_ifreq {
698 	union {
699 		char	ifrn_name[LINUX_IFNAMSIZ];
700 	} ifr_ifrn;
701 
702 	union {
703 		struct l_sockaddr	ifru_addr;
704 		struct l_sockaddr	ifru_dstaddr;
705 		struct l_sockaddr	ifru_broadaddr;
706 		struct l_sockaddr	ifru_netmask;
707 		struct l_sockaddr	ifru_hwaddr;
708 		l_short		ifru_flags[1];
709 		l_int		ifru_metric;
710 		l_int		ifru_mtu;
711 		struct l_ifmap	ifru_map;
712 		char		ifru_slave[LINUX_IFNAMSIZ];
713 		l_caddr_t	ifru_data;
714 	} ifr_ifru;
715 };
716 
717 #define	ifr_name	ifr_ifrn.ifrn_name	/* Interface name */
718 #define	ifr_hwaddr	ifr_ifru.ifru_hwaddr	/* MAC address */
719 
720 /*
721  * poll()
722  */
723 #define	LINUX_POLLIN		0x0001
724 #define	LINUX_POLLPRI		0x0002
725 #define	LINUX_POLLOUT		0x0004
726 #define	LINUX_POLLERR		0x0008
727 #define	LINUX_POLLHUP		0x0010
728 #define	LINUX_POLLNVAL		0x0020
729 #define	LINUX_POLLRDNORM	0x0040
730 #define	LINUX_POLLRDBAND	0x0080
731 #define	LINUX_POLLWRNORM	0x0100
732 #define	LINUX_POLLWRBAND	0x0200
733 #define	LINUX_POLLMSG		0x0400
734 
735 struct l_pollfd {
736 	l_int		fd;
737 	l_short		events;
738 	l_short		revents;
739 };
740 
741 struct l_user_desc {
742 	l_uint		entry_number;
743 	l_uint		base_addr;
744 	l_uint		limit;
745 	l_uint		seg_32bit:1;
746 	l_uint		contents:2;
747 	l_uint		read_exec_only:1;
748 	l_uint		limit_in_pages:1;
749 	l_uint		seg_not_present:1;
750 	l_uint		useable:1;
751 };
752 
753 struct l_desc_struct {
754 	unsigned long	a, b;
755 };
756 
757 
758 #define	LINUX_LOWERWORD	0x0000ffff
759 
760 /*
761  * Macros which does the same thing as those in Linux include/asm-um/ldt-i386.h.
762  * These convert Linux user space descriptor to machine one.
763  */
764 #define	LINUX_LDT_entry_a(info)					\
765 	((((info)->base_addr & LINUX_LOWERWORD) << 16) |	\
766 	((info)->limit & LINUX_LOWERWORD))
767 
768 #define	LINUX_ENTRY_B_READ_EXEC_ONLY	9
769 #define	LINUX_ENTRY_B_CONTENTS		10
770 #define	LINUX_ENTRY_B_SEG_NOT_PRESENT	15
771 #define	LINUX_ENTRY_B_BASE_ADDR		16
772 #define	LINUX_ENTRY_B_USEABLE		20
773 #define	LINUX_ENTRY_B_SEG32BIT		22
774 #define	LINUX_ENTRY_B_LIMIT		23
775 
776 #define	LINUX_LDT_entry_b(info)							\
777 	(((info)->base_addr & 0xff000000) |					\
778 	((info)->limit & 0xf0000) |						\
779 	((info)->contents << LINUX_ENTRY_B_CONTENTS) |				\
780 	(((info)->seg_not_present == 0) << LINUX_ENTRY_B_SEG_NOT_PRESENT) |	\
781 	(((info)->base_addr & 0x00ff0000) >> LINUX_ENTRY_B_BASE_ADDR) |		\
782 	(((info)->read_exec_only == 0) << LINUX_ENTRY_B_READ_EXEC_ONLY) |	\
783 	((info)->seg_32bit << LINUX_ENTRY_B_SEG32BIT) |				\
784 	((info)->useable << LINUX_ENTRY_B_USEABLE) |				\
785 	((info)->limit_in_pages << LINUX_ENTRY_B_LIMIT) | 0x7000)
786 
787 #define	LINUX_LDT_empty(info)		\
788 	((info)->base_addr == 0 &&	\
789 	(info)->limit == 0 &&		\
790 	(info)->contents == 0 &&	\
791 	(info)->seg_not_present == 1 &&	\
792 	(info)->read_exec_only == 1 &&	\
793 	(info)->seg_32bit == 0 &&	\
794 	(info)->limit_in_pages == 0 &&	\
795 	(info)->useable == 0)
796 
797 /*
798  * Macros for converting segments.
799  * They do the same as those in arch/i386/kernel/process.c in Linux.
800  */
801 #define	LINUX_GET_BASE(desc)				\
802 	((((desc)->a >> 16) & LINUX_LOWERWORD) |	\
803 	(((desc)->b << 16) & 0x00ff0000) |		\
804 	((desc)->b & 0xff000000))
805 
806 #define	LINUX_GET_LIMIT(desc)			\
807 	(((desc)->a & LINUX_LOWERWORD) |	\
808 	((desc)->b & 0xf0000))
809 
810 #define	LINUX_GET_32BIT(desc)		\
811 	(((desc)->b >> LINUX_ENTRY_B_SEG32BIT) & 1)
812 #define	LINUX_GET_CONTENTS(desc)	\
813 	(((desc)->b >> LINUX_ENTRY_B_CONTENTS) & 3)
814 #define	LINUX_GET_WRITABLE(desc)	\
815 	(((desc)->b >> LINUX_ENTRY_B_READ_EXEC_ONLY) & 1)
816 #define	LINUX_GET_LIMIT_PAGES(desc)	\
817 	(((desc)->b >> LINUX_ENTRY_B_LIMIT) & 1)
818 #define	LINUX_GET_PRESENT(desc)		\
819 	(((desc)->b >> LINUX_ENTRY_B_SEG_NOT_PRESENT) & 1)
820 #define	LINUX_GET_USEABLE(desc)		\
821 	(((desc)->b >> LINUX_ENTRY_B_USEABLE) & 1)
822 
823 #define	LINUX_CLOCK_REALTIME		0
824 #define	LINUX_CLOCK_MONOTONIC		1
825 #define	LINUX_CLOCK_PROCESS_CPUTIME_ID	2
826 #define	LINUX_CLOCK_THREAD_CPUTIME_ID	3
827 #define	LINUX_CLOCK_REALTIME_HR		4
828 #define	LINUX_CLOCK_MONOTONIC_HR	5
829 
830 typedef int l_timer_t;
831 typedef int l_mqd_t;
832 
833 #define	LINUX_CLONE_VM			0x00000100
834 #define	LINUX_CLONE_FS			0x00000200
835 #define	LINUX_CLONE_FILES		0x00000400
836 #define	LINUX_CLONE_SIGHAND		0x00000800
837 #define	LINUX_CLONE_PID			0x00001000	/* No longer exist in Linux */
838 #define	LINUX_CLONE_VFORK		0x00004000
839 #define	LINUX_CLONE_PARENT		0x00008000
840 #define	LINUX_CLONE_THREAD		0x00010000
841 #define	LINUX_CLONE_SETTLS		0x00080000
842 #define	LINUX_CLONE_PARENT_SETTID	0x00100000
843 #define	LINUX_CLONE_CHILD_CLEARTID	0x00200000
844 #define	LINUX_CLONE_CHILD_SETTID	0x01000000
845 
846 #define	LINUX_THREADING_FLAGS					\
847 	(LINUX_CLONE_VM | LINUX_CLONE_FS | LINUX_CLONE_FILES |	\
848 	LINUX_CLONE_SIGHAND | LINUX_CLONE_THREAD)
849 
850 #endif /* !_I386_LINUX_H_ */
851