xref: /freebsd/sys/amd64/linux/linux.h (revision 3e89b64168e77c413823002dd58be6a081970629)
1b2f58791SDmitry Chagin /*-
2b2f58791SDmitry Chagin  * Copyright (c) 2013 Dmitry Chagin
3b2f58791SDmitry Chagin  * Copyright (c) 1994-1996 Søren Schmidt
4b2f58791SDmitry Chagin  * All rights reserved.
5b2f58791SDmitry Chagin  *
6b2f58791SDmitry Chagin  * Redistribution and use in source and binary forms, with or without
7b2f58791SDmitry Chagin  * modification, are permitted provided that the following conditions
8b2f58791SDmitry Chagin  * are met:
9b2f58791SDmitry Chagin  * 1. Redistributions of source code must retain the above copyright
10b2f58791SDmitry Chagin  *    notice, this list of conditions and the following disclaimer
11b2f58791SDmitry Chagin  *    in this position and unchanged.
12b2f58791SDmitry Chagin  * 2. Redistributions in binary form must reproduce the above copyright
13b2f58791SDmitry Chagin  *    notice, this list of conditions and the following disclaimer in the
14b2f58791SDmitry Chagin  *    documentation and/or other materials provided with the distribution.
15b2f58791SDmitry Chagin  * 3. The name of the author may not be used to endorse or promote products
16b2f58791SDmitry Chagin  *    derived from this software without specific prior written permission
17b2f58791SDmitry Chagin  *
18b2f58791SDmitry Chagin  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19b2f58791SDmitry Chagin  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20b2f58791SDmitry Chagin  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21b2f58791SDmitry Chagin  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22b2f58791SDmitry Chagin  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23b2f58791SDmitry Chagin  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24b2f58791SDmitry Chagin  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25b2f58791SDmitry Chagin  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26b2f58791SDmitry Chagin  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27b2f58791SDmitry Chagin  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28b2f58791SDmitry Chagin  *
29b2f58791SDmitry Chagin  * $FreeBSD$
30b2f58791SDmitry Chagin  */
31b2f58791SDmitry Chagin 
32b2f58791SDmitry Chagin #ifndef _AMD64_LINUX_H_
33b2f58791SDmitry Chagin #define	_AMD64_LINUX_H_
34b2f58791SDmitry Chagin 
35b2f58791SDmitry Chagin #include <amd64/linux/linux_syscall.h>
36b2f58791SDmitry Chagin 
37b2f58791SDmitry Chagin /*
38b2f58791SDmitry Chagin  * debugging support
39b2f58791SDmitry Chagin  */
40b2f58791SDmitry Chagin extern u_char linux_debug_map[];
41b2f58791SDmitry Chagin #define	ldebug(name)	isclr(linux_debug_map, LINUX_SYS_linux_ ## name)
42b2f58791SDmitry Chagin #define	ARGS(nm, fmt)	"linux(%ld/%ld): "#nm"("fmt")\n",			\
43b2f58791SDmitry Chagin 			(long)td->td_proc->p_pid, (long)td->td_tid
44b2f58791SDmitry Chagin #define	LMSG(fmt)	"linux(%ld/%ld): "fmt"\n",				\
45b2f58791SDmitry Chagin 			(long)td->td_proc->p_pid, (long)td->td_tid
46b2f58791SDmitry Chagin #define	LINUX_DTRACE	linuxulator
47b2f58791SDmitry Chagin 
48b2f58791SDmitry Chagin #define	PTRIN(v)	(void *)(v)
49b2f58791SDmitry Chagin #define	PTROUT(v)	(uintptr_t)(v)
50b2f58791SDmitry Chagin 
51b2f58791SDmitry Chagin #define	CP(src,dst,fld) do { (dst).fld = (src).fld; } while (0)
52b2f58791SDmitry Chagin #define	CP2(src,dst,sfld,dfld) do { (dst).dfld = (src).sfld; } while (0)
53b2f58791SDmitry Chagin #define	PTRIN_CP(src,dst,fld) \
54b2f58791SDmitry Chagin 	do { (dst).fld = PTRIN((src).fld); } while (0)
55b2f58791SDmitry Chagin 
56b2f58791SDmitry Chagin /*
57b2f58791SDmitry Chagin  * Provide a separate set of types for the Linux types.
58b2f58791SDmitry Chagin  */
59b2f58791SDmitry Chagin typedef int32_t		l_int;
60b2f58791SDmitry Chagin typedef int64_t		l_long;
61b2f58791SDmitry Chagin typedef int16_t		l_short;
62b2f58791SDmitry Chagin typedef uint32_t	l_uint;
63b2f58791SDmitry Chagin typedef uint64_t	l_ulong;
64b2f58791SDmitry Chagin typedef uint16_t	l_ushort;
65b2f58791SDmitry Chagin 
66b2f58791SDmitry Chagin typedef l_ulong		l_uintptr_t;
67b2f58791SDmitry Chagin typedef l_long		l_clock_t;
68b2f58791SDmitry Chagin typedef l_int		l_daddr_t;
69b2f58791SDmitry Chagin typedef l_ulong		l_dev_t;
70b2f58791SDmitry Chagin typedef l_uint		l_gid_t;
71b2f58791SDmitry Chagin typedef l_uint		l_uid_t;
72b2f58791SDmitry Chagin typedef l_ulong		l_ino_t;
73b2f58791SDmitry Chagin typedef l_int		l_key_t;
74b2f58791SDmitry Chagin typedef l_long		l_loff_t;
75b2f58791SDmitry Chagin typedef l_uint		l_mode_t;
76b2f58791SDmitry Chagin typedef l_long		l_off_t;
77b2f58791SDmitry Chagin typedef l_int		l_pid_t;
78b2f58791SDmitry Chagin typedef l_ulong		l_size_t;
79b2f58791SDmitry Chagin typedef l_long		l_ssize_t;
80b2f58791SDmitry Chagin typedef l_long		l_suseconds_t;
81b2f58791SDmitry Chagin typedef l_long		l_time_t;
82b2f58791SDmitry Chagin typedef l_int		l_timer_t;
83b2f58791SDmitry Chagin typedef l_int		l_mqd_t;
84b2f58791SDmitry Chagin typedef l_size_t	l_socklen_t;
85*3e89b641SDmitry Chagin typedef	l_ulong		l_fd_mask;
86b2f58791SDmitry Chagin 
87b2f58791SDmitry Chagin typedef struct {
88b2f58791SDmitry Chagin 	l_int		val[2];
89b2f58791SDmitry Chagin } l_fsid_t;
90b2f58791SDmitry Chagin 
91b2f58791SDmitry Chagin typedef struct {
92b2f58791SDmitry Chagin 	l_time_t	tv_sec;
93b2f58791SDmitry Chagin 	l_suseconds_t	tv_usec;
94b2f58791SDmitry Chagin } l_timeval;
95b2f58791SDmitry Chagin 
96b2f58791SDmitry Chagin #define	l_fd_set	fd_set
97b2f58791SDmitry Chagin 
98b2f58791SDmitry Chagin /*
99b2f58791SDmitry Chagin  * Miscellaneous
100b2f58791SDmitry Chagin  */
101b2f58791SDmitry Chagin #define	LINUX_NAME_MAX		255
102b2f58791SDmitry Chagin #define	LINUX_CTL_MAXNAME	10
103b2f58791SDmitry Chagin 
1044048f59cSDmitry Chagin #define LINUX_AT_COUNT		19	/* Count of used aux entry types. */
105b2f58791SDmitry Chagin 
106b2f58791SDmitry Chagin struct l___sysctl_args
107b2f58791SDmitry Chagin {
108b2f58791SDmitry Chagin 	l_uintptr_t	name;
109b2f58791SDmitry Chagin 	l_int		nlen;
110b2f58791SDmitry Chagin 	l_uintptr_t	oldval;
111b2f58791SDmitry Chagin 	l_uintptr_t	oldlenp;
112b2f58791SDmitry Chagin 	l_uintptr_t	newval;
113b2f58791SDmitry Chagin 	l_size_t	newlen;
114b2f58791SDmitry Chagin 	l_ulong		__spare[4];
115b2f58791SDmitry Chagin };
116b2f58791SDmitry Chagin 
117b2f58791SDmitry Chagin /* Scheduling policies */
118b2f58791SDmitry Chagin #define	LINUX_SCHED_OTHER	0
119b2f58791SDmitry Chagin #define	LINUX_SCHED_FIFO	1
120b2f58791SDmitry Chagin #define	LINUX_SCHED_RR		2
121b2f58791SDmitry Chagin 
122b2f58791SDmitry Chagin /* Resource limits */
123b2f58791SDmitry Chagin #define	LINUX_RLIMIT_CPU	0
124b2f58791SDmitry Chagin #define	LINUX_RLIMIT_FSIZE	1
125b2f58791SDmitry Chagin #define	LINUX_RLIMIT_DATA	2
126b2f58791SDmitry Chagin #define	LINUX_RLIMIT_STACK	3
127b2f58791SDmitry Chagin #define	LINUX_RLIMIT_CORE	4
128b2f58791SDmitry Chagin #define	LINUX_RLIMIT_RSS	5
129b2f58791SDmitry Chagin #define	LINUX_RLIMIT_NPROC	6
130b2f58791SDmitry Chagin #define	LINUX_RLIMIT_NOFILE	7
131b2f58791SDmitry Chagin #define	LINUX_RLIMIT_MEMLOCK	8
132b2f58791SDmitry Chagin #define	LINUX_RLIMIT_AS		9	/* Address space limit */
133b2f58791SDmitry Chagin 
134b2f58791SDmitry Chagin #define	LINUX_RLIM_NLIMITS	10
135b2f58791SDmitry Chagin 
136b2f58791SDmitry Chagin struct l_rlimit {
137b2f58791SDmitry Chagin 	l_ulong		rlim_cur;
138b2f58791SDmitry Chagin 	l_ulong		rlim_max;
139b2f58791SDmitry Chagin };
140b2f58791SDmitry Chagin 
141b2f58791SDmitry Chagin /* mmap options */
142b2f58791SDmitry Chagin #define	LINUX_MAP_SHARED	0x0001
143b2f58791SDmitry Chagin #define	LINUX_MAP_PRIVATE	0x0002
144b2f58791SDmitry Chagin #define	LINUX_MAP_FIXED		0x0010
145b2f58791SDmitry Chagin #define	LINUX_MAP_ANON		0x0020
146b2f58791SDmitry Chagin #define	LINUX_MAP_GROWSDOWN	0x0100
147b2f58791SDmitry Chagin 
148b2f58791SDmitry Chagin /*
149b2f58791SDmitry Chagin  * stat family of syscalls
150b2f58791SDmitry Chagin  */
151b2f58791SDmitry Chagin struct l_timespec {
152b2f58791SDmitry Chagin 	l_time_t	tv_sec;
153b2f58791SDmitry Chagin 	l_long		tv_nsec;
154b2f58791SDmitry Chagin };
155b2f58791SDmitry Chagin 
156b2f58791SDmitry Chagin struct l_newstat {
157b2f58791SDmitry Chagin 	l_dev_t		st_dev;
158b2f58791SDmitry Chagin 	l_ino_t		st_ino;
159b2f58791SDmitry Chagin 	l_ulong		st_nlink;
160b2f58791SDmitry Chagin 	l_uint		st_mode;
161b2f58791SDmitry Chagin 	l_uid_t		st_uid;
162b2f58791SDmitry Chagin 	l_gid_t		st_gid;
163b2f58791SDmitry Chagin 	l_uint		__st_pad1;
164b2f58791SDmitry Chagin 	l_dev_t		st_rdev;
165b2f58791SDmitry Chagin 	l_off_t		st_size;
166b2f58791SDmitry Chagin 	l_long		st_blksize;
167b2f58791SDmitry Chagin 	l_long		st_blocks;
168b2f58791SDmitry Chagin 	struct l_timespec	st_atim;
169b2f58791SDmitry Chagin 	struct l_timespec	st_mtim;
170b2f58791SDmitry Chagin 	struct l_timespec	st_ctim;
171b2f58791SDmitry Chagin 	l_long		__unused1;
172b2f58791SDmitry Chagin 	l_long		__unused2;
173b2f58791SDmitry Chagin 	l_long		__unused3;
174b2f58791SDmitry Chagin };
175b2f58791SDmitry Chagin 
176b2f58791SDmitry Chagin /*
177b2f58791SDmitry Chagin  * Signalling
178b2f58791SDmitry Chagin  */
179b2f58791SDmitry Chagin #define	LINUX_SIGHUP		1
180b2f58791SDmitry Chagin #define	LINUX_SIGINT		2
181b2f58791SDmitry Chagin #define	LINUX_SIGQUIT		3
182b2f58791SDmitry Chagin #define	LINUX_SIGILL		4
183b2f58791SDmitry Chagin #define	LINUX_SIGTRAP		5
184b2f58791SDmitry Chagin #define	LINUX_SIGABRT		6
185b2f58791SDmitry Chagin #define	LINUX_SIGIOT		LINUX_SIGABRT
186b2f58791SDmitry Chagin #define	LINUX_SIGBUS		7
187b2f58791SDmitry Chagin #define	LINUX_SIGFPE		8
188b2f58791SDmitry Chagin #define	LINUX_SIGKILL		9
189b2f58791SDmitry Chagin #define	LINUX_SIGUSR1		10
190b2f58791SDmitry Chagin #define	LINUX_SIGSEGV		11
191b2f58791SDmitry Chagin #define	LINUX_SIGUSR2		12
192b2f58791SDmitry Chagin #define	LINUX_SIGPIPE		13
193b2f58791SDmitry Chagin #define	LINUX_SIGALRM		14
194b2f58791SDmitry Chagin #define	LINUX_SIGTERM		15
195b2f58791SDmitry Chagin #define	LINUX_SIGSTKFLT		16
196b2f58791SDmitry Chagin #define	LINUX_SIGCHLD		17
197b2f58791SDmitry Chagin #define	LINUX_SIGCONT		18
198b2f58791SDmitry Chagin #define	LINUX_SIGSTOP		19
199b2f58791SDmitry Chagin #define	LINUX_SIGTSTP		20
200b2f58791SDmitry Chagin #define	LINUX_SIGTTIN		21
201b2f58791SDmitry Chagin #define	LINUX_SIGTTOU		22
202b2f58791SDmitry Chagin #define	LINUX_SIGURG		23
203b2f58791SDmitry Chagin #define	LINUX_SIGXCPU		24
204b2f58791SDmitry Chagin #define	LINUX_SIGXFSZ		25
205b2f58791SDmitry Chagin #define	LINUX_SIGVTALRM		26
206b2f58791SDmitry Chagin #define	LINUX_SIGPROF		27
207b2f58791SDmitry Chagin #define	LINUX_SIGWINCH		28
208b2f58791SDmitry Chagin #define	LINUX_SIGIO		29
209b2f58791SDmitry Chagin #define	LINUX_SIGPOLL		LINUX_SIGIO
210b2f58791SDmitry Chagin #define	LINUX_SIGPWR		30
211b2f58791SDmitry Chagin #define	LINUX_SIGSYS		31
212b2f58791SDmitry Chagin #define	LINUX_SIGRTMIN		32
213b2f58791SDmitry Chagin 
214b2f58791SDmitry Chagin #define	LINUX_SIGTBLSZ		31
215b2f58791SDmitry Chagin #define	LINUX_NSIG		64
216b2f58791SDmitry Chagin #define	LINUX_NBPW		64
217b2f58791SDmitry Chagin #define	LINUX_NSIG_WORDS	(LINUX_NSIG / LINUX_NBPW)
218b2f58791SDmitry Chagin 
219b2f58791SDmitry Chagin /* sigaction flags */
220b2f58791SDmitry Chagin #define	LINUX_SA_NOCLDSTOP	0x00000001
221b2f58791SDmitry Chagin #define	LINUX_SA_NOCLDWAIT	0x00000002
222b2f58791SDmitry Chagin #define	LINUX_SA_SIGINFO	0x00000004
223b2f58791SDmitry Chagin #define	LINUX_SA_RESTORER	0x04000000
224b2f58791SDmitry Chagin #define	LINUX_SA_ONSTACK	0x08000000
225b2f58791SDmitry Chagin #define	LINUX_SA_RESTART	0x10000000
226b2f58791SDmitry Chagin #define	LINUX_SA_INTERRUPT	0x20000000
227b2f58791SDmitry Chagin #define	LINUX_SA_NOMASK		0x40000000
228b2f58791SDmitry Chagin #define	LINUX_SA_ONESHOT	0x80000000
229b2f58791SDmitry Chagin 
230b2f58791SDmitry Chagin /* sigprocmask actions */
231b2f58791SDmitry Chagin #define	LINUX_SIG_BLOCK		0
232b2f58791SDmitry Chagin #define	LINUX_SIG_UNBLOCK	1
233b2f58791SDmitry Chagin #define	LINUX_SIG_SETMASK	2
234b2f58791SDmitry Chagin 
235b2f58791SDmitry Chagin /* primitives to manipulate sigset_t */
236b2f58791SDmitry Chagin 
237b2f58791SDmitry Chagin #define	LINUX_SIGEMPTYSET(set)					\
238b2f58791SDmitry Chagin 	do {							\
239b2f58791SDmitry Chagin 		(set).__bits[0] = 0;				\
240b2f58791SDmitry Chagin 	} while(0)
241b2f58791SDmitry Chagin 
242b2f58791SDmitry Chagin #define	LINUX_SIGISMEMBER(set, sig)				\
243b2f58791SDmitry Chagin 	(1UL & ((set).__bits[0] >> _SIG_IDX(sig)))
244b2f58791SDmitry Chagin 
245b2f58791SDmitry Chagin #define	LINUX_SIGADDSET(set, sig)				\
246b2f58791SDmitry Chagin 	(set).__bits[0] |= 1UL << _SIG_IDX(sig)
247b2f58791SDmitry Chagin 
248b2f58791SDmitry Chagin /* sigaltstack */
249b2f58791SDmitry Chagin #define	LINUX_MINSIGSTKSZ	2048
250b2f58791SDmitry Chagin #define	LINUX_SS_ONSTACK	1
251b2f58791SDmitry Chagin #define	LINUX_SS_DISABLE	2
252b2f58791SDmitry Chagin 
253b2f58791SDmitry Chagin int linux_to_bsd_sigaltstack(int lsa);
254b2f58791SDmitry Chagin int bsd_to_linux_sigaltstack(int bsa);
255b2f58791SDmitry Chagin 
256b2f58791SDmitry Chagin typedef void	(*l_handler_t)(l_int);
257b2f58791SDmitry Chagin 
258b2f58791SDmitry Chagin typedef struct {
259b2f58791SDmitry Chagin 	l_ulong __bits[LINUX_NSIG_WORDS];
260b2f58791SDmitry Chagin } l_sigset_t;
261b2f58791SDmitry Chagin 
262b2f58791SDmitry Chagin typedef struct {
263b2f58791SDmitry Chagin 	l_handler_t	lsa_handler;
264b2f58791SDmitry Chagin 	l_ulong		lsa_flags;
265b2f58791SDmitry Chagin 	l_uintptr_t	lsa_restorer;
266b2f58791SDmitry Chagin 	l_sigset_t	lsa_mask;
267b2f58791SDmitry Chagin } l_sigaction_t;
268b2f58791SDmitry Chagin 
269b2f58791SDmitry Chagin typedef struct {
270b2f58791SDmitry Chagin 	l_uintptr_t	ss_sp;
271b2f58791SDmitry Chagin 	l_int		ss_flags;
272b2f58791SDmitry Chagin 	l_size_t	ss_size;
273b2f58791SDmitry Chagin } l_stack_t;
274b2f58791SDmitry Chagin 
275b2f58791SDmitry Chagin struct l_fpstate {
276b2f58791SDmitry Chagin 	u_int16_t cwd;
277b2f58791SDmitry Chagin 	u_int16_t swd;
278b2f58791SDmitry Chagin 	u_int16_t twd;
279b2f58791SDmitry Chagin 	u_int16_t fop;
280b2f58791SDmitry Chagin 	u_int64_t rip;
281b2f58791SDmitry Chagin 	u_int64_t rdp;
282b2f58791SDmitry Chagin 	u_int32_t mxcsr;
283b2f58791SDmitry Chagin 	u_int32_t mxcsr_mask;
284b2f58791SDmitry Chagin 	u_int32_t st_space[32];
285b2f58791SDmitry Chagin 	u_int32_t xmm_space[64];
286b2f58791SDmitry Chagin 	u_int32_t reserved2[24];
287b2f58791SDmitry Chagin };
288b2f58791SDmitry Chagin 
289b2f58791SDmitry Chagin struct l_sigcontext {
290b2f58791SDmitry Chagin 	l_ulong		sc_r8;
291b2f58791SDmitry Chagin 	l_ulong		sc_r9;
292b2f58791SDmitry Chagin 	l_ulong		sc_r10;
293b2f58791SDmitry Chagin 	l_ulong		sc_r11;
294b2f58791SDmitry Chagin 	l_ulong		sc_r12;
295b2f58791SDmitry Chagin 	l_ulong		sc_r13;
296b2f58791SDmitry Chagin 	l_ulong		sc_r14;
297b2f58791SDmitry Chagin 	l_ulong		sc_r15;
298b2f58791SDmitry Chagin 	l_ulong		sc_rdi;
299b2f58791SDmitry Chagin 	l_ulong		sc_rsi;
300b2f58791SDmitry Chagin 	l_ulong		sc_rbp;
301b2f58791SDmitry Chagin 	l_ulong		sc_rbx;
302b2f58791SDmitry Chagin 	l_ulong		sc_rdx;
303b2f58791SDmitry Chagin 	l_ulong		sc_rax;
304b2f58791SDmitry Chagin 	l_ulong		sc_rcx;
305b2f58791SDmitry Chagin 	l_ulong		sc_rsp;
306b2f58791SDmitry Chagin 	l_ulong		sc_rip;
307b2f58791SDmitry Chagin 	l_ulong		sc_rflags;
308b2f58791SDmitry Chagin 	l_ushort	sc_cs;
309b2f58791SDmitry Chagin 	l_ushort	sc_gs;
310b2f58791SDmitry Chagin 	l_ushort	sc_fs;
311b2f58791SDmitry Chagin 	l_ushort	sc___pad0;
312b2f58791SDmitry Chagin 	l_ulong		sc_err;
313b2f58791SDmitry Chagin 	l_ulong		sc_trapno;
314b2f58791SDmitry Chagin 	l_sigset_t	sc_mask;
315b2f58791SDmitry Chagin 	l_ulong		sc_cr2;
316b2f58791SDmitry Chagin 	struct l_fpstate *sc_fpstate;
317b2f58791SDmitry Chagin 	l_ulong		sc_reserved1[8];
318b2f58791SDmitry Chagin };
319b2f58791SDmitry Chagin 
320b2f58791SDmitry Chagin struct l_ucontext {
321b2f58791SDmitry Chagin 	l_ulong		uc_flags;
322b2f58791SDmitry Chagin 	l_uintptr_t	uc_link;
323b2f58791SDmitry Chagin 	l_stack_t	uc_stack;
324b2f58791SDmitry Chagin 	struct l_sigcontext	uc_mcontext;
325b2f58791SDmitry Chagin 	l_sigset_t	uc_sigmask;
326b2f58791SDmitry Chagin };
327b2f58791SDmitry Chagin 
328b2f58791SDmitry Chagin #define LINUX_SI_PREAMBLE_SIZE	(4 * sizeof(int))
329b2f58791SDmitry Chagin #define	LINUX_SI_MAX_SIZE	128
330b2f58791SDmitry Chagin #define	LINUX_SI_PAD_SIZE	((LINUX_SI_MAX_SIZE - \
331b2f58791SDmitry Chagin 				    LINUX_SI_PREAMBLE_SIZE) / sizeof(l_int))
332b2f58791SDmitry Chagin typedef union l_sigval {
333b2f58791SDmitry Chagin 	l_int		sival_int;
334b2f58791SDmitry Chagin 	l_uintptr_t	sival_ptr;
335b2f58791SDmitry Chagin } l_sigval_t;
336b2f58791SDmitry Chagin 
337b2f58791SDmitry Chagin typedef struct l_siginfo {
338b2f58791SDmitry Chagin 	l_int		lsi_signo;
339b2f58791SDmitry Chagin 	l_int		lsi_errno;
340b2f58791SDmitry Chagin 	l_int		lsi_code;
341b2f58791SDmitry Chagin 	union {
342b2f58791SDmitry Chagin 		l_int	_pad[LINUX_SI_PAD_SIZE];
343b2f58791SDmitry Chagin 
344b2f58791SDmitry Chagin 		struct {
345b2f58791SDmitry Chagin 			l_pid_t		_pid;
346b2f58791SDmitry Chagin 			l_uid_t		_uid;
347b2f58791SDmitry Chagin 		} _kill;
348b2f58791SDmitry Chagin 
349b2f58791SDmitry Chagin 		struct {
350b2f58791SDmitry Chagin 			l_timer_t	_tid;
351b2f58791SDmitry Chagin 			l_int		_overrun;
352b2f58791SDmitry Chagin 			char		_pad[sizeof(l_uid_t) - sizeof(int)];
353b2f58791SDmitry Chagin 			union l_sigval	_sigval;
354b2f58791SDmitry Chagin 			l_uint		_sys_private;
355b2f58791SDmitry Chagin 		} _timer;
356b2f58791SDmitry Chagin 
357b2f58791SDmitry Chagin 		struct {
358b2f58791SDmitry Chagin 			l_pid_t		_pid;		/* sender's pid */
359b2f58791SDmitry Chagin 			l_uid_t		_uid;		/* sender's uid */
360b2f58791SDmitry Chagin 			union l_sigval	_sigval;
361b2f58791SDmitry Chagin 		} _rt;
362b2f58791SDmitry Chagin 
363b2f58791SDmitry Chagin 		struct {
364b2f58791SDmitry Chagin 			l_pid_t		_pid;		/* which child */
365b2f58791SDmitry Chagin 			l_uid_t		_uid;		/* sender's uid */
366b2f58791SDmitry Chagin 			l_int		_status;	/* exit code */
367b2f58791SDmitry Chagin 			l_clock_t	_utime;
368b2f58791SDmitry Chagin 			l_clock_t	_stime;
369b2f58791SDmitry Chagin 		} _sigchld;
370b2f58791SDmitry Chagin 
371b2f58791SDmitry Chagin 		struct {
372b2f58791SDmitry Chagin 			l_uintptr_t	_addr;	/* Faulting insn/memory ref. */
373b2f58791SDmitry Chagin 		} _sigfault;
374b2f58791SDmitry Chagin 
375b2f58791SDmitry Chagin 		struct {
376b2f58791SDmitry Chagin 			l_long		_band;	/* POLL_IN,POLL_OUT,POLL_MSG */
377b2f58791SDmitry Chagin 			l_int		_fd;
378b2f58791SDmitry Chagin 		} _sigpoll;
379b2f58791SDmitry Chagin 	} _sifields;
380b2f58791SDmitry Chagin } l_siginfo_t;
381b2f58791SDmitry Chagin 
382b2f58791SDmitry Chagin #define	lsi_pid		_sifields._kill._pid
383b2f58791SDmitry Chagin #define	lsi_uid		_sifields._kill._uid
384b2f58791SDmitry Chagin #define	lsi_tid		_sifields._timer._tid
385b2f58791SDmitry Chagin #define	lsi_overrun	_sifields._timer._overrun
386b2f58791SDmitry Chagin #define	lsi_sys_private	_sifields._timer._sys_private
387b2f58791SDmitry Chagin #define	lsi_status	_sifields._sigchld._status
388b2f58791SDmitry Chagin #define	lsi_utime	_sifields._sigchld._utime
389b2f58791SDmitry Chagin #define	lsi_stime	_sifields._sigchld._stime
390b2f58791SDmitry Chagin #define	lsi_value	_sifields._rt._sigval
391b2f58791SDmitry Chagin #define	lsi_int		_sifields._rt._sigval.sival_int
392b2f58791SDmitry Chagin #define	lsi_ptr		_sifields._rt._sigval.sival_ptr
393b2f58791SDmitry Chagin #define	lsi_addr	_sifields._sigfault._addr
394b2f58791SDmitry Chagin #define	lsi_band	_sifields._sigpoll._band
395b2f58791SDmitry Chagin #define	lsi_fd		_sifields._sigpoll._fd
396b2f58791SDmitry Chagin 
397b2f58791SDmitry Chagin /*
398b2f58791SDmitry Chagin  * We make the stack look like Linux expects it when calling a signal
399b2f58791SDmitry Chagin  * handler, but use the BSD way of calling the handler and sigreturn().
400b2f58791SDmitry Chagin  * This means that we need to pass the pointer to the handler too.
401b2f58791SDmitry Chagin  * It is appended to the frame to not interfere with the rest of it.
402b2f58791SDmitry Chagin  */
403b2f58791SDmitry Chagin 
404b2f58791SDmitry Chagin struct l_rt_sigframe {
405b2f58791SDmitry Chagin 	struct l_ucontext	sf_sc;
406b2f58791SDmitry Chagin 	struct l_siginfo	sf_si;
407b2f58791SDmitry Chagin 	l_handler_t		sf_handler;
408b2f58791SDmitry Chagin };
409b2f58791SDmitry Chagin 
410b2f58791SDmitry Chagin /*
411b2f58791SDmitry Chagin  * mount flags
412b2f58791SDmitry Chagin  */
413b2f58791SDmitry Chagin #define	LINUX_MS_RDONLY		0x0001
414b2f58791SDmitry Chagin #define	LINUX_MS_NOSUID		0x0002
415b2f58791SDmitry Chagin #define	LINUX_MS_NODEV		0x0004
416b2f58791SDmitry Chagin #define	LINUX_MS_NOEXEC		0x0008
417b2f58791SDmitry Chagin #define	LINUX_MS_REMOUNT	0x0020
418b2f58791SDmitry Chagin 
419b2f58791SDmitry Chagin /*
420b2f58791SDmitry Chagin  * SystemV IPC defines
421b2f58791SDmitry Chagin  */
422b2f58791SDmitry Chagin #define	LINUX_IPC_RMID		0
423b2f58791SDmitry Chagin #define	LINUX_IPC_SET		1
424b2f58791SDmitry Chagin #define	LINUX_IPC_STAT		2
425b2f58791SDmitry Chagin #define	LINUX_IPC_INFO		3
426b2f58791SDmitry Chagin 
427b2f58791SDmitry Chagin #define	LINUX_SHM_LOCK		11
428b2f58791SDmitry Chagin #define	LINUX_SHM_UNLOCK	12
429b2f58791SDmitry Chagin #define	LINUX_SHM_STAT		13
430b2f58791SDmitry Chagin #define	LINUX_SHM_INFO		14
431b2f58791SDmitry Chagin 
432b2f58791SDmitry Chagin #define	LINUX_SHM_RDONLY	0x1000
433b2f58791SDmitry Chagin #define	LINUX_SHM_RND		0x2000
434b2f58791SDmitry Chagin #define	LINUX_SHM_REMAP		0x4000
435b2f58791SDmitry Chagin 
436b2f58791SDmitry Chagin /* semctl commands */
437b2f58791SDmitry Chagin #define	LINUX_GETPID		11
438b2f58791SDmitry Chagin #define	LINUX_GETVAL		12
439b2f58791SDmitry Chagin #define	LINUX_GETALL		13
440b2f58791SDmitry Chagin #define	LINUX_GETNCNT		14
441b2f58791SDmitry Chagin #define	LINUX_GETZCNT		15
442b2f58791SDmitry Chagin #define	LINUX_SETVAL		16
443b2f58791SDmitry Chagin #define	LINUX_SETALL		17
444b2f58791SDmitry Chagin #define	LINUX_SEM_STAT		18
445b2f58791SDmitry Chagin #define	LINUX_SEM_INFO		19
446b2f58791SDmitry Chagin 
447b2f58791SDmitry Chagin union l_semun {
448b2f58791SDmitry Chagin 	l_int		val;
449b2f58791SDmitry Chagin 	l_uintptr_t	buf;
450b2f58791SDmitry Chagin 	l_uintptr_t	array;
451b2f58791SDmitry Chagin 	l_uintptr_t	__buf;
452b2f58791SDmitry Chagin 	l_uintptr_t	__pad;
453b2f58791SDmitry Chagin };
454b2f58791SDmitry Chagin 
455b2f58791SDmitry Chagin struct l_ipc_perm {
456b2f58791SDmitry Chagin 	l_key_t		key;
457b2f58791SDmitry Chagin 	l_uid_t		uid;
458b2f58791SDmitry Chagin 	l_gid_t		gid;
459b2f58791SDmitry Chagin 	l_uid_t		cuid;
460b2f58791SDmitry Chagin 	l_gid_t		cgid;
461b2f58791SDmitry Chagin 	l_ushort	mode;
462b2f58791SDmitry Chagin 	l_ushort	seq;
463b2f58791SDmitry Chagin };
464b2f58791SDmitry Chagin 
465b2f58791SDmitry Chagin /*
466b2f58791SDmitry Chagin  * Socket defines
467b2f58791SDmitry Chagin  */
468b2f58791SDmitry Chagin 
469b2f58791SDmitry Chagin #define	LINUX_SOL_SOCKET	1
470b2f58791SDmitry Chagin #define	LINUX_SOL_IP		0
471b2f58791SDmitry Chagin #define	LINUX_SOL_IPX		256
472b2f58791SDmitry Chagin #define	LINUX_SOL_AX25		257
473b2f58791SDmitry Chagin #define	LINUX_SOL_TCP		6
474b2f58791SDmitry Chagin #define	LINUX_SOL_UDP		17
475b2f58791SDmitry Chagin 
476b2f58791SDmitry Chagin #define	LINUX_SO_DEBUG		1
477b2f58791SDmitry Chagin #define	LINUX_SO_REUSEADDR	2
478b2f58791SDmitry Chagin #define	LINUX_SO_TYPE		3
479b2f58791SDmitry Chagin #define	LINUX_SO_ERROR		4
480b2f58791SDmitry Chagin #define	LINUX_SO_DONTROUTE	5
481b2f58791SDmitry Chagin #define	LINUX_SO_BROADCAST	6
482b2f58791SDmitry Chagin #define	LINUX_SO_SNDBUF		7
483b2f58791SDmitry Chagin #define	LINUX_SO_RCVBUF		8
484b2f58791SDmitry Chagin #define	LINUX_SO_KEEPALIVE	9
485b2f58791SDmitry Chagin #define	LINUX_SO_OOBINLINE	10
486b2f58791SDmitry Chagin #define	LINUX_SO_NO_CHECK	11
487b2f58791SDmitry Chagin #define	LINUX_SO_PRIORITY	12
488b2f58791SDmitry Chagin #define	LINUX_SO_LINGER		13
489b2f58791SDmitry Chagin #define	LINUX_SO_PASSCRED	16
490b2f58791SDmitry Chagin #define	LINUX_SO_PEERCRED	17
491b2f58791SDmitry Chagin #define	LINUX_SO_RCVLOWAT	18
492b2f58791SDmitry Chagin #define	LINUX_SO_SNDLOWAT	19
493b2f58791SDmitry Chagin #define	LINUX_SO_RCVTIMEO	20
494b2f58791SDmitry Chagin #define	LINUX_SO_SNDTIMEO	21
495b2f58791SDmitry Chagin #define	LINUX_SO_TIMESTAMP	29
496b2f58791SDmitry Chagin #define	LINUX_SO_ACCEPTCONN	30
497b2f58791SDmitry Chagin 
498b2f58791SDmitry Chagin #define	LINUX_IP_TOS		1
499b2f58791SDmitry Chagin #define	LINUX_IP_TTL		2
500b2f58791SDmitry Chagin #define	LINUX_IP_HDRINCL	3
501b2f58791SDmitry Chagin #define	LINUX_IP_OPTIONS	4
502b2f58791SDmitry Chagin 
503b2f58791SDmitry Chagin #define	LINUX_IP_MULTICAST_IF		32
504b2f58791SDmitry Chagin #define	LINUX_IP_MULTICAST_TTL		33
505b2f58791SDmitry Chagin #define	LINUX_IP_MULTICAST_LOOP		34
506b2f58791SDmitry Chagin #define	LINUX_IP_ADD_MEMBERSHIP		35
507b2f58791SDmitry Chagin #define	LINUX_IP_DROP_MEMBERSHIP	36
508b2f58791SDmitry Chagin 
509b2f58791SDmitry Chagin struct l_sockaddr {
510b2f58791SDmitry Chagin 	l_ushort	sa_family;
511b2f58791SDmitry Chagin 	char		sa_data[14];
512b2f58791SDmitry Chagin };
513b2f58791SDmitry Chagin 
514b2f58791SDmitry Chagin struct l_msghdr {
515b2f58791SDmitry Chagin 	l_uintptr_t	msg_name;
516b2f58791SDmitry Chagin 	l_int		msg_namelen;
517b2f58791SDmitry Chagin 	l_uintptr_t	msg_iov;
518b2f58791SDmitry Chagin 	l_size_t	msg_iovlen;
519b2f58791SDmitry Chagin 	l_uintptr_t	msg_control;
520b2f58791SDmitry Chagin 	l_size_t	msg_controllen;
521b2f58791SDmitry Chagin 	l_uint		msg_flags;
522b2f58791SDmitry Chagin };
523b2f58791SDmitry Chagin 
524b2f58791SDmitry Chagin struct l_cmsghdr {
525b2f58791SDmitry Chagin 	l_size_t	cmsg_len;
526b2f58791SDmitry Chagin 	l_int		cmsg_level;
527b2f58791SDmitry Chagin 	l_int		cmsg_type;
528b2f58791SDmitry Chagin };
529b2f58791SDmitry Chagin 
530b2f58791SDmitry Chagin struct l_ifmap {
531b2f58791SDmitry Chagin 	l_ulong		mem_start;
532b2f58791SDmitry Chagin 	l_ulong		mem_end;
533b2f58791SDmitry Chagin 	l_ushort	base_addr;
534b2f58791SDmitry Chagin 	u_char		irq;
535b2f58791SDmitry Chagin 	u_char		dma;
536b2f58791SDmitry Chagin 	u_char		port;
537b2f58791SDmitry Chagin } __packed;
538b2f58791SDmitry Chagin 
539b2f58791SDmitry Chagin #define	LINUX_IFHWADDRLEN	6
540b2f58791SDmitry Chagin #define	LINUX_IFNAMSIZ		16
541b2f58791SDmitry Chagin 
542b2f58791SDmitry Chagin struct l_ifreq {
543b2f58791SDmitry Chagin 	union {
544b2f58791SDmitry Chagin 		char	ifrn_name[LINUX_IFNAMSIZ];
545b2f58791SDmitry Chagin 	} ifr_ifrn;
546b2f58791SDmitry Chagin 
547b2f58791SDmitry Chagin 	union {
548b2f58791SDmitry Chagin 		struct l_sockaddr	ifru_addr;
549b2f58791SDmitry Chagin 		struct l_sockaddr	ifru_dstaddr;
550b2f58791SDmitry Chagin 		struct l_sockaddr	ifru_broadaddr;
551b2f58791SDmitry Chagin 		struct l_sockaddr	ifru_netmask;
552b2f58791SDmitry Chagin 		struct l_sockaddr	ifru_hwaddr;
553b2f58791SDmitry Chagin 		l_short		ifru_flags[1];
554b2f58791SDmitry Chagin 		l_int		ifru_metric;
555b2f58791SDmitry Chagin 		l_int		ifru_mtu;
556b2f58791SDmitry Chagin 		struct l_ifmap	ifru_map;
557b2f58791SDmitry Chagin 		char		ifru_slave[LINUX_IFNAMSIZ];
558b2f58791SDmitry Chagin 		l_uintptr_t	ifru_data;
559b2f58791SDmitry Chagin 	} ifr_ifru;
560b2f58791SDmitry Chagin } __packed;
561b2f58791SDmitry Chagin 
562b2f58791SDmitry Chagin #define	ifr_name	ifr_ifrn.ifrn_name	/* Interface name */
563b2f58791SDmitry Chagin #define	ifr_hwaddr	ifr_ifru.ifru_hwaddr	/* MAC address */
564b2f58791SDmitry Chagin 
565b2f58791SDmitry Chagin struct l_ifconf {
566b2f58791SDmitry Chagin 	int	ifc_len;
567b2f58791SDmitry Chagin 	union {
568b2f58791SDmitry Chagin 		l_uintptr_t	ifcu_buf;
569b2f58791SDmitry Chagin 		l_uintptr_t	ifcu_req;
570b2f58791SDmitry Chagin 	} ifc_ifcu;
571b2f58791SDmitry Chagin };
572b2f58791SDmitry Chagin 
573b2f58791SDmitry Chagin #define	ifc_buf		ifc_ifcu.ifcu_buf
574b2f58791SDmitry Chagin #define	ifc_req		ifc_ifcu.ifcu_req
575b2f58791SDmitry Chagin 
576b2f58791SDmitry Chagin /*
577b2f58791SDmitry Chagin  * poll()
578b2f58791SDmitry Chagin  */
579b2f58791SDmitry Chagin #define	LINUX_POLLIN		0x0001
580b2f58791SDmitry Chagin #define	LINUX_POLLPRI		0x0002
581b2f58791SDmitry Chagin #define	LINUX_POLLOUT		0x0004
582b2f58791SDmitry Chagin #define	LINUX_POLLERR		0x0008
583b2f58791SDmitry Chagin #define	LINUX_POLLHUP		0x0010
584b2f58791SDmitry Chagin #define	LINUX_POLLNVAL		0x0020
585b2f58791SDmitry Chagin #define	LINUX_POLLRDNORM	0x0040
586b2f58791SDmitry Chagin #define	LINUX_POLLRDBAND	0x0080
587b2f58791SDmitry Chagin #define	LINUX_POLLWRNORM	0x0100
588b2f58791SDmitry Chagin #define	LINUX_POLLWRBAND	0x0200
589b2f58791SDmitry Chagin #define	LINUX_POLLMSG		0x0400
590b2f58791SDmitry Chagin 
591b2f58791SDmitry Chagin struct l_pollfd {
592b2f58791SDmitry Chagin 	l_int		fd;
593b2f58791SDmitry Chagin 	l_short		events;
594b2f58791SDmitry Chagin 	l_short		revents;
595b2f58791SDmitry Chagin };
596b2f58791SDmitry Chagin 
597b2f58791SDmitry Chagin 
598b2f58791SDmitry Chagin #define	LINUX_CLONE_VM			0x00000100
599b2f58791SDmitry Chagin #define	LINUX_CLONE_FS			0x00000200
600b2f58791SDmitry Chagin #define	LINUX_CLONE_FILES		0x00000400
601b2f58791SDmitry Chagin #define	LINUX_CLONE_SIGHAND		0x00000800
602b2f58791SDmitry Chagin #define	LINUX_CLONE_PID			0x00001000	/* No longer exist in Linux */
603b2f58791SDmitry Chagin #define	LINUX_CLONE_VFORK		0x00004000
604b2f58791SDmitry Chagin #define	LINUX_CLONE_PARENT		0x00008000
605b2f58791SDmitry Chagin #define	LINUX_CLONE_THREAD		0x00010000
606b2f58791SDmitry Chagin #define	LINUX_CLONE_SETTLS		0x00080000
607b2f58791SDmitry Chagin #define	LINUX_CLONE_PARENT_SETTID	0x00100000
608b2f58791SDmitry Chagin #define	LINUX_CLONE_CHILD_CLEARTID	0x00200000
609b2f58791SDmitry Chagin #define	LINUX_CLONE_CHILD_SETTID	0x01000000
610b2f58791SDmitry Chagin 
611b2f58791SDmitry Chagin #define LINUX_ARCH_SET_GS		0x1001
612b2f58791SDmitry Chagin #define LINUX_ARCH_SET_FS		0x1002
613b2f58791SDmitry Chagin #define LINUX_ARCH_GET_GS		0x1003
614b2f58791SDmitry Chagin #define LINUX_ARCH_GET_FS		0x1004
615b2f58791SDmitry Chagin 
616b2f58791SDmitry Chagin #define	linux_copyout_rusage(r, u)	copyout(r, u, sizeof(*r))
617b2f58791SDmitry Chagin 
618b2f58791SDmitry Chagin /* robust futexes */
619b2f58791SDmitry Chagin struct linux_robust_list {
620b2f58791SDmitry Chagin 	l_uintptr_t			next;
621b2f58791SDmitry Chagin };
622b2f58791SDmitry Chagin 
623b2f58791SDmitry Chagin struct linux_robust_list_head {
624b2f58791SDmitry Chagin 	struct linux_robust_list	list;
625b2f58791SDmitry Chagin 	l_long				futex_offset;
626b2f58791SDmitry Chagin 	l_uintptr_t			pending_list;
627b2f58791SDmitry Chagin };
628b2f58791SDmitry Chagin 
629b2f58791SDmitry Chagin #endif /* !_AMD64_LINUX_H_ */
630