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