Deleted Added
full compact
linux.h (293500) linux.h (293514)
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 *
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: stable/10/sys/i386/linux/linux.h 293500 2016-01-09 15:23:54Z dchagin $
28 * $FreeBSD: stable/10/sys/i386/linux/linux.h 293514 2016-01-09 15:44:38Z dchagin $
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 */
41extern u_char linux_debug_map[];
42#define ldebug(name) isclr(linux_debug_map, LINUX_SYS_linux_ ## name)
43#define ARGS(nm, fmt) "linux(%ld/%ld): "#nm"("fmt")\n", \
44 (long)td->td_proc->p_pid, (long)td->td_tid
45#define LMSG(fmt) "linux(%ld/%ld): "fmt"\n", \
46 (long)td->td_proc->p_pid, (long)td->td_tid
47#define LINUX_DTRACE linuxulator
48
49#ifdef MALLOC_DECLARE
50MALLOC_DECLARE(M_LINUX);
51#endif
52
53#define LINUX_SHAREDPAGE (VM_MAXUSER_ADDRESS - PAGE_SIZE)
54#define LINUX_USRSTACK LINUX_SHAREDPAGE
55
56#define PTRIN(v) (void *)(v)
57#define PTROUT(v) (l_uintptr_t)(v)
58
59#define CP(src,dst,fld) do { (dst).fld = (src).fld; } while (0)
60#define CP2(src,dst,sfld,dfld) do { (dst).dfld = (src).sfld; } while (0)
61#define PTRIN_CP(src,dst,fld) \
62 do { (dst).fld = PTRIN((src).fld); } while (0)
63
64/*
65 * Provide a separate set of types for the Linux types.
66 */
67typedef int l_int;
68typedef int32_t l_long;
69typedef int64_t l_longlong;
70typedef short l_short;
71typedef unsigned int l_uint;
72typedef uint32_t l_ulong;
73typedef uint64_t l_ulonglong;
74typedef unsigned short l_ushort;
75
76typedef char *l_caddr_t;
77typedef l_ulong l_uintptr_t;
78typedef l_long l_clock_t;
79typedef l_int l_daddr_t;
80typedef l_ushort l_dev_t;
81typedef l_uint l_gid_t;
82typedef l_ushort l_gid16_t;
83typedef l_ulong l_ino_t;
84typedef l_int l_key_t;
85typedef l_longlong l_loff_t;
86typedef l_ushort l_mode_t;
87typedef l_long l_off_t;
88typedef l_int l_pid_t;
89typedef l_uint l_size_t;
90typedef l_long l_suseconds_t;
91typedef l_long l_time_t;
92typedef l_uint l_uid_t;
93typedef l_ushort l_uid16_t;
94typedef l_int l_timer_t;
95typedef l_int l_mqd_t;
96
97typedef struct {
98 l_int val[2];
99} l_fsid_t;
100
101typedef struct {
102 l_time_t tv_sec;
103 l_suseconds_t tv_usec;
104} l_timeval;
105
106#define l_fd_set fd_set
107
108/*
109 * Miscellaneous
110 */
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 */
41extern u_char linux_debug_map[];
42#define ldebug(name) isclr(linux_debug_map, LINUX_SYS_linux_ ## name)
43#define ARGS(nm, fmt) "linux(%ld/%ld): "#nm"("fmt")\n", \
44 (long)td->td_proc->p_pid, (long)td->td_tid
45#define LMSG(fmt) "linux(%ld/%ld): "fmt"\n", \
46 (long)td->td_proc->p_pid, (long)td->td_tid
47#define LINUX_DTRACE linuxulator
48
49#ifdef MALLOC_DECLARE
50MALLOC_DECLARE(M_LINUX);
51#endif
52
53#define LINUX_SHAREDPAGE (VM_MAXUSER_ADDRESS - PAGE_SIZE)
54#define LINUX_USRSTACK LINUX_SHAREDPAGE
55
56#define PTRIN(v) (void *)(v)
57#define PTROUT(v) (l_uintptr_t)(v)
58
59#define CP(src,dst,fld) do { (dst).fld = (src).fld; } while (0)
60#define CP2(src,dst,sfld,dfld) do { (dst).dfld = (src).sfld; } while (0)
61#define PTRIN_CP(src,dst,fld) \
62 do { (dst).fld = PTRIN((src).fld); } while (0)
63
64/*
65 * Provide a separate set of types for the Linux types.
66 */
67typedef int l_int;
68typedef int32_t l_long;
69typedef int64_t l_longlong;
70typedef short l_short;
71typedef unsigned int l_uint;
72typedef uint32_t l_ulong;
73typedef uint64_t l_ulonglong;
74typedef unsigned short l_ushort;
75
76typedef char *l_caddr_t;
77typedef l_ulong l_uintptr_t;
78typedef l_long l_clock_t;
79typedef l_int l_daddr_t;
80typedef l_ushort l_dev_t;
81typedef l_uint l_gid_t;
82typedef l_ushort l_gid16_t;
83typedef l_ulong l_ino_t;
84typedef l_int l_key_t;
85typedef l_longlong l_loff_t;
86typedef l_ushort l_mode_t;
87typedef l_long l_off_t;
88typedef l_int l_pid_t;
89typedef l_uint l_size_t;
90typedef l_long l_suseconds_t;
91typedef l_long l_time_t;
92typedef l_uint l_uid_t;
93typedef l_ushort l_uid16_t;
94typedef l_int l_timer_t;
95typedef l_int l_mqd_t;
96
97typedef struct {
98 l_int val[2];
99} l_fsid_t;
100
101typedef struct {
102 l_time_t tv_sec;
103 l_suseconds_t tv_usec;
104} l_timeval;
105
106#define l_fd_set fd_set
107
108/*
109 * Miscellaneous
110 */
111#define LINUX_AT_COUNT 16 /* Count of used aux entry types.
111#define LINUX_AT_COUNT 18 /* Count of used aux entry types.
112 * Keep this synchronized with
113 * elf_linux_fixup() code.
114 */
115struct l___sysctl_args
116{
117 l_int *name;
118 l_int nlen;
119 void *oldval;
120 l_size_t *oldlenp;
121 void *newval;
122 l_size_t newlen;
123 l_ulong __spare[4];
124};
125
126/* Resource limits */
127#define LINUX_RLIMIT_CPU 0
128#define LINUX_RLIMIT_FSIZE 1
129#define LINUX_RLIMIT_DATA 2
130#define LINUX_RLIMIT_STACK 3
131#define LINUX_RLIMIT_CORE 4
132#define LINUX_RLIMIT_RSS 5
133#define LINUX_RLIMIT_NPROC 6
134#define LINUX_RLIMIT_NOFILE 7
135#define LINUX_RLIMIT_MEMLOCK 8
136#define LINUX_RLIMIT_AS 9 /* Address space limit */
137
138#define LINUX_RLIM_NLIMITS 10
139
140struct l_rlimit {
141 l_ulong rlim_cur;
142 l_ulong rlim_max;
143};
144
145/* mmap options */
146#define LINUX_MAP_SHARED 0x0001
147#define LINUX_MAP_PRIVATE 0x0002
148#define LINUX_MAP_FIXED 0x0010
149#define LINUX_MAP_ANON 0x0020
150#define LINUX_MAP_GROWSDOWN 0x0100
151
152struct l_mmap_argv {
153 l_uintptr_t addr;
154 l_size_t len;
155 l_int prot;
156 l_int flags;
157 l_int fd;
158 l_off_t pgoff;
159} __packed;
160
161/*
162 * stat family of syscalls
163 */
164struct l_timespec {
165 l_time_t tv_sec;
166 l_long tv_nsec;
167};
168
169struct l_newstat {
170 l_ushort st_dev;
171 l_ushort __pad1;
172 l_ulong st_ino;
173 l_ushort st_mode;
174 l_ushort st_nlink;
175 l_ushort st_uid;
176 l_ushort st_gid;
177 l_ushort st_rdev;
178 l_ushort __pad2;
179 l_ulong st_size;
180 l_ulong st_blksize;
181 l_ulong st_blocks;
182 struct l_timespec st_atim;
183 struct l_timespec st_mtim;
184 struct l_timespec st_ctim;
185 l_ulong __unused4;
186 l_ulong __unused5;
187};
188
189struct l_stat {
190 l_ushort st_dev;
191 l_ulong st_ino;
192 l_ushort st_mode;
193 l_ushort st_nlink;
194 l_ushort st_uid;
195 l_ushort st_gid;
196 l_ushort st_rdev;
197 l_long st_size;
198 struct l_timespec st_atim;
199 struct l_timespec st_mtim;
200 struct l_timespec st_ctim;
201 l_long st_blksize;
202 l_long st_blocks;
203 l_ulong st_flags;
204 l_ulong st_gen;
205};
206
207struct l_stat64 {
208 l_ushort st_dev;
209 u_char __pad0[10];
210 l_ulong __st_ino;
211 l_uint st_mode;
212 l_uint st_nlink;
213 l_ulong st_uid;
214 l_ulong st_gid;
215 l_ushort st_rdev;
216 u_char __pad3[10];
217 l_longlong st_size;
218 l_ulong st_blksize;
219 l_ulong st_blocks;
220 l_ulong __pad4;
221 struct l_timespec st_atim;
222 struct l_timespec st_mtim;
223 struct l_timespec st_ctim;
224 l_ulonglong st_ino;
225};
226
227struct l_statfs64 {
228 l_int f_type;
229 l_int f_bsize;
230 uint64_t f_blocks;
231 uint64_t f_bfree;
232 uint64_t f_bavail;
233 uint64_t f_files;
234 uint64_t f_ffree;
235 l_fsid_t f_fsid;
236 l_int f_namelen;
237 l_int f_spare[6];
238};
239
240/*
241 * Signalling
242 */
243#define LINUX_SIGHUP 1
244#define LINUX_SIGINT 2
245#define LINUX_SIGQUIT 3
246#define LINUX_SIGILL 4
247#define LINUX_SIGTRAP 5
248#define LINUX_SIGABRT 6
249#define LINUX_SIGIOT LINUX_SIGABRT
250#define LINUX_SIGBUS 7
251#define LINUX_SIGFPE 8
252#define LINUX_SIGKILL 9
253#define LINUX_SIGUSR1 10
254#define LINUX_SIGSEGV 11
255#define LINUX_SIGUSR2 12
256#define LINUX_SIGPIPE 13
257#define LINUX_SIGALRM 14
258#define LINUX_SIGTERM 15
259#define LINUX_SIGSTKFLT 16
260#define LINUX_SIGCHLD 17
261#define LINUX_SIGCONT 18
262#define LINUX_SIGSTOP 19
263#define LINUX_SIGTSTP 20
264#define LINUX_SIGTTIN 21
265#define LINUX_SIGTTOU 22
266#define LINUX_SIGURG 23
267#define LINUX_SIGXCPU 24
268#define LINUX_SIGXFSZ 25
269#define LINUX_SIGVTALRM 26
270#define LINUX_SIGPROF 27
271#define LINUX_SIGWINCH 28
272#define LINUX_SIGIO 29
273#define LINUX_SIGPOLL LINUX_SIGIO
274#define LINUX_SIGPWR 30
275#define LINUX_SIGSYS 31
276#define LINUX_SIGRTMIN 32
277
278#define LINUX_SIGTBLSZ 31
279#define LINUX_NSIG_WORDS 2
280#define LINUX_NBPW 32
281#define LINUX_NSIG (LINUX_NBPW * LINUX_NSIG_WORDS)
282
283/* sigaction flags */
284#define LINUX_SA_NOCLDSTOP 0x00000001
285#define LINUX_SA_NOCLDWAIT 0x00000002
286#define LINUX_SA_SIGINFO 0x00000004
287#define LINUX_SA_RESTORER 0x04000000
288#define LINUX_SA_ONSTACK 0x08000000
289#define LINUX_SA_RESTART 0x10000000
290#define LINUX_SA_INTERRUPT 0x20000000
291#define LINUX_SA_NOMASK 0x40000000
292#define LINUX_SA_ONESHOT 0x80000000
293
294/* sigprocmask actions */
295#define LINUX_SIG_BLOCK 0
296#define LINUX_SIG_UNBLOCK 1
297#define LINUX_SIG_SETMASK 2
298
299/* sigset_t macros */
300#define LINUX_SIGEMPTYSET(set) (set).__bits[0] = (set).__bits[1] = 0
301#define LINUX_SIGISMEMBER(set, sig) SIGISMEMBER(set, sig)
302#define LINUX_SIGADDSET(set, sig) SIGADDSET(set, sig)
303
304/* sigaltstack */
305#define LINUX_MINSIGSTKSZ 2048
306#define LINUX_SS_ONSTACK 1
307#define LINUX_SS_DISABLE 2
308
309int linux_to_bsd_sigaltstack(int lsa);
310int bsd_to_linux_sigaltstack(int bsa);
311
312typedef void (*l_handler_t)(l_int);
313typedef l_ulong l_osigset_t;
314
315typedef struct {
316 l_uint __bits[LINUX_NSIG_WORDS];
317} l_sigset_t;
318
319typedef struct {
320 l_handler_t lsa_handler;
321 l_osigset_t lsa_mask;
322 l_ulong lsa_flags;
323 void (*lsa_restorer)(void);
324} l_osigaction_t;
325
326typedef struct {
327 l_handler_t lsa_handler;
328 l_ulong lsa_flags;
329 void (*lsa_restorer)(void);
330 l_sigset_t lsa_mask;
331} l_sigaction_t;
332
333typedef struct {
334 void *ss_sp;
335 l_int ss_flags;
336 l_size_t ss_size;
337} l_stack_t;
338
339/* The Linux sigcontext, pretty much a standard 386 trapframe. */
340struct l_sigcontext {
341 l_int sc_gs;
342 l_int sc_fs;
343 l_int sc_es;
344 l_int sc_ds;
345 l_int sc_edi;
346 l_int sc_esi;
347 l_int sc_ebp;
348 l_int sc_esp;
349 l_int sc_ebx;
350 l_int sc_edx;
351 l_int sc_ecx;
352 l_int sc_eax;
353 l_int sc_trapno;
354 l_int sc_err;
355 l_int sc_eip;
356 l_int sc_cs;
357 l_int sc_eflags;
358 l_int sc_esp_at_signal;
359 l_int sc_ss;
360 l_int sc_387;
361 l_int sc_mask;
362 l_int sc_cr2;
363};
364
365struct l_ucontext {
366 l_ulong uc_flags;
367 void *uc_link;
368 l_stack_t uc_stack;
369 struct l_sigcontext uc_mcontext;
370 l_sigset_t uc_sigmask;
371};
372
373#define LINUX_SI_MAX_SIZE 128
374#define LINUX_SI_PAD_SIZE ((LINUX_SI_MAX_SIZE/sizeof(l_int)) - 3)
375
376typedef union l_sigval {
377 l_int sival_int;
378 l_uintptr_t sival_ptr;
379} l_sigval_t;
380
381typedef struct l_siginfo {
382 l_int lsi_signo;
383 l_int lsi_errno;
384 l_int lsi_code;
385 union {
386 l_int _pad[LINUX_SI_PAD_SIZE];
387
388 struct {
389 l_pid_t _pid;
390 l_uid_t _uid;
391 } _kill;
392
393 struct {
394 l_timer_t _tid;
395 l_int _overrun;
396 char _pad[sizeof(l_uid_t) - sizeof(l_int)];
397 l_sigval_t _sigval;
398 l_int _sys_private;
399 } _timer;
400
401 struct {
402 l_pid_t _pid; /* sender's pid */
403 l_uid_t _uid; /* sender's uid */
404 l_sigval_t _sigval;
405 } _rt;
406
407 struct {
408 l_pid_t _pid; /* which child */
409 l_uid_t _uid; /* sender's uid */
410 l_int _status; /* exit code */
411 l_clock_t _utime;
412 l_clock_t _stime;
413 } _sigchld;
414
415 struct {
416 l_uintptr_t _addr; /* Faulting insn/memory ref. */
417 } _sigfault;
418
419 struct {
420 l_long _band; /* POLL_IN,POLL_OUT,POLL_MSG */
421 l_int _fd;
422 } _sigpoll;
423 } _sifields;
424} l_siginfo_t;
425
426#define lsi_pid _sifields._kill._pid
427#define lsi_uid _sifields._kill._uid
428#define lsi_tid _sifields._timer._tid
429#define lsi_overrun _sifields._timer._overrun
430#define lsi_sys_private _sifields._timer._sys_private
431#define lsi_status _sifields._sigchld._status
432#define lsi_utime _sifields._sigchld._utime
433#define lsi_stime _sifields._sigchld._stime
434#define lsi_value _sifields._rt._sigval
435#define lsi_int _sifields._rt._sigval.sival_int
436#define lsi_ptr _sifields._rt._sigval.sival_ptr
437#define lsi_addr _sifields._sigfault._addr
438#define lsi_band _sifields._sigpoll._band
439#define lsi_fd _sifields._sigpoll._fd
440
441struct l_fpreg {
442 u_int16_t significand[4];
443 u_int16_t exponent;
444};
445
446struct l_fpxreg {
447 u_int16_t significand[4];
448 u_int16_t exponent;
449 u_int16_t padding[3];
450};
451
452struct l_xmmreg {
453 u_int32_t element[4];
454};
455
456struct l_fpstate {
457 /* Regular FPU environment */
458 u_int32_t cw;
459 u_int32_t sw;
460 u_int32_t tag;
461 u_int32_t ipoff;
462 u_int32_t cssel;
463 u_int32_t dataoff;
464 u_int32_t datasel;
465 struct l_fpreg _st[8];
466 u_int16_t status;
467 u_int16_t magic; /* 0xffff = regular FPU data */
468
469 /* FXSR FPU environment */
470 u_int32_t _fxsr_env[6]; /* env is ignored. */
471 u_int32_t mxcsr;
472 u_int32_t reserved;
473 struct l_fpxreg _fxsr_st[8]; /* reg data is ignored. */
474 struct l_xmmreg _xmm[8];
475 u_int32_t padding[56];
476};
477
478/*
479 * We make the stack look like Linux expects it when calling a signal
480 * handler, but use the BSD way of calling the handler and sigreturn().
481 * This means that we need to pass the pointer to the handler too.
482 * It is appended to the frame to not interfere with the rest of it.
483 */
484struct l_sigframe {
485 l_int sf_sig;
486 struct l_sigcontext sf_sc;
487 struct l_fpstate sf_fpstate;
488 l_uint sf_extramask[LINUX_NSIG_WORDS-1];
489 l_handler_t sf_handler;
490};
491
492struct l_rt_sigframe {
493 l_int sf_sig;
494 l_siginfo_t *sf_siginfo;
495 struct l_ucontext *sf_ucontext;
496 l_siginfo_t sf_si;
497 struct l_ucontext sf_sc;
498 l_handler_t sf_handler;
499};
500
501extern struct sysentvec linux_sysvec;
502extern struct sysentvec elf_linux_sysvec;
503
504/*
505 * open/fcntl flags
506 */
507#define LINUX_O_RDONLY 00000000
508#define LINUX_O_WRONLY 00000001
509#define LINUX_O_RDWR 00000002
510#define LINUX_O_ACCMODE 00000003
511#define LINUX_O_CREAT 00000100
512#define LINUX_O_EXCL 00000200
513#define LINUX_O_NOCTTY 00000400
514#define LINUX_O_TRUNC 00001000
515#define LINUX_O_APPEND 00002000
516#define LINUX_O_NONBLOCK 00004000
517#define LINUX_O_NDELAY LINUX_O_NONBLOCK
518#define LINUX_O_SYNC 00010000
519#define LINUX_FASYNC 00020000
520#define LINUX_O_DIRECT 00040000 /* Direct disk access hint */
521#define LINUX_O_LARGEFILE 00100000
522#define LINUX_O_DIRECTORY 00200000 /* Must be a directory */
523#define LINUX_O_NOFOLLOW 00400000 /* Do not follow links */
524#define LINUX_O_NOATIME 01000000
525#define LINUX_O_CLOEXEC 02000000
526
527#define LINUX_F_DUPFD 0
528#define LINUX_F_GETFD 1
529#define LINUX_F_SETFD 2
530#define LINUX_F_GETFL 3
531#define LINUX_F_SETFL 4
532#define LINUX_F_GETLK 5
533#define LINUX_F_SETLK 6
534#define LINUX_F_SETLKW 7
535#define LINUX_F_SETOWN 8
536#define LINUX_F_GETOWN 9
537
538#define LINUX_F_GETLK64 12
539#define LINUX_F_SETLK64 13
540#define LINUX_F_SETLKW64 14
541
542#define LINUX_F_RDLCK 0
543#define LINUX_F_WRLCK 1
544#define LINUX_F_UNLCK 2
545
546union l_semun {
547 l_int val;
548 struct l_semid_ds *buf;
549 l_ushort *array;
550 struct l_seminfo *__buf;
551 void *__pad;
552};
553
554/*
555 * Socket defines
556 */
557#define LINUX_SOL_SOCKET 1
558#define LINUX_SOL_IP 0
559#define LINUX_SOL_IPX 256
560#define LINUX_SOL_AX25 257
561#define LINUX_SOL_TCP 6
562#define LINUX_SOL_UDP 17
563
564#define LINUX_SO_DEBUG 1
565#define LINUX_SO_REUSEADDR 2
566#define LINUX_SO_TYPE 3
567#define LINUX_SO_ERROR 4
568#define LINUX_SO_DONTROUTE 5
569#define LINUX_SO_BROADCAST 6
570#define LINUX_SO_SNDBUF 7
571#define LINUX_SO_RCVBUF 8
572#define LINUX_SO_KEEPALIVE 9
573#define LINUX_SO_OOBINLINE 10
574#define LINUX_SO_NO_CHECK 11
575#define LINUX_SO_PRIORITY 12
576#define LINUX_SO_LINGER 13
577#define LINUX_SO_PEERCRED 17
578#define LINUX_SO_RCVLOWAT 18
579#define LINUX_SO_SNDLOWAT 19
580#define LINUX_SO_RCVTIMEO 20
581#define LINUX_SO_SNDTIMEO 21
582#define LINUX_SO_TIMESTAMP 29
583#define LINUX_SO_ACCEPTCONN 30
584
585struct l_sockaddr {
586 l_ushort sa_family;
587 char sa_data[14];
588};
589
590struct l_msghdr {
591 l_uintptr_t msg_name;
592 l_int msg_namelen;
593 l_uintptr_t msg_iov;
594 l_size_t msg_iovlen;
595 l_uintptr_t msg_control;
596 l_size_t msg_controllen;
597 l_uint msg_flags;
598};
599
600struct l_cmsghdr {
601 l_size_t cmsg_len;
602 l_int cmsg_level;
603 l_int cmsg_type;
604};
605
606struct l_ifmap {
607 l_ulong mem_start;
608 l_ulong mem_end;
609 l_ushort base_addr;
610 u_char irq;
611 u_char dma;
612 u_char port;
613};
614
615#define LINUX_IFHWADDRLEN 6
616#define LINUX_IFNAMSIZ 16
617
618struct l_ifreq {
619 union {
620 char ifrn_name[LINUX_IFNAMSIZ];
621 } ifr_ifrn;
622
623 union {
624 struct l_sockaddr ifru_addr;
625 struct l_sockaddr ifru_dstaddr;
626 struct l_sockaddr ifru_broadaddr;
627 struct l_sockaddr ifru_netmask;
628 struct l_sockaddr ifru_hwaddr;
629 l_short ifru_flags[1];
630 l_int ifru_metric;
631 l_int ifru_mtu;
632 struct l_ifmap ifru_map;
633 char ifru_slave[LINUX_IFNAMSIZ];
634 l_caddr_t ifru_data;
635 } ifr_ifru;
636};
637
638#define ifr_name ifr_ifrn.ifrn_name /* Interface name */
639#define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */
640
641/*
642 * poll()
643 */
644#define LINUX_POLLIN 0x0001
645#define LINUX_POLLPRI 0x0002
646#define LINUX_POLLOUT 0x0004
647#define LINUX_POLLERR 0x0008
648#define LINUX_POLLHUP 0x0010
649#define LINUX_POLLNVAL 0x0020
650#define LINUX_POLLRDNORM 0x0040
651#define LINUX_POLLRDBAND 0x0080
652#define LINUX_POLLWRNORM 0x0100
653#define LINUX_POLLWRBAND 0x0200
654#define LINUX_POLLMSG 0x0400
655
656struct l_pollfd {
657 l_int fd;
658 l_short events;
659 l_short revents;
660};
661
662struct l_user_desc {
663 l_uint entry_number;
664 l_uint base_addr;
665 l_uint limit;
666 l_uint seg_32bit:1;
667 l_uint contents:2;
668 l_uint read_exec_only:1;
669 l_uint limit_in_pages:1;
670 l_uint seg_not_present:1;
671 l_uint useable:1;
672};
673
674struct l_desc_struct {
675 unsigned long a, b;
676};
677
678
679#define LINUX_LOWERWORD 0x0000ffff
680
681/*
682 * Macros which does the same thing as those in Linux include/asm-um/ldt-i386.h.
683 * These convert Linux user space descriptor to machine one.
684 */
685#define LINUX_LDT_entry_a(info) \
686 ((((info)->base_addr & LINUX_LOWERWORD) << 16) | \
687 ((info)->limit & LINUX_LOWERWORD))
688
689#define LINUX_ENTRY_B_READ_EXEC_ONLY 9
690#define LINUX_ENTRY_B_CONTENTS 10
691#define LINUX_ENTRY_B_SEG_NOT_PRESENT 15
692#define LINUX_ENTRY_B_BASE_ADDR 16
693#define LINUX_ENTRY_B_USEABLE 20
694#define LINUX_ENTRY_B_SEG32BIT 22
695#define LINUX_ENTRY_B_LIMIT 23
696
697#define LINUX_LDT_entry_b(info) \
698 (((info)->base_addr & 0xff000000) | \
699 ((info)->limit & 0xf0000) | \
700 ((info)->contents << LINUX_ENTRY_B_CONTENTS) | \
701 (((info)->seg_not_present == 0) << LINUX_ENTRY_B_SEG_NOT_PRESENT) | \
702 (((info)->base_addr & 0x00ff0000) >> LINUX_ENTRY_B_BASE_ADDR) | \
703 (((info)->read_exec_only == 0) << LINUX_ENTRY_B_READ_EXEC_ONLY) | \
704 ((info)->seg_32bit << LINUX_ENTRY_B_SEG32BIT) | \
705 ((info)->useable << LINUX_ENTRY_B_USEABLE) | \
706 ((info)->limit_in_pages << LINUX_ENTRY_B_LIMIT) | 0x7000)
707
708#define LINUX_LDT_empty(info) \
709 ((info)->base_addr == 0 && \
710 (info)->limit == 0 && \
711 (info)->contents == 0 && \
712 (info)->seg_not_present == 1 && \
713 (info)->read_exec_only == 1 && \
714 (info)->seg_32bit == 0 && \
715 (info)->limit_in_pages == 0 && \
716 (info)->useable == 0)
717
718/*
719 * Macros for converting segments.
720 * They do the same as those in arch/i386/kernel/process.c in Linux.
721 */
722#define LINUX_GET_BASE(desc) \
723 ((((desc)->a >> 16) & LINUX_LOWERWORD) | \
724 (((desc)->b << 16) & 0x00ff0000) | \
725 ((desc)->b & 0xff000000))
726
727#define LINUX_GET_LIMIT(desc) \
728 (((desc)->a & LINUX_LOWERWORD) | \
729 ((desc)->b & 0xf0000))
730
731#define LINUX_GET_32BIT(desc) \
732 (((desc)->b >> LINUX_ENTRY_B_SEG32BIT) & 1)
733#define LINUX_GET_CONTENTS(desc) \
734 (((desc)->b >> LINUX_ENTRY_B_CONTENTS) & 3)
735#define LINUX_GET_WRITABLE(desc) \
736 (((desc)->b >> LINUX_ENTRY_B_READ_EXEC_ONLY) & 1)
737#define LINUX_GET_LIMIT_PAGES(desc) \
738 (((desc)->b >> LINUX_ENTRY_B_LIMIT) & 1)
739#define LINUX_GET_PRESENT(desc) \
740 (((desc)->b >> LINUX_ENTRY_B_SEG_NOT_PRESENT) & 1)
741#define LINUX_GET_USEABLE(desc) \
742 (((desc)->b >> LINUX_ENTRY_B_USEABLE) & 1)
743
744#define linux_copyout_rusage(r, u) copyout(r, u, sizeof(*r))
745
746/* robust futexes */
747struct linux_robust_list {
748 struct linux_robust_list *next;
749};
750
751struct linux_robust_list_head {
752 struct linux_robust_list list;
753 l_long futex_offset;
754 struct linux_robust_list *pending_list;
755};
756
757#endif /* !_I386_LINUX_H_ */
112 * Keep this synchronized with
113 * elf_linux_fixup() code.
114 */
115struct l___sysctl_args
116{
117 l_int *name;
118 l_int nlen;
119 void *oldval;
120 l_size_t *oldlenp;
121 void *newval;
122 l_size_t newlen;
123 l_ulong __spare[4];
124};
125
126/* Resource limits */
127#define LINUX_RLIMIT_CPU 0
128#define LINUX_RLIMIT_FSIZE 1
129#define LINUX_RLIMIT_DATA 2
130#define LINUX_RLIMIT_STACK 3
131#define LINUX_RLIMIT_CORE 4
132#define LINUX_RLIMIT_RSS 5
133#define LINUX_RLIMIT_NPROC 6
134#define LINUX_RLIMIT_NOFILE 7
135#define LINUX_RLIMIT_MEMLOCK 8
136#define LINUX_RLIMIT_AS 9 /* Address space limit */
137
138#define LINUX_RLIM_NLIMITS 10
139
140struct l_rlimit {
141 l_ulong rlim_cur;
142 l_ulong rlim_max;
143};
144
145/* mmap options */
146#define LINUX_MAP_SHARED 0x0001
147#define LINUX_MAP_PRIVATE 0x0002
148#define LINUX_MAP_FIXED 0x0010
149#define LINUX_MAP_ANON 0x0020
150#define LINUX_MAP_GROWSDOWN 0x0100
151
152struct l_mmap_argv {
153 l_uintptr_t addr;
154 l_size_t len;
155 l_int prot;
156 l_int flags;
157 l_int fd;
158 l_off_t pgoff;
159} __packed;
160
161/*
162 * stat family of syscalls
163 */
164struct l_timespec {
165 l_time_t tv_sec;
166 l_long tv_nsec;
167};
168
169struct l_newstat {
170 l_ushort st_dev;
171 l_ushort __pad1;
172 l_ulong st_ino;
173 l_ushort st_mode;
174 l_ushort st_nlink;
175 l_ushort st_uid;
176 l_ushort st_gid;
177 l_ushort st_rdev;
178 l_ushort __pad2;
179 l_ulong st_size;
180 l_ulong st_blksize;
181 l_ulong st_blocks;
182 struct l_timespec st_atim;
183 struct l_timespec st_mtim;
184 struct l_timespec st_ctim;
185 l_ulong __unused4;
186 l_ulong __unused5;
187};
188
189struct l_stat {
190 l_ushort st_dev;
191 l_ulong st_ino;
192 l_ushort st_mode;
193 l_ushort st_nlink;
194 l_ushort st_uid;
195 l_ushort st_gid;
196 l_ushort st_rdev;
197 l_long st_size;
198 struct l_timespec st_atim;
199 struct l_timespec st_mtim;
200 struct l_timespec st_ctim;
201 l_long st_blksize;
202 l_long st_blocks;
203 l_ulong st_flags;
204 l_ulong st_gen;
205};
206
207struct l_stat64 {
208 l_ushort st_dev;
209 u_char __pad0[10];
210 l_ulong __st_ino;
211 l_uint st_mode;
212 l_uint st_nlink;
213 l_ulong st_uid;
214 l_ulong st_gid;
215 l_ushort st_rdev;
216 u_char __pad3[10];
217 l_longlong st_size;
218 l_ulong st_blksize;
219 l_ulong st_blocks;
220 l_ulong __pad4;
221 struct l_timespec st_atim;
222 struct l_timespec st_mtim;
223 struct l_timespec st_ctim;
224 l_ulonglong st_ino;
225};
226
227struct l_statfs64 {
228 l_int f_type;
229 l_int f_bsize;
230 uint64_t f_blocks;
231 uint64_t f_bfree;
232 uint64_t f_bavail;
233 uint64_t f_files;
234 uint64_t f_ffree;
235 l_fsid_t f_fsid;
236 l_int f_namelen;
237 l_int f_spare[6];
238};
239
240/*
241 * Signalling
242 */
243#define LINUX_SIGHUP 1
244#define LINUX_SIGINT 2
245#define LINUX_SIGQUIT 3
246#define LINUX_SIGILL 4
247#define LINUX_SIGTRAP 5
248#define LINUX_SIGABRT 6
249#define LINUX_SIGIOT LINUX_SIGABRT
250#define LINUX_SIGBUS 7
251#define LINUX_SIGFPE 8
252#define LINUX_SIGKILL 9
253#define LINUX_SIGUSR1 10
254#define LINUX_SIGSEGV 11
255#define LINUX_SIGUSR2 12
256#define LINUX_SIGPIPE 13
257#define LINUX_SIGALRM 14
258#define LINUX_SIGTERM 15
259#define LINUX_SIGSTKFLT 16
260#define LINUX_SIGCHLD 17
261#define LINUX_SIGCONT 18
262#define LINUX_SIGSTOP 19
263#define LINUX_SIGTSTP 20
264#define LINUX_SIGTTIN 21
265#define LINUX_SIGTTOU 22
266#define LINUX_SIGURG 23
267#define LINUX_SIGXCPU 24
268#define LINUX_SIGXFSZ 25
269#define LINUX_SIGVTALRM 26
270#define LINUX_SIGPROF 27
271#define LINUX_SIGWINCH 28
272#define LINUX_SIGIO 29
273#define LINUX_SIGPOLL LINUX_SIGIO
274#define LINUX_SIGPWR 30
275#define LINUX_SIGSYS 31
276#define LINUX_SIGRTMIN 32
277
278#define LINUX_SIGTBLSZ 31
279#define LINUX_NSIG_WORDS 2
280#define LINUX_NBPW 32
281#define LINUX_NSIG (LINUX_NBPW * LINUX_NSIG_WORDS)
282
283/* sigaction flags */
284#define LINUX_SA_NOCLDSTOP 0x00000001
285#define LINUX_SA_NOCLDWAIT 0x00000002
286#define LINUX_SA_SIGINFO 0x00000004
287#define LINUX_SA_RESTORER 0x04000000
288#define LINUX_SA_ONSTACK 0x08000000
289#define LINUX_SA_RESTART 0x10000000
290#define LINUX_SA_INTERRUPT 0x20000000
291#define LINUX_SA_NOMASK 0x40000000
292#define LINUX_SA_ONESHOT 0x80000000
293
294/* sigprocmask actions */
295#define LINUX_SIG_BLOCK 0
296#define LINUX_SIG_UNBLOCK 1
297#define LINUX_SIG_SETMASK 2
298
299/* sigset_t macros */
300#define LINUX_SIGEMPTYSET(set) (set).__bits[0] = (set).__bits[1] = 0
301#define LINUX_SIGISMEMBER(set, sig) SIGISMEMBER(set, sig)
302#define LINUX_SIGADDSET(set, sig) SIGADDSET(set, sig)
303
304/* sigaltstack */
305#define LINUX_MINSIGSTKSZ 2048
306#define LINUX_SS_ONSTACK 1
307#define LINUX_SS_DISABLE 2
308
309int linux_to_bsd_sigaltstack(int lsa);
310int bsd_to_linux_sigaltstack(int bsa);
311
312typedef void (*l_handler_t)(l_int);
313typedef l_ulong l_osigset_t;
314
315typedef struct {
316 l_uint __bits[LINUX_NSIG_WORDS];
317} l_sigset_t;
318
319typedef struct {
320 l_handler_t lsa_handler;
321 l_osigset_t lsa_mask;
322 l_ulong lsa_flags;
323 void (*lsa_restorer)(void);
324} l_osigaction_t;
325
326typedef struct {
327 l_handler_t lsa_handler;
328 l_ulong lsa_flags;
329 void (*lsa_restorer)(void);
330 l_sigset_t lsa_mask;
331} l_sigaction_t;
332
333typedef struct {
334 void *ss_sp;
335 l_int ss_flags;
336 l_size_t ss_size;
337} l_stack_t;
338
339/* The Linux sigcontext, pretty much a standard 386 trapframe. */
340struct l_sigcontext {
341 l_int sc_gs;
342 l_int sc_fs;
343 l_int sc_es;
344 l_int sc_ds;
345 l_int sc_edi;
346 l_int sc_esi;
347 l_int sc_ebp;
348 l_int sc_esp;
349 l_int sc_ebx;
350 l_int sc_edx;
351 l_int sc_ecx;
352 l_int sc_eax;
353 l_int sc_trapno;
354 l_int sc_err;
355 l_int sc_eip;
356 l_int sc_cs;
357 l_int sc_eflags;
358 l_int sc_esp_at_signal;
359 l_int sc_ss;
360 l_int sc_387;
361 l_int sc_mask;
362 l_int sc_cr2;
363};
364
365struct l_ucontext {
366 l_ulong uc_flags;
367 void *uc_link;
368 l_stack_t uc_stack;
369 struct l_sigcontext uc_mcontext;
370 l_sigset_t uc_sigmask;
371};
372
373#define LINUX_SI_MAX_SIZE 128
374#define LINUX_SI_PAD_SIZE ((LINUX_SI_MAX_SIZE/sizeof(l_int)) - 3)
375
376typedef union l_sigval {
377 l_int sival_int;
378 l_uintptr_t sival_ptr;
379} l_sigval_t;
380
381typedef struct l_siginfo {
382 l_int lsi_signo;
383 l_int lsi_errno;
384 l_int lsi_code;
385 union {
386 l_int _pad[LINUX_SI_PAD_SIZE];
387
388 struct {
389 l_pid_t _pid;
390 l_uid_t _uid;
391 } _kill;
392
393 struct {
394 l_timer_t _tid;
395 l_int _overrun;
396 char _pad[sizeof(l_uid_t) - sizeof(l_int)];
397 l_sigval_t _sigval;
398 l_int _sys_private;
399 } _timer;
400
401 struct {
402 l_pid_t _pid; /* sender's pid */
403 l_uid_t _uid; /* sender's uid */
404 l_sigval_t _sigval;
405 } _rt;
406
407 struct {
408 l_pid_t _pid; /* which child */
409 l_uid_t _uid; /* sender's uid */
410 l_int _status; /* exit code */
411 l_clock_t _utime;
412 l_clock_t _stime;
413 } _sigchld;
414
415 struct {
416 l_uintptr_t _addr; /* Faulting insn/memory ref. */
417 } _sigfault;
418
419 struct {
420 l_long _band; /* POLL_IN,POLL_OUT,POLL_MSG */
421 l_int _fd;
422 } _sigpoll;
423 } _sifields;
424} l_siginfo_t;
425
426#define lsi_pid _sifields._kill._pid
427#define lsi_uid _sifields._kill._uid
428#define lsi_tid _sifields._timer._tid
429#define lsi_overrun _sifields._timer._overrun
430#define lsi_sys_private _sifields._timer._sys_private
431#define lsi_status _sifields._sigchld._status
432#define lsi_utime _sifields._sigchld._utime
433#define lsi_stime _sifields._sigchld._stime
434#define lsi_value _sifields._rt._sigval
435#define lsi_int _sifields._rt._sigval.sival_int
436#define lsi_ptr _sifields._rt._sigval.sival_ptr
437#define lsi_addr _sifields._sigfault._addr
438#define lsi_band _sifields._sigpoll._band
439#define lsi_fd _sifields._sigpoll._fd
440
441struct l_fpreg {
442 u_int16_t significand[4];
443 u_int16_t exponent;
444};
445
446struct l_fpxreg {
447 u_int16_t significand[4];
448 u_int16_t exponent;
449 u_int16_t padding[3];
450};
451
452struct l_xmmreg {
453 u_int32_t element[4];
454};
455
456struct l_fpstate {
457 /* Regular FPU environment */
458 u_int32_t cw;
459 u_int32_t sw;
460 u_int32_t tag;
461 u_int32_t ipoff;
462 u_int32_t cssel;
463 u_int32_t dataoff;
464 u_int32_t datasel;
465 struct l_fpreg _st[8];
466 u_int16_t status;
467 u_int16_t magic; /* 0xffff = regular FPU data */
468
469 /* FXSR FPU environment */
470 u_int32_t _fxsr_env[6]; /* env is ignored. */
471 u_int32_t mxcsr;
472 u_int32_t reserved;
473 struct l_fpxreg _fxsr_st[8]; /* reg data is ignored. */
474 struct l_xmmreg _xmm[8];
475 u_int32_t padding[56];
476};
477
478/*
479 * We make the stack look like Linux expects it when calling a signal
480 * handler, but use the BSD way of calling the handler and sigreturn().
481 * This means that we need to pass the pointer to the handler too.
482 * It is appended to the frame to not interfere with the rest of it.
483 */
484struct l_sigframe {
485 l_int sf_sig;
486 struct l_sigcontext sf_sc;
487 struct l_fpstate sf_fpstate;
488 l_uint sf_extramask[LINUX_NSIG_WORDS-1];
489 l_handler_t sf_handler;
490};
491
492struct l_rt_sigframe {
493 l_int sf_sig;
494 l_siginfo_t *sf_siginfo;
495 struct l_ucontext *sf_ucontext;
496 l_siginfo_t sf_si;
497 struct l_ucontext sf_sc;
498 l_handler_t sf_handler;
499};
500
501extern struct sysentvec linux_sysvec;
502extern struct sysentvec elf_linux_sysvec;
503
504/*
505 * open/fcntl flags
506 */
507#define LINUX_O_RDONLY 00000000
508#define LINUX_O_WRONLY 00000001
509#define LINUX_O_RDWR 00000002
510#define LINUX_O_ACCMODE 00000003
511#define LINUX_O_CREAT 00000100
512#define LINUX_O_EXCL 00000200
513#define LINUX_O_NOCTTY 00000400
514#define LINUX_O_TRUNC 00001000
515#define LINUX_O_APPEND 00002000
516#define LINUX_O_NONBLOCK 00004000
517#define LINUX_O_NDELAY LINUX_O_NONBLOCK
518#define LINUX_O_SYNC 00010000
519#define LINUX_FASYNC 00020000
520#define LINUX_O_DIRECT 00040000 /* Direct disk access hint */
521#define LINUX_O_LARGEFILE 00100000
522#define LINUX_O_DIRECTORY 00200000 /* Must be a directory */
523#define LINUX_O_NOFOLLOW 00400000 /* Do not follow links */
524#define LINUX_O_NOATIME 01000000
525#define LINUX_O_CLOEXEC 02000000
526
527#define LINUX_F_DUPFD 0
528#define LINUX_F_GETFD 1
529#define LINUX_F_SETFD 2
530#define LINUX_F_GETFL 3
531#define LINUX_F_SETFL 4
532#define LINUX_F_GETLK 5
533#define LINUX_F_SETLK 6
534#define LINUX_F_SETLKW 7
535#define LINUX_F_SETOWN 8
536#define LINUX_F_GETOWN 9
537
538#define LINUX_F_GETLK64 12
539#define LINUX_F_SETLK64 13
540#define LINUX_F_SETLKW64 14
541
542#define LINUX_F_RDLCK 0
543#define LINUX_F_WRLCK 1
544#define LINUX_F_UNLCK 2
545
546union l_semun {
547 l_int val;
548 struct l_semid_ds *buf;
549 l_ushort *array;
550 struct l_seminfo *__buf;
551 void *__pad;
552};
553
554/*
555 * Socket defines
556 */
557#define LINUX_SOL_SOCKET 1
558#define LINUX_SOL_IP 0
559#define LINUX_SOL_IPX 256
560#define LINUX_SOL_AX25 257
561#define LINUX_SOL_TCP 6
562#define LINUX_SOL_UDP 17
563
564#define LINUX_SO_DEBUG 1
565#define LINUX_SO_REUSEADDR 2
566#define LINUX_SO_TYPE 3
567#define LINUX_SO_ERROR 4
568#define LINUX_SO_DONTROUTE 5
569#define LINUX_SO_BROADCAST 6
570#define LINUX_SO_SNDBUF 7
571#define LINUX_SO_RCVBUF 8
572#define LINUX_SO_KEEPALIVE 9
573#define LINUX_SO_OOBINLINE 10
574#define LINUX_SO_NO_CHECK 11
575#define LINUX_SO_PRIORITY 12
576#define LINUX_SO_LINGER 13
577#define LINUX_SO_PEERCRED 17
578#define LINUX_SO_RCVLOWAT 18
579#define LINUX_SO_SNDLOWAT 19
580#define LINUX_SO_RCVTIMEO 20
581#define LINUX_SO_SNDTIMEO 21
582#define LINUX_SO_TIMESTAMP 29
583#define LINUX_SO_ACCEPTCONN 30
584
585struct l_sockaddr {
586 l_ushort sa_family;
587 char sa_data[14];
588};
589
590struct l_msghdr {
591 l_uintptr_t msg_name;
592 l_int msg_namelen;
593 l_uintptr_t msg_iov;
594 l_size_t msg_iovlen;
595 l_uintptr_t msg_control;
596 l_size_t msg_controllen;
597 l_uint msg_flags;
598};
599
600struct l_cmsghdr {
601 l_size_t cmsg_len;
602 l_int cmsg_level;
603 l_int cmsg_type;
604};
605
606struct l_ifmap {
607 l_ulong mem_start;
608 l_ulong mem_end;
609 l_ushort base_addr;
610 u_char irq;
611 u_char dma;
612 u_char port;
613};
614
615#define LINUX_IFHWADDRLEN 6
616#define LINUX_IFNAMSIZ 16
617
618struct l_ifreq {
619 union {
620 char ifrn_name[LINUX_IFNAMSIZ];
621 } ifr_ifrn;
622
623 union {
624 struct l_sockaddr ifru_addr;
625 struct l_sockaddr ifru_dstaddr;
626 struct l_sockaddr ifru_broadaddr;
627 struct l_sockaddr ifru_netmask;
628 struct l_sockaddr ifru_hwaddr;
629 l_short ifru_flags[1];
630 l_int ifru_metric;
631 l_int ifru_mtu;
632 struct l_ifmap ifru_map;
633 char ifru_slave[LINUX_IFNAMSIZ];
634 l_caddr_t ifru_data;
635 } ifr_ifru;
636};
637
638#define ifr_name ifr_ifrn.ifrn_name /* Interface name */
639#define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */
640
641/*
642 * poll()
643 */
644#define LINUX_POLLIN 0x0001
645#define LINUX_POLLPRI 0x0002
646#define LINUX_POLLOUT 0x0004
647#define LINUX_POLLERR 0x0008
648#define LINUX_POLLHUP 0x0010
649#define LINUX_POLLNVAL 0x0020
650#define LINUX_POLLRDNORM 0x0040
651#define LINUX_POLLRDBAND 0x0080
652#define LINUX_POLLWRNORM 0x0100
653#define LINUX_POLLWRBAND 0x0200
654#define LINUX_POLLMSG 0x0400
655
656struct l_pollfd {
657 l_int fd;
658 l_short events;
659 l_short revents;
660};
661
662struct l_user_desc {
663 l_uint entry_number;
664 l_uint base_addr;
665 l_uint limit;
666 l_uint seg_32bit:1;
667 l_uint contents:2;
668 l_uint read_exec_only:1;
669 l_uint limit_in_pages:1;
670 l_uint seg_not_present:1;
671 l_uint useable:1;
672};
673
674struct l_desc_struct {
675 unsigned long a, b;
676};
677
678
679#define LINUX_LOWERWORD 0x0000ffff
680
681/*
682 * Macros which does the same thing as those in Linux include/asm-um/ldt-i386.h.
683 * These convert Linux user space descriptor to machine one.
684 */
685#define LINUX_LDT_entry_a(info) \
686 ((((info)->base_addr & LINUX_LOWERWORD) << 16) | \
687 ((info)->limit & LINUX_LOWERWORD))
688
689#define LINUX_ENTRY_B_READ_EXEC_ONLY 9
690#define LINUX_ENTRY_B_CONTENTS 10
691#define LINUX_ENTRY_B_SEG_NOT_PRESENT 15
692#define LINUX_ENTRY_B_BASE_ADDR 16
693#define LINUX_ENTRY_B_USEABLE 20
694#define LINUX_ENTRY_B_SEG32BIT 22
695#define LINUX_ENTRY_B_LIMIT 23
696
697#define LINUX_LDT_entry_b(info) \
698 (((info)->base_addr & 0xff000000) | \
699 ((info)->limit & 0xf0000) | \
700 ((info)->contents << LINUX_ENTRY_B_CONTENTS) | \
701 (((info)->seg_not_present == 0) << LINUX_ENTRY_B_SEG_NOT_PRESENT) | \
702 (((info)->base_addr & 0x00ff0000) >> LINUX_ENTRY_B_BASE_ADDR) | \
703 (((info)->read_exec_only == 0) << LINUX_ENTRY_B_READ_EXEC_ONLY) | \
704 ((info)->seg_32bit << LINUX_ENTRY_B_SEG32BIT) | \
705 ((info)->useable << LINUX_ENTRY_B_USEABLE) | \
706 ((info)->limit_in_pages << LINUX_ENTRY_B_LIMIT) | 0x7000)
707
708#define LINUX_LDT_empty(info) \
709 ((info)->base_addr == 0 && \
710 (info)->limit == 0 && \
711 (info)->contents == 0 && \
712 (info)->seg_not_present == 1 && \
713 (info)->read_exec_only == 1 && \
714 (info)->seg_32bit == 0 && \
715 (info)->limit_in_pages == 0 && \
716 (info)->useable == 0)
717
718/*
719 * Macros for converting segments.
720 * They do the same as those in arch/i386/kernel/process.c in Linux.
721 */
722#define LINUX_GET_BASE(desc) \
723 ((((desc)->a >> 16) & LINUX_LOWERWORD) | \
724 (((desc)->b << 16) & 0x00ff0000) | \
725 ((desc)->b & 0xff000000))
726
727#define LINUX_GET_LIMIT(desc) \
728 (((desc)->a & LINUX_LOWERWORD) | \
729 ((desc)->b & 0xf0000))
730
731#define LINUX_GET_32BIT(desc) \
732 (((desc)->b >> LINUX_ENTRY_B_SEG32BIT) & 1)
733#define LINUX_GET_CONTENTS(desc) \
734 (((desc)->b >> LINUX_ENTRY_B_CONTENTS) & 3)
735#define LINUX_GET_WRITABLE(desc) \
736 (((desc)->b >> LINUX_ENTRY_B_READ_EXEC_ONLY) & 1)
737#define LINUX_GET_LIMIT_PAGES(desc) \
738 (((desc)->b >> LINUX_ENTRY_B_LIMIT) & 1)
739#define LINUX_GET_PRESENT(desc) \
740 (((desc)->b >> LINUX_ENTRY_B_SEG_NOT_PRESENT) & 1)
741#define LINUX_GET_USEABLE(desc) \
742 (((desc)->b >> LINUX_ENTRY_B_USEABLE) & 1)
743
744#define linux_copyout_rusage(r, u) copyout(r, u, sizeof(*r))
745
746/* robust futexes */
747struct linux_robust_list {
748 struct linux_robust_list *next;
749};
750
751struct linux_robust_list_head {
752 struct linux_robust_list list;
753 l_long futex_offset;
754 struct linux_robust_list *pending_list;
755};
756
757#endif /* !_I386_LINUX_H_ */