1
2 /*--------------------------------------------------------------------*/
3 /*--- FreeBSD-specific kernel interface. vki-freebsd.h ---*/
4 /*--------------------------------------------------------------------*/
5
6 /*
7 This file is part of Valgrind, a dynamic binary instrumentation
8 framework.
9
10 Copyright (C) 2000-2005 Julian Seward
11 jseward@acm.org
12
13 This program is free software; you can redistribute it and/or
14 modify it under the terms of the GNU General Public License as
15 published by the Free Software Foundation; either version 2 of the
16 License, or (at your option) any later version.
17
18 This program is distributed in the hope that it will be useful, but
19 WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 General Public License for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26 02111-1307, USA.
27
28 The GNU General Public License is contained in the file COPYING.
29 */
30
31 /* This file defines types and constants for the kernel interface, and to
32 make that clear everything is prefixed VKI_/vki_.
33
34 All code is copied verbatim from kernel source files, except that:
35 - VKI_/vki_ prefixes are added
36 - some extra explanatory comments are included; they are all within
37 "[[ ]]"
38 - for some types, we only care about the size; for a few of them (big
39 ones that are painful to fully drag in here), a VKI_SIZEOF_* constant
40 is used.
41
42 The files the code is taken from is indicated.
43
44 Note especially that the types are not the glibc versions, many of which
45 are different to those in here.
46
47 Also note that this file contains all the generic header info, ie. that
48 from linux/include/linux/ *.h. The arch-specific header info, eg. that
49 from linux/include/asm-i386/ *.h, is in vki-$PLATFORM.h and
50 vki_posixtypes-$PLATFORM.h. (Two files are required to avoid
51 circular dependencies between the generic VKI header and the
52 arch-specific VKI header. It's possible in the future, as more stuff
53 gets pulled in, that we might have to split files up some more to avoid
54 further circular dependencies.)
55
56 Finally, note that it is assumed that __KERNEL__ is set for all these
57 definitions, which affects some of them.
58 */
59
60 #ifndef __VKI_FREEBSD_H
61 #define __VKI_FREEBSD_H
62
63 //----------------------------------------------------------------------
64 // Arch-specific POSIX types
65 //----------------------------------------------------------------------
66
67 #if defined(VGA_x86)
68 # include "vki-machine-types-x86-freebsd.h"
69 #elif defined(VGA_amd64)
70 # include "vki-machine-types-amd64-freebsd.h"
71 #else
72 # error Unknown platform
73 #endif
74
75 #include <sys/fcntl.h>
76 #include <sys/param.h>
77
78
79 //----------------------------------------------------------------------
80 // From sys/select.h
81 //----------------------------------------------------------------------
82
83 typedef unsigned long __vki_fd_mask;
84
85 #undef __VKI_NFDBITS
86 #define __VKI_NFDBITS (8 * sizeof(__vki_fd_mask))
87
88 #undef __VKI_FD_SETSIZE
89 #define __VKI_FD_SETSIZE 1024U
90
91 #undef __VKI_FDSET_LONGS
92 #define __VKI_FDSET_LONGS (__VKI_FD_SETSIZE/__VKI_NFDBITS)
93
94 #undef __VKI_FDELT
95 #define __VKI_FDELT(d) ((d) / __VKI_NFDBITS)
96
97 #undef __VKI_FDMASK
98 #define __VKI_FDMASK(d) (1UL << ((d) % __VKI_NFDBITS))
99
100 typedef struct {
101 unsigned long fds_bits [__VKI_FDSET_LONGS];
102 } __vki_fd_set;
103
104 //----------------------------------------------------------------------
105 // sys/_types.h
106 //----------------------------------------------------------------------
107 /* MD QQQ 32 on 64 */
108 typedef long __vki_key_t;
109 typedef long __vki_suseconds_t;
110 typedef struct __timer *__vki_timer_t;
111 typedef struct __mq *__vki_mqd_t;
112
113 /* MI */
114 typedef vki_uint32_t __vki_blksize_t;
115 typedef vki_int64_t __vki_blkcnt_t;
116 typedef vki_int32_t __vki_clockid_t;
117 typedef vki_int32_t __vki_ct_rune_t;
118 typedef vki_uint32_t __vki_fflags_t;
119 typedef vki_uint64_t __vki_fsblkcnt_t;
120 typedef vki_uint64_t __vki_fsfilcnt_t;
121 typedef vki_uint32_t __vki_gid_t;
122 typedef vki_int64_t __vki_id_t;
123 typedef vki_uint32_t __vki_ino_t;
124 typedef vki_int32_t __vki_lwpid_t;
125 typedef vki_uint16_t __vki_mode_t;
126 typedef vki_uint16_t __vki_nlink_t;
127 typedef vki_int64_t __vki_off_t;
128 typedef vki_int32_t __vki_pid_t;
129 typedef vki_int64_t __vki_rlim_t;
130 typedef vki_uint8_t __vki_sa_family_t;
131 typedef vki_uint32_t __vki_socklen_t;
132 typedef vki_uint32_t __vki_uid_t;
133 typedef vki_int32_t __vki_useconds_t;
134 typedef __vki_ct_rune_t __vki_rune_t;
135 typedef __vki_ct_rune_t __vki_wchar_t;
136 typedef __vki_ct_rune_t __vki_wint_t;
137 typedef vki_uint32_t __vki_dev_t;
138 typedef vki_uint32_t __vki_fixpt_t;
139
140
141 //----------------------------------------------------------------------
142 // sys/types.h
143 //----------------------------------------------------------------------
144
145 typedef vki_uint8_t vki_u_int8_t;
146 typedef vki_uint16_t vki_u_int16_t;
147 typedef vki_uint32_t vki_u_int32_t;
148 typedef vki_uint64_t vki_u_int64_t;
149
150 typedef vki_uint64_t vki_u_quad_t;
151 typedef vki_int64_t vki_quad_t;
152 typedef __vki_caddr_t vki_caddr_t;
153 typedef __const __vki_caddr_t vki_c_caddr_t;
154 typedef __volatile __vki_caddr_t vki_v_caddr_t;
155
156 typedef __vki_blksize_t vki_blksize_t;
157 typedef __vki_blkcnt_t vki_blkcnt_t;
158 typedef __vki_clock_t vki_clock_t;
159 typedef __vki_clockid_t vki_clockid_t;
160 typedef __vki_dev_t vki_dev_t;
161 typedef __vki_fflags_t vki_fflags_t;
162 typedef __vki_fixpt_t vki_fixpt_t;
163 typedef __vki_fsblkcnt_t vki_fsblkcnt_t;
164 typedef __vki_fsfilcnt_t vki_fsfilcnt_t;
165 typedef __vki_gid_t vki_gid_t;
166 typedef vki_uint32_t vki_in_addr_t;
167 typedef vki_uint16_t vki_in_port_t;
168 typedef __vki_id_t vki_id_t;
169 typedef __vki_ino_t vki_ino_t;
170 typedef __vki_key_t vki_key_t;
171 typedef __vki_lwpid_t vki_lwpid_t;
172 typedef __vki_mode_t vki_mode_t;
173 typedef __vki_nlink_t vki_nlink_t;
174 typedef __vki_off_t vki_off_t;
175 typedef __vki_pid_t vki_pid_t;
176 typedef __vki_register_t vki_register_t;
177 typedef __vki_rlim_t vki_rlim_t;
178 typedef __vki_segsz_t vki_segsz_t;
179 typedef __vki_size_t vki_size_t;
180 typedef __vki_ssize_t vki_ssize_t;
181 typedef __vki_suseconds_t vki_suseconds_t;
182 typedef __vki_time_t vki_time_t;
183 typedef __vki_timer_t vki_timer_t;
184 typedef __vki_mqd_t vki_mqd_t;
185 typedef __vki_u_register_t vki_u_register_t;
186 typedef __vki_uid_t vki_uid_t;
187 typedef __vki_useconds_t vki_useconds_t;
188
189 typedef __vki_vm_offset_t vki_vm_offset_t;
190 typedef __vki_vm_ooffset_t vki_vm_ooffset_t;
191 typedef __vki_vm_paddr_t vki_vm_paddr_t;
192 typedef __vki_vm_pindex_t vki_vm_pindex_t;
193 typedef __vki_vm_size_t vki_vm_size_t;
194
195 //----------------------------------------------------------------------
196 // sys/select.h
197 //----------------------------------------------------------------------
198
199 typedef __vki_fd_set vki_fd_set;
200
201 //----------------------------------------------------------------------
202 // Now the rest of the arch-specific stuff
203 //----------------------------------------------------------------------
204
205 #if defined(VGA_x86)
206 # include "vki-x86-freebsd.h"
207 #elif defined(VGA_amd64)
208 # include "vki-amd64-freebsd.h"
209 #elif defined(VGA_ppc32)
210 # include "vki-ppc32-freebsd.h"
211 #elif defined(VGA_ppc64)
212 # include "vki-ppc64-freebsd.h"
213 #else
214 # error Unknown platform
215 #endif
216
217 //----------------------------------------------------------------------
218 // linux and freebsd version hacks
219 //----------------------------------------------------------------------
220 #ifndef ELFMAG
221 #define ELFMAG "\177ELF" /* magic string */
222 #endif
223 #ifndef SELFMAG
224 #define SELFMAG 4 /* magic string size */
225 #endif
226
227 //----------------------------------------------------------------------
228 // From sys/syslimits.h
229 //----------------------------------------------------------------------
230
231 #define VKI_PATH_MAX 1024
232
233
234 //----------------------------------------------------------------------
235 // From sys/timespec.h
236 //----------------------------------------------------------------------
237
238 struct vki_timespec {
239 vki_time_t tv_sec; /* seconds */
240 long tv_nsec; /* nanoseconds */
241 };
242
243 struct vki_itimerspec {
244 struct vki_timespec it_interval; /* timer period */
245 struct vki_timespec it_value; /* timer expiration */
246 };
247
248 //----------------------------------------------------------------------
249 // From sys/_time.h
250 //----------------------------------------------------------------------
251
252 struct vki_timeval {
253 vki_time_t tv_sec; /* seconds */
254 vki_suseconds_t tv_usec; /* microseconds */
255 };
256
257 //----------------------------------------------------------------------
258 // From sys/time.h
259 //----------------------------------------------------------------------
260
261 #define VKI_CLOCK_REALTIME 0
262 #define VKI_CLOCK_MONOTONIC 1
263 #define VKI_CLOCK_PROCESS_CPUTIME_ID 2
264 #define VKI_CLOCK_THREAD_CPUTIME_ID 3
265
266 struct vki_timezone {
267 int tz_minuteswest; /* minutes west of Greenwich */
268 int tz_dsttime; /* type of dst correction */
269 };
270
271 struct vki_itimerval {
272 struct vki_timeval it_interval; /* timer interval */
273 struct vki_timeval it_value; /* current value */
274 };
275
276 //----------------------------------------------------------------------
277 // From sys/timex.h
278 //----------------------------------------------------------------------
279
280 struct vki_ntptimeval {
281 struct vki_timespec time;
282 long maxerror;
283 long esterror;
284 long tai;
285 int time_state;
286 };
287
288 struct vki_timex {
289 unsigned int modes; /* mode selector */
290 long offset; /* time offset (usec) */
291 long freq; /* frequency offset (scaled ppm) */
292 long maxerror; /* maximum error (usec) */
293 long esterror; /* estimated error (usec) */
294 int status; /* clock command/status */
295 long constant; /* pll time constant */
296 long precision; /* clock precision (usec) (read only) */
297 long tolerance; /* clock frequency tolerance (ppm)
298 * (read only)
299 */
300 long ppsfreq; /* pps frequency (scaled ppm) (ro) */
301 long jitter; /* pps jitter (us) (ro) */
302 int shift; /* interval duration (s) (shift) (ro) */
303 long stabil; /* pps stability (scaled ppm) (ro) */
304 long jitcnt; /* jitter limit exceeded (ro) */
305 long calcnt; /* calibration intervals (ro) */
306 long errcnt; /* calibration errors (ro) */
307 long stbcnt; /* stability limit exceeded (ro) */
308 };
309
310 #define MOD_OFFSET 0x0001 /* time offset */
311 #define MOD_FREQUENCY 0x0002 /* frequency offset */
312 #define MOD_MAXERROR 0x0004 /* maximum time error */
313 #define MOD_ESTERROR 0x0008 /* estimated time error */
314 #define MOD_STATUS 0x0010 /* clock status */
315 #define MOD_TIMECONST 0x0020 /* pll time constant */
316 #define MOD_PPSMAX 0x0040
317 #define MOD_TAI 0x0080
318 #define MOD_MICRO 0x1000
319 #define MOD_NANO 0x2000
320 #define MOD_CLKB 0x4000
321 #define MOD_CLKA 0x8000
322
323 //----------------------------------------------------------------------
324 // From sys/times.h
325 //----------------------------------------------------------------------
326
327 struct vki_tms {
328 vki_clock_t tms_utime;
329 vki_clock_t tms_stime;
330 vki_clock_t tms_cutime;
331 vki_clock_t tms_cstime;
332 };
333
334 //----------------------------------------------------------------------
335 // From sys/stat.h
336 //----------------------------------------------------------------------
337
338 /* QQQ 4.x stat layout */
339 struct vki_stat {
340 vki_dev_t st_dev;
341 vki_ino_t st_ino;
342 vki_mode_t st_mode;
343 vki_nlink_t st_nlink;
344 vki_uid_t st_uid;
345 vki_gid_t st_gid;
346 vki_dev_t st_rdev;
347 #if 0
348 struct vki_timespec st_atimespec;
349 struct vki_timespec st_mtimespec;
350 struct vki_timespec st_ctimespec;
351 #else
352 vki_time_t st_atime;
353 long st_atime_nsec;
354 vki_time_t st_mtime;
355 long st_mtime_nsec;
356 vki_time_t st_ctime;
357 long st_ctime_nsec;
358 #endif
359 vki_off_t st_size;
360 vki_blkcnt_t st_blocks;
361 vki_blksize_t st_blksize;
362 vki_fflags_t st_flags;
363 vki_uint32_t st_gen;
364 vki_int32_t st_lspare;
365 struct vki_timespec st_birthtimespec;
366 unsigned int :(8 / 2) * (16 - (int)sizeof(struct vki_timespec));
367 unsigned int :(8 / 2) * (16 - (int)sizeof(struct vki_timespec));
368 };
369
370
371 //----------------------------------------------------------------------
372 // From linux-2.6.8.1/include/linux/sched.h
373 //----------------------------------------------------------------------
374
375 struct vki_sched_param {
376 int sched_priority;
377 };
378
379 //----------------------------------------------------------------------
380 // From sys/signal.h
381 //----------------------------------------------------------------------
382
383 #define VKI_SIG_BLOCK 1 /* block specified signal set */
384 #define VKI_SIG_UNBLOCK 2 /* unblock specified signal set */
385 #define VKI_SIG_SETMASK 3 /* set specified signal set */
386
387 #define VKI_SIG_DFL ((__vki_sighandler_t)0)
388 #define VKI_SIG_IGN ((__vki_sighandler_t)1)
389 #define VKI_SIG_ERR ((__vki_sighandler_t)-1)
390
391 typedef void __vki_signalfn_t(int);
392 typedef __vki_signalfn_t *__vki_sighandler_t;
393
394 #define VKI_SIGHUP 1
395 #define VKI_SIGINT 2
396 #define VKI_SIGQUIT 3
397 #define VKI_SIGILL 4
398 #define VKI_SIGTRAP 5
399 #define VKI_SIGABRT 6
400 #define VKI_SIGEMT 7
401 #define VKI_SIGFPE 8
402 #define VKI_SIGKILL 9
403 #define VKI_SIGBUS 10
404 #define VKI_SIGSEGV 11
405 #define VKI_SIGSYS 12
406 #define VKI_SIGPIPE 13
407 #define VKI_SIGALRM 14
408 #define VKI_SIGTERM 15
409 #define VKI_SIGURG 16
410 #define VKI_SIGSTOP 17
411 #define VKI_SIGTSTP 18
412 #define VKI_SIGCONT 19
413 #define VKI_SIGCHLD 20
414 #define VKI_SIGTTIN 21
415 #define VKI_SIGTTOU 22
416 #define VKI_SIGIO 23
417 #define VKI_SIGXCPU 24
418 #define VKI_SIGXFSZ 25
419 #define VKI_SIGVTALRM 26
420 #define VKI_SIGPROF 27
421 #define VKI_SIGWINCH 28
422 #define VKI_SIGINFO 29
423 #define VKI_SIGUSR1 30
424 #define VKI_SIGUSR2 31
425 #define VKI_SIGTHR 32
426
427 #define VKI_SIGRTMIN 65
428 #define VKI_SIGRTMAX 126
429
430 #define VKI_SA_ONSTACK 0x0001
431 #define VKI_SA_RESTART 0x0002
432 #define VKI_SA_RESETHAND 0x0004
433 #define VKI_SA_NOCLDSTOP 0x0008
434 #define VKI_SA_NODEFER 0x0010
435 #define VKI_SA_NOCLDWAIT 0x0020
436 #define VKI_SA_SIGINFO 0x0040
437
438 #define VKI_SS_ONSTACK 0x0001
439 #define VKI_SS_DISABLE 0x0004
440
441 #define VKI_SA_ONESHOT VKI_SA_RESETHAND
442 #define VKI_SA_NOMASK VKI_SA_NODEFER
443
444 struct vki_sigaction {
445 __vki_sighandler_t ksa_handler;
446 int sa_flags;
447 vki_sigset_t sa_mask;
448 };
449
450 typedef struct vki_sigaltstack {
451 void *ss_sp;
452 vki_size_t ss_size;
453 int ss_flags;
454 } vki_stack_t;
455
456 typedef union vki_sigval {
457 int sival_int;
458 void *sival_ptr;
459 } vki_sigval_t;
460
461 #if 0 /* freebsd6 */
462 typedef struct vki_siginfo {
463 int si_signo;
464 int si_errno;
465 int si_code;
466 vki_pid_t si_pid;
467 vki_uid_t si_uid;
468 int si_status;
469 void *si_addr;
470 vki_sigval_t si_value;
471
472 union {
473
474 /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
475 struct {
476 int _trapno; /* TRAP # which caused the signal */
477 } _sigfault;
478
479 /* POSIX.1b timers */
480 struct {
481 int _timerid; /* timer id */
482 int _overrun; /* overrun count */
483 } _timer;
484
485 struct {
486 int _mqd;
487 } _mesgq;
488
489 /* SIGPOLL */
490 struct {
491 long _band; /* POLL_IN, POLL_OUT, POLL_MSG */
492 } _sigpoll;
493
494 struct {
495 long __spare1__;
496 int __spare2[7];
497 } __spare__;
498 } _sifields;
499 } vki_siginfo_t;
500 #endif
501 typedef struct vki_siginfo {
502 int si_signo;
503 int si_errno;
504 int si_code;
505 vki_pid_t si_pid;
506 vki_uid_t si_uid;
507 int si_status;
508 void *si_addr;
509 vki_sigval_t si_value;
510 // 666: not valid. switch to above def
511 #ifdef si_band
512 #undef si_band
513 #endif
514 long si_band;
515 int __spare__[7];
516 } vki_siginfo_t;
517
518 /*
519 * si_code values
520 */
521 #define VKI_SI_USER 0x10001 /* sent by kill, sigsend, raise */
522 #define VKI_SI_QUEUE 0x10002
523 #define VKI_SI_TIMER 0x10003
524 #define VKI_SI_ASYNCIO 0x10004
525 #define VKI_SI_MESGQ 0x10005
526
527 /*
528 * SIGILL si_codes
529 */
530 #define VKI_ILL_ILLOPC 1 /* illegal opcode */
531 #define VKI_ILL_ILLOPN 2 /* illegal operand */
532 #define VKI_ILL_ILLADR 3 /* illegal addressing mode */
533 #define VKI_ILL_ILLTRP 4 /* illegal trap */
534 #define VKI_ILL_PRVOPC 5 /* privileged opcode */
535 #define VKI_ILL_PRVREG 6 /* privileged register */
536 #define VKI_ILL_COPROC 7 /* coprocessor error */
537 #define VKI_ILL_BADSTK 8 /* internal stack error */
538
539 /*
540 * SIGFPE si_codes
541 */
542 #define VKI_FPE_INTOVF 1 /* integer overflow */
543 #define VKI_FPE_INTDIV 2 /* integer divide by zero */
544 #define VKI_FPE_FLTDIV 3 /* floating point divide by zero */
545 #define VKI_FPE_FLTOVF 4 /* floating point overflow */
546 #define VKI_FPE_FLTUND 5 /* floating point underflow */
547 #define VKI_FPE_FLTRES 6 /* floating point inexact result */
548 #define VKI_FPE_FLTINV 7 /* floating point invalid operation */
549 #define VKI_FPE_FLTSUB 8 /* subscript out of range */
550
551 /*
552 * SIGSEGV si_codes
553 */
554 #define VKI_SEGV_MAPERR 1 /* address not mapped to object */
555 #define VKI_SEGV_ACCERR 2 /* invalid permissions for mapped object */
556 /* XXX i386 and amd64 specific */
557 #define VKI_SEGV_PAGE_FAULT 12
558
559 /*
560 * SIGBUS si_codes
561 */
562 #define VKI_BUS_ADRALN 1 /* invalid address alignment */
563 #define VKI_BUS_ADRERR 2 /* non-existant physical address */
564 #define VKI_BUS_OBJERR 3 /* object specific hardware error */
565
566 /*
567 * SIGTRAP si_codes
568 */
569 #define VKI_TRAP_BRKPT 1 /* process breakpoint */
570 #define VKI_TRAP_TRACE 2 /* process trace trap */
571
572
573 #if 0 /* freebsd-6 */
574 typedef struct vki_sigevent {
575 int sigev_notify;
576 int sigev_signo;
577 vki_sigval_t sigev_value;
578 union {
579 int _threadid;
580
581 struct {
582 void (*_function)(vki_sigval_t);
583 void *_attribute; /* really pthread_attr_t */
584 } _sigev_thread;
585 long __spare__[8];
586 } _sigev_un;
587 } vki_sigevent_t;
588 #endif
589
590 struct vki_sigevent {
591 int sigev_notify; /* Notification type */
592 union {
593 int __sigev_signo; /* Signal number */
594 int __sigev_notify_kqueue;
595 } __sigev_u;
596 vki_sigval_t sigev_value; /* Signal value */
597 };
598 #if 0
599 #define sigev_signo __sigev_u.__sigev_signo
600 #define sigev_notify_kqueue __sigev_u.__sigev_notify_kqueue
601 #endif
602
603 //----------------------------------------------------------------------
604 // From sys/_iovec.h
605 //----------------------------------------------------------------------
606
607 struct vki_iovec
608 {
609 void *iov_base;
610 __vki_size_t iov_len;
611 };
612
613 //----------------------------------------------------------------------
614 // From sys/socket.h
615 //----------------------------------------------------------------------
616
617 typedef __vki_sa_family_t vki_sa_family_t;
618 typedef __vki_socklen_t vki_socklen_t;
619
620 struct vki_sockaddr {
621 vki_uint8_t sa_len;
622 vki_sa_family_t sa_family; /* address family, AF_xxx */
623 char sa_data[14]; /* 14 bytes of protocol address */
624 };
625
626 struct vki_msghdr {
627 void * msg_name; /* Socket name */
628 vki_socklen_t msg_namelen; /* Length of name */
629 struct vki_iovec * msg_iov; /* Data blocks */
630 int msg_iovlen; /* Number of blocks */
631 void * msg_control; /* Per protocol magic (eg BSD file descriptor passing) */
632 vki_socklen_t msg_controllen; /* Length of cmsg list */
633 int msg_flags;
634 };
635
636 struct vki_cmsghdr {
637 vki_socklen_t cmsg_len; /* data byte count, including hdr */
638 int cmsg_level; /* originating protocol */
639 int cmsg_type; /* protocol-specific type */
640 };
641
642 #define __VKI_CMSG_NXTHDR(ctl, len, cmsg) __vki_cmsg_nxthdr((ctl),(len),(cmsg))
643 #define VKI_CMSG_NXTHDR(mhdr, cmsg) vki_cmsg_nxthdr((mhdr), (cmsg))
644
645 #define VKI_CMSG_ALIGN(len) ( ((len)+sizeof(long)-1) & ~(sizeof(long)-1) )
646
647 #define VKI_CMSG_DATA(cmsg) ((void *)((char *)(cmsg) + VKI_CMSG_ALIGN(sizeof(struct vki_cmsghdr))))
648
649 #define __VKI_CMSG_FIRSTHDR(ctl,len) ((len) >= sizeof(struct vki_cmsghdr) ? \
650 (struct vki_cmsghdr *)(ctl) : \
651 (struct vki_cmsghdr *)NULL)
652 #define VKI_CMSG_FIRSTHDR(msg) __VKI_CMSG_FIRSTHDR((msg)->msg_control, (msg)->msg_controllen)
653
654 // [[Urgh, this is revolting...]
655 // QQQ check
__vki_cmsg_nxthdr(void * __ctl,vki_socklen_t __size,struct vki_cmsghdr * __cmsg)656 static __inline struct vki_cmsghdr * __vki_cmsg_nxthdr(void *__ctl, vki_socklen_t __size,
657 struct vki_cmsghdr *__cmsg)
658 {
659 struct vki_cmsghdr * __ptr;
660
661 __ptr = (struct vki_cmsghdr*)(((unsigned char *) __cmsg) + VKI_CMSG_ALIGN(__cmsg->cmsg_len));
662 if ((unsigned long)((char*)(__ptr+1) - (char *) __ctl) > __size)
663 return (struct vki_cmsghdr *)0;
664
665 return __ptr;
666 }
667
vki_cmsg_nxthdr(struct vki_msghdr * __msg,struct vki_cmsghdr * __cmsg)668 static __inline struct vki_cmsghdr * vki_cmsg_nxthdr (struct vki_msghdr *__msg, struct vki_cmsghdr *__cmsg)
669 {
670 return __vki_cmsg_nxthdr(__msg->msg_control, __msg->msg_controllen, __cmsg);
671 }
672
673 #define VKI_SCM_RIGHTS 0x01 /* rw: access rights (array of int) */
674
675 #define VKI_AF_UNIX 1 /* Unix domain sockets */
676 #define VKI_AF_INET 2 /* Internet IP Protocol */
677 #define VKI_AF_INET6 28 /* IP version 6 */
678
679 #define VKI_MSG_NOSIGNAL 0x20000 /* Do not generate SIGPIPE */
680
681 #define VKI_SOL_SOCKET 0xffff
682
683 #define VKI_SO_TYPE 0x1008
684
685 #define VKI_SOCK_STREAM 1
686
687 #include <netinet/tcp.h>
688
689 #define VKI_TCP_NODELAY TCP_NODELAY
690
691 #include <netinet/in.h>
692
693 #define VKI_IPPROTO_TCP IPPROTO_TCP
694
695 //----------------------------------------------------------------------
696 // From netinet/in.h
697 //----------------------------------------------------------------------
698
699 struct vki_in_addr {
700 vki_in_addr_t s_addr;
701 };
702
703 /* Structure describing an Internet (IP) socket address. */
704 #define __VKI_SOCK_SIZE__ 16 /* sizeof(struct sockaddr) */
705 struct vki_sockaddr_in {
706 vki_uint8_t sin_len;
707 vki_sa_family_t sin_family; /* Address family */
708 vki_in_port_t sin_port; /* Port number */
709 struct vki_in_addr sin_addr; /* Internet address */
710 char sin_zero[8];
711 };
712
713 //----------------------------------------------------------------------
714 // From netinet6/in6.h
715 //----------------------------------------------------------------------
716
717 struct vki_in6_addr
718 {
719 union
720 {
721 vki_uint8_t u6_addr8[16];
722 vki_uint16_t u6_addr16[8];
723 vki_uint32_t u6_addr32[4];
724 } vki_in6_u;
725 #define vki_s6_addr vki_in6_u.u6_addr8
726 #define vki_s6_addr16 vki_in6_u.u6_addr16
727 #define vki_s6_addr32 vki_in6_u.u6_addr32
728 };
729
730 struct vki_sockaddr_in6 {
731 vki_uint8_t sin6_len;
732 vki_sa_family_t sin6_family; /* AF_INET6 */
733 vki_uint16_t sin6_port; /* Transport layer port # */
734 vki_uint32_t sin6_flowinfo; /* IPv6 flow information */
735 struct vki_in6_addr sin6_addr; /* IPv6 address */
736 vki_uint32_t sin6_scope_id; /* scope id (new in RFC2553) */
737 };
738
739 //----------------------------------------------------------------------
740 // From sys/un.h
741 //----------------------------------------------------------------------
742
743 #define VKI_UNIX_PATH_MAX 104 /* QQQ overridden by sun_len */
744
745 struct vki_sockaddr_un {
746 unsigned char sun_len;
747 vki_sa_family_t sun_family; /* AF_UNIX */
748 char sun_path[VKI_UNIX_PATH_MAX]; /* pathname */
749 };
750
751 #if 0
752 //----------------------------------------------------------------------
753 // From linux-2.6.8.1/include/linux/if.h
754 //----------------------------------------------------------------------
755
756 #define VKI_IFNAMSIZ 16
757
758 struct vki_ifmap
759 {
760 unsigned long mem_start;
761 unsigned long mem_end;
762 unsigned short base_addr;
763 unsigned char irq;
764 unsigned char dma;
765 unsigned char port;
766 /* 3 bytes spare */
767 };
768
769 struct vki_if_settings
770 {
771 unsigned int type; /* Type of physical device or protocol */
772 unsigned int size; /* Size of the data allocated by the caller */
773 union {
774 // [[Nb: converted these all to void* to avoid pulling in
775 // unnecessary headers]]]
776 /* {atm/eth/dsl}_settings anyone ? */
777 void /*raw_hdlc_proto */__user *raw_hdlc;
778 void /*cisco_proto */__user *cisco;
779 void /*fr_proto */__user *fr;
780 void /*fr_proto_pvc */__user *fr_pvc;
781 void /*fr_proto_pvc_info */__user *fr_pvc_info;
782
783 /* interface settings */
784 void /*sync_serial_settings */__user *sync;
785 void /*te1_settings */__user *te1;
786 } ifs_ifsu;
787 };
788
789 struct vki_ifreq
790 {
791 #define VKI_IFHWADDRLEN 6
792 union
793 {
794 char ifrn_name[VKI_IFNAMSIZ]; /* if name, e.g. "en0" */
795 } ifr_ifrn;
796
797 union {
798 struct vki_sockaddr ifru_addr;
799 struct vki_sockaddr ifru_dstaddr;
800 struct vki_sockaddr ifru_broadaddr;
801 struct vki_sockaddr ifru_netmask;
802 struct vki_sockaddr ifru_hwaddr;
803 short ifru_flags;
804 int ifru_ivalue;
805 int ifru_mtu;
806 struct vki_ifmap ifru_map;
807 char ifru_slave[VKI_IFNAMSIZ]; /* Just fits the size */
808 char ifru_newname[VKI_IFNAMSIZ];
809 void __user * ifru_data;
810 struct vki_if_settings ifru_settings;
811 } ifr_ifru;
812 };
813
814 #define vki_ifr_name ifr_ifrn.ifrn_name /* interface name */
815 #define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */
816 #define ifr_addr ifr_ifru.ifru_addr /* address */
817 #define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-p lnk */
818 #define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */
819 #define ifr_netmask ifr_ifru.ifru_netmask /* interface net mask */
820 #define vki_ifr_flags ifr_ifru.ifru_flags /* flags */
821 #define vki_ifr_metric ifr_ifru.ifru_ivalue /* metric */
822 #define vki_ifr_mtu ifr_ifru.ifru_mtu /* mtu */
823 #define ifr_map ifr_ifru.ifru_map /* device map */
824 #define ifr_slave ifr_ifru.ifru_slave /* slave device */
825 #define vki_ifr_data ifr_ifru.ifru_data /* for use by interface */
826 #define vki_ifr_ifindex ifr_ifru.ifru_ivalue /* interface index */
827 #define ifr_bandwidth ifr_ifru.ifru_ivalue /* link bandwidth */
828 #define ifr_qlen ifr_ifru.ifru_ivalue /* Queue length */
829 #define ifr_newname ifr_ifru.ifru_newname /* New name */
830 #define ifr_settings ifr_ifru.ifru_settings /* Device/proto settings*/
831
832 struct vki_ifconf
833 {
834 int ifc_len; /* size of buffer */
835 union
836 {
837 char __user *ifcu_buf;
838 struct vki_ifreq __user *ifcu_req;
839 } ifc_ifcu;
840 };
841 #define vki_ifc_buf ifc_ifcu.ifcu_buf /* buffer address */
842
843 //----------------------------------------------------------------------
844 // From linux-2.6.8.1/include/linux/if_arp.h
845 //----------------------------------------------------------------------
846
847 struct vki_arpreq {
848 struct vki_sockaddr arp_pa; /* protocol address */
849 struct vki_sockaddr arp_ha; /* hardware address */
850 int arp_flags; /* flags */
851 struct vki_sockaddr arp_netmask; /* netmask (only for proxy arps) */
852 char arp_dev[16];
853 };
854
855 //----------------------------------------------------------------------
856 // From linux-2.6.8.1/include/linux/route.h
857 //----------------------------------------------------------------------
858
859 struct vki_rtentry
860 {
861 unsigned long rt_pad1;
862 struct vki_sockaddr rt_dst; /* target address */
863 struct vki_sockaddr rt_gateway; /* gateway addr (RTF_GATEWAY) */
864 struct vki_sockaddr rt_genmask; /* target network mask (IP) */
865 unsigned short rt_flags;
866 short rt_pad2;
867 unsigned long rt_pad3;
868 void *rt_pad4;
869 short rt_metric; /* +1 for binary compatibility! */
870 char __user *rt_dev; /* forcing the device at add */
871 unsigned long rt_mtu; /* per route MTU/Window */
872 // [[Not important for Valgrind]]
873 //#ifndef __KERNEL__
874 //#define rt_mss rt_mtu /* Compatibility :-( */
875 //#endif
876 unsigned long rt_window; /* Window clamping */
877 unsigned short rt_irtt; /* Initial RTT */
878 };
879 #endif
880
881 // QQQ sort
882
883 //----------------------------------------------------------------------
884 // From sys/mount.h
885 //----------------------------------------------------------------------
886
887 typedef struct vki_fsid { vki_int32_t val[2]; } vki_fsid_t;
888 #define VKI_OMFSNAMELEN 16
889 #define VKI_OMNAMELEN (88 - 2 * sizeof(long))
890 #define VKI_MFSNAMELEN 16
891 #define VKI_MNAMELEN 88
892
893 struct vki_statfs4 {
894 long f_spare2;
895 long f_bsize;
896 long f_iosize;
897 long f_blocks;
898 long f_bfree;
899 long f_bavail;
900 long f_files;
901 long f_ffree;
902 vki_fsid_t f_fsid;
903 vki_uid_t f_owner;
904 vki_int32_t f_type;
905 vki_int32_t f_flags;
906 long f_syncwrites;
907 long f_asyncwrites;
908 char f_fstypename[VKI_OMFSNAMELEN];
909 char f_mntonname[VKI_OMNAMELEN];
910 long f_syncreads;
911 long f_asyncreads;
912 vki_int16_t f_spares1;
913 char f_mntfromnname[VKI_OMNAMELEN];
914 vki_int16_t f_spares2;
915 long f_spare[2];
916 };
917
918 struct vki_statfs {
919 vki_uint32_t f_version;
920 vki_uint32_t f_type;
921 vki_uint64_t f_flags;
922 vki_uint64_t f_bsize;
923 vki_uint64_t f_iosize;
924 vki_uint64_t f_blocks;
925 vki_uint64_t f_bfree;
926 vki_int64_t f_bavail;
927 vki_uint64_t f_files;
928 vki_int64_t f_ffree;
929 vki_uint64_t f_syncwrites;
930 vki_uint64_t f_asyncwrites;
931 vki_uint64_t f_syncreads;
932 vki_uint64_t f_asyncreads;
933 vki_uint64_t f_spare[10];
934 vki_uint32_t f_namemax;
935 vki_uid_t f_owner;
936 vki_fsid_t f_fsid;
937 char f_charspare[80];
938 char f_fstypename[VKI_MFSNAMELEN];
939 char f_mntfromnname[VKI_MNAMELEN];
940 char f_mntonname[VKI_MNAMELEN];
941 };
942
943 #define MAXFIDSZ 16
944
945 struct vki_fid {
946 vki_uint16_t fid_len;
947 vki_uint16_t fid_reserved;
948 char fid_data[MAXFIDSZ];
949 };
950
951 struct vki_fhandle {
952 vki_fsid_t fh_fsid;
953 struct vki_fid fh_fid;
954 };
955
956 #define VKI_MNAMELEN6 88
957 struct vki_statfs6 {
958 vki_uint32_t f_version;
959 vki_uint32_t f_type;
960 vki_uint64_t f_flags;
961 vki_uint64_t f_bsize;
962 vki_uint64_t f_iosize;
963 vki_uint64_t f_blocks;
964 vki_uint64_t f_bfree;
965 vki_int64_t f_bavail;
966 vki_uint64_t f_files;
967 vki_int64_t f_ffree;
968 vki_int64_t f_syncwrites;
969 vki_int64_t f_asyncwrites;
970 vki_int64_t f_syncreads;
971 vki_int64_t f_asyncreads;
972 vki_uint64_t f_spare[10];
973 vki_uint32_t f_namemax;
974 vki_uid_t f_owner;
975 vki_fsid_t f_fsid;
976 char f_charspare[80];
977 char f_fstypename[VKI_MFSNAMELEN];
978 char f_mntfromnname[VKI_MNAMELEN6];
979 char f_mntonname[VKI_MNAMELEN6];
980 };
981
982 //----------------------------------------------------------------------
983 // From sys/ttycom.h
984 //----------------------------------------------------------------------
985
986 struct vki_winsize {
987 unsigned short ws_row;
988 unsigned short ws_col;
989 unsigned short ws_xpixel;
990 unsigned short ws_ypixel;
991 };
992
993
994 //----------------------------------------------------------------------
995 // From sys/termios.h
996 //----------------------------------------------------------------------
997
998 typedef unsigned int vki_tcflag_t;
999 typedef unsigned char vki_cc_t;
1000 typedef unsigned int vki_speed_t;
1001
1002 #define VKI_NCCS 20
1003 struct vki_termios {
1004 vki_tcflag_t c_iflag; /* input mode flags */
1005 vki_tcflag_t c_oflag; /* output mode flags */
1006 vki_tcflag_t c_cflag; /* control mode flags */
1007 vki_tcflag_t c_lflag; /* local mode flags */
1008 vki_cc_t c_cc[VKI_NCCS]; /* control characters */
1009 vki_speed_t c_ispeed;
1010 vki_speed_t c_ospeed;
1011 };
1012
1013 //----------------------------------------------------------------------
1014 // From sys/ioccom.h
1015 //----------------------------------------------------------------------
1016
1017 /* QQQ keep linux's naming, but use our layout */
1018
1019 /*
1020 * We actually have a 16 bit "base" ioctl, which may or may not be decoded
1021 * into number/group
1022 */
1023 #define _VKI_IOC_BASEBITS 16
1024 #define _VKI_IOC_NRBITS 8 /* "num" on freebsd */
1025 #define _VKI_IOC_TYPEBITS 8 /* "group" on freebsd */
1026
1027 #define _VKI_IOC_SIZEBITS 13
1028 #define _VKI_IOC_DIRBITS 3
1029
1030 #define _VKI_IOC_BASEMASK ((1ul << _VKI_IOC_BASEBITS)-1)
1031 #define _VKI_IOC_NRMASK ((1ul << _VKI_IOC_NRBITS)-1)
1032 #define _VKI_IOC_TYPEMASK ((1ul << _VKI_IOC_TYPEBITS)-1)
1033 #define _VKI_IOC_SIZEMASK ((1ul << _VKI_IOC_SIZEBITS)-1)
1034 #define _VKI_IOC_DIRMASK ((1ul << _VKI_IOC_DIRBITS)-1)
1035
1036 #define _VKI_IOC_BASESHIFT 0
1037 #define _VKI_IOC_NRSHIFT 0
1038 #define _VKI_IOC_TYPESHIFT (_VKI_IOC_NRSHIFT+_VKI_IOC_NRBITS)
1039 #define _VKI_IOC_SIZESHIFT (_VKI_IOC_TYPESHIFT+_VKI_IOC_TYPEBITS)
1040 #define _VKI_IOC_DIRSHIFT (_VKI_IOC_SIZESHIFT+_VKI_IOC_SIZEBITS)
1041
1042 #define _VKI_IOC_NONE 1U /* "void" on freebsd, as a specific mode */
1043 #define _VKI_IOC_READ 2U /* "out", copyout in reversed linux terminology */
1044 #define _VKI_IOC_WRITE 4U /* "in", copyin in reversed linux terminology */
1045 #define _VKI_IOC_RDWR 6U /* "inout", copyin and copyout */
1046
1047 #define _VKI_IOC(dir,type,nr,size) \
1048 (((dir) << _VKI_IOC_DIRSHIFT) | \
1049 ((type) << _VKI_IOC_TYPESHIFT) | \
1050 ((nr) << _VKI_IOC_NRSHIFT) | \
1051 ((size) << _VKI_IOC_SIZESHIFT))
1052
1053 /* provoke compile error for invalid uses of size argument */
1054 extern unsigned int __vki_invalid_size_argument_for_IOC;
1055 #define _VKI_IOC_TYPECHECK(t) \
1056 ((sizeof(t) == sizeof(t[1]) && \
1057 sizeof(t) < (1 << _VKI_IOC_SIZEBITS)) ? \
1058 sizeof(t) : __vki_invalid_size_argument_for_IOC)
1059
1060 /* used to create numbers */
1061 #define _VKI_IO(type,nr) _VKI_IOC(_VKI_IOC_NONE,(type),(nr),0)
1062 #define _VKI_IOR(type,nr,size) _VKI_IOC(_VKI_IOC_READ,(type),(nr),(_VKI_IOC_TYPECHECK(size)))
1063 #define _VKI_IOW(type,nr,size) _VKI_IOC(_VKI_IOC_WRITE,(type),(nr),(_VKI_IOC_TYPECHECK(size)))
1064 #define _VKI_IOWR(type,nr,size) _VKI_IOC(_VKI_IOC_READ|_VKI_IOC_WRITE,(type),(nr),(_VKI_IOC_TYPECHECK(size)))
1065
1066 /* used to decode ioctl numbers.. */
1067 #define _VKI_IOC_DIR(nr) (((nr) >> _VKI_IOC_DIRSHIFT) & _VKI_IOC_DIRMASK)
1068 #define _VKI_IOC_TYPE(nr) (((nr) >> _VKI_IOC_TYPESHIFT) & _VKI_IOC_TYPEMASK)
1069 #define _VKI_IOC_NR(nr) (((nr) >> _VKI_IOC_NRSHIFT) & _VKI_IOC_NRMASK)
1070 #define _VKI_IOC_SIZE(nr) (((nr) >> _VKI_IOC_SIZESHIFT) & _VKI_IOC_SIZEMASK)
1071 #define _VKI_IOC_BASE(nr) (((nr) >> _VKI_IOC_BASESHIFT) & _VKI_IOC_BASEMASK)
1072
1073
1074 //----------------------------------------------------------------------
1075 // From sys/termios.h
1076 //----------------------------------------------------------------------
1077
1078 #if 0
1079 #define VKI_TCGETS 0x5401
1080 #define VKI_TCSETS 0x5402 /* Clashes with SNDCTL_TMR_START sound ioctl */
1081 #define VKI_TCSETSW 0x5403
1082 #define VKI_TCSETSF 0x5404
1083 #define VKI_TCGETA 0x5405 y
1084 #define VKI_TCSETA 0x5406 y
1085 #define VKI_TCSETAW 0x5407 y
1086 #define VKI_TCSETAF 0x5408 y
1087 #define VKI_TCSBRK 0x5409
1088 #define VKI_TCXONC 0x540A
1089 #define VKI_TCFLSH 0x540B y
1090 #define VKI_TIOCSCTTY 0x540E
1091 #define VKI_TIOCGPGRP 0x540F y
1092 #define VKI_TIOCSPGRP 0x5410 y
1093 #define VKI_TIOCOUTQ 0x5411
1094 #define VKI_TIOCGWINSZ 0x5413 y
1095 #define VKI_TIOCSWINSZ 0x5414 y
1096 #define VKI_TIOCMGET 0x5415 y
1097 #define VKI_TIOCMBIS 0x5416 y
1098 #define VKI_TIOCMBIC 0x5417 y
1099 #define VKI_TIOCMSET 0x5418 y
1100 #define VKI_FIONREAD 0x541B
1101 #define VKI_TIOCLINUX 0x541C
1102 #define VKI_FIONBIO 0x5421
1103 #define VKI_TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */
1104 #define VKI_TIOCGPTN _VKI_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
1105 #define VKI_TIOCSPTLCK _VKI_IOW('T',0x31, int) /* Lock/unlock Pty */
1106
1107 #define VKI_FIOASYNC 0x5452
1108 #define VKI_TIOCSERGETLSR 0x5459 /* Get line status register */
1109
1110 #define VKI_TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */
1111 #endif
1112
1113 #define VKI_TIOCFLUSH _VKI_IOW('t', 16, int);
1114 #define VKI_TIOCGETA _VKI_IOR('t', 19, struct vki_termios) /* get termios */
1115 #define VKI_TIOCSETA _VKI_IOR('t', 20, struct vki_termios) /* set termios */
1116 #define VKI_TIOCSETAW _VKI_IOR('t', 21, struct vki_termios) /* drain,set */
1117 #define VKI_TIOCSETAF _VKI_IOR('t', 22, struct vki_termios) /* flush,set */
1118
1119 #define VKI_TIOCSBRK _VKI_IO('t', 123)
1120 #define VKI_TIOCCBRK _VKI_IO('t', 122)
1121 #define VKI_TIOCGPGRP _VKI_IOR('t', 119, int) /* get pgrp */
1122 #define VKI_TIOCSPGRP _VKI_IOW('t', 118, int) /* set pgrp */
1123
1124 #define VKI_TIOCGWINSZ _VKI_IOR('t', 104, struct vki_winsize) /* get window size */
1125 #define VKI_TIOCSWINSZ _VKI_IOW('t', 103, struct vki_winsize) /* set window size */
1126
1127 #define VKI_TIOCMGET _VKI_IOR('t', 106, int) /* get all modem bits */
1128 #define VKI_TIOCMBIS _VKI_IOW('t', 108, int) /* bis modem bits */
1129 #define VKI_TIOCMBIC _VKI_IOW('t', 107, int) /* bic modem bits */
1130 #define VKI_TIOCMSET _VKI_IOW('t', 109, int) /* set all modem bits */
1131
1132
1133 //----------------------------------------------------------------------
1134 // From sys/filio.h
1135 //----------------------------------------------------------------------
1136
1137 #define VKI_FIOCLEX _VKI_IO('f', 1) /* close on exec */
1138 #define VKI_FIONCLEX _VKI_IO('f', 2) /* no close on exec */
1139 #define VKI_FIONREAD _VKI_IOR('f', 127, int)
1140 #define VKI_FIONBIO _VKI_IOW('f', 126, int)
1141 #define VKI_FIOASYNC _VKI_IOW('f', 125, int)
1142 #define VKI_FIOSETOWN _VKI_IOW('f', 124, int)
1143 #define VKI_FIOGETOWN _VKI_IOW('f', 123, int)
1144
1145 //----------------------------------------------------------------------
1146 // From sys/poll.h
1147 //----------------------------------------------------------------------
1148
1149 #define VKI_POLLIN 0x0001
1150
1151 struct vki_pollfd {
1152 int fd;
1153 short events;
1154 short revents;
1155 };
1156
1157 //----------------------------------------------------------------------
1158 // From sys/kevent.h
1159 //----------------------------------------------------------------------
1160 struct vki_kevent {
1161 vki_uintptr_t ident;
1162 vki_int16_t filter;
1163 vki_uint16_t flags;
1164 vki_uint32_t fflags;
1165 vki_intptr_t data;
1166 void *udata;
1167 };
1168
1169
1170 // QQQ sort
1171
1172 //----------------------------------------------------------------------
1173 // From sys/resource.h
1174 //----------------------------------------------------------------------
1175
1176 struct vki_rusage {
1177 struct vki_timeval ru_utime; /* user time used */
1178 struct vki_timeval ru_stime; /* system time used */
1179 long ru_maxrss; /* maximum resident set size */
1180 long ru_ixrss; /* integral shared memory size */
1181 long ru_idrss; /* integral unshared data size */
1182 long ru_isrss; /* integral unshared stack size */
1183 long ru_minflt; /* page reclaims */
1184 long ru_majflt; /* page faults */
1185 long ru_nswap; /* swaps */
1186 long ru_inblock; /* block input operations */
1187 long ru_oublock; /* block output operations */
1188 long ru_msgsnd; /* messages sent */
1189 long ru_msgrcv; /* messages received */
1190 long ru_nsignals; /* signals received */
1191 long ru_nvcsw; /* voluntary context switches */
1192 long ru_nivcsw; /* involuntary " */
1193 };
1194
1195 struct vki_rlimit {
1196 vki_rlim_t rlim_cur;
1197 vki_rlim_t rlim_max;
1198 };
1199
1200 #define VKI_RLIMIT_DATA 2 /* max data size */
1201 #define VKI_RLIMIT_STACK 3 /* max stack size */
1202 #define VKI_RLIMIT_CORE 4 /* max core file size */
1203 #define VKI_RLIMIT_NOFILE 8 /* max number of open files */
1204
1205 //----------------------------------------------------------------------
1206 // From sys/procfs.h
1207 //----------------------------------------------------------------------
1208
1209 #define VKI_PRSTATUS_VERSION 1
1210 struct vki_elf_prstatus
1211 {
1212 int pr_version; /* version of struct - PRSTATUS_VERSION */
1213 vki_size_t pr_statussz;
1214 vki_size_t pr_gregsetsz;
1215 vki_size_t pr_fpregsetsz;
1216 int pr_osreldate;
1217 short pr_cursig; /* Current signal */
1218 vki_pid_t pr_pid;
1219 vki_elf_gregset_t pr_reg; /* GP registers */
1220 };
1221
1222 #define VKI_ELF_PRARGSZ (80) /* Number of chars for args */
1223 #define VKI_MAXCOMLEN (16)
1224
1225 #define VKI_PRPSINFO_VERSION 1
1226 struct vki_elf_prpsinfo
1227 {
1228 int pr_version; /* version of struct - PRPSINFO_VERSION */
1229 vki_size_t pr_psinfosz;
1230 char pr_fname[VKI_MAXCOMLEN+1]; /* filename of executable */
1231 char pr_psargs[VKI_ELF_PRARGSZ]; /* initial part of arg list */
1232 };
1233
1234 //----------------------------------------------------------------------
1235 // From posix4/mqueue.h
1236 //----------------------------------------------------------------------
1237
1238 struct vki_mq_attr {
1239 long mq_flags; /* message queue flags */
1240 long mq_maxmsg; /* maximum number of messages */
1241 long mq_msgsize; /* maximum message size */
1242 long mq_curmsgs; /* number of messages currently queued */
1243 };
1244
1245 //----------------------------------------------------------------------
1246 // From sys/ucontext.h
1247 //----------------------------------------------------------------------
1248
1249 #define VKI_UCF_SWAPPED 1
1250
1251 struct vki_ucontext {
1252 vki_sigset_t uc_sigmask;
1253 struct vki_mcontext uc_mcontext;
1254 struct vki_ucontext *uc_link;
1255 vki_stack_t uc_stack;
1256 int uc_flags;
1257 unsigned int __spare__[4];
1258 };
1259
1260 //----------------------------------------------------------------------
1261 // From sys/utsname.h
1262 //----------------------------------------------------------------------
1263
1264 #define VKI_SYS_NMLN 32
1265
1266 struct vki_utsname {
1267 char sysname[VKI_SYS_NMLN]; /* Name of this OS. */
1268 char nodename[VKI_SYS_NMLN]; /* Name of this network node. */
1269 char release[VKI_SYS_NMLN]; /* Release level. */
1270 char version[VKI_SYS_NMLN]; /* Version level. */
1271 char machine[VKI_SYS_NMLN]; /* Hardware type. */
1272 };
1273
1274 #define VKI_IPC_CREAT 00001000 /* create if key is nonexistent */
1275 #define VKI_IPC_EXCL 00002000 /* fail if key exists */
1276 #define VKI_IPC_NOWAIT 00004000 /* return error on wait */
1277
1278 #define VKI_IPC_RMID 0 /* remove resource */
1279 #define VKI_IPC_SET 1 /* set ipc_perm options */
1280 #define VKI_IPC_STAT 2 /* get ipc_perm options */
1281 #define VKI_IPC_INFO 3 /* see ipcs */
1282
1283 struct vki_ipc_perm
1284 {
1285 vki_uid_t cuid;
1286 vki_gid_t cgid;
1287 vki_uid_t uid;
1288 vki_gid_t gid;
1289 vki_mode_t mode;
1290 unsigned short seq;
1291 vki_key_t key;
1292 };
1293
1294 struct vki_ipc_perm7
1295 {
1296 unsigned short cuid;
1297 unsigned short cgid;
1298 unsigned short uid;
1299 unsigned short gid;
1300 unsigned short mode;
1301 unsigned short seq;
1302 vki_key_t key;
1303 };
1304
1305 //----------------------------------------------------------------------
1306 // From sys/sem.h
1307 //----------------------------------------------------------------------
1308
1309 #if 0
1310 #define VKI_SEMOP 1
1311 #define VKI_SEMGET 2
1312 #define VKI_SEMCTL 3
1313 #define VKI_SEMTIMEDOP 4
1314 #endif
1315
1316 #define VKI_GETALL 6 /* get all semval's */
1317 #define VKI_SETVAL 8 /* set semval */
1318 #define VKI_SETALL 9 /* set all semval's */
1319 #define VKI_SEM_STAT 10
1320 #define VKI_SEM_INFO 11
1321
1322 /* Obsolete, used only for backwards compatibility and libc5 compiles */
1323 struct vki_semid_ds {
1324 struct vki_ipc_perm sem_perm; /* permissions .. see ipc.h */
1325 // [[Use void* to avoid excess header copying]]
1326 void/*struct sem */*sem_base; /* ptr to first semaphore in array */
1327 unsigned short sem_nsems; /* no. of semaphores in array */
1328 vki_time_t sem_otime; /* last semop time */
1329 vki_time_t sem_ctime; /* last change time */
1330 long sem_pad2;
1331 long sem_pad3[4];
1332 };
1333
1334 struct vki_sembuf {
1335 vki_uint16_t sem_num; /* semaphore index in array */
1336 vki_int16_t sem_op; /* semaphore operation */
1337 vki_int16_t sem_flg; /* operation flags */
1338 };
1339
1340 union vki_semun {
1341 int val; /* value for SETVAL */
1342 struct vki_semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */
1343 vki_uint16_t *array; /* array for GETALL & SETALL */
1344 };
1345
1346
1347 //----------------------------------------------------------------------
1348 // From sys/errno.h
1349 //----------------------------------------------------------------------
1350
1351 #define VKI_ERESTART -1
1352 #define VKI_EPERM 1 /* Operation not permitted */
1353 #define VKI_ENOENT 2 /* No such file or directory */
1354 #define VKI_ESRCH 3 /* No such process */
1355 #define VKI_EINTR 4 /* Interrupted system call */
1356 #define VKI_EIO 5 /* Input/output error */
1357 #define VKI_ENXIO 6 /* Device not configured */
1358 #define VKI_E2BIG 7 /* Argument list too long */
1359 #define VKI_ENOEXEC 8 /* Exec format error */
1360 #define VKI_EBADF 9 /* Bad file descriptor */
1361 #define VKI_ECHILD 10 /* No child processes */
1362 #define VKI_EDEADLK 11 /* Resource deadlock avoided */
1363 #define VKI_ENOMEM 12 /* Cannot allocate memory */
1364 #define VKI_EACCES 13 /* Permission denied */
1365 #define VKI_EFAULT 14 /* Bad address */
1366 #define VKI_ENOTBLK 15 /* Block device required */
1367 #define VKI_EBUSY 16 /* Device busy */
1368 #define VKI_EEXIST 17 /* File exists */
1369 #define VKI_EXDEV 18 /* Cross-device link */
1370 #define VKI_ENODEV 19 /* Operation not supported by device */
1371 #define VKI_ENOTDIR 20 /* Not a directory */
1372 #define VKI_EISDIR 21 /* Is a directory */
1373 #define VKI_EINVAL 22 /* Invalid argument */
1374 #define VKI_ENFILE 23 /* Too many open files in system */
1375 #define VKI_EMFILE 24 /* Too many open files */
1376 #define VKI_ENOTTY 25 /* Inappropriate ioctl for device */
1377 #define VKI_ETXTBSY 26 /* Text file busy */
1378 #define VKI_EFBIG 27 /* File too large */
1379 #define VKI_ENOSPC 28 /* No space left on device */
1380 #define VKI_ESPIPE 29 /* Illegal seek */
1381 #define VKI_EROFS 30 /* Read-only filesystem */
1382 #define VKI_EMLINK 31 /* Too many links */
1383 #define VKI_EPIPE 32 /* Broken pipe */
1384 #define VKI_EDOM 33 /* Numerical argument out of domain */
1385 #define VKI_ERANGE 34 /* Result too large */
1386 #define VKI_EAGAIN 35 /* Resource temporarily unavailable */
1387 #define VKI_EWOULDBLOCK VKI_EAGAIN /* Operation would block */
1388 #define VKI_EINPROGRESS 36 /* Operation now in progress */
1389 #define VKI_EALREADY 37 /* Operation already in progress */
1390 #define VKI_ENOTSOCK 38 /* Socket operation on non-socket */
1391 #define VKI_EDESTADDRREQ 39 /* Destination address required */
1392 #define VKI_EMSGSIZE 40 /* Message too long */
1393 #define VKI_EPROTOTYPE 41 /* Protocol wrong type for socket */
1394 #define VKI_ENOPROTOOPT 42 /* Protocol not available */
1395 #define VKI_EPROTONOSUPPORT 43 /* Protocol not supported */
1396 #define VKI_ESOCKTNOSUPPORT 44 /* Socket type not supported */
1397 #define VKI_EOPNOTSUPP 45 /* Operation not supported */
1398 #define VKI_ENOTSUP VKI_EOPNOTSUPP /* Operation not supported */
1399 #define VKI_EPFNOSUPPORT 46 /* Protocol family not supported */
1400 #define VKI_EAFNOSUPPORT 47 /* Address family not supported by protocol family */
1401 #define VKI_EADDRINUSE 48 /* Address already in use */
1402 #define VKI_EADDRNOTAVAIL 49
1403 #define VKI_ENETDOWN 50 /* Network is down */
1404 #define VKI_ENETUNREACH 51 /* Network is unreachable */
1405 #define VKI_ENETRESET 52 /* Network dropped connection on reset */
1406 #define VKI_ECONNABORTED 53 /* Software caused connection abort */
1407 #define VKI_ECONNRESET 54 /* Connection reset by peer */
1408 #define VKI_ENOBUFS 55 /* No buffer space available */
1409 #define VKI_EISCONN 56 /* Socket is already connected */
1410 #define VKI_ENOTCONN 57 /* Socket is not connected */
1411 #define VKI_ESHUTDOWN 58 /* Can't send after socket shutdown */
1412 #define VKI_ETOOMANYREFS 59 /* Too many references: can't splice */
1413 #define VKI_ETIMEDOUT 60 /* Operation timed out */
1414 #define VKI_ECONNREFUSED 61 /* Connection refused */
1415 #define VKI_ELOOP 62 /* Too many levels of symbolic links */
1416 #define VKI_ENAMETOOLONG 63 /* File name too long */
1417 #define VKI_EHOSTDOWN 64 /* Host is down */
1418 #define VKI_EHOSTUNREACH 65 /* No route to host */
1419 #define VKI_ENOTEMPTY 66 /* Directory not empty */
1420 #define VKI_EPROCLIM 67 /* Too many processes */
1421 #define VKI_EUSERS 68 /* Too many users */
1422 #define VKI_EDQUOT 69 /* Disc quota exceeded */
1423 #define VKI_ESTALE 70 /* Stale NFS file handle */
1424 #define VKI_EREMOTE 71 /* Too many levels of remote in path */
1425 #define VKI_EBADRPC 72 /* RPC struct is bad */
1426 #define VKI_ERPCMISMATCH 73 /* RPC version wrong */
1427 #define VKI_EPROGUNAVAIL 74 /* RPC prog. not avail */
1428 #define VKI_EPROGMISMATCH 75 /* Program version wrong */
1429 #define VKI_EPROCUNAVAIL 76 /* Bad procedure for program */
1430 #define VKI_ENOLCK 77 /* No locks available */
1431 #define VKI_ENOSYS 78 /* Function not implemented */
1432 #define VKI_EFTYPE 79 /* Inappropriate file type or format */
1433 #define VKI_EAUTH 80 /* Authentication error */
1434 #define VKI_ENEEDAUTH 81 /* Need authenticator */
1435 #define VKI_EIDRM 82 /* Identifier removed */
1436 #define VKI_ENOMSG 83 /* No message of desired type */
1437 #define VKI_EOVERFLOW 84 /* Value too large to be stored in data type */
1438 #define VKI_ECANCELED 85 /* Operation canceled */
1439 #define VKI_EILSEQ 86 /* Illegal byte sequence */
1440 #define VKI_ENOATTR 87 /* Attribute not found */
1441 #define VKI_EDOOFUS 88 /* Programming error */
1442 #define VKI_EBADMSG 89 /* Bad message */
1443 #define VKI_EMULTIHOP 90 /* Multihop attempted */
1444 #define VKI_ENOLINK 91 /* Link has been severed */
1445 #define VKI_EPROTO 92 /* Protocol error */
1446 #define VKI_ENOTCAPABLE 93 /* Capabilities insufficient */
1447 #define VKI_ECAPMODE 94 /* Not permitted in capability mode */
1448
1449 //----------------------------------------------------------------------
1450 // From sys/wait.h
1451 //----------------------------------------------------------------------
1452
1453 #define VKI_WNOHANG 0x00000001
1454
1455 //----------------------------------------------------------------------
1456 // From sys/mman.h
1457 //----------------------------------------------------------------------
1458
1459 #define VKI_PROT_NONE 0x00 /* No page permissions */
1460 #define VKI_PROT_READ 0x01 /* page can be read */
1461 #define VKI_PROT_WRITE 0x02 /* page can be written */
1462 #define VKI_PROT_EXEC 0x04 /* page can be executed */
1463
1464 #define VKI_MAP_SHARED 0x01 /* Share changes */
1465 #define VKI_MAP_PRIVATE 0x02 /* Changes are private */
1466 #define VKI_MAP_FIXED 0x10 /* Interpret addr exactly */
1467 #define VKI_MAP_NORESERVE 0x0040 /* don't check for reservations */
1468 #define VKI_MAP_STACK 0x400
1469 #define VKI_MAP_ANON 0x1000 /* don't use a file */
1470 #define VKI_MAP_ANONYMOUS VKI_MAP_ANON
1471
1472 //----------------------------------------------------------------------
1473 // From sys/stat.h
1474 //----------------------------------------------------------------------
1475
1476 #define VKI_S_IFMT 00170000
1477
1478 #define VKI_S_IFWHT 0160000
1479 #define VKI_S_IFSOCK 0140000
1480 #define VKI_S_IFLNK 0120000
1481 #define VKI_S_IFREG 0100000
1482 #define VKI_S_IFBLK 0060000
1483 #define VKI_S_IFDIR 0040000
1484 #define VKI_S_IFCHR 0020000
1485 #define VKI_S_IFIFO 0010000
1486 #define VKI_S_ISUID 0004000
1487 #define VKI_S_ISGID 0002000
1488 #define VKI_S_ISTXT 0001000
1489
1490 #define VKI_S_ISLNK(m) (((m) & VKI_S_IFMT) == VKI_S_IFLNK)
1491 #define VKI_S_ISREG(m) (((m) & VKI_S_IFMT) == VKI_S_IFREG)
1492 #define VKI_S_ISDIR(m) (((m) & VKI_S_IFMT) == VKI_S_IFDIR)
1493 #define VKI_S_ISCHR(m) (((m) & VKI_S_IFMT) == VKI_S_IFCHR)
1494 #define VKI_S_ISBLK(m) (((m) & VKI_S_IFMT) == VKI_S_IFBLK)
1495 #define VKI_S_ISFIFO(m) (((m) & VKI_S_IFMT) == VKI_S_IFIFO)
1496 #define VKI_S_ISSOCK(m) (((m) & VKI_S_IFMT) == VKI_S_IFSOCK)
1497 #define VKI_S_ISWHT(m) (((m) & VKI_S_IFMT) == VKI_S_IFWHT)
1498
1499 #define VKI_S_IRWXU 00700
1500 #define VKI_S_IRUSR 00400
1501 #define VKI_S_IWUSR 00200
1502 #define VKI_S_IXUSR 00100
1503
1504 #define VKI_S_IRWXG 00070
1505 #define VKI_S_IRGRP 00040
1506 #define VKI_S_IWGRP 00020
1507 #define VKI_S_IXGRP 00010
1508
1509 #define VKI_S_IRWXO 00007
1510 #define VKI_S_IROTH 00004
1511 #define VKI_S_IWOTH 00002
1512 #define VKI_S_IXOTH 00001
1513
1514
1515 //----------------------------------------------------------------------
1516 // From sys/dirent.h
1517 //----------------------------------------------------------------------
1518
1519 struct vki_dirent {
1520 vki_uint32_t d_fileno;
1521 vki_uint16_t d_reclen;
1522 vki_uint8_t d_type;
1523 vki_uint8_t d_namelen;
1524 char d_name[256]; /* We must not include limits.h! */
1525 };
1526
1527 //----------------------------------------------------------------------
1528 // From sys/fcntl.h
1529 //----------------------------------------------------------------------
1530
1531 #define VKI_O_RDONLY O_RDONLY
1532 #define VKI_O_WRONLY O_WRONLY
1533 #define VKI_O_RDWR O_RDWR
1534
1535 #define VKI_O_NONBLOCK O_NONBLOCK
1536 #define VKI_O_APPEND O_APPEND
1537 #define VKI_O_CREAT O_CREAT
1538 #define VKI_O_TRUNC O_TRUNC
1539 #define VKI_O_EXCL O_EXCL
1540
1541 #define VKI_AT_FDCWD AT_FDCWD
1542
1543 #define VKI_F_DUPFD 0 /* dup */
1544 #define VKI_F_GETFD 1 /* get close_on_exec */
1545 #define VKI_F_SETFD 2 /* set/clear close_on_exec */
1546 #define VKI_F_GETFL 3 /* get file->f_flags */
1547 #define VKI_F_SETFL 4 /* set file->f_flags */
1548 #define VKI_F_SETOWN 5 /* for sockets. */
1549 #define VKI_F_GETOWN 6 /* for sockets. */
1550 #define VKI_F_OGETLK 7 /* get record locking information */
1551 #define VKI_F_OSETLK 8 /* set record locking information */
1552 #define VKI_F_OSETLKW 9 /* F_SETLK; wait if blocked */
1553 #define VKI_F_DUP2FD 10 /* duplicate file descriptor to arg */
1554 #define VKI_F_GETLK 11 /* get record locking information */
1555 #define VKI_F_SETLK 12 /* set record locking information */
1556 #define VKI_F_SETLKW 13 /* F_SETLK; wait if blocked */
1557 #define VKI_F_SETLK_REMOTE 14 /* debugging support for remote locks */
1558 #define VKI_F_DUPFD_CLOEXEC 17 /* dup close_on_exec */
1559
1560 /* for F_[GET|SET]FL */
1561 #define VKI_FD_CLOEXEC 1 /* actually anything with low bit set goes */
1562
1563 //----------------------------------------------------------------------
1564 // From sys/unistd.h
1565 //----------------------------------------------------------------------
1566
1567 #define VKI_SEEK_SET 0
1568 #define VKI_SEEK_CUR 1
1569 #define VKI_SEEK_END 2
1570
1571 #define VKI_F_OK 0 /* test for existence of file */
1572 #define VKI_X_OK 0x01 /* test for execute or search permission */
1573 #define VKI_W_OK 0x02 /* test for write permission */
1574 #define VKI_R_OK 0x04 /* test for read permission */
1575
1576 //----------------------------------------------------------------------
1577 // From sys/msg.h
1578 //----------------------------------------------------------------------
1579
1580 #if 0 /* not in freebsd */
1581 #define VKI_MSGSND 11
1582 #define VKI_MSGRCV 12
1583 #define VKI_MSGGET 13
1584 #define VKI_MSGCTL 14
1585 #endif
1586
1587 struct vki_msqid_ds {
1588 struct vki_ipc_perm msg_perm;
1589 struct vki_msg *msg_first; /* first message on queue,unused */
1590 struct vki_msg *msg_last; /* last message in queue,unused */
1591 vki_uint32_t msg_cbytes; /* current number of bytes on queue */
1592 vki_uint32_t msg_qnum; /* number of messages in queue */
1593 vki_uint32_t msg_qbytes; /* max number of bytes on queue */
1594 vki_pid_t msg_lspid; /* pid of last msgsnd */
1595 vki_pid_t msg_lrpid; /* last receive pid */
1596 vki_time_t msg_stime; /* last msgsnd time */
1597 vki_uint32_t msg_pad1;
1598 vki_time_t msg_rtime; /* last msgrcv time */
1599 vki_uint32_t msg_pad2;
1600 vki_time_t msg_ctime; /* last change time */
1601 vki_uint32_t msg_pad3;
1602 vki_uint32_t msg_pad4[4];
1603 };
1604
1605 struct vki_msgbuf {
1606 long mtype; /* type of message */
1607 char mtext[1]; /* message text */
1608 };
1609
1610
1611 //----------------------------------------------------------------------
1612 // From sys/shm.h
1613 //----------------------------------------------------------------------
1614
1615 struct vki_shmid_ds {
1616 struct vki_ipc_perm shm_perm; /* operation perms */
1617 vki_size_t shm_segsz; /* size of segment (bytes) */
1618 vki_pid_t shm_lpid; /* pid of last operator */
1619 vki_pid_t shm_cpid; /* pid of creator */
1620 int shm_nattch; /* no. of current attaches */
1621 vki_time_t shm_atime; /* last attach time */
1622 vki_time_t shm_dtime; /* last detach time */
1623 vki_time_t shm_ctime; /* last change time */
1624 };
1625
1626 struct vki_shmid_ds7 {
1627 struct vki_ipc_perm7 shm_perm; /* operation perms */
1628 int shm_segsz; /* size of segment (bytes) */
1629 vki_pid_t shm_lpid; /* pid of last operator */
1630 vki_pid_t shm_cpid; /* pid of creator */
1631 short shm_nattch; /* no. of current attaches */
1632 vki_time_t shm_atime; /* last attach time */
1633 vki_time_t shm_dtime; /* last detach time */
1634 vki_time_t shm_ctime; /* last change time */
1635 void *shm_internal; /* sysv stupidity */
1636 };
1637
1638 #define VKI_SHMLBA VKI_PAGE_SIZE
1639 #define VKI_SHM_RDONLY 010000 /* read-only access */
1640 #define VKI_SHM_ANON (1UL)
1641
1642 #if 0 /* not in freebsd abi */
1643 #define VKI_SHMAT 21
1644 #define VKI_SHMDT 22
1645 #define VKI_SHMGET 23
1646 #define VKI_SHMCTL 24
1647 #endif
1648
1649 #if 0
1650 //----------------------------------------------------------------------
1651 // From linux-2.6.8.1/include/linux/sockios.h
1652 //----------------------------------------------------------------------
1653
1654 #define VKI_SIOCOUTQ VKI_TIOCOUTQ
1655
1656 #define VKI_SIOCADDRT 0x890B /* add routing table entry */
1657 #define VKI_SIOCDELRT 0x890C /* delete routing table entry */
1658
1659 #define VKI_SIOCGIFNAME 0x8910 /* get iface name */
1660 #define VKI_SIOCGIFCONF 0x8912 /* get iface list */
1661 #define VKI_SIOCGIFFLAGS 0x8913 /* get flags */
1662 #define VKI_SIOCSIFFLAGS 0x8914 /* set flags */
1663 #define VKI_SIOCGIFADDR 0x8915 /* get PA address */
1664 #define VKI_SIOCSIFADDR 0x8916 /* set PA address */
1665 #define VKI_SIOCGIFDSTADDR 0x8917 /* get remote PA address */
1666 #define VKI_SIOCSIFDSTADDR 0x8918 /* set remote PA address */
1667 #define VKI_SIOCGIFBRDADDR 0x8919 /* get broadcast PA address */
1668 #define VKI_SIOCSIFBRDADDR 0x891a /* set broadcast PA address */
1669 #define VKI_SIOCGIFNETMASK 0x891b /* get network PA mask */
1670 #define VKI_SIOCSIFNETMASK 0x891c /* set network PA mask */
1671 #define VKI_SIOCGIFMETRIC 0x891d /* get metric */
1672 #define VKI_SIOCSIFMETRIC 0x891e /* set metric */
1673 #define VKI_SIOCGIFMTU 0x8921 /* get MTU size */
1674 #define VKI_SIOCSIFMTU 0x8922 /* set MTU size */
1675 #define VKI_SIOCSIFHWADDR 0x8924 /* set hardware address */
1676 #define VKI_SIOCGIFHWADDR 0x8927 /* Get hardware address */
1677 #define VKI_SIOCGIFINDEX 0x8933 /* name -> if_index mapping */
1678
1679 #define VKI_SIOCGIFTXQLEN 0x8942 /* Get the tx queue length */
1680 #define VKI_SIOCSIFTXQLEN 0x8943 /* Set the tx queue length */
1681
1682 #define VKI_SIOCGMIIPHY 0x8947 /* Get address of MII PHY in use. */
1683 #define VKI_SIOCGMIIREG 0x8948 /* Read MII PHY register. */
1684 #define VKI_SIOCSMIIREG 0x8949 /* Write MII PHY register. */
1685
1686 #define VKI_SIOCDARP 0x8953 /* delete ARP table entry */
1687 #define VKI_SIOCGARP 0x8954 /* get ARP table entry */
1688 #define VKI_SIOCSARP 0x8955 /* set ARP table entry */
1689
1690 #define VKI_SIOCDRARP 0x8960 /* delete RARP table entry */
1691 #define VKI_SIOCGRARP 0x8961 /* get RARP table entry */
1692 #define VKI_SIOCSRARP 0x8962 /* set RARP table entry */
1693
1694 #define VKI_SIOCGIFMAP 0x8970 /* Get device parameters */
1695 #define VKI_SIOCSIFMAP 0x8971 /* Set device parameters */
1696
1697 //----------------------------------------------------------------------
1698 // From linux-2.6.9/include/linux/kb.h
1699 //----------------------------------------------------------------------
1700
1701 #define VKI_GIO_FONT 0x4B60 /* gets font in expanded form */
1702 #define VKI_PIO_FONT 0x4B61 /* use font in expanded form */
1703
1704 #define VKI_GIO_FONTX 0x4B6B /* get font using struct consolefontdesc */
1705 #define VKI_PIO_FONTX 0x4B6C /* set font using struct consolefontdesc */
1706 struct vki_consolefontdesc {
1707 unsigned short charcount; /* characters in font (256 or 512) */
1708 unsigned short charheight; /* scan lines per character (1-32) */
1709 char __user *chardata; /* font data in expanded form */
1710 };
1711
1712 #define VKI_PIO_FONTRESET 0x4B6D /* reset to default font */
1713
1714 #define VKI_GIO_CMAP 0x4B70 /* gets colour palette on VGA+ */
1715 #define VKI_PIO_CMAP 0x4B71 /* sets colour palette on VGA+ */
1716
1717 #define VKI_KIOCSOUND 0x4B2F /* start sound generation (0 for off) */
1718 #define VKI_KDMKTONE 0x4B30 /* generate tone */
1719
1720 #define VKI_KDGETLED 0x4B31 /* return current led state */
1721 #define VKI_KDSETLED 0x4B32 /* set led state [lights, not flags] */
1722
1723 #define VKI_KDGKBTYPE 0x4B33 /* get keyboard type */
1724
1725 #define VKI_KDADDIO 0x4B34 /* add i/o port as valid */
1726 #define VKI_KDDELIO 0x4B35 /* del i/o port as valid */
1727 #define VKI_KDENABIO 0x4B36 /* enable i/o to video board */
1728 #define VKI_KDDISABIO 0x4B37 /* disable i/o to video board */
1729
1730 #define VKI_KDSETMODE 0x4B3A /* set text/graphics mode */
1731 #define VKI_KDGETMODE 0x4B3B /* get current mode */
1732
1733 #define VKI_KDMAPDISP 0x4B3C /* map display into address space */
1734 #define VKI_KDUNMAPDISP 0x4B3D /* unmap display from address space */
1735
1736 #define VKI_E_TABSZ 256
1737 #define VKI_GIO_SCRNMAP 0x4B40 /* get screen mapping from kernel */
1738 #define VKI_PIO_SCRNMAP 0x4B41 /* put screen mapping table in kernel */
1739 #define VKI_GIO_UNISCRNMAP 0x4B69 /* get full Unicode screen mapping */
1740 #define VKI_PIO_UNISCRNMAP 0x4B6A /* set full Unicode screen mapping */
1741
1742 #define VKI_GIO_UNIMAP 0x4B66 /* get unicode-to-font mapping from kernel */
1743 #define VKI_PIO_UNIMAP 0x4B67 /* put unicode-to-font mapping in kernel */
1744 #define VKI_PIO_UNIMAPCLR 0x4B68 /* clear table, possibly advise hash algorithm */
1745
1746 #define VKI_KDGKBMODE 0x4B44 /* gets current keyboard mode */
1747 #define VKI_KDSKBMODE 0x4B45 /* sets current keyboard mode */
1748
1749 #define VKI_KDGKBMETA 0x4B62 /* gets meta key handling mode */
1750 #define VKI_KDSKBMETA 0x4B63 /* sets meta key handling mode */
1751
1752 #define VKI_KDGKBLED 0x4B64 /* get led flags (not lights) */
1753 #define VKI_KDSKBLED 0x4B65 /* set led flags (not lights) */
1754
1755 struct vki_kbentry {
1756 unsigned char kb_table;
1757 unsigned char kb_index;
1758 unsigned short kb_value;
1759 };
1760 #define VKI_KDGKBENT 0x4B46 /* gets one entry in translation table */
1761 #define VKI_KDSKBENT 0x4B47 /* sets one entry in translation table */
1762
1763 struct vki_kbsentry {
1764 unsigned char kb_func;
1765 unsigned char kb_string[512];
1766 };
1767 #define VKI_KDGKBSENT 0x4B48 /* gets one function key string entry */
1768 #define VKI_KDSKBSENT 0x4B49 /* sets one function key string entry */
1769
1770 struct vki_kbdiacr {
1771 unsigned char diacr, base, result;
1772 };
1773 struct vki_kbdiacrs {
1774 unsigned int kb_cnt; /* number of entries in following array */
1775 struct vki_kbdiacr kbdiacr[256]; /* MAX_DIACR from keyboard.h */
1776 };
1777 #define VKI_KDGKBDIACR 0x4B4A /* read kernel accent table */
1778 #define VKI_KDSKBDIACR 0x4B4B /* write kernel accent table */
1779
1780 struct vki_kbkeycode {
1781 unsigned int scancode, keycode;
1782 };
1783 #define VKI_KDGETKEYCODE 0x4B4C /* read kernel keycode table entry */
1784 #define VKI_KDSETKEYCODE 0x4B4D /* write kernel keycode table entry */
1785
1786 #define VKI_KDSIGACCEPT 0x4B4E /* accept kbd generated signals */
1787
1788 struct vki_kbd_repeat {
1789 int delay; /* in msec; <= 0: don't change */
1790 int period; /* in msec; <= 0: don't change */
1791 /* earlier this field was misnamed "rate" */
1792 };
1793 #define VKI_KDKBDREP 0x4B52 /* set keyboard delay/repeat rate;
1794 * actually used values are returned */
1795
1796 #define VKI_KDFONTOP 0x4B72 /* font operations */
1797
1798 //----------------------------------------------------------------------
1799 // From linux-2.6.9/include/linux/kb.h
1800 //----------------------------------------------------------------------
1801
1802 typedef __vki_kernel_uid32_t vki_qid_t; /* Type in which we store ids in memory */
1803
1804 #endif
1805
1806 //----------------------------------------------------------------------
1807 // From sys/ptrace.h
1808 //----------------------------------------------------------------------
1809
1810 #define VKI_PTRACE_TRACEME 0
1811 #define VKI_PTRACE_READ_I 1
1812 #define VKI_PTRACE_READ_D 2
1813 /* 3 - read user struct */
1814 #define VKI_PTRACE_WRITE_I 4
1815 #define VKI_PTRACE_WRITE_D 5
1816 /* 6 - write user struct */
1817 #define VKI_PTRACE_CONTINUE 7
1818 #define VKI_PTRACE_KILL 8
1819 #define VKI_PTRACE_STEP 9
1820 #define VKI_PTRACE_ATTACH 10
1821 #define VKI_PTRACE_DETACH 11
1822 #define VKI_PTRACE_IO 12
1823 #define VKI_PTRACE_LWPINFO 13
1824 #define VKI_PTRACE_GETNUMLWPS 14
1825 #define VKI_PTRACE_GETLWPLIST 15
1826 #define VKI_PTRACE_CLEARSTEP 16
1827 #define VKI_PTRACE_SETSTEP 17
1828 #define VKI_PTRACE_SUSPEND 18
1829 #define VKI_PTRACE_RESUME 19
1830 #define VKI_PTRACE_TO_SCE 20
1831 #define VKI_PTRACE_TO_SCX 21
1832 #define VKI_PTRACE_SYSCALL 22
1833 /* md */
1834 #define VKI_PTRACE_GETREGS 33
1835 #define VKI_PTRACE_SETREGS 34
1836 #define VKI_PTRACE_GETFPREGS 35
1837 #define VKI_PTRACE_SETFPREGS 36
1838 #define VKI_PTRACE_GETDBREGS 37
1839 #define VKI_PTRACE_SETDBREGS 38
1840
1841 #define VKI_PTRACE_VM_TIMESTAMP 40
1842 #define VKI_PTRACE_VM_ENTRY 41
1843
1844 #define VKI_PTRACE_FIRSTMACH 64
1845
1846 struct vki_ptrace_io_desc {
1847 int piod_op;
1848 void * piod_offs;
1849 void * piod_addr;
1850 vki_size_t piod_len;
1851 };
1852 #define VKI_PIOD_READ_D 1
1853 #define VKI_PIOD_WRITE_D 2
1854 #define VKI_PIOD_READ_I 3
1855 #define VKI_PIOD_WRITE_I 4
1856
1857 struct vki_ptrace_lwpinfo {
1858 vki_lwpid_t pl_lwpid;
1859 int pl_event;
1860 #define VKI_PL_EVENT_NONE 0
1861 #define VKI_PL_EVENT_SIGNAL 1
1862 int pl_flags;
1863 #define VKI_FLAG_SA 0x01
1864 #define VKI_FLAG_BOUND 0x02
1865 vki_sigset_t pl_sigmask;
1866 vki_sigset_t pl_siglist;
1867 };
1868
1869 struct vki_ptrace_vm_entry {
1870 int pve_entry; /* Entry number used for iteration. */
1871 int pve_timestamp; /* Generation number of VM map. */
1872 unsigned long pve_start; /* Start VA of range. */
1873 unsigned long pve_end; /* End VA of range (incl). */
1874 unsigned long pve_offset; /* Offset in backing object. */
1875 unsigned int pve_prot; /* Protection of memory range. */
1876 unsigned int pve_pathlen; /* Size of path. */
1877 long pve_fileid; /* File ID. */
1878 vki_uint32_t pve_fsid; /* File system ID. */
1879 char *pve_path; /* Path name of object. */
1880 };
1881
1882 #endif // __VKI_FREEBSD_H
1883
1884 //----------------------------------------------------------------------
1885 // From i386/include/sysarch.h and amd64/include/sysarch.h (interchangeable)
1886 //----------------------------------------------------------------------
1887
1888 #define VKI_I386_GET_FSBASE 7
1889 #define VKI_I386_SET_FSBASE 8
1890 #define VKI_I386_GET_GSBASE 9
1891 #define VKI_I386_SET_GSBASE 10
1892 #define VKI_I386_GET_XFPUSTATE 11
1893
1894 #define VKI_AMD64_GET_FSBASE 128
1895 #define VKI_AMD64_SET_FSBASE 129
1896 #define VKI_AMD64_GET_GSBASE 130
1897 #define VKI_AMD64_SET_GSBASE 131
1898 #define VKI_AMD64_GET_XFPUSTATE 132
1899
1900 //----------------------------------------------------------------------
1901 // From sys/module.h
1902 //----------------------------------------------------------------------
1903
1904 #define VKI_MAXMODNAME 32
1905
1906 typedef union vki_modspecific {
1907 vki_int32_t intval;
1908 vki_uint32_t u_intval;
1909 #if defined(VGP_x86_freebsd)
1910 vki_int32_t longval;
1911 vki_uint32_t u_longval;
1912 #elif defined(VGP_amd64_freebsd)
1913 vki_int64_t longval;
1914 vki_uint64_t u_longval;
1915 #else
1916 #error Unknown platform
1917 #endif
1918 } vki_modspecific_t;
1919
1920 struct vki_module_stat {
1921 int version;
1922 char name[VKI_MAXMODNAME];
1923 int refs;
1924 int id;
1925 vki_modspecific_t data;
1926 };
1927
1928 //----------------------------------------------------------------------
1929 // From sys/rtprio.h
1930 //----------------------------------------------------------------------
1931
1932 struct vki_rtprio {
1933 vki_uint16_t type;
1934 vki_uint16_t prio;
1935 };
1936
1937 #define VKI_RTP_LOOKUP 0
1938 #define VKI_RTP_SET 1
1939
1940 //----------------------------------------------------------------------
1941 // From sys/umtx.h
1942 //----------------------------------------------------------------------
1943
1944 struct vki_umtx {
1945 unsigned long u_owner;
1946 };
1947
1948 struct vki_umutex {
1949 vki_lwpid_t m_owner;
1950 vki_uint32_t m_flags;
1951 vki_uint32_t m_ceilings[2];
1952 vki_uint32_t m_spare[4];
1953 };
1954
1955 struct vki_ucond {
1956 vki_uint32_t c_has_waiters;
1957 vki_uint32_t c_flags;
1958 vki_uint32_t c_spare[2];
1959 };
1960
1961 struct vki_urwlock {
1962 vki_uint32_t rw_state;
1963 vki_uint32_t rw_flags;
1964 vki_uint32_t rw_blocked_readers;
1965 vki_uint32_t rw_blocked_writers;
1966 vki_uint32_t rw_spare[4];
1967 };
1968
1969 struct vki_usem {
1970 vki_uint32_t has_waiters;
1971 vki_uint32_t count;
1972 vki_uint32_t flags;
1973 };
1974
1975 struct vki_umtx_time {
1976 struct vki_timespec timeout;
1977 vki_uint32_t flags;
1978 vki_uint32_t clockid;
1979 };
1980
1981 #define VKI_UMTX_OP_LOCK 0
1982 #define VKI_UMTX_OP_UNLOCK 1
1983 #define VKI_UMTX_OP_WAIT 2
1984 #define VKI_UMTX_OP_WAKE 3
1985 #define VKI_UMTX_OP_MUTEX_TRYLOCK 4
1986 #define VKI_UMTX_OP_MUTEX_LOCK 5
1987 #define VKI_UMTX_OP_MUTEX_UNLOCK 6
1988 #define VKI_UMTX_OP_SET_CEILING 7
1989 #define VKI_UMTX_OP_CV_WAIT 8
1990 #define VKI_UMTX_OP_CV_SIGNAL 9
1991 #define VKI_UMTX_OP_CV_BROADCAST 10
1992 #define VKI_UMTX_OP_WAIT_UINT 11
1993 #define VKI_UMTX_OP_RW_RDLOCK 12
1994 #define VKI_UMTX_OP_RW_WRLOCK 13
1995 #define VKI_UMTX_OP_RW_UNLOCK 14
1996 #define VKI_UMTX_OP_WAIT_UINT_PRIVATE 15
1997 #define VKI_UMTX_OP_WAKE_PRIVATE 16
1998 #define VKI_UMTX_OP_MUTEX_WAIT 17
1999 #define VKI_UMTX_OP_MUTEX_WAKE 18 /* deprecated */
2000 #define VKI_UMTX_OP_SEM_WAIT 19
2001 #define VKI_UMTX_OP_SEM_WAKE 20
2002 #define VKI_UMTX_OP_NWAKE_PRIVATE 21
2003 #define VKI_UMTX_OP_MUTEX_WAKE2 22
2004 #define VKI_UMTX_OP_MAX 23
2005
2006
2007 //----------------------------------------------------------------------
2008 // From sys/acl.h
2009 //----------------------------------------------------------------------
2010
2011 struct vki_acl_entry {
2012 int ae_tag;
2013 vki_uid_t ae_uid;
2014 vki_mode_t ae_perm;
2015 };
2016
2017 #define VKI_ACL_MAX_ENTRIES 32
2018 struct vki_acl {
2019 int acl_cnt;
2020 struct vki_acl_entry acl_entry[VKI_ACL_MAX_ENTRIES];
2021 };
2022
2023
2024 //----------------------------------------------------------------------
2025 // From sys/uuid.h
2026 //----------------------------------------------------------------------
2027
2028 struct vki_uuid {
2029 vki_uint32_t time_low;
2030 vki_uint16_t time_mid;
2031 vki_uint16_t time_hi_and_version;
2032 vki_uint8_t clock_seq_hi_and_reserved;
2033 vki_uint8_t clock_seq_low;
2034 vki_uint8_t node[6];
2035 };
2036
2037 //----------------------------------------------------------------------
2038 // From sys/user.h
2039 //----------------------------------------------------------------------
2040
2041 #define VKI_KVME_TYPE_NONE 0
2042 #define VKI_KVME_TYPE_DEFAULT 1
2043 #define VKI_KVME_TYPE_VNODE 2
2044 #define VKI_KVME_TYPE_SWAP 3
2045 #define VKI_KVME_TYPE_DEVICE 4
2046 #define VKI_KVME_TYPE_PHYS 5
2047 #define VKI_KVME_TYPE_DEAD 6
2048 #define VKI_KVME_TYPE_UNKNOWN 255
2049
2050 #define VKI_KVME_PROT_READ 0x00000001
2051 #define VKI_KVME_PROT_WRITE 0x00000002
2052 #define VKI_KVME_PROT_EXEC 0x00000004
2053
2054 #define VKI_KVME_FLAG_COW 0x00000001
2055 #define VKI_KVME_FLAG_NEEDS_COPY 0x00000002
2056
2057 struct vki_kinfo_vmentry {
2058 int kve_structsize;
2059 int kve_type;
2060 ULong kve_start;
2061 ULong kve_end;
2062 Off64T kve_offset;
2063 ULong kve_fileid;
2064 UInt kve_fsid;
2065 int kve_flags;
2066 int kve_resident;
2067 int kve_private_resident;
2068 int kve_protection;
2069 int kve_ref_count;
2070 int kve_shadow_count;
2071 int _kve_pad0;
2072 int kve_ispare[16];
2073 char kve_path[VKI_PATH_MAX];
2074 };
2075
2076 struct vki_kinfo_file {
2077 int kf_structsize; /* Variable size of record. */
2078 int kf_type; /* Descriptor type. */
2079 int kf_fd; /* Array index. */
2080 int kf_ref_count; /* Reference count. */
2081 int kf_flags; /* Flags. */
2082 int _kf_pad0; /* Round to 64 bit alignment */
2083 Off64T kf_offset; /* Seek location. */
2084 int kf_vnode_type; /* Vnode type. */
2085 int kf_sock_domain; /* Socket domain. */
2086 int kf_sock_type; /* Socket type. */
2087 int kf_sock_protocol; /* Socket protocol. */
2088 char kf_sa_local[128]; /* Socket address. */
2089 char kf_sa_peer[128]; /* Peer address. */
2090 int _kf_ispare[16]; /* Space for more stuff. */
2091 /* Truncated before copyout in sysctl */
2092 char kf_path[VKI_PATH_MAX]; /* Path to file, if any. */
2093 };
2094
2095 //----------------------------------------------------------------------
2096 // From sys/kenv.h
2097 //----------------------------------------------------------------------
2098 #define VKI_KENV_GET 0
2099 #define VKI_KENV_SET 1
2100 #define VKI_KENV_UNSET 2
2101 #define VKI_KENV_DUMP 3
2102
2103 //----------------------------------------------------------------------
2104 // From sys/sysctl.h (and related)
2105 //----------------------------------------------------------------------
2106
2107 #include <sys/types.h>
2108 #include <sys/sysctl.h>
2109
2110 #define VKI_CTL_KERN CTL_KERN
2111 #define VKI_CTL_HW CTL_HW
2112 #define VKI_KERN_PROC KERN_PROC
2113 #define VKI_KERN_PROC_VMMAP KERN_PROC_VMMAP
2114 #define VKI_KERN_PROC_FILEDESC KERN_PROC_FILEDESC
2115 #define VKI_HW_MACHINE HW_MACHINE
2116
2117 //----------------------------------------------------------------------
2118 // From sys/thr.h
2119 //----------------------------------------------------------------------
2120
2121 struct vki_thr_param {
2122 void (*start_func)(void *);
2123 void *arg;
2124 char *stack_base;
2125 vki_size_t stack_size;
2126 char *tls_base;
2127 vki_size_t tls_size;
2128 long *child_tid;
2129 long *parent_tid;
2130 int flags;
2131 struct vki_rtprio *rtp;
2132 void *spare[3];
2133 };
2134
2135 //----------------------------------------------------------------------
2136 // From sys/linker.h
2137 //----------------------------------------------------------------------
2138
2139 struct vki_kld_sym_lookup {
2140 int version; /* set to sizeof(struct kld_sym_lookup) */
2141 char *symname; /* Symbol name we are looking up */
2142 unsigned long symvalue;
2143 vki_size_t symsize;
2144 };
2145
2146 #if !defined(VKI_INIT_ARCH_ELF_STATE)
2147 /* This structure is used to preserve architecture specific data during
2148 the loading of an ELF file, throughout the checking of architecture
2149 specific ELF headers & through to the point where the ELF load is
2150 known to be proceeding. This implementation is a dummy for
2151 architectures which require no specific state. */
2152 struct vki_arch_elf_state {
2153 };
2154
2155 # define VKI_INIT_ARCH_ELF_STATE { }
2156
2157 #endif
2158 /*--------------------------------------------------------------------*/
2159 /*--- end ---*/
2160 /*--------------------------------------------------------------------*/
2161