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