linux.h revision 293587
1/*-
2 * Copyright (c) 2004 Tim J. Robbins
3 * Copyright (c) 2001 Doug Rabson
4 * Copyright (c) 1994-1996 S��ren Schmidt
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer
12 *    in this position and unchanged.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 * 3. The name of the author may not be used to endorse or promote products
17 *    derived from this software without specific prior written permission
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 *
30 * $FreeBSD: stable/10/sys/amd64/linux32/linux.h 293587 2016-01-09 17:49:05Z dchagin $
31 */
32
33#ifndef _AMD64_LINUX_H_
34#define	_AMD64_LINUX_H_
35
36#include <compat/linux/linux.h>
37#include <amd64/linux32/linux32_syscall.h>
38
39/*
40 * debugging support
41 */
42extern u_char linux_debug_map[];
43#define	ldebug(name)	isclr(linux_debug_map, LINUX_SYS_linux_ ## name)
44#define	ARGS(nm, fmt)	"linux(%ld/%ld): "#nm"("fmt")\n",			\
45			(long)td->td_proc->p_pid, (long)td->td_tid
46#define	LMSG(fmt)	"linux(%ld/%ld): "fmt"\n",				\
47			(long)td->td_proc->p_pid, (long)td->td_tid
48#define	LINUX_DTRACE	linuxulator32
49
50#define	LINUX32_MAXUSER		((1ul << 32) - PAGE_SIZE)
51#define	LINUX32_SHAREDPAGE	(LINUX32_MAXUSER - PAGE_SIZE)
52#define	LINUX32_USRSTACK	LINUX32_SHAREDPAGE
53
54/* XXX 16 = sizeof(linux32_ps_strings) */
55#define	LINUX32_PS_STRINGS	(LINUX32_USRSTACK - 16)
56#define	LINUX32_MAXDSIZ		(512 * 1024 * 1024)	/* 512MB */
57#define	LINUX32_MAXSSIZ		(64 * 1024 * 1024)	/* 64MB */
58#define	LINUX32_MAXVMEM		0			/* Unlimited */
59
60#define	PTRIN(v)	(void *)(uintptr_t)(v)
61#define	PTROUT(v)	(l_uintptr_t)(uintptr_t)(v)
62
63#define	CP(src,dst,fld) do { (dst).fld = (src).fld; } while (0)
64#define	CP2(src,dst,sfld,dfld) do { (dst).dfld = (src).sfld; } while (0)
65#define	PTRIN_CP(src,dst,fld) \
66	do { (dst).fld = PTRIN((src).fld); } while (0)
67
68/*
69 * Provide a separate set of types for the Linux types.
70 */
71typedef int		l_int;
72typedef int32_t		l_long;
73typedef int64_t		l_longlong;
74typedef short		l_short;
75typedef unsigned int	l_uint;
76typedef uint32_t	l_ulong;
77typedef uint64_t	l_ulonglong;
78typedef unsigned short	l_ushort;
79
80typedef l_ulong		l_uintptr_t;
81typedef l_long		l_clock_t;
82typedef l_int		l_daddr_t;
83typedef l_ushort	l_dev_t;
84typedef l_uint		l_gid_t;
85typedef l_ushort	l_gid16_t;
86typedef l_ulong		l_ino_t;
87typedef l_int		l_key_t;
88typedef l_longlong	l_loff_t;
89typedef l_ushort	l_mode_t;
90typedef l_long		l_off_t;
91typedef l_int		l_pid_t;
92typedef l_uint		l_size_t;
93typedef l_long		l_suseconds_t;
94typedef l_long		l_time_t;
95typedef l_uint		l_uid_t;
96typedef l_ushort	l_uid16_t;
97typedef l_int		l_timer_t;
98typedef l_int		l_mqd_t;
99typedef	l_ulong		l_fd_mask;
100
101typedef struct {
102	l_int		val[2];
103} __packed l_fsid_t;
104
105typedef struct {
106	l_time_t	tv_sec;
107	l_suseconds_t	tv_usec;
108} l_timeval;
109
110#define	l_fd_set	fd_set
111
112/*
113 * Miscellaneous
114 */
115#define	LINUX_AT_COUNT		20	/* Count of used aux entry types.
116					 * Keep this synchronized with
117					 * elf_linux_fixup() code.
118					 */
119struct l___sysctl_args
120{
121	l_uintptr_t	name;
122	l_int		nlen;
123	l_uintptr_t	oldval;
124	l_uintptr_t	oldlenp;
125	l_uintptr_t	newval;
126	l_size_t	newlen;
127	l_ulong		__spare[4];
128} __packed;
129
130/* Resource limits */
131#define	LINUX_RLIMIT_CPU	0
132#define	LINUX_RLIMIT_FSIZE	1
133#define	LINUX_RLIMIT_DATA	2
134#define	LINUX_RLIMIT_STACK	3
135#define	LINUX_RLIMIT_CORE	4
136#define	LINUX_RLIMIT_RSS	5
137#define	LINUX_RLIMIT_NPROC	6
138#define	LINUX_RLIMIT_NOFILE	7
139#define	LINUX_RLIMIT_MEMLOCK	8
140#define	LINUX_RLIMIT_AS		9	/* Address space limit */
141
142#define	LINUX_RLIM_NLIMITS	10
143
144struct l_rlimit {
145	l_ulong rlim_cur;
146	l_ulong rlim_max;
147} __packed;
148
149struct l_rusage {
150	l_timeval ru_utime;
151	l_timeval ru_stime;
152	l_long	ru_maxrss;
153	l_long	ru_ixrss;
154	l_long	ru_idrss;
155	l_long	ru_isrss;
156	l_long	ru_minflt;
157	l_long	ru_majflt;
158	l_long	ru_nswap;
159	l_long	ru_inblock;
160	l_long	ru_oublock;
161	l_long	ru_msgsnd;
162	l_long	ru_msgrcv;
163	l_long	ru_nsignals;
164	l_long	ru_nvcsw;
165	l_long	ru_nivcsw;
166} __packed;
167
168/* mmap options */
169#define	LINUX_MAP_SHARED	0x0001
170#define	LINUX_MAP_PRIVATE	0x0002
171#define	LINUX_MAP_FIXED		0x0010
172#define	LINUX_MAP_ANON		0x0020
173#define	LINUX_MAP_GROWSDOWN	0x0100
174
175struct l_mmap_argv {
176	l_uintptr_t	addr;
177	l_size_t	len;
178	l_int		prot;
179	l_int		flags;
180	l_int		fd;
181	l_ulong		pgoff;
182};
183
184/*
185 * stat family of syscalls
186 */
187struct l_timespec {
188	l_time_t	tv_sec;
189	l_long		tv_nsec;
190} __packed;
191
192struct l_newstat {
193	l_ushort	st_dev;
194	l_ushort	__pad1;
195	l_ulong		st_ino;
196	l_ushort	st_mode;
197	l_ushort	st_nlink;
198	l_ushort	st_uid;
199	l_ushort	st_gid;
200	l_ushort	st_rdev;
201	l_ushort	__pad2;
202	l_ulong		st_size;
203	l_ulong		st_blksize;
204	l_ulong		st_blocks;
205	struct l_timespec	st_atim;
206	struct l_timespec	st_mtim;
207	struct l_timespec	st_ctim;
208	l_ulong		__unused4;
209	l_ulong		__unused5;
210} __packed;
211
212struct l_stat {
213	l_ushort	st_dev;
214	l_ulong		st_ino;
215	l_ushort	st_mode;
216	l_ushort	st_nlink;
217	l_ushort	st_uid;
218	l_ushort	st_gid;
219	l_ushort	st_rdev;
220	l_long		st_size;
221	struct l_timespec	st_atim;
222	struct l_timespec	st_mtim;
223	struct l_timespec	st_ctim;
224	l_long		st_blksize;
225	l_long		st_blocks;
226	l_ulong		st_flags;
227	l_ulong		st_gen;
228};
229
230struct l_stat64 {
231	l_ushort	st_dev;
232	u_char		__pad0[10];
233	l_ulong		__st_ino;
234	l_uint		st_mode;
235	l_uint		st_nlink;
236	l_ulong		st_uid;
237	l_ulong		st_gid;
238	l_ushort	st_rdev;
239	u_char		__pad3[10];
240	l_longlong	st_size;
241	l_ulong		st_blksize;
242	l_ulong		st_blocks;
243	l_ulong		__pad4;
244	struct l_timespec	st_atim;
245	struct l_timespec	st_mtim;
246	struct l_timespec	st_ctim;
247	l_ulonglong	st_ino;
248} __packed;
249
250struct l_statfs64 {
251        l_int           f_type;
252        l_int           f_bsize;
253        uint64_t        f_blocks;
254        uint64_t        f_bfree;
255        uint64_t        f_bavail;
256        uint64_t        f_files;
257        uint64_t        f_ffree;
258        l_fsid_t        f_fsid;
259        l_int           f_namelen;
260        l_int           f_spare[6];
261} __packed;
262
263/* sigaction flags */
264#define	LINUX_SA_NOCLDSTOP	0x00000001
265#define	LINUX_SA_NOCLDWAIT	0x00000002
266#define	LINUX_SA_SIGINFO	0x00000004
267#define	LINUX_SA_RESTORER	0x04000000
268#define	LINUX_SA_ONSTACK	0x08000000
269#define	LINUX_SA_RESTART	0x10000000
270#define	LINUX_SA_INTERRUPT	0x20000000
271#define	LINUX_SA_NOMASK		0x40000000
272#define	LINUX_SA_ONESHOT	0x80000000
273
274/* sigprocmask actions */
275#define	LINUX_SIG_BLOCK		0
276#define	LINUX_SIG_UNBLOCK	1
277#define	LINUX_SIG_SETMASK	2
278
279/* sigaltstack */
280#define	LINUX_MINSIGSTKSZ	2048
281
282typedef l_uintptr_t l_handler_t;
283typedef l_ulong	l_osigset_t;
284
285typedef struct {
286	l_handler_t	lsa_handler;
287	l_osigset_t	lsa_mask;
288	l_ulong		lsa_flags;
289	l_uintptr_t	lsa_restorer;
290} __packed l_osigaction_t;
291
292typedef struct {
293	l_handler_t	lsa_handler;
294	l_ulong		lsa_flags;
295	l_uintptr_t	lsa_restorer;
296	l_sigset_t	lsa_mask;
297} __packed l_sigaction_t;
298
299typedef struct {
300	l_uintptr_t	ss_sp;
301	l_int		ss_flags;
302	l_size_t	ss_size;
303} __packed l_stack_t;
304
305/* The Linux sigcontext, pretty much a standard 386 trapframe. */
306struct l_sigcontext {
307	l_uint		sc_gs;
308	l_uint		sc_fs;
309	l_uint		sc_es;
310	l_uint		sc_ds;
311	l_uint		sc_edi;
312	l_uint		sc_esi;
313	l_uint		sc_ebp;
314	l_uint		sc_esp;
315	l_uint		sc_ebx;
316	l_uint		sc_edx;
317	l_uint		sc_ecx;
318	l_uint		sc_eax;
319	l_uint		sc_trapno;
320	l_uint		sc_err;
321	l_uint		sc_eip;
322	l_uint		sc_cs;
323	l_uint		sc_eflags;
324	l_uint		sc_esp_at_signal;
325	l_uint		sc_ss;
326	l_uint		sc_387;
327	l_uint		sc_mask;
328	l_uint		sc_cr2;
329} __packed;
330
331struct l_ucontext {
332	l_ulong		uc_flags;
333	l_uintptr_t	uc_link;
334	l_stack_t	uc_stack;
335	struct l_sigcontext	uc_mcontext;
336	l_sigset_t	uc_sigmask;
337} __packed;
338
339#define	LINUX_SI_MAX_SIZE	128
340#define	LINUX_SI_PAD_SIZE	((LINUX_SI_MAX_SIZE/sizeof(l_int)) - 3)
341
342typedef union l_sigval {
343	l_int		sival_int;
344	l_uintptr_t	sival_ptr;
345} l_sigval_t;
346
347typedef struct l_siginfo {
348	l_int		lsi_signo;
349	l_int		lsi_errno;
350	l_int		lsi_code;
351	union {
352		l_int	_pad[LINUX_SI_PAD_SIZE];
353
354		struct {
355			l_pid_t		_pid;
356			l_uid_t		_uid;
357		} __packed _kill;
358
359		struct {
360			l_timer_t	_tid;
361			l_int		_overrun;
362			char		_pad[sizeof(l_uid_t) - sizeof(l_int)];
363			l_sigval_t	_sigval;
364			l_int		_sys_private;
365		} __packed _timer;
366
367		struct {
368			l_pid_t		_pid;		/* sender's pid */
369			l_uid_t		_uid;		/* sender's uid */
370			l_sigval_t	_sigval;
371		} __packed _rt;
372
373		struct {
374			l_pid_t		_pid;		/* which child */
375			l_uid_t		_uid;		/* sender's uid */
376			l_int		_status;	/* exit code */
377			l_clock_t	_utime;
378			l_clock_t	_stime;
379		} __packed _sigchld;
380
381		struct {
382			l_uintptr_t	_addr;	/* Faulting insn/memory ref. */
383		} __packed _sigfault;
384
385		struct {
386			l_long		_band;	/* POLL_IN,POLL_OUT,POLL_MSG */
387			l_int		_fd;
388		} __packed _sigpoll;
389	} _sifields;
390} __packed l_siginfo_t;
391
392#define	lsi_pid		_sifields._kill._pid
393#define	lsi_uid		_sifields._kill._uid
394#define	lsi_tid		_sifields._timer._tid
395#define	lsi_overrun	_sifields._timer._overrun
396#define	lsi_sys_private	_sifields._timer._sys_private
397#define	lsi_status	_sifields._sigchld._status
398#define	lsi_utime	_sifields._sigchld._utime
399#define	lsi_stime	_sifields._sigchld._stime
400#define	lsi_value	_sifields._rt._sigval
401#define	lsi_int		_sifields._rt._sigval.sival_int
402#define	lsi_ptr		_sifields._rt._sigval.sival_ptr
403#define	lsi_addr	_sifields._sigfault._addr
404#define	lsi_band	_sifields._sigpoll._band
405#define	lsi_fd		_sifields._sigpoll._fd
406
407struct l_fpreg {
408	u_int16_t	significand[4];
409	u_int16_t	exponent;
410} __packed;
411
412struct l_fpxreg {
413	u_int16_t	significand[4];
414	u_int16_t	exponent;
415	u_int16_t	padding[3];
416} __packed;
417
418struct l_xmmreg {
419	u_int32_t	element[4];
420} __packed;
421
422struct l_fpstate {
423	/* Regular FPU environment */
424	u_int32_t		cw;
425	u_int32_t		sw;
426	u_int32_t		tag;
427	u_int32_t		ipoff;
428	u_int32_t		cssel;
429	u_int32_t		dataoff;
430	u_int32_t		datasel;
431	struct l_fpreg		_st[8];
432	u_int16_t		status;
433	u_int16_t		magic;		/* 0xffff = regular FPU data */
434
435	/* FXSR FPU environment */
436	u_int32_t		_fxsr_env[6];	/* env is ignored. */
437	u_int32_t		mxcsr;
438	u_int32_t		reserved;
439	struct l_fpxreg		_fxsr_st[8];	/* reg data is ignored. */
440	struct l_xmmreg		_xmm[8];
441	u_int32_t		padding[56];
442} __packed;
443
444/*
445 * We make the stack look like Linux expects it when calling a signal
446 * handler, but use the BSD way of calling the handler and sigreturn().
447 * This means that we need to pass the pointer to the handler too.
448 * It is appended to the frame to not interfere with the rest of it.
449 */
450struct l_sigframe {
451	l_int			sf_sig;
452	struct l_sigcontext	sf_sc;
453	struct l_fpstate	sf_fpstate;
454	l_uint			sf_extramask[1];
455	l_handler_t		sf_handler;
456} __packed;
457
458struct l_rt_sigframe {
459	l_int			sf_sig;
460	l_uintptr_t 		sf_siginfo;
461	l_uintptr_t		sf_ucontext;
462	l_siginfo_t		sf_si;
463	struct l_ucontext 	sf_sc;
464	l_handler_t 		sf_handler;
465} __packed;
466
467/*
468 * arch specific open/fcntl flags
469 */
470#define	LINUX_F_GETLK64		12
471#define	LINUX_F_SETLK64		13
472#define	LINUX_F_SETLKW64	14
473
474union l_semun {
475	l_int		val;
476	l_uintptr_t	buf;
477	l_uintptr_t	array;
478	l_uintptr_t	__buf;
479	l_uintptr_t	__pad;
480} __packed;
481
482struct l_ipc_perm {
483	l_key_t		key;
484	l_uid16_t	uid;
485	l_gid16_t	gid;
486	l_uid16_t	cuid;
487	l_gid16_t	cgid;
488	l_ushort	mode;
489	l_ushort	seq;
490};
491
492/*
493 * Socket defines
494 */
495#define	LINUX_SOL_SOCKET	1
496#define	LINUX_SOL_IP		0
497#define	LINUX_SOL_IPX		256
498#define	LINUX_SOL_AX25		257
499#define	LINUX_SOL_TCP		6
500#define	LINUX_SOL_UDP		17
501
502#define	LINUX_SO_DEBUG		1
503#define	LINUX_SO_REUSEADDR	2
504#define	LINUX_SO_TYPE		3
505#define	LINUX_SO_ERROR		4
506#define	LINUX_SO_DONTROUTE	5
507#define	LINUX_SO_BROADCAST	6
508#define	LINUX_SO_SNDBUF		7
509#define	LINUX_SO_RCVBUF		8
510#define	LINUX_SO_KEEPALIVE	9
511#define	LINUX_SO_OOBINLINE	10
512#define	LINUX_SO_NO_CHECK	11
513#define	LINUX_SO_PRIORITY	12
514#define	LINUX_SO_LINGER		13
515#define	LINUX_SO_PEERCRED	17
516#define	LINUX_SO_RCVLOWAT	18
517#define	LINUX_SO_SNDLOWAT	19
518#define	LINUX_SO_RCVTIMEO	20
519#define	LINUX_SO_SNDTIMEO	21
520#define	LINUX_SO_TIMESTAMP	29
521#define	LINUX_SO_ACCEPTCONN	30
522
523struct l_sockaddr {
524	l_ushort	sa_family;
525	char		sa_data[14];
526} __packed;
527
528struct l_ifmap {
529	l_ulong		mem_start;
530	l_ulong		mem_end;
531	l_ushort	base_addr;
532	u_char		irq;
533	u_char		dma;
534	u_char		port;
535} __packed;
536
537#define	LINUX_IFHWADDRLEN	6
538#define	LINUX_IFNAMSIZ		16
539
540struct l_ifreq {
541	union {
542		char	ifrn_name[LINUX_IFNAMSIZ];
543	} ifr_ifrn;
544
545	union {
546		struct l_sockaddr	ifru_addr;
547		struct l_sockaddr	ifru_dstaddr;
548		struct l_sockaddr	ifru_broadaddr;
549		struct l_sockaddr	ifru_netmask;
550		struct l_sockaddr	ifru_hwaddr;
551		l_short		ifru_flags[1];
552		l_int		ifru_metric;
553		l_int		ifru_mtu;
554		struct l_ifmap	ifru_map;
555		char		ifru_slave[LINUX_IFNAMSIZ];
556		l_uintptr_t	ifru_data;
557	} ifr_ifru;
558} __packed;
559
560#define	ifr_name	ifr_ifrn.ifrn_name	/* Interface name */
561#define	ifr_hwaddr	ifr_ifru.ifru_hwaddr	/* MAC address */
562
563struct l_ifconf {
564	int	ifc_len;
565	union {
566		l_uintptr_t	ifcu_buf;
567		l_uintptr_t	ifcu_req;
568	} ifc_ifcu;
569} __packed;
570
571#define	ifc_buf		ifc_ifcu.ifcu_buf
572#define	ifc_req		ifc_ifcu.ifcu_req
573
574/*
575 * poll()
576 */
577#define	LINUX_POLLIN		0x0001
578#define	LINUX_POLLPRI		0x0002
579#define	LINUX_POLLOUT		0x0004
580#define	LINUX_POLLERR		0x0008
581#define	LINUX_POLLHUP		0x0010
582#define	LINUX_POLLNVAL		0x0020
583#define	LINUX_POLLRDNORM	0x0040
584#define	LINUX_POLLRDBAND	0x0080
585#define	LINUX_POLLWRNORM	0x0100
586#define	LINUX_POLLWRBAND	0x0200
587#define	LINUX_POLLMSG		0x0400
588
589struct l_pollfd {
590	l_int		fd;
591	l_short		events;
592	l_short		revents;
593} __packed;
594
595struct l_user_desc {
596	l_uint		entry_number;
597	l_uint		base_addr;
598	l_uint		limit;
599	l_uint		seg_32bit:1;
600	l_uint		contents:2;
601	l_uint		read_exec_only:1;
602	l_uint		limit_in_pages:1;
603	l_uint		seg_not_present:1;
604	l_uint		useable:1;
605};
606
607#define	LINUX_LOWERWORD	0x0000ffff
608
609/*
610 * Macros which does the same thing as those in Linux include/asm-um/ldt-i386.h.
611 * These convert Linux user space descriptor to machine one.
612 */
613#define	LINUX_LDT_entry_a(info)					\
614	((((info)->base_addr & LINUX_LOWERWORD) << 16) |	\
615	((info)->limit & LINUX_LOWERWORD))
616
617#define	LINUX_ENTRY_B_READ_EXEC_ONLY	9
618#define	LINUX_ENTRY_B_CONTENTS		10
619#define	LINUX_ENTRY_B_SEG_NOT_PRESENT	15
620#define	LINUX_ENTRY_B_BASE_ADDR		16
621#define	LINUX_ENTRY_B_USEABLE		20
622#define	LINUX_ENTRY_B_SEG32BIT		22
623#define	LINUX_ENTRY_B_LIMIT		23
624
625#define	LINUX_LDT_entry_b(info)							\
626	(((info)->base_addr & 0xff000000) |					\
627	((info)->limit & 0xf0000) |						\
628	((info)->contents << LINUX_ENTRY_B_CONTENTS) |				\
629	(((info)->seg_not_present == 0) << LINUX_ENTRY_B_SEG_NOT_PRESENT) |	\
630	(((info)->base_addr & 0x00ff0000) >> LINUX_ENTRY_B_BASE_ADDR) |		\
631	(((info)->read_exec_only == 0) << LINUX_ENTRY_B_READ_EXEC_ONLY) |	\
632	((info)->seg_32bit << LINUX_ENTRY_B_SEG32BIT) |				\
633	((info)->useable << LINUX_ENTRY_B_USEABLE) |				\
634	((info)->limit_in_pages << LINUX_ENTRY_B_LIMIT) | 0x7000)
635
636#define	LINUX_LDT_empty(info)		\
637	((info)->base_addr == 0 &&	\
638	(info)->limit == 0 &&		\
639	(info)->contents == 0 &&	\
640	(info)->seg_not_present == 1 &&	\
641	(info)->read_exec_only == 1 &&	\
642	(info)->seg_32bit == 0 &&	\
643	(info)->limit_in_pages == 0 &&	\
644	(info)->useable == 0)
645
646/*
647 * Macros for converting segments.
648 * They do the same as those in arch/i386/kernel/process.c in Linux.
649 */
650#define	LINUX_GET_BASE(desc)				\
651	((((desc)->a >> 16) & LINUX_LOWERWORD) |	\
652	(((desc)->b << 16) & 0x00ff0000) |		\
653	((desc)->b & 0xff000000))
654
655#define	LINUX_GET_LIMIT(desc)			\
656	(((desc)->a & LINUX_LOWERWORD) |	\
657	((desc)->b & 0xf0000))
658
659#define	LINUX_GET_32BIT(desc)		\
660	(((desc)->b >> LINUX_ENTRY_B_SEG32BIT) & 1)
661#define	LINUX_GET_CONTENTS(desc)	\
662	(((desc)->b >> LINUX_ENTRY_B_CONTENTS) & 3)
663#define	LINUX_GET_WRITABLE(desc)	\
664	(((desc)->b >> LINUX_ENTRY_B_READ_EXEC_ONLY) & 1)
665#define	LINUX_GET_LIMIT_PAGES(desc)	\
666	(((desc)->b >> LINUX_ENTRY_B_LIMIT) & 1)
667#define	LINUX_GET_PRESENT(desc)		\
668	(((desc)->b >> LINUX_ENTRY_B_SEG_NOT_PRESENT) & 1)
669#define	LINUX_GET_USEABLE(desc)		\
670	(((desc)->b >> LINUX_ENTRY_B_USEABLE) & 1)
671
672struct iovec;
673
674struct l_iovec32 {
675	uint32_t	iov_base;
676	l_size_t	iov_len;
677};
678
679int linux32_copyiniov(struct l_iovec32 *iovp32, l_ulong iovcnt,
680			    struct iovec **iovp, int error);
681int linux_copyout_rusage(struct rusage *ru, void *uaddr);
682
683/* robust futexes */
684struct linux_robust_list {
685	l_uintptr_t			next;
686};
687
688struct linux_robust_list_head {
689	struct linux_robust_list	list;
690	l_long				futex_offset;
691	l_uintptr_t			pending_list;
692};
693
694#endif /* !_AMD64_LINUX_H_ */
695