Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-09-15 09:14:19

0001 
0002 /*--------------------------------------------------------------------*/
0003 /*--- FreeBSD-specific kernel interface.             vki-freebsd.h ---*/
0004 /*--------------------------------------------------------------------*/
0005 
0006 /*
0007    This file is part of Valgrind, a dynamic binary instrumentation
0008    framework.
0009 
0010    Copyright (C) 2000-2005 Julian Seward
0011       jseward@acm.org
0012    Copyright (C) 2018-2021 Paul Floyd
0013       pjfloyd@wanadoo.fr
0014 
0015    This program is free software; you can redistribute it and/or
0016    modify it under the terms of the GNU General Public License as
0017    published by the Free Software Foundation; either version 2 of the
0018    License, or (at your option) any later version.
0019 
0020    This program is distributed in the hope that it will be useful, but
0021    WITHOUT ANY WARRANTY; without even the implied warranty of
0022    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0023    General Public License for more details.
0024 
0025    You should have received a copy of the GNU General Public License
0026    along with this program; if not, see <http://www.gnu.org/licenses/>.
0027 
0028    The GNU General Public License is contained in the file COPYING.
0029 */
0030 
0031 /* This file defines types and constants for the kernel interface, and to
0032    make that clear everything is prefixed VKI_/vki_.
0033 
0034    All code is copied verbatim from kernel source files, except that:
0035    - VKI_/vki_ prefixes are added
0036    - some extra explanatory comments are included;  they are all within
0037      "[[ ]]"
0038    - for some types, we only care about the size;  for a few of them (big
0039      ones that are painful to fully drag in here), a VKI_SIZEOF_* constant
0040      is used.
0041 
0042    The files the code is taken from is indicated.
0043 */
0044 
0045 #ifndef VKI_FREEBSD_H
0046 #define VKI_FREEBSD_H
0047 
0048 //----------------------------------------------------------------------
0049 // Arch-specific POSIX types
0050 //----------------------------------------------------------------------
0051 
0052 #if defined(VGA_x86)
0053 #  include "vki-machine-types-x86-freebsd.h"
0054 #elif defined(VGA_amd64)
0055 #  include "vki-machine-types-amd64-freebsd.h"
0056 #elif defined(VGA_arm64)
0057 #  include "vki-machine-types-arm64-freebsd.h"
0058 #else
0059 #  error Unknown platform
0060 #endif
0061 
0062 #include <sys/fcntl.h> // O_RDONLY
0063 #include <sys/param.h> // MAXPATHLEN
0064 
0065 
0066 //----------------------------------------------------------------------
0067 // From sys/select.h
0068 //----------------------------------------------------------------------
0069 
0070 typedef unsigned long __vki_fd_mask;
0071 
0072 #undef __VKI_NFDBITS
0073 #define __VKI_NFDBITS   (8 * sizeof(__vki_fd_mask))
0074 
0075 #undef __VKI_FD_SETSIZE
0076 #define __VKI_FD_SETSIZE   1024U
0077 
0078 #undef __VKI_FDSET_LONGS
0079 #define __VKI_FDSET_LONGS  (__VKI_FD_SETSIZE/__VKI_NFDBITS)
0080 
0081 #undef __VKI_FDELT
0082 #define  __VKI_FDELT(d) ((d) / __VKI_NFDBITS)
0083 
0084 #undef __VKI_FDMASK
0085 #define  __VKI_FDMASK(d)   (1UL << ((d) % __VKI_NFDBITS))
0086 
0087 typedef struct {
0088    unsigned long fds_bits [__VKI_FDSET_LONGS];
0089 } __vki_fd_set;
0090 
0091 //----------------------------------------------------------------------
0092 // sys/_types.h
0093 //----------------------------------------------------------------------
0094 /* MD QQQ 32 on 64 */
0095 typedef  long     __vki_key_t;
0096 typedef  long     __vki_suseconds_t;
0097 typedef  struct __timer *__vki_timer_t;
0098 typedef  struct __mq *__vki_mqd_t;
0099 
0100 /* MI */
0101 typedef  vki_uint32_t   __vki_blksize_t;
0102 typedef  vki_int64_t __vki_blkcnt_t;
0103 typedef  vki_int32_t __vki_clockid_t;
0104 typedef  vki_int32_t __vki_ct_rune_t;
0105 typedef  vki_uint32_t   __vki_fflags_t;
0106 typedef  vki_uint64_t   __vki_fsblkcnt_t;
0107 typedef  vki_uint64_t   __vki_fsfilcnt_t;
0108 typedef  vki_uint32_t   __vki_gid_t;
0109 typedef  vki_int64_t __vki_id_t;
0110 typedef  vki_uint64_t   __vki_ino_t;
0111 typedef  vki_int32_t __vki_lwpid_t;
0112 typedef  vki_uint16_t   __vki_mode_t;
0113 typedef  vki_uint64_t   __vki_nlink_t;
0114 typedef  vki_int64_t __vki_off_t;
0115 typedef  vki_int32_t __vki_pid_t;
0116 typedef  vki_int64_t __vki_rlim_t;
0117 typedef  vki_uint8_t __vki_sa_family_t;
0118 typedef  vki_uint32_t   __vki_socklen_t;
0119 typedef  vki_uint32_t   __vki_uid_t;
0120 typedef  vki_int32_t __vki_useconds_t;
0121 typedef  __vki_ct_rune_t   __vki_rune_t;
0122 typedef  __vki_ct_rune_t   __vki_wchar_t;
0123 typedef  __vki_ct_rune_t   __vki_wint_t;
0124 typedef  vki_uint64_t   __vki_dev_t;
0125 typedef  vki_uint32_t   __vki_fixpt_t;
0126 
0127 
0128 //----------------------------------------------------------------------
0129 // From sys/types.h
0130 //----------------------------------------------------------------------
0131 
0132 typedef unsigned char   vki_u_char;
0133 typedef unsigned short  vki_u_short;
0134 typedef unsigned int    vki_u_int;
0135 typedef unsigned long   vki_u_long;
0136 
0137 typedef  vki_uint8_t    vki_u_int8_t;
0138 typedef  vki_uint16_t      vki_u_int16_t;
0139 typedef  vki_uint32_t      vki_u_int32_t;
0140 typedef  vki_uint64_t      vki_u_int64_t;
0141 
0142 typedef  vki_uint64_t      vki_u_quad_t;
0143 typedef  vki_int64_t    vki_quad_t;
0144 typedef  __vki_caddr_t     vki_caddr_t;
0145 typedef __const __vki_caddr_t vki_c_caddr_t;
0146 typedef __volatile __vki_caddr_t vki_v_caddr_t;
0147 
0148 typedef __vki_blksize_t    vki_blksize_t;
0149 typedef __vki_blkcnt_t     vki_blkcnt_t;
0150 typedef __vki_clock_t      vki_clock_t;
0151 typedef __vki_clockid_t    vki_clockid_t;
0152 typedef __vki_dev_t     vki_dev_t;
0153 typedef __vki_fflags_t     vki_fflags_t;
0154 typedef __vki_fixpt_t      vki_fixpt_t;
0155 typedef __vki_fsblkcnt_t   vki_fsblkcnt_t;
0156 typedef __vki_fsfilcnt_t   vki_fsfilcnt_t;
0157 typedef __vki_gid_t     vki_gid_t;
0158 typedef vki_uint32_t    vki_in_addr_t;
0159 typedef vki_uint16_t    vki_in_port_t;
0160 typedef __vki_id_t      vki_id_t;
0161 typedef __vki_ino_t     vki_ino_t;
0162 typedef __vki_key_t     vki_key_t;
0163 typedef __vki_lwpid_t      vki_lwpid_t;
0164 typedef __vki_mode_t    vki_mode_t;
0165 typedef __vki_nlink_t      vki_nlink_t;
0166 typedef __vki_off_t     vki_off_t;
0167 typedef __vki_pid_t     vki_pid_t;
0168 typedef __vki_register_t   vki_register_t;
0169 typedef __vki_rlim_t    vki_rlim_t;
0170 typedef __vki_segsz_t      vki_segsz_t;
0171 typedef __vki_size_t    vki_size_t;
0172 typedef __vki_ssize_t      vki_ssize_t;
0173 typedef __vki_suseconds_t  vki_suseconds_t;
0174 typedef __vki_time_t    vki_time_t;
0175 typedef __vki_timer_t      vki_timer_t;
0176 typedef __vki_mqd_t     vki_mqd_t;
0177 typedef __vki_u_register_t vki_u_register_t;
0178 typedef __vki_uid_t     vki_uid_t;
0179 typedef __vki_useconds_t   vki_useconds_t;
0180 typedef int             vki_cpuwhich_t;
0181 typedef int             vki_cpulevel_t;
0182 typedef int             vki_cpusetid_t;
0183 
0184 
0185 typedef __vki_vm_offset_t  vki_vm_offset_t;
0186 typedef __vki_vm_ooffset_t vki_vm_ooffset_t;
0187 typedef __vki_vm_paddr_t   vki_vm_paddr_t;
0188 typedef __vki_vm_pindex_t  vki_vm_pindex_t;
0189 typedef __vki_vm_size_t    vki_vm_size_t;
0190 
0191 //----------------------------------------------------------------------
0192 // sys/select.h
0193 //----------------------------------------------------------------------
0194 
0195 typedef __vki_fd_set    vki_fd_set;
0196 
0197 //----------------------------------------------------------------------
0198 // Now the rest of the arch-specific stuff
0199 //----------------------------------------------------------------------
0200 
0201 #if defined(VGA_x86)
0202 #  include "vki-x86-freebsd.h"
0203 #elif defined(VGA_amd64)
0204 #  include "vki-amd64-freebsd.h"
0205 #elif defined(VGA_arm64)
0206 #  include "vki-arm64-freebsd.h"
0207 #else
0208 #  error Unknown platform
0209 #endif
0210 
0211 //----------------------------------------------------------------------
0212 // freebsd version hacks
0213 //----------------------------------------------------------------------
0214 #ifndef ELFMAG
0215 #define ELFMAG "\177ELF"   /* magic string */
0216 #endif
0217 #ifndef SELFMAG
0218 #define SELFMAG   4     /* magic string size */
0219 #endif
0220 
0221 // see http://bugs.freebsd.org/bugzilla/show_bug.cgi?id=239669
0222 #if !defined(ELF_NOTE_GNU)
0223 #define ELF_NOTE_GNU "GNU"
0224 #endif
0225 
0226 
0227 #define VKI_ELF_NOTE_ROUNDSIZE 4
0228 
0229 
0230 //----------------------------------------------------------------------
0231 // From sys/syslimits.h
0232 //----------------------------------------------------------------------
0233 
0234 #define VKI_PATH_MAX       1024
0235 
0236 
0237 //----------------------------------------------------------------------
0238 // From sys/timespec.h
0239 //----------------------------------------------------------------------
0240 
0241 struct vki_timespec {
0242    vki_time_t  tv_sec;     /* seconds */
0243    long     tv_nsec; /* nanoseconds */
0244 };
0245 
0246 struct  vki_itimerspec {
0247    struct  vki_timespec it_interval;    /* timer period */
0248    struct  vki_timespec it_value;       /* timer expiration */
0249 };
0250 
0251 //----------------------------------------------------------------------
0252 // From sys/_time.h
0253 //----------------------------------------------------------------------
0254 
0255 struct vki_timeval {
0256    vki_time_t  tv_sec;     /* seconds */
0257    vki_suseconds_t   tv_usec; /* microseconds */
0258 };
0259 
0260 //----------------------------------------------------------------------
0261 // From sys/time.h
0262 //----------------------------------------------------------------------
0263 
0264 #define VKI_CLOCK_REALTIME            0
0265 #define VKI_CLOCK_MONOTONIC           1
0266 #define VKI_CLOCK_PROCESS_CPUTIME_ID  2
0267 #define VKI_CLOCK_THREAD_CPUTIME_ID   3
0268 
0269 struct vki_timezone {
0270    int   tz_minuteswest;   /* minutes west of Greenwich */
0271    int   tz_dsttime; /* type of dst correction */
0272 };
0273 
0274 struct   vki_itimerval {
0275    struct   vki_timeval it_interval;   /* timer interval */
0276    struct   vki_timeval it_value;   /* current value */
0277 };
0278 
0279 //----------------------------------------------------------------------
0280 // From sys/timex.h
0281 //----------------------------------------------------------------------
0282 
0283 struct vki_ntptimeval {
0284    struct vki_timespec time;
0285    long maxerror;
0286    long esterror;
0287    long tai;
0288    int time_state;
0289 };
0290 
0291 struct vki_timex {
0292    unsigned int modes;  /* mode selector */
0293    long offset;      /* time offset (usec) */
0294    long freq;     /* frequency offset (scaled ppm) */
0295    long maxerror;    /* maximum error (usec) */
0296    long esterror;    /* estimated error (usec) */
0297    int status;    /* clock command/status */
0298    long constant;    /* pll time constant */
0299    long precision;      /* clock precision (usec) (read only) */
0300    long tolerance;      /* clock frequency tolerance (ppm)
0301              * (read only)
0302              */
0303    long ppsfreq;           /* pps frequency (scaled ppm) (ro) */
0304    long jitter;            /* pps jitter (us) (ro) */
0305    int shift;              /* interval duration (s) (shift) (ro) */
0306    long stabil;            /* pps stability (scaled ppm) (ro) */
0307    long jitcnt;            /* jitter limit exceeded (ro) */
0308    long calcnt;            /* calibration intervals (ro) */
0309    long errcnt;            /* calibration errors (ro) */
0310    long stbcnt;            /* stability limit exceeded (ro) */
0311 };
0312 
0313 #define MOD_OFFSET      0x0001   /* time offset */
0314 #define MOD_FREQUENCY      0x0002   /* frequency offset */
0315 #define MOD_MAXERROR    0x0004   /* maximum time error */
0316 #define MOD_ESTERROR    0x0008   /* estimated time error */
0317 #define MOD_STATUS      0x0010   /* clock status */
0318 #define MOD_TIMECONST      0x0020   /* pll time constant */
0319 #define MOD_PPSMAX      0x0040
0320 #define MOD_TAI         0x0080
0321 #define MOD_MICRO    0x1000
0322 #define MOD_NANO     0x2000
0323 #define MOD_CLKB     0x4000
0324 #define MOD_CLKA     0x8000
0325 
0326 //----------------------------------------------------------------------
0327 // From sys/times.h
0328 //----------------------------------------------------------------------
0329 
0330 struct vki_tms {
0331    vki_clock_t tms_utime;
0332    vki_clock_t tms_stime;
0333    vki_clock_t tms_cutime;
0334    vki_clock_t tms_cstime;
0335 };
0336 
0337 //----------------------------------------------------------------------
0338 // From sys/stat.h
0339 //----------------------------------------------------------------------
0340 
0341 /* QQQ 4.x stat layout */
0342 struct vki_freebsd11_stat {
0343    vki_uint32_t   st_dev;
0344    vki_uint32_t   st_ino;
0345    vki_mode_t  st_mode;
0346    vki_uint16_t st_nlink;
0347    vki_uid_t   st_uid;
0348    vki_gid_t   st_gid;
0349    vki_uint32_t   st_rdev;
0350 #if 0
0351    struct vki_timespec  st_atimespec;
0352    struct vki_timespec  st_mtimespec;
0353    struct vki_timespec  st_ctimespec;
0354 #else
0355    vki_time_t  st_atime;
0356    long     st_atime_nsec;
0357    vki_time_t  st_mtime;
0358    long     st_mtime_nsec;
0359    vki_time_t  st_ctime;
0360    long     st_ctime_nsec;
0361 #endif
0362    vki_off_t   st_size;
0363    vki_blkcnt_t   st_blocks;
0364    vki_blksize_t  st_blksize;
0365    vki_fflags_t   st_flags;
0366    vki_uint32_t   st_gen;
0367    vki_int32_t st_lspare;
0368    struct vki_timespec  st_birthtimespec;
0369 unsigned int :
0370    (8 / 2) * (16 - (int)sizeof(struct vki_timespec));
0371 unsigned int :
0372    (8 / 2) * (16 - (int)sizeof(struct vki_timespec));
0373 };
0374 
0375 #if defined(VGP_x86_freebsd)
0376 #define  VKI_STAT_TIME_T_EXT  1
0377 #endif
0378 
0379 /*
0380  * FreeBSD 12 has two versions of the stat struct
0381  * freebsd11_stat, which is the same as vki_stat above
0382  * and just stat, which is the same as vki_stat below
0383  * Since vki_stat is used by other OSes, it's best not to
0384  * use the same naming
0385  */
0386 
0387 struct vki_stat {
0388    vki_dev_t     st_dev;
0389    vki_ino_t     st_ino;
0390    vki_nlink_t   st_nlink;
0391    vki_mode_t   st_mode;
0392    vki_int16_t st_padding0;
0393    vki_uid_t    st_uid;
0394    vki_gid_t    st_gid;
0395    vki_int32_t st_padding1;
0396    vki_dev_t     st_rdev;
0397 #ifdef   VKI_STAT_TIME_T_EXT
0398    vki_int32_t st_atim_ext;
0399 #endif
0400    //struct   vki_timespec st_atim;
0401    vki_time_t st_atime;
0402    long    st_atime_nsec;
0403 #ifdef   VKI_STAT_TIME_T_EXT
0404    vki_int32_t st_mtim_ext;
0405 #endif
0406    //struct   vki_timespec st_mtim;
0407    vki_time_t st_mtime;
0408    long    st_mtime_nsec;
0409 #ifdef   VKI_STAT_TIME_T_EXT
0410    vki_int32_t st_ctim_ext;
0411 #endif
0412    //struct   vki_timespec st_ctim;
0413    vki_time_t st_ctime;
0414    long    st_ctime_nsec;
0415 #ifdef   VKI_STAT_TIME_T_EXT
0416    vki_int32_t st_btim_ext;
0417 #endif
0418    //struct   vki_timespec st_birthtim;
0419    vki_time_t st_btime;
0420    long    st_btime_nsec;
0421    vki_off_t    st_size;
0422    vki_blkcnt_t st_blocks;
0423    vki_blksize_t st_blksize;
0424    vki_fflags_t  st_flags;
0425    vki_uint64_t st_gen;
0426    vki_uint64_t st_spare[10];
0427 };
0428 
0429 
0430 //----------------------------------------------------------------------
0431 // From sys/sched.h
0432 //----------------------------------------------------------------------
0433 
0434 struct vki_sched_param {
0435    int sched_priority;
0436 };
0437 
0438 //----------------------------------------------------------------------
0439 // From sys/signal.h
0440 //----------------------------------------------------------------------
0441 
0442 #define  VKI_SIG_BLOCK  1  /*  block specified signal set */
0443 #define  VKI_SIG_UNBLOCK   2  /*  unblock specified signal set */
0444 #define  VKI_SIG_SETMASK   3  /*  set specified signal set */
0445 
0446 #define  VKI_SIG_DFL ((__vki_sighandler_t)0)
0447 #define  VKI_SIG_IGN ((__vki_sighandler_t)1)
0448 #define  VKI_SIG_ERR ((__vki_sighandler_t)-1)
0449 
0450 typedef void __vki_signalfn_t(int);
0451 typedef __vki_signalfn_t *__vki_sighandler_t;
0452 
0453 #define  VKI_SIGHUP     1
0454 #define  VKI_SIGINT     2
0455 #define  VKI_SIGQUIT    3
0456 #define  VKI_SIGILL     4
0457 #define  VKI_SIGTRAP    5
0458 #define  VKI_SIGABRT    6
0459 #define  VKI_SIGEMT     7
0460 #define  VKI_SIGFPE     8
0461 #define  VKI_SIGKILL    9
0462 #define  VKI_SIGBUS     10
0463 #define  VKI_SIGSEGV    11
0464 #define  VKI_SIGSYS     12
0465 #define  VKI_SIGPIPE    13
0466 #define  VKI_SIGALRM    14
0467 #define  VKI_SIGTERM    15
0468 #define  VKI_SIGURG     16
0469 #define  VKI_SIGSTOP    17
0470 #define  VKI_SIGTSTP    18
0471 #define  VKI_SIGCONT    19
0472 #define  VKI_SIGCHLD    20
0473 #define  VKI_SIGTTIN    21
0474 #define  VKI_SIGTTOU    22
0475 #define  VKI_SIGIO      23
0476 #define  VKI_SIGXCPU    24
0477 #define  VKI_SIGXFSZ    25
0478 #define  VKI_SIGVTALRM  26
0479 #define  VKI_SIGPROF    27
0480 #define  VKI_SIGWINCH   28
0481 #define  VKI_SIGINFO    29
0482 #define  VKI_SIGUSR1    30
0483 #define  VKI_SIGUSR2    31
0484 #define  VKI_SIGTHR     32
0485 #define  VKI_SIGLIBRT   33
0486 
0487 #define  VKI_SIGRTMIN      65
0488 #define  VKI_SIGRTMAX      126
0489 
0490 #define  VKI_SA_ONSTACK    0x0001
0491 #define  VKI_SA_RESTART    0x0002
0492 #define  VKI_SA_RESETHAND  0x0004
0493 #define  VKI_SA_NOCLDSTOP  0x0008
0494 #define  VKI_SA_NODEFER    0x0010
0495 #define  VKI_SA_NOCLDWAIT  0x0020
0496 #define  VKI_SA_SIGINFO    0x0040
0497 #define VKI_SA_RESTORER         0 /* FreeBSD doesn't have this */
0498 
0499 #define  VKI_SS_ONSTACK    0x0001
0500 #define  VKI_SS_DISABLE    0x0004
0501 
0502 #define  VKI_SA_ONESHOT    VKI_SA_RESETHAND
0503 #define  VKI_SA_NOMASK     VKI_SA_NODEFER
0504 
0505 struct vki_sigaction {
0506    __vki_sighandler_t ksa_handler;
0507    int      sa_flags;
0508    vki_sigset_t   sa_mask;
0509 };
0510 
0511 typedef struct vki_sigaltstack {
0512    void     *ss_sp;
0513    vki_size_t  ss_size;
0514    int      ss_flags;
0515 } vki_stack_t;
0516 
0517 typedef union vki_sigval {
0518    int sival_int;
0519    void *sival_ptr;
0520 } vki_sigval_t;
0521 
0522 typedef struct vki_siginfo {
0523    int si_signo;
0524    int si_errno;
0525    int si_code;
0526    vki_pid_t si_pid;
0527    vki_uid_t si_uid;
0528    int si_status;
0529    void *si_addr;
0530    vki_sigval_t si_value;
0531 // 666: not valid. switch to above def
0532 #ifdef si_band
0533 #undef si_band
0534 #endif
0535    long si_band;
0536    int __spare__[7];
0537 } vki_siginfo_t;
0538 
0539 /*
0540  * si_code values
0541  */
0542 #define VKI_SI_USER  0x10001     /* sent by kill, sigsend, raise */
0543 #define VKI_SI_QUEUE 0x10002
0544 #define VKI_SI_TIMER 0x10003
0545 #define VKI_SI_ASYNCIO  0x10004
0546 #define VKI_SI_MESGQ 0x10005
0547 #define VKI_SI_KERNEL   0x10006
0548 #define VKI_SI_LWP      0x10007
0549 /*
0550  * SIGILL si_codes
0551  */
0552 #define VKI_ILL_ILLOPC  1  /* illegal opcode */
0553 #define VKI_ILL_ILLOPN  2  /* illegal operand */
0554 #define VKI_ILL_ILLADR  3  /* illegal addressing mode */
0555 #define VKI_ILL_ILLTRP  4  /* illegal trap */
0556 #define VKI_ILL_PRVOPC  5  /* privileged opcode */
0557 #define VKI_ILL_PRVREG  6  /* privileged register */
0558 #define VKI_ILL_COPROC  7  /* coprocessor error */
0559 #define VKI_ILL_BADSTK  8  /* internal stack error */
0560 
0561 /*
0562  * SIGFPE si_codes
0563  */
0564 #define VKI_FPE_INTOVF  1  /* integer overflow */
0565 #define VKI_FPE_INTDIV  2  /* integer divide by zero */
0566 #define VKI_FPE_FLTDIV  3  /* floating point divide by zero */
0567 #define VKI_FPE_FLTOVF  4  /* floating point overflow */
0568 #define VKI_FPE_FLTUND  5  /* floating point underflow */
0569 #define VKI_FPE_FLTRES  6  /* floating point inexact result */
0570 #define VKI_FPE_FLTINV  7  /* floating point invalid operation */
0571 #define VKI_FPE_FLTSUB  8  /* subscript out of range */
0572 
0573 /*
0574  * SIGSEGV si_codes
0575  */
0576 #define VKI_SEGV_MAPERR 1  /* address not mapped to object */
0577 #define VKI_SEGV_ACCERR 2  /* invalid permissions for mapped object */
0578 /* XXX i386 and amd64 specific */
0579 #define  VKI_SEGV_PAGE_FAULT  12
0580 
0581 /*
0582  * SIGBUS si_codes
0583  */
0584 #define VKI_BUS_ADRALN  1  /* invalid address alignment */
0585 #define VKI_BUS_ADRERR  2  /* non-existant physical address */
0586 #define VKI_BUS_OBJERR  3  /* object specific hardware error */
0587 #define VKI_BUS_OOMERR  100   /* Non-standard: No memory.  */
0588 
0589 /*
0590  * SIGTRAP si_codes
0591  */
0592 #define VKI_TRAP_BRKPT  1  /* process breakpoint */
0593 #define VKI_TRAP_TRACE  2  /* process trace trap */
0594 #define VKI_TRAP_DTRACE 3   /* DTrace induced trap.                 */
0595 #define VKI_TRAP_CAP    4   /* Capabilities protective trap.        */
0596 
0597 /*
0598  * SIGCHLD si_codes
0599  */
0600 #define VKI_CLD_EXITED    1  /* child has exited */
0601 #define VKI_CLD_KILLED    2  /* child was killed */
0602 #define VKI_CLD_DUMPED    3  /* child terminated abnormally */
0603 #define VKI_CLD_TRAPPED   4  /* traced child has trapped */
0604 #define VKI_CLD_STOPPED   5  /* child has stopped */
0605 #define VKI_CLD_CONTINUED 6  /* stopped child has continued */
0606 
0607 #if 0 /* freebsd-6 */
0608 typedef struct vki_sigevent {
0609    int sigev_notify;
0610    int sigev_signo;
0611    vki_sigval_t sigev_value;
0612    union {
0613       int _threadid;
0614 
0615       struct {
0616          void (*_function)(vki_sigval_t);
0617          void *_attribute; /* really pthread_attr_t */
0618       } _sigev_thread;
0619       long __spare__[8];
0620    } _sigev_un;
0621 } vki_sigevent_t;
0622 #endif
0623 
0624 struct vki_sigevent {
0625    int     sigev_notify;           /* Notification type */
0626    union {
0627       int   __sigev_signo;  /* Signal number */
0628       int   __sigev_notify_kqueue;
0629    } __sigev_u;
0630    vki_sigval_t sigev_value;       /* Signal value */
0631 };
0632 #if 0
0633 #define sigev_signo             __sigev_u.__sigev_signo
0634 #define sigev_notify_kqueue     __sigev_u.__sigev_notify_kqueue
0635 #endif
0636 
0637 //----------------------------------------------------------------------
0638 // From sys/_iovec.h
0639 //----------------------------------------------------------------------
0640 
0641 struct vki_iovec {
0642    void *iov_base;
0643    __vki_size_t iov_len;
0644 };
0645 
0646 //----------------------------------------------------------------------
0647 // From sys/socket.h
0648 //----------------------------------------------------------------------
0649 
0650 typedef __vki_sa_family_t  vki_sa_family_t;
0651 typedef __vki_socklen_t    vki_socklen_t;
0652 
0653 struct vki_sockaddr {
0654    vki_uint8_t sa_len;
0655    vki_sa_family_t   sa_family;  /* address family, AF_xxx  */
0656    char     sa_data[14];   /* 14 bytes of protocol address  */
0657 };
0658 
0659 struct vki_msghdr {
0660    void  *  msg_name;   /* Socket name       */
0661    vki_socklen_t  msg_namelen;   /* Length of name    */
0662    struct vki_iovec *   msg_iov; /* Data blocks       */
0663    int      msg_iovlen; /* Number of blocks     */
0664    void  *  msg_control;   /* Per protocol magic (eg BSD file descriptor passing) */
0665    vki_socklen_t  msg_controllen;   /* Length of cmsg list */
0666    int      msg_flags;
0667 };
0668 
0669 struct vki_cmsghdr {
0670    vki_socklen_t  cmsg_len;   /* data byte count, including hdr */
0671    int    cmsg_level; /* originating protocol */
0672    int    cmsg_type;  /* protocol-specific type */
0673 };
0674 
0675 #define __VKI_CMSG_NXTHDR(ctl, len, cmsg) __vki_cmsg_nxthdr((ctl),(len),(cmsg))
0676 #define VKI_CMSG_NXTHDR(mhdr, cmsg) vki_cmsg_nxthdr((mhdr), (cmsg))
0677 
0678 #define VKI_CMSG_ALIGN(len) ( ((len)+sizeof(long)-1) & ~(sizeof(long)-1) )
0679 
0680 #define VKI_CMSG_DATA(cmsg)   ((void *)((char *)(cmsg) + VKI_CMSG_ALIGN(sizeof(struct vki_cmsghdr))))
0681 
0682 #define __VKI_CMSG_FIRSTHDR(ctl,len) ((len) >= sizeof(struct vki_cmsghdr) ? \
0683               (struct vki_cmsghdr *)(ctl) : \
0684               (struct vki_cmsghdr *)NULL)
0685 #define VKI_CMSG_FIRSTHDR(msg)   __VKI_CMSG_FIRSTHDR((msg)->msg_control, (msg)->msg_controllen)
0686 
0687 // [[Urgh, this is revolting...]
0688 // QQQ check
0689 static __inline struct vki_cmsghdr * __vki_cmsg_nxthdr(void *__ctl, vki_socklen_t __size,
0690       struct vki_cmsghdr *__cmsg)
0691 {
0692    struct vki_cmsghdr * __ptr;
0693 
0694    __ptr = (struct vki_cmsghdr*)(((unsigned char *) __cmsg) +  VKI_CMSG_ALIGN(__cmsg->cmsg_len));
0695    if ((unsigned long)((char*)(__ptr+1) - (char *) __ctl) > __size)
0696       return (struct vki_cmsghdr *)0;
0697 
0698    return __ptr;
0699 }
0700 
0701 static __inline struct vki_cmsghdr * vki_cmsg_nxthdr (struct vki_msghdr *__msg, struct vki_cmsghdr *__cmsg)
0702 {
0703    return __vki_cmsg_nxthdr(__msg->msg_control, __msg->msg_controllen, __cmsg);
0704 }
0705 
0706 #define  VKI_SCM_RIGHTS 0x01     /* rw: access rights (array of int) */
0707 
0708 #define VKI_AF_UNIX  1  /* Unix domain sockets     */
0709 #define VKI_AF_INET  2  /* Internet IP Protocol    */
0710 #define VKI_AF_INET6 28 /* IP version 6         */
0711 
0712 #define VKI_MSG_NOSIGNAL   0x20000  /* Do not generate SIGPIPE */
0713 
0714 #define VKI_SOL_SOCKET  0xffff
0715 
0716 #define VKI_SO_TYPE  0x1008
0717 
0718 #define VKI_SOCK_STREAM 1
0719 
0720 #include <netinet/tcp.h> // TCP_NODELAY
0721 
0722 #define VKI_TCP_NODELAY  TCP_NODELAY
0723 
0724 #include <netinet/in.h> // IPPROTO_TCP
0725 
0726 #define VKI_IPPROTO_TCP  IPPROTO_TCP
0727 
0728 struct vki_sf_hdtr {
0729    struct iovec *headers;
0730    int hdr_cnt;
0731    struct iovec *trailers;
0732    int trl_cnt;
0733 };
0734 
0735 
0736 //----------------------------------------------------------------------
0737 // From netinet/in.h
0738 //----------------------------------------------------------------------
0739 
0740 struct vki_in_addr {
0741    vki_in_addr_t  s_addr;
0742 };
0743 
0744 /* Structure describing an Internet (IP) socket address. */
0745 #define __VKI_SOCK_SIZE__  16 /* sizeof(struct sockaddr) */
0746 struct vki_sockaddr_in {
0747    vki_uint8_t     sin_len;
0748    vki_sa_family_t sin_family; /* Address family    */
0749    vki_in_port_t      sin_port;   /* Port number       */
0750    struct vki_in_addr sin_addr;   /* Internet address     */
0751    char         sin_zero[8];
0752 };
0753 
0754 //----------------------------------------------------------------------
0755 // From netinet6/in6.h
0756 //----------------------------------------------------------------------
0757 
0758 struct vki_in6_addr {
0759    union {
0760       vki_uint8_t u6_addr8[16];
0761       vki_uint16_t   u6_addr16[8];
0762       vki_uint32_t   u6_addr32[4];
0763    } vki_in6_u;
0764 #define vki_s6_addr     vki_in6_u.u6_addr8
0765 #define vki_s6_addr16      vki_in6_u.u6_addr16
0766 #define vki_s6_addr32      vki_in6_u.u6_addr32
0767 };
0768 
0769 struct vki_sockaddr_in6 {
0770    vki_uint8_t    sin6_len;
0771    vki_sa_family_t      sin6_family;    /* AF_INET6 */
0772    vki_uint16_t      sin6_port;      /* Transport layer port # */
0773    vki_uint32_t      sin6_flowinfo;  /* IPv6 flow information */
0774    struct vki_in6_addr  sin6_addr;      /* IPv6 address */
0775    vki_uint32_t      sin6_scope_id;  /* scope id (new in RFC2553) */
0776 };
0777 
0778 //----------------------------------------------------------------------
0779 // From netinet/sctp_uio.h
0780 //----------------------------------------------------------------------
0781 #define VKI_SCTP_ALIGN_RESV_PAD 92
0782 
0783 typedef vki_uint32_t vki_sctp_assoc_t;
0784 
0785 struct vki_sctp_sndrcvinfo {
0786    vki_uint16_t sinfo_stream;
0787    vki_uint16_t sinfo_ssn;
0788    vki_uint16_t sinfo_flags;
0789    vki_uint32_t sinfo_ppid;
0790    vki_uint32_t sinfo_context;
0791    vki_uint32_t sinfo_timetolive;
0792    vki_uint32_t sinfo_tsn;
0793    vki_uint32_t sinfo_cumtsn;
0794    vki_sctp_assoc_t sinfo_assoc_id;
0795    vki_uint16_t sinfo_keynumber;
0796    vki_uint16_t sinfo_keynumber_valid;
0797    vki_uint8_t __reserve_pad[VKI_SCTP_ALIGN_RESV_PAD];
0798 };
0799 
0800 //----------------------------------------------------------------------
0801 // From sys/un.h
0802 //----------------------------------------------------------------------
0803 
0804 #define VKI_UNIX_PATH_MAX  104   /* QQQ overridden by sun_len */
0805 
0806 struct vki_sockaddr_un {
0807    unsigned char sun_len;
0808    vki_sa_family_t sun_family;   /* AF_UNIX */
0809    char sun_path[VKI_UNIX_PATH_MAX];   /* pathname */
0810 };
0811 
0812 //----------------------------------------------------------------------
0813 // From aio.h
0814 //----------------------------------------------------------------------
0815 
0816 struct vki___aiocb_private {
0817    long    status;
0818    long    error;
0819    void    *kernelinfo;
0820 };
0821 
0822 typedef struct vki_aiocb {
0823    int     aio_fildes;
0824    vki_off_t   aio_offset;
0825    volatile void *aio_buf;
0826    vki_size_t  aio_nbytes;
0827    int     __spare__[2];
0828    void    *__spare2__;
0829    int     aio_lio_opcode;
0830    int     aio_reqprio;
0831    struct  vki___aiocb_private _aiocb_private;
0832    struct  vki_sigevent aio_sigevent;
0833 } aiocb_t;
0834 
0835 #define VKI_LIO_NOP                 0x0
0836 #define VKI_LIO_WRITE               0x1
0837 #define VKI_LIO_READ                0x2
0838 
0839 #define VKI_LIO_NOWAIT              0x0
0840 #define VKI_LIO_WAIT                0x1
0841 
0842 
0843 #define VKI_LIO_NOWAIT 0x0
0844 
0845 //----------------------------------------------------------------------
0846 // From sys/mount.h
0847 //----------------------------------------------------------------------
0848 
0849 typedef struct vki_fsid {
0850    vki_int32_t val[2];
0851 } vki_fsid_t;
0852 #define VKI_OMFSNAMELEN 16
0853 #define VKI_OMNAMELEN   (88 - 2 * sizeof(long))
0854 #define VKI_MFSNAMELEN  16
0855 #define VKI_FREEBSD11_MNAMELEN   88
0856 
0857 struct vki_freebsd11_statfs {
0858    vki_uint32_t f_version;
0859    vki_uint32_t f_type;
0860    vki_uint64_t f_flags;
0861    vki_uint64_t f_bsize;
0862    vki_uint64_t f_iosize;
0863    vki_uint64_t f_blocks;
0864    vki_uint64_t f_bfree;
0865    vki_int64_t  f_bavail;
0866    vki_uint64_t f_files;
0867    vki_int64_t  f_ffree;
0868    vki_uint64_t f_syncwrites;
0869    vki_uint64_t f_asyncwrites;
0870    vki_uint64_t f_syncreads;
0871    vki_uint64_t f_asyncreads;
0872    vki_uint64_t f_spare[10];
0873    vki_uint32_t f_namemax;
0874    vki_uid_t     f_owner;
0875    vki_fsid_t    f_fsid;
0876    char      f_charspare[80];
0877    char      f_fstypename[VKI_OMFSNAMELEN];
0878    char      f_mntfromname[VKI_FREEBSD11_MNAMELEN];
0879    char      f_mntonname[VKI_FREEBSD11_MNAMELEN];
0880 };
0881 
0882 
0883 #define MAXFIDSZ        16
0884 
0885 struct vki_fid {
0886    vki_uint16_t    fid_len;
0887    vki_uint16_t    fid_reserved;
0888    char            fid_data[MAXFIDSZ];
0889 };
0890 
0891 struct vki_fhandle {
0892    vki_fsid_t  fh_fsid;
0893    struct vki_fid fh_fid;
0894 };
0895 
0896 
0897 #define VKI_MNAMELEN        1024
0898 struct vki_statfs {
0899    vki_uint32_t f_version;
0900    vki_uint32_t f_type;
0901    vki_uint64_t f_flags;
0902    vki_uint64_t f_bsize;
0903    vki_uint64_t f_iosize;
0904    vki_uint64_t f_blocks;
0905    vki_uint64_t f_bfree;
0906    vki_int64_t  f_bavail;
0907    vki_uint64_t f_files;
0908    vki_int64_t  f_ffree;
0909    vki_uint64_t f_syncwrites;
0910    vki_uint64_t f_asyncwrites;
0911    vki_uint64_t f_syncreads;
0912    vki_uint64_t f_asyncreads;
0913    vki_uint64_t f_spare[10];
0914    vki_uint32_t f_namemax;
0915    vki_uid_t     f_owner;
0916    vki_fsid_t    f_fsid;
0917    char      f_charspare[80];
0918    char      f_fstypename[VKI_MFSNAMELEN];
0919    char      f_mntfromname[VKI_MNAMELEN];
0920    char      f_mntonname[VKI_MNAMELEN];
0921 };
0922 
0923 typedef struct vki_fhandle  vki_fhandle_t;
0924 
0925 //----------------------------------------------------------------------
0926 // From sys/ttycom.h
0927 //----------------------------------------------------------------------
0928 
0929 struct vki_winsize {
0930    unsigned short ws_row;
0931    unsigned short ws_col;
0932    unsigned short ws_xpixel;
0933    unsigned short ws_ypixel;
0934 };
0935 
0936 
0937 //----------------------------------------------------------------------
0938 // From sys/termios.h
0939 //----------------------------------------------------------------------
0940 
0941 typedef unsigned int    vki_tcflag_t;
0942 typedef unsigned char   vki_cc_t;
0943 typedef unsigned int    vki_speed_t;
0944 
0945 #define VKI_NCCS 20
0946 struct vki_termios {
0947    vki_tcflag_t c_iflag;      /* input mode flags */
0948    vki_tcflag_t c_oflag;      /* output mode flags */
0949    vki_tcflag_t c_cflag;      /* control mode flags */
0950    vki_tcflag_t c_lflag;      /* local mode flags */
0951    vki_cc_t c_cc[VKI_NCCS];   /* control characters */
0952    vki_speed_t c_ispeed;
0953    vki_speed_t c_ospeed;
0954 };
0955 
0956 //----------------------------------------------------------------------
0957 // From sys/ioccom.h
0958 //----------------------------------------------------------------------
0959 
0960 /* QQQ keep linux's naming, but use our layout */
0961 
0962 /*
0963  * We actually have a 16 bit "base" ioctl, which may or may not be decoded
0964  * into number/group
0965  */
0966 #define _VKI_IOC_BASEBITS  16U
0967 #define _VKI_IOC_NRBITS    8U  /* "num" on freebsd */
0968 #define _VKI_IOC_TYPEBITS  8U  /* "group" on freebsd */
0969 
0970 #define _VKI_IOC_SIZEBITS  13U
0971 #define _VKI_IOC_DIRBITS   3U
0972 
0973 #define _VKI_IOC_BASEMASK  ((1ul << _VKI_IOC_BASEBITS)-1)
0974 #define _VKI_IOC_NRMASK    ((1ul << _VKI_IOC_NRBITS)-1)
0975 #define _VKI_IOC_TYPEMASK  ((1ul << _VKI_IOC_TYPEBITS)-1)
0976 #define _VKI_IOC_SIZEMASK  ((1ul << _VKI_IOC_SIZEBITS)-1)
0977 #define _VKI_IOC_DIRMASK   ((1ul << _VKI_IOC_DIRBITS)-1)
0978 
0979 #define _VKI_IOC_BASESHIFT   0U
0980 #define _VKI_IOC_NRSHIFT   0U
0981 #define _VKI_IOC_TYPESHIFT (_VKI_IOC_NRSHIFT+_VKI_IOC_NRBITS)
0982 #define _VKI_IOC_SIZESHIFT (_VKI_IOC_TYPESHIFT+_VKI_IOC_TYPEBITS)
0983 #define _VKI_IOC_DIRSHIFT  (_VKI_IOC_SIZESHIFT+_VKI_IOC_SIZEBITS)
0984 
0985 #define _VKI_IOC_NONE   1U /* "void" on freebsd, as a specific mode */
0986 #define _VKI_IOC_READ   2U /* "out", copyout in reversed linux terminology */
0987 #define _VKI_IOC_WRITE  4U /* "in", copyin in reversed linux terminology */
0988 #define _VKI_IOC_RDWR   6U /* "inout", copyin and copyout */
0989 
0990 #define _VKI_IOC(dir,type,nr,size) \
0991    (((dir)  << _VKI_IOC_DIRSHIFT) | \
0992     ((type) << _VKI_IOC_TYPESHIFT) | \
0993     ((nr)   << _VKI_IOC_NRSHIFT) | \
0994     ((size) << _VKI_IOC_SIZESHIFT))
0995 
0996 /* provoke compile error for invalid uses of size argument */
0997 extern unsigned int __vki_invalid_size_argument_for_IOC;
0998 #define _VKI_IOC_TYPECHECK(t) \
0999    ((sizeof(t) == sizeof(t[1]) && \
1000      sizeof(t) < (1 << _VKI_IOC_SIZEBITS)) ? \
1001      sizeof(t) : __vki_invalid_size_argument_for_IOC)
1002 
1003 /* used to create numbers */
1004 #define _VKI_IO(type,nr)   _VKI_IOC(_VKI_IOC_NONE,(type),(nr),0)
1005 #define _VKI_IOR(type,nr,size)   _VKI_IOC(_VKI_IOC_READ,(type),(nr),(_VKI_IOC_TYPECHECK(size)))
1006 #define _VKI_IOW(type,nr,size)   _VKI_IOC(_VKI_IOC_WRITE,(type),(nr),(_VKI_IOC_TYPECHECK(size)))
1007 #define _VKI_IOWR(type,nr,size)  _VKI_IOC(_VKI_IOC_READ|_VKI_IOC_WRITE,(type),(nr),(_VKI_IOC_TYPECHECK(size)))
1008 
1009 /* used to decode ioctl numbers.. */
1010 #define _VKI_IOC_DIR(nr)   (((nr) >> _VKI_IOC_DIRSHIFT) & _VKI_IOC_DIRMASK)
1011 #define _VKI_IOC_TYPE(nr)  (((nr) >> _VKI_IOC_TYPESHIFT) & _VKI_IOC_TYPEMASK)
1012 #define _VKI_IOC_NR(nr)    (((nr) >> _VKI_IOC_NRSHIFT) & _VKI_IOC_NRMASK)
1013 #define _VKI_IOC_SIZE(nr)  (((nr) >> _VKI_IOC_SIZESHIFT) & _VKI_IOC_SIZEMASK)
1014 #define _VKI_IOC_BASE(nr)  (((nr) >> _VKI_IOC_BASESHIFT) & _VKI_IOC_BASEMASK)
1015 
1016 //----------------------------------------------------------------------
1017 // From sys/random.h
1018 //----------------------------------------------------------------------
1019 
1020 #define VKI_GRND_NONBLOCK 0x1U
1021 
1022 //----------------------------------------------------------------------
1023 // From sys/termios.h
1024 //----------------------------------------------------------------------
1025 
1026 #define VKI_TIOCFLUSH  _VKI_IOW('t', 16, int);
1027 #define VKI_TIOCGETA   _VKI_IOR('t', 19, struct vki_termios)  /* get termios */
1028 #define VKI_TIOCSETA   _VKI_IOR('t', 20, struct vki_termios)  /* set termios */
1029 #define VKI_TIOCSETAW  _VKI_IOR('t', 21, struct vki_termios)  /* drain,set */
1030 #define VKI_TIOCSETAF  _VKI_IOR('t', 22, struct vki_termios)  /* flush,set */
1031 
1032 #define _VKI_TIOCPTMASTER  _VKI_IO('t', 28)    /* pts master validation */
1033 
1034 #define VKI_TIOCSWINSZ  _VKI_IOW('t', 103, struct vki_winsize)  /* set window size */
1035 #define VKI_TIOCGWINSZ  _VKI_IOR('t', 104, struct vki_winsize)  /* get window size */
1036 
1037 #define VKI_TIOCMGET _VKI_IOR('t', 106, int) /* get all modem bits */
1038 #define VKI_TIOCMBIC _VKI_IOW('t', 107, int) /* bic modem bits */
1039 #define VKI_TIOCMBIS _VKI_IOW('t', 108, int) /* bis modem bits */
1040 #define VKI_TIOCMSET _VKI_IOW('t', 109, int) /* set all modem bits */
1041 #define  VKI_TIOCSTART  _VKI_IO('t', 110)    /* start output, like ^Q */
1042 #define  VKI_TIOCSTOP   _VKI_IO('t', 111)    /* stop output, like ^S */
1043 #define  VKI_TIOCPKT    _VKI_IOW('t', 112, int) /* pty: set/clear packet mode */
1044 
1045 #define  VKI_TIOCSPGRP  _VKI_IOW('t', 118, int)    /* set pgrp */
1046 #define  VKI_TIOCGPGRP  _VKI_IOR('t', 119, int)    /* get pgrp */
1047 #define  VKI_TIOCCBRK   _VKI_IO('t', 122)
1048 #define  VKI_TIOCSBRK   _VKI_IO('t', 123)
1049 
1050 
1051 //----------------------------------------------------------------------
1052 // From sys/filio.h
1053 //----------------------------------------------------------------------
1054 
1055 #define VKI_FIOCLEX  _VKI_IO('f', 1)      /* close on exec */
1056 #define VKI_FIONCLEX _VKI_IO('f', 2)      /* no close on exec */
1057 #define VKI_FIONREAD _VKI_IOR('f', 127, int)
1058 #define VKI_FIONBIO  _VKI_IOW('f', 126, int)
1059 #define VKI_FIOASYNC _VKI_IOW('f', 125, int)
1060 #define VKI_FIOSETOWN   _VKI_IOW('f', 124, int)
1061 #define VKI_FIOGETOWN   _VKI_IOW('f', 123, int)
1062 struct vki_fiodgname_arg {
1063    int     len;
1064    void    *buf;
1065 };
1066 #define VKI_FIODGNAME   _VKI_IOW('f', 120, struct vki_fiodgname_arg) /* get dev. name */
1067 
1068 //----------------------------------------------------------------------
1069 // From net/bpf.h
1070 //----------------------------------------------------------------------
1071 
1072 struct vki_bpf_program {
1073    vki_u_int bf_len;
1074    struct vki_bpf_insn *bf_insns;
1075 };
1076 
1077 typedef vki_u_int32_t vki_bpf_u_int32;
1078 
1079 struct vki_bpf_insn {
1080    u_short         code;
1081    u_char          jt;
1082    u_char          jf;
1083    vki_bpf_u_int32     k;
1084 };
1085 
1086 
1087 #define VKI_BIOCSETF _VKI_IOW('B', 103, struct vki_bpf_program)
1088 
1089 //----------------------------------------------------------------------
1090 // From net/if.h
1091 //----------------------------------------------------------------------
1092 #define  VKI_IFNAMSIZ   16
1093 
1094 struct vki_ifmediareq {
1095    char    ifm_name[VKI_IFNAMSIZ];
1096    int     ifm_current;
1097    int     ifm_mask;
1098    int     ifm_status;
1099    int     ifm_active;
1100    int     ifm_count;
1101    int     *ifm_ulist;
1102 };
1103 
1104 #define VKI_IFSTATMAX       800             /* 10 lines of text */
1105 struct vki_ifstat {
1106    char    ifs_name[VKI_IFNAMSIZ];     /* if name, e.g. "en0" */
1107    char    ascii[VKI_IFSTATMAX + 1];
1108 };
1109 
1110 struct vki_ifreq_buffer {
1111    vki_size_t  length;
1112    void    *buffer;
1113 };
1114 
1115 struct vki_ifreq_nv_req {
1116    vki_u_int   buf_length;     /* Total size of buffer,
1117                         u_int for ABI struct ifreq */
1118    vki_u_int   length;         /* Length of the filled part */
1119    void    *buffer;        /* Buffer itself, containing packed nv */
1120 };
1121 
1122 struct vki_ifreq {
1123    char    ifr_name[VKI_IFNAMSIZ];             /* if name, e.g. "en0" */
1124    union {
1125       struct  vki_sockaddr ifru_addr;
1126       struct  vki_sockaddr ifru_dstaddr;
1127       struct  vki_sockaddr ifru_broadaddr;
1128       struct  vki_ifreq_buffer ifru_buffer;
1129       short   ifru_flags[2];
1130       short   ifru_index;
1131       int     ifru_jid;
1132       int     ifru_metric;
1133       int     ifru_mtu;
1134       int     ifru_phys;
1135       int     ifru_media;
1136       __vki_caddr_t ifru_data;
1137       int     ifru_cap[2];
1138       vki_u_int   ifru_fib;
1139       vki_u_char  ifru_vlan_pcp;
1140       struct  vki_ifreq_nv_req ifru_nv;
1141    } ifr_ifru;
1142 };
1143 
1144 struct vki_ifconf {
1145    int     ifc_len;                /* size of associated buffer */
1146    union {
1147       __vki_caddr_t ifcu_buf;
1148       struct  vki_ifreq *ifcu_req;
1149    } ifc_ifcu;
1150 };
1151 
1152 #define VKI_SIOCGIFSTATUS _VKI_IOWR('i', 59, struct vki_ifstat)
1153 //----------------------------------------------------------------------
1154 // From sys/sockio.h
1155 //----------------------------------------------------------------------
1156 #define VKI_SIOCGIFCONF _VKI_IOWR('i', 36, struct vki_ifconf)   /* get ifnet list */
1157 #define VKI_SIOCGIFMEDIA  _VKI_IOWR('i', 56, struct vki_ifmediareq)
1158 
1159 //----------------------------------------------------------------------
1160 // From sys/poll.h
1161 //----------------------------------------------------------------------
1162 
1163 #define VKI_POLLIN      0x0001
1164 
1165 struct vki_pollfd {
1166    int fd;
1167    short events;
1168    short revents;
1169 };
1170 
1171 //----------------------------------------------------------------------
1172 // From sys/event.h
1173 //----------------------------------------------------------------------
1174 struct vki_kevent_freebsd11 {
1175    vki_uintptr_t  ident;
1176    vki_int16_t    filter;
1177    vki_uint16_t   flags;
1178    vki_uint32_t   fflags;
1179    vki_intptr_t   data;
1180    void           *udata;
1181 };
1182 
1183 struct vki_kevent {
1184    vki_uintptr_t  ident;
1185    vki_int16_t    filter;
1186    vki_uint16_t   flags;
1187    vki_uint32_t   fflags;
1188    vki_int64_t    data;
1189    void           *udata;
1190    vki_uint64_t   ext[4];
1191 };
1192 
1193 
1194 // QQQ sort
1195 
1196 //----------------------------------------------------------------------
1197 // From sys/resource.h
1198 //----------------------------------------------------------------------
1199 
1200 #define VKI_RUSAGE_SELF     0
1201 #define VKI_RUSAGE_CHILDREN -1
1202 #define VKI_RUSAGE_THREAD   1
1203 
1204 struct   vki_rusage {
1205    struct vki_timeval ru_utime;  /* user time used */
1206    struct vki_timeval ru_stime;  /* system time used */
1207    long  ru_maxrss;     /* maximum resident set size */
1208    long  ru_ixrss;      /* integral shared memory size */
1209    long  ru_idrss;      /* integral unshared data size */
1210    long  ru_isrss;      /* integral unshared stack size */
1211    long  ru_minflt;     /* page reclaims */
1212    long  ru_majflt;     /* page faults */
1213    long  ru_nswap;      /* swaps */
1214    long  ru_inblock;    /* block input operations */
1215    long  ru_oublock;    /* block output operations */
1216    long  ru_msgsnd;     /* messages sent */
1217    long  ru_msgrcv;     /* messages received */
1218    long  ru_nsignals;      /* signals received */
1219    long  ru_nvcsw;      /* voluntary context switches */
1220    long  ru_nivcsw;     /* involuntary " */
1221 };
1222 
1223 struct vki_rlimit {
1224    vki_rlim_t  rlim_cur;
1225    vki_rlim_t  rlim_max;
1226 };
1227 
1228 #define VKI_RLIMIT_DATA    2  /* max data size */
1229 #define VKI_RLIMIT_STACK   3  /* max stack size */
1230 #define VKI_RLIMIT_CORE    4  /* max core file size */
1231 #define VKI_RLIMIT_NOFILE  8  /* max number of open files */
1232 
1233 struct vki___wrusage {
1234    struct vki_rusage   wru_self;
1235    struct vki_rusage   wru_children;
1236 };
1237 
1238 
1239 //----------------------------------------------------------------------
1240 // From sys/procfs.h
1241 //----------------------------------------------------------------------
1242 
1243 #define VKI_PRSTATUS_VERSION  1
1244 struct vki_elf_prstatus {
1245    int      pr_version; /* version of struct - PRSTATUS_VERSION */
1246    vki_size_t  pr_statussz;
1247    vki_size_t  pr_gregsetsz;
1248    vki_size_t  pr_fpregsetsz;
1249    int      pr_osreldate;
1250    int      pr_cursig;  /* Current signal */
1251    vki_pid_t   pr_pid;
1252    vki_elf_gregset_t pr_reg;  /* GP registers */
1253 };
1254 
1255 #define VKI_ELF_PRARGSZ (80)  /* Number of chars for args */
1256 #define VKI_MAXCOMLEN   (16)
1257 
1258 #define  VKI_PRPSINFO_VERSION 1
1259 struct vki_elf_prpsinfo {
1260    int   pr_version; /* version of struct - PRPSINFO_VERSION */
1261    vki_size_t  pr_psinfosz;
1262    char  pr_fname[VKI_MAXCOMLEN+1];    /* filename of executable */
1263    char  pr_psargs[VKI_ELF_PRARGSZ];   /* initial part of arg list */
1264 };
1265 
1266 //----------------------------------------------------------------------
1267 // From posix4/mqueue.h
1268 //----------------------------------------------------------------------
1269 
1270 struct vki_mq_attr {
1271    long  mq_flags;   /* message queue flags        */
1272    long  mq_maxmsg;  /* maximum number of messages    */
1273    long  mq_msgsize; /* maximum message size       */
1274    long  mq_curmsgs; /* number of messages currently queued */
1275 };
1276 
1277 //----------------------------------------------------------------------
1278 // From sys/ucontext.h
1279 //----------------------------------------------------------------------
1280 
1281 #define  VKI_UCF_SWAPPED   1
1282 
1283 struct vki_ucontext {
1284    vki_sigset_t         uc_sigmask;
1285    struct vki_mcontext  uc_mcontext;
1286    struct vki_ucontext* uc_link;
1287    vki_stack_t          uc_stack;
1288    int                  uc_flags;
1289    unsigned int         __spare__[4];
1290 };
1291 
1292 //----------------------------------------------------------------------
1293 // From sys/utsname.h
1294 //----------------------------------------------------------------------
1295 
1296 #define VKI_SYS_NMLN        32
1297 
1298 struct vki_utsname {
1299    char    sysname[VKI_SYS_NMLN];      /* Name of this OS. */
1300    char    nodename[VKI_SYS_NMLN];     /* Name of this network node. */
1301    char    release[VKI_SYS_NMLN];      /* Release level. */
1302    char    version[VKI_SYS_NMLN];      /* Version level. */
1303    char    machine[VKI_SYS_NMLN];      /* Hardware type. */
1304 };
1305 
1306 #define VKI_IPC_CREAT  00001000   /* create if key is nonexistent */
1307 #define VKI_IPC_EXCL   00002000   /* fail if key exists */
1308 #define VKI_IPC_NOWAIT 00004000   /* return error on wait */
1309 
1310 #define VKI_IPC_RMID 0     /* remove resource */
1311 #define VKI_IPC_SET  1     /* set ipc_perm options */
1312 #define VKI_IPC_STAT 2     /* get ipc_perm options */
1313 #define VKI_IPC_INFO 3     /* only used by Linux compatibilty shm_ctl */
1314 
1315 //----------------------------------------------------------------------
1316 // From sys/ipc.h
1317 //----------------------------------------------------------------------
1318 
1319 struct vki_ipc_perm_old {
1320    unsigned short cuid;
1321    unsigned short cgid;
1322    unsigned short uid;
1323    unsigned short gid;
1324    unsigned short mode;
1325    unsigned short seq;
1326    vki_key_t   key;
1327 };
1328 
1329 struct vki_ipc_perm {
1330    vki_uid_t   cuid;
1331    vki_gid_t   cgid;
1332    vki_uid_t   uid;
1333    vki_gid_t   gid;
1334    vki_mode_t  mode;
1335    unsigned short seq;
1336    vki_key_t   key;
1337 };
1338 
1339 //----------------------------------------------------------------------
1340 // From sys/sem.h
1341 //----------------------------------------------------------------------
1342 
1343 #define VKI_GETALL  6       /* get all semval's */
1344 #define VKI_SETVAL  8       /* set semval */
1345 #define VKI_SETALL  9       /* set all semval's */
1346 #define VKI_SEM_STAT 10
1347 #define VKI_SEM_INFO 11
1348 
1349 struct vki_semid_ds_old {
1350    struct vki_ipc_perm_old sem_perm;
1351    struct sem      *__sem_base;
1352    unsigned short  sem_nsems;
1353    vki_time_t      sem_otime;
1354    long            sem_pad1;
1355    vki_time_t      sem_ctime;
1356    long            sem_pad2;
1357    long            sem_pad3[4];
1358 };
1359 
1360 
1361 /* Obsolete, used only for backwards compatibility and libc5 compiles */
1362 struct vki_semid_ds {
1363    struct vki_ipc_perm  sem_perm;      /* permissions .. see ipc.h */
1364    // [[Use void* to avoid excess header copying]]
1365    void/*struct sem  */*sem_base;      /* ptr to first semaphore in array */
1366    unsigned short    sem_nsems;     /* no. of semaphores in array */
1367    vki_time_t     sem_otime;     /* last semop time */
1368    vki_time_t     sem_ctime;     /* last change time */
1369 };
1370 
1371 struct vki_sembuf {
1372    vki_uint16_t   sem_num; /* semaphore index in array */
1373    vki_int16_t sem_op;     /* semaphore operation */
1374    vki_int16_t sem_flg; /* operation flags */
1375 };
1376 
1377 union vki_semun {
1378    int val;       /* value for SETVAL */
1379    struct vki_semid_ds *buf;  /* buffer for IPC_STAT & IPC_SET */
1380    vki_uint16_t *array; /* array for GETALL & SETALL */
1381 };
1382 
1383 
1384 //----------------------------------------------------------------------
1385 // From sys/errno.h
1386 //----------------------------------------------------------------------
1387 
1388 #define VKI_ERESTART -1
1389 #define VKI_EPERM           1               /* Operation not permitted */
1390 #define VKI_ENOENT          2               /* No such file or directory */
1391 #define VKI_ESRCH           3               /* No such process */
1392 #define VKI_EINTR           4               /* Interrupted system call */
1393 #define VKI_EIO             5               /* Input/output error */
1394 #define VKI_ENXIO           6               /* Device not configured */
1395 #define VKI_E2BIG           7               /* Argument list too long */
1396 #define VKI_ENOEXEC         8               /* Exec format error */
1397 #define VKI_EBADF           9               /* Bad file descriptor */
1398 #define VKI_ECHILD          10              /* No child processes */
1399 #define VKI_EDEADLK         11              /* Resource deadlock avoided */
1400 #define VKI_ENOMEM          12              /* Cannot allocate memory */
1401 #define VKI_EACCES          13              /* Permission denied */
1402 #define VKI_EFAULT          14              /* Bad address */
1403 #define VKI_ENOTBLK         15              /* Block device required */
1404 #define VKI_EBUSY           16              /* Device busy */
1405 #define VKI_EEXIST          17              /* File exists */
1406 #define VKI_EXDEV           18              /* Cross-device link */
1407 #define VKI_ENODEV          19              /* Operation not supported by device */
1408 #define VKI_ENOTDIR         20              /* Not a directory */
1409 #define VKI_EISDIR          21              /* Is a directory */
1410 #define VKI_EINVAL          22              /* Invalid argument */
1411 #define VKI_ENFILE          23              /* Too many open files in system */
1412 #define VKI_EMFILE          24              /* Too many open files */
1413 #define VKI_ENOTTY          25              /* Inappropriate ioctl for device */
1414 #define VKI_ETXTBSY         26              /* Text file busy */
1415 #define VKI_EFBIG           27              /* File too large */
1416 #define VKI_ENOSPC          28              /* No space left on device */
1417 #define VKI_ESPIPE          29              /* Illegal seek */
1418 #define VKI_EROFS           30              /* Read-only filesystem */
1419 #define VKI_EMLINK          31              /* Too many links */
1420 #define VKI_EPIPE           32              /* Broken pipe */
1421 #define VKI_EDOM            33              /* Numerical argument out of domain */
1422 #define VKI_ERANGE          34              /* Result too large */
1423 #define VKI_EAGAIN          35              /* Resource temporarily unavailable */
1424 #define VKI_EWOULDBLOCK     VKI_EAGAIN          /* Operation would block */
1425 #define VKI_EINPROGRESS     36              /* Operation now in progress */
1426 #define VKI_EALREADY        37              /* Operation already in progress */
1427 #define VKI_ENOTSOCK        38              /* Socket operation on non-socket */
1428 #define VKI_EDESTADDRREQ    39              /* Destination address required */
1429 #define VKI_EMSGSIZE        40              /* Message too long */
1430 #define VKI_EPROTOTYPE      41              /* Protocol wrong type for socket */
1431 #define VKI_ENOPROTOOPT     42              /* Protocol not available */
1432 #define VKI_EPROTONOSUPPORT 43              /* Protocol not supported */
1433 #define VKI_ESOCKTNOSUPPORT 44              /* Socket type not supported */
1434 #define VKI_EOPNOTSUPP      45              /* Operation not supported */
1435 #define VKI_ENOTSUP         VKI_EOPNOTSUPP      /* Operation not supported */
1436 #define VKI_EPFNOSUPPORT    46              /* Protocol family not supported */
1437 #define VKI_EAFNOSUPPORT    47              /* Address family not supported by protocol family */
1438 #define VKI_EADDRINUSE      48              /* Address already in use */
1439 #define VKI_EADDRNOTAVAIL   49
1440 #define VKI_ENETDOWN        50              /* Network is down */
1441 #define VKI_ENETUNREACH     51              /* Network is unreachable */
1442 #define VKI_ENETRESET       52              /* Network dropped connection on reset */
1443 #define VKI_ECONNABORTED    53              /* Software caused connection abort */
1444 #define VKI_ECONNRESET      54              /* Connection reset by peer */
1445 #define VKI_ENOBUFS         55              /* No buffer space available */
1446 #define VKI_EISCONN         56              /* Socket is already connected */
1447 #define VKI_ENOTCONN        57              /* Socket is not connected */
1448 #define VKI_ESHUTDOWN       58              /* Can't send after socket shutdown */
1449 #define VKI_ETOOMANYREFS    59              /* Too many references: can't splice */
1450 #define VKI_ETIMEDOUT       60              /* Operation timed out */
1451 #define VKI_ECONNREFUSED    61              /* Connection refused */
1452 #define VKI_ELOOP           62              /* Too many levels of symbolic links */
1453 #define VKI_ENAMETOOLONG    63              /* File name too long */
1454 #define VKI_EHOSTDOWN       64              /* Host is down */
1455 #define VKI_EHOSTUNREACH    65              /* No route to host */
1456 #define VKI_ENOTEMPTY       66              /* Directory not empty */
1457 #define VKI_EPROCLIM        67              /* Too many processes */
1458 #define VKI_EUSERS          68              /* Too many users */
1459 #define VKI_EDQUOT          69              /* Disc quota exceeded */
1460 #define VKI_ESTALE          70              /* Stale NFS file handle */
1461 #define VKI_EREMOTE         71              /* Too many levels of remote in path */
1462 #define VKI_EBADRPC         72              /* RPC struct is bad */
1463 #define VKI_ERPCMISMATCH    73              /* RPC version wrong */
1464 #define VKI_EPROGUNAVAIL    74              /* RPC prog. not avail */
1465 #define VKI_EPROGMISMATCH   75              /* Program version wrong */
1466 #define VKI_EPROCUNAVAIL    76              /* Bad procedure for program */
1467 #define VKI_ENOLCK          77              /* No locks available */
1468 #define VKI_ENOSYS          78              /* Function not implemented */
1469 #define VKI_EFTYPE          79              /* Inappropriate file type or format */
1470 #define VKI_EAUTH           80              /* Authentication error */
1471 #define VKI_ENEEDAUTH       81              /* Need authenticator */
1472 #define VKI_EIDRM           82              /* Identifier removed */
1473 #define VKI_ENOMSG          83              /* No message of desired type */
1474 #define VKI_EOVERFLOW       84              /* Value too large to be stored in data type */
1475 #define VKI_ECANCELED       85              /* Operation canceled */
1476 #define VKI_EILSEQ          86              /* Illegal byte sequence */
1477 #define VKI_ENOATTR         87              /* Attribute not found */
1478 #define VKI_EDOOFUS         88              /* Programming error */
1479 #define VKI_EBADMSG         89              /* Bad message */
1480 #define VKI_EMULTIHOP       90              /* Multihop attempted */
1481 #define VKI_ENOLINK         91              /* Link has been severed */
1482 #define VKI_EPROTO          92              /* Protocol error */
1483 #define VKI_ENOTCAPABLE     93              /* Capabilities insufficient */
1484 #define VKI_ECAPMODE        94              /* Not permitted in capability mode */
1485 
1486 //----------------------------------------------------------------------
1487 // From sys/wait.h
1488 //----------------------------------------------------------------------
1489 
1490 #define VKI_WNOHANG  0x00000001
1491 
1492 typedef enum vki_idtype {
1493    VKI_P_PID,
1494    VKI_P_PPID,
1495    VKI_P_PGID,
1496    VKI_P_SID,
1497    VKI_P_CID,
1498    VKI_P_UID,
1499    VKI_P_GID,
1500    VKI_P_ALL,
1501    VKI_P_LWPID,
1502    VKI_P_TASKID,
1503    VKI_P_PROJID,
1504    VLI_P_POOLID,
1505    VKI_P_JAILID,
1506    VKI_P_CTID,
1507    VKI_P_CPUID,
1508    VKI_P_PSETID
1509 } vki_idtype_t;
1510 
1511 //----------------------------------------------------------------------
1512 // From sys/mman.h
1513 //----------------------------------------------------------------------
1514 
1515 #define VKI_PROT_NONE   0x00     /* No page permissions */
1516 #define VKI_PROT_READ   0x01     /* page can be read */
1517 #define VKI_PROT_WRITE  0x02     /* page can be written */
1518 #define VKI_PROT_EXEC   0x04     /* page can be executed */
1519 
1520 #define VKI_MAP_SHARED  0x01     /* Share changes */
1521 #define VKI_MAP_PRIVATE 0x02     /* Changes are private */
1522 #define VKI_MAP_FIXED   0x10     /* Interpret addr exactly */
1523 #define VKI_MAP_NORESERVE  0x0040      /* don't check for reservations */
1524 #define  VKI_MAP_STACK  0x400
1525 #define VKI_MAP_ANON 0x1000   /* don't use a file */
1526 #define  VKI_MAP_ANONYMOUS VKI_MAP_ANON
1527 
1528 //----------------------------------------------------------------------
1529 // From sys/stat.h
1530 //----------------------------------------------------------------------
1531 
1532 #define VKI_S_IFMT  00170000
1533 
1534 #define VKI_S_IFWHT  0160000
1535 #define VKI_S_IFSOCK 0140000
1536 #define VKI_S_IFLNK  0120000
1537 #define VKI_S_IFREG  0100000
1538 #define VKI_S_IFBLK  0060000
1539 #define VKI_S_IFDIR  0040000
1540 #define VKI_S_IFCHR  0020000
1541 #define VKI_S_IFIFO  0010000
1542 #define VKI_S_ISUID  0004000
1543 #define VKI_S_ISGID  0002000
1544 #define VKI_S_ISTXT  0001000
1545 
1546 #define VKI_S_ISLNK(m)  (((m) & VKI_S_IFMT) == VKI_S_IFLNK)
1547 #define VKI_S_ISREG(m)  (((m) & VKI_S_IFMT) == VKI_S_IFREG)
1548 #define VKI_S_ISDIR(m)  (((m) & VKI_S_IFMT) == VKI_S_IFDIR)
1549 #define VKI_S_ISCHR(m)  (((m) & VKI_S_IFMT) == VKI_S_IFCHR)
1550 #define VKI_S_ISBLK(m)  (((m) & VKI_S_IFMT) == VKI_S_IFBLK)
1551 #define VKI_S_ISFIFO(m) (((m) & VKI_S_IFMT) == VKI_S_IFIFO)
1552 #define VKI_S_ISSOCK(m) (((m) & VKI_S_IFMT) == VKI_S_IFSOCK)
1553 #define VKI_S_ISWHT(m)  (((m) & VKI_S_IFMT) == VKI_S_IFWHT)
1554 
1555 #define VKI_S_IRWXU 00700
1556 #define VKI_S_IRUSR 00400
1557 #define VKI_S_IWUSR 00200
1558 #define VKI_S_IXUSR 00100
1559 
1560 #define VKI_S_IRWXG 00070
1561 #define VKI_S_IRGRP 00040
1562 #define VKI_S_IWGRP 00020
1563 #define VKI_S_IXGRP 00010
1564 
1565 #define VKI_S_IRWXO 00007
1566 #define VKI_S_IROTH 00004
1567 #define VKI_S_IWOTH 00002
1568 #define VKI_S_IXOTH 00001
1569 
1570 
1571 //----------------------------------------------------------------------
1572 // From sys/dirent.h
1573 //----------------------------------------------------------------------
1574 
1575 struct vki_dirent {
1576    vki_uint32_t   d_fileno;
1577    vki_uint16_t   d_reclen;
1578    vki_uint8_t d_type;
1579    vki_uint8_t d_namelen;
1580    char     vki_d_name[256]; /* We must not include limits.h! */
1581 };
1582 
1583 //----------------------------------------------------------------------
1584 // From sys/fcntl.h
1585 //----------------------------------------------------------------------
1586 
1587 #define VKI_O_RDONLY   O_RDONLY
1588 #define VKI_O_WRONLY   O_WRONLY
1589 #define VKI_O_RDWR     O_RDWR
1590 
1591 #define VKI_FREAD FREAD
1592 #define VKI_WRITE WRITE
1593 
1594 #define VKI_O_NONBLOCK    O_NONBLOCK
1595 #define VKI_O_APPEND   O_APPEND
1596 #define VKI_O_CREAT    O_CREAT
1597 #define VKI_O_TRUNC    O_TRUNC
1598 #define VKI_O_EXCL     O_EXCL
1599 #define VKI_O_DIRECTORY O_DIRECTORY
1600 #define VKI_O_EXEC      O_EXEC
1601 #define VKI_O_SEARCH    O_EXEC
1602 
1603 #define VKI_AT_FDCWD            AT_FDCWD
1604 #define VKI_AT_SYMLINK_NOFOLLOW 0x0200
1605 
1606 
1607 #define VKI_F_DUPFD     0  /* dup */
1608 #define VKI_F_GETFD     1  /* get close_on_exec */
1609 #define VKI_F_SETFD     2  /* set/clear close_on_exec */
1610 #define VKI_F_GETFL     3  /* get file->f_flags */
1611 #define VKI_F_SETFL     4  /* set file->f_flags */
1612 #define VKI_F_SETOWN    5  /*  for sockets. */
1613 #define VKI_F_GETOWN    6  /*  for sockets. */
1614 #define VKI_F_OGETLK    7  /* get record locking information */
1615 #define VKI_F_OSETLK    8  /* set record locking information */
1616 #define VKI_F_OSETLKW   9  /* F_SETLK; wait if blocked */
1617 #define VKI_F_DUP2FD    10 /* duplicate file descriptor to arg */
1618 #define VKI_F_GETLK     11 /* get record locking information */
1619 #define VKI_F_SETLK     12 /* set record locking information */
1620 #define VKI_F_SETLKW    13 /* F_SETLK; wait if blocked */
1621 #define VKI_F_SETLK_REMOTE 14 /* debugging support for remote locks */
1622 #define VKI_F_READAHEAD    15 /* read ahead */
1623 #define VKI_F_RDAHEAD      16 /* Darwin compatible read ahead */
1624 #define VKI_F_DUPFD_CLOEXEC  17 /* dup close_on_exec */
1625 #define VKI_F_DUP2FD_CLOEXEC 18 /* Like F_DUP2FD, but FD_CLOEXEC is set */
1626 #define VKI_F_ADD_SEALS    19 /* apply seals to underlying file */
1627 #define VKI_F_GET_SEALS    20 /* get seals to underlying file */
1628 #define VKI_F_ISUNIONSTACK 21 /* kludge for libc (part of a union stack?) */
1629 /* FreeBSD 13.1 and later */
1630 #define VKI_F_KINFO        22 /* Return kinfo_file for this fd */
1631 
1632 /* for F_[GET|SET]FL */
1633 #define VKI_FD_CLOEXEC  1  /* actually anything with low bit set goes */
1634 
1635 /* for F_[ADD|GET]_SEALS */
1636 #define VKI_F_SEAL_SEAL    0x0001
1637 #define VKI_F_SEAL_SHRINK  0x0002
1638 #define VKI_F_SEAL_GROW    0x0004
1639 #define VKI_F_SEAL_WRITE   0x0008
1640 
1641 struct vki_spacectl_range {
1642    vki_off_t   r_offset;
1643    vki_off_t   r_len;
1644 };
1645 
1646 
1647 //----------------------------------------------------------------------
1648 // From sys/unistd.h
1649 //----------------------------------------------------------------------
1650 
1651 #define VKI_SEEK_SET              0
1652 #define VKI_SEEK_CUR              1
1653 #define VKI_SEEK_END              2
1654 
1655 #define VKI_F_OK  0       /* test for existence of file */
1656 #define VKI_X_OK  0x01    /* test for execute or search permission */
1657 #define VKI_W_OK  0x02    /* test for write permission */
1658 #define VKI_R_OK  0x04    /* test for read permission */
1659 
1660 #define VKI_RFSPAWN         (1U<<31U)
1661 
1662 /* kcmp() options. */
1663 #define VKI_KCMP_FILE       100
1664 #define VKI_KCMP_FILEOBJ    101
1665 #define VKI_KCMP_FILES      102
1666 #define VKI_KCMP_SIGHAND    103
1667 #define VKI_KCMP_VM         104
1668 
1669 #define VKI_CLOSE_RANGE_CLOEXEC     (1<<2)
1670 
1671 //----------------------------------------------------------------------
1672 // From sys/msg.h
1673 //----------------------------------------------------------------------
1674 
1675 #if 0 /* not in freebsd */
1676 #define VKI_MSGSND              11
1677 #define VKI_MSGRCV              12
1678 #define VKI_MSGGET              13
1679 #define VKI_MSGCTL              14
1680 #endif
1681 
1682 typedef unsigned long vki_msglen_t;
1683 typedef unsigned long vki_msgqnum_t;
1684 
1685 struct vki_msqid_ds_old {
1686    struct vki_ipc_perm_old msg_perm;
1687    struct vki_msg *msg_first;
1688    struct vki_msg *msg_last;
1689    vki_msglen_t msg_cbytes;
1690    vki_msgqnum_t msg_qnum;
1691    vki_msglen_t msg_qbytes;
1692    vki_pid_t   msg_lspid;
1693    vki_pid_t   msg_lrpid;
1694    vki_time_t  msg_stime;
1695    vki_uint32_t   msg_pad1;
1696    vki_time_t  msg_rtime;
1697    vki_uint32_t   msg_pad2;
1698    vki_time_t  msg_ctime;
1699    vki_uint32_t   msg_pad3;
1700    vki_uint32_t   msg_pad4[4];
1701 };
1702 
1703 struct vki_msqid_ds {
1704    struct vki_ipc_perm msg_perm;
1705    struct vki_msg *msg_first;
1706    struct vki_msg *msg_last;
1707    vki_msglen_t msg_cbytes;
1708    vki_msgqnum_t msg_qnum;
1709    vki_msglen_t msg_qbytes;
1710    vki_pid_t   msg_lspid;
1711    vki_pid_t   msg_lrpid;
1712    vki_time_t  msg_stime;
1713    vki_time_t  msg_rtime;
1714    vki_time_t  msg_ctime;
1715 };
1716 
1717 
1718 struct vki_msgbuf {
1719    long mtype;         /* type of message */
1720    char mtext[1];      /* message text */
1721 };
1722 
1723 
1724 //----------------------------------------------------------------------
1725 // From sys/shm.h
1726 //----------------------------------------------------------------------
1727 
1728 struct vki_shmid_ds_old {
1729    struct vki_ipc_perm_old shm_perm;   /* operation perms */
1730    int         shm_segsz;  /* size of segment (bytes) */
1731    vki_pid_t      shm_lpid;   /* pid of last operator */
1732    vki_pid_t      shm_cpid;   /* pid of creator */
1733    short       shm_nattch; /* no. of current attaches */
1734    vki_time_t     shm_atime;  /* last attach time */
1735    vki_time_t     shm_dtime;  /* last detach time */
1736    vki_time_t     shm_ctime;  /* last change time */
1737    void        *shm_internal; /* sysv stupidity */
1738 };
1739 
1740 
1741 struct vki_shmid_ds {
1742    struct vki_ipc_perm  shm_perm;   /* operation perms */
1743    vki_size_t     shm_segsz;  /* size of segment (bytes) */
1744    vki_pid_t      shm_lpid;   /* pid of last operator */
1745    vki_pid_t      shm_cpid;   /* pid of creator */
1746    int         shm_nattch; /* no. of current attaches */
1747    vki_time_t     shm_atime;  /* last attach time */
1748    vki_time_t     shm_dtime;  /* last detach time */
1749    vki_time_t     shm_ctime;  /* last change time */
1750 };
1751 
1752 #define VKI_SHMLBA  VKI_PAGE_SIZE
1753 #define VKI_SHM_RDONLY  010000  /* read-only access */
1754 #define  VKI_SHM_ANON   (1UL)
1755 
1756 #if 0 /* not in freebsd abi */
1757 #define VKI_SHMAT               21
1758 #define VKI_SHMDT               22
1759 #define VKI_SHMGET              23
1760 #define VKI_SHMCTL              24
1761 #endif
1762 
1763 //----------------------------------------------------------------------
1764 // From sys/ptrace.h
1765 //----------------------------------------------------------------------
1766 
1767 #define VKI_PTRACE_TRACEME         0
1768 #define VKI_PTRACE_READ_I     1
1769 #define VKI_PTRACE_READ_D     2
1770 /* 3 - read user struct */
1771 #define VKI_PTRACE_WRITE_I    4
1772 #define VKI_PTRACE_WRITE_D    5
1773 /* 6 - write user struct */
1774 #define VKI_PTRACE_CONTINUE      7
1775 #define VKI_PTRACE_KILL       8
1776 #define VKI_PTRACE_STEP       9
1777 #define VKI_PTRACE_ATTACH     10
1778 #define VKI_PTRACE_DETACH     11
1779 #define VKI_PTRACE_IO         12
1780 #define VKI_PTRACE_LWPINFO    13
1781 #define VKI_PTRACE_GETNUMLWPS    14
1782 #define VKI_PTRACE_GETLWPLIST    15
1783 #define VKI_PTRACE_CLEARSTEP     16
1784 #define VKI_PTRACE_SETSTEP    17
1785 #define VKI_PTRACE_SUSPEND    18
1786 #define VKI_PTRACE_RESUME     19
1787 #define VKI_PTRACE_TO_SCE     20
1788 #define VKI_PTRACE_TO_SCX     21
1789 #define VKI_PTRACE_SYSCALL    22
1790 /* md */
1791 #define VKI_PTRACE_GETREGS    33
1792 #define VKI_PTRACE_SETREGS    34
1793 #define VKI_PTRACE_GETFPREGS     35
1794 #define VKI_PTRACE_SETFPREGS     36
1795 #define VKI_PTRACE_GETDBREGS     37
1796 #define VKI_PTRACE_SETDBREGS     38
1797 
1798 #define  VKI_PTRACE_VM_TIMESTAMP    40
1799 #define  VKI_PTRACE_VM_ENTRY        41
1800 
1801 #define VKI_PTRACE_FIRSTMACH     64
1802 
1803 struct vki_ptrace_io_desc {
1804    int      piod_op;
1805    void *      piod_offs;
1806    void *      piod_addr;
1807    vki_size_t  piod_len;
1808 };
1809 #define VKI_PIOD_READ_D    1
1810 #define VKI_PIOD_WRITE_D   2
1811 #define VKI_PIOD_READ_I    3
1812 #define VKI_PIOD_WRITE_I   4
1813 
1814 struct vki_ptrace_lwpinfo {
1815    vki_lwpid_t pl_lwpid;
1816    int      pl_event;
1817 #define  VKI_PL_EVENT_NONE 0
1818 #define  VKI_PL_EVENT_SIGNAL  1
1819    int      pl_flags;
1820 #define VKI_FLAG_SA     0x01
1821 #define  VKI_FLAG_BOUND    0x02
1822    vki_sigset_t pl_sigmask;
1823    vki_sigset_t pl_siglist;
1824 };
1825 
1826 struct vki_ptrace_vm_entry {
1827    int      pve_entry;  /* Entry number used for iteration. */
1828    int      pve_timestamp; /* Generation number of VM map. */
1829    unsigned long  pve_start;  /* Start VA of range. */
1830    unsigned long  pve_end; /* End VA of range (incl). */
1831    unsigned long  pve_offset; /* Offset in backing object. */
1832    unsigned int   pve_prot;   /* Protection of memory range. */
1833    unsigned int   pve_pathlen;   /* Size of path. */
1834    long     pve_fileid; /* File ID. */
1835    vki_uint32_t   pve_fsid;   /* File system ID. */
1836    char     *pve_path;  /* Path name of object. */
1837 };
1838 
1839 #endif // __VKI_FREEBSD_H
1840 
1841 //----------------------------------------------------------------------
1842 // From x86/sysarch.h
1843 //----------------------------------------------------------------------
1844 
1845 // @todo PJF missing VKI_I386_VM86 VKI_I386_SET_PKRU VKI_I386_CLEAR_PKRU VKI_AMD64_SET_PKRU VKI_AMD64_CLEAR_PKRU
1846 #define VKI_I386_GET_FSBASE     7
1847 #define VKI_I386_SET_FSBASE     8
1848 #define VKI_I386_GET_GSBASE     9
1849 #define VKI_I386_SET_GSBASE     10
1850 #define VKI_I386_GET_XFPUSTATE  11
1851 
1852 #define VKI_AMD64_GET_FSBASE    128
1853 #define VKI_AMD64_SET_FSBASE    129
1854 #define VKI_AMD64_GET_GSBASE    130
1855 #define VKI_AMD64_SET_GSBASE    131
1856 #define VKI_AMD64_GET_XFPUSTATE  132
1857 
1858 //----------------------------------------------------------------------
1859 // From sys/module.h
1860 //----------------------------------------------------------------------
1861 
1862 #define VKI_MAXMODNAME 32
1863 
1864 typedef union vki_modspecific {
1865    vki_int32_t intval;
1866    vki_uint32_t   u_intval;
1867 #if defined(VGP_x86_freebsd)
1868    vki_int32_t longval;
1869    vki_uint32_t   u_longval;
1870 #elif defined(VGP_amd64_freebsd) || defined(VGP_arm64_freebsd)
1871    vki_int64_t longval;
1872    vki_uint64_t   u_longval;
1873 #else
1874 #error Unknown platform
1875 #endif
1876 } vki_modspecific_t;
1877 
1878 struct vki_module_stat {
1879    int   version;
1880    char  name[VKI_MAXMODNAME];
1881    int   refs;
1882    int   id;
1883    vki_modspecific_t data;
1884 };
1885 
1886 //----------------------------------------------------------------------
1887 // From sys/rtprio.h
1888 //----------------------------------------------------------------------
1889 
1890 struct vki_rtprio {
1891    vki_uint16_t   type;
1892    vki_uint16_t   prio;
1893 };
1894 
1895 #define VKI_RTP_LOOKUP  0
1896 #define VKI_RTP_SET  1
1897 
1898 //----------------------------------------------------------------------
1899 // From sys/umtx.h
1900 //----------------------------------------------------------------------
1901 
1902 struct vki_umtx {
1903    unsigned long  u_owner;
1904 };
1905 
1906 struct vki_umutex {
1907    vki_lwpid_t m_owner;
1908    vki_uint32_t   m_flags;
1909    vki_uint32_t   m_ceilings[2];
1910    vki_uint32_t   m_spare[4];
1911 };
1912 
1913 struct vki_ucond {
1914    vki_uint32_t   c_has_waiters;
1915    vki_uint32_t   c_flags;
1916    vki_uint32_t   c_spare[2];
1917 };
1918 
1919 struct vki_urwlock {
1920    vki_uint32_t   rw_state;
1921    vki_uint32_t   rw_flags;
1922    vki_uint32_t   rw_blocked_readers;
1923    vki_uint32_t   rw_blocked_writers;
1924    vki_uint32_t   rw_spare[4];
1925 };
1926 
1927 struct vki_usem {
1928    vki_uint32_t   has_waiters;
1929    vki_uint32_t   count;
1930    vki_uint32_t   flags;
1931 };
1932 
1933 struct vki_umtx_time {
1934    struct vki_timespec  timeout;
1935    vki_uint32_t      flags;
1936    vki_uint32_t      clockid;
1937 };
1938 
1939 struct vki_usem2 {
1940    vki_uint32_t    count;
1941    vki_uint32_t  flags;
1942 };
1943 
1944 struct vki_umtx_robust_lists_params {
1945    vki_uintptr_t robust_list_offset;
1946    vki_uintptr_t robust_priv_list_offset;
1947    vki_uintptr_t robust_inact_offset;
1948 };
1949 
1950 #define VKI_UMTX_OP_LOCK     0
1951 #define VKI_UMTX_OP_UNLOCK      1
1952 #define VKI_UMTX_OP_WAIT     2
1953 #define VKI_UMTX_OP_WAKE     3
1954 #define VKI_UMTX_OP_MUTEX_TRYLOCK  4
1955 #define VKI_UMTX_OP_MUTEX_LOCK     5
1956 #define VKI_UMTX_OP_MUTEX_UNLOCK   6
1957 #define VKI_UMTX_OP_SET_CEILING    7
1958 #define VKI_UMTX_OP_CV_WAIT     8
1959 #define VKI_UMTX_OP_CV_SIGNAL      9
1960 #define VKI_UMTX_OP_CV_BROADCAST   10
1961 #define VKI_UMTX_OP_WAIT_UINT      11
1962 #define VKI_UMTX_OP_RW_RDLOCK      12
1963 #define VKI_UMTX_OP_RW_WRLOCK      13
1964 #define VKI_UMTX_OP_RW_UNLOCK      14
1965 #define VKI_UMTX_OP_WAIT_UINT_PRIVATE 15
1966 #define VKI_UMTX_OP_WAKE_PRIVATE   16
1967 #define VKI_UMTX_OP_MUTEX_WAIT     17
1968 #define VKI_UMTX_OP_MUTEX_WAKE     18 /* deprecated */
1969 #define VKI_UMTX_OP_SEM_WAIT    19
1970 #define VKI_UMTX_OP_SEM_WAKE    20
1971 #define VKI_UMTX_OP_NWAKE_PRIVATE  21
1972 #define VKI_UMTX_OP_MUTEX_WAKE2    22
1973 #define VKI_UMTX_OP_SEM2_WAIT       23
1974 #define VKI_UMTX_OP_SEM2_WAKE       24
1975 #define VKI_UMTX_OP_SHM             25
1976 #define VKI_UMTX_OP_ROBUST_LISTS    26
1977 #define VKI_UMTX_OP_GET_MIN_TIMEOUT 27
1978 #define VKI_UMTX_OP_SET_MIN_TIMEOUT 28
1979 
1980 #define VKI_UMTX_SHM_CREAT          0x0001
1981 
1982 //----------------------------------------------------------------------
1983 // From sys/acl.h
1984 //----------------------------------------------------------------------
1985 
1986 struct vki_acl_entry {
1987    int      ae_tag;
1988    vki_uid_t   ae_uid;
1989    vki_mode_t  ae_perm;
1990 };
1991 
1992 #define VKI_ACL_MAX_ENTRIES 32
1993 struct vki_acl {
1994    int      acl_cnt;
1995    struct vki_acl_entry acl_entry[VKI_ACL_MAX_ENTRIES];
1996 };
1997 
1998 
1999 //----------------------------------------------------------------------
2000 // From sys/uuid.h
2001 //----------------------------------------------------------------------
2002 
2003 struct vki_uuid {
2004    vki_uint32_t   time_low;
2005    vki_uint16_t   time_mid;
2006    vki_uint16_t   time_hi_and_version;
2007    vki_uint8_t clock_seq_hi_and_reserved;
2008    vki_uint8_t clock_seq_low;
2009    vki_uint8_t node[6];
2010 };
2011 
2012 //----------------------------------------------------------------------
2013 // sys/_sockaddr_storage.h
2014 //----------------------------------------------------------------------
2015 
2016 #define VKI__SS_MAXSIZE     128U
2017 #define VKI__SS_ALIGNSIZE   (sizeof(__int64_t))
2018 #define VKI__SS_PAD1SIZE    (VKI__SS_ALIGNSIZE - sizeof(unsigned char) - \
2019                             sizeof(vki_sa_family_t))
2020 #define VKI__SS_PAD2SIZE    (VKI__SS_MAXSIZE - sizeof(unsigned char) - \
2021                             sizeof(vki_sa_family_t) - VKI__SS_PAD1SIZE - VKI__SS_ALIGNSIZE)
2022 
2023 struct vki_sockaddr_storage {
2024         unsigned char   vki_ss_len;         /* address length */
2025         vki_sa_family_t     vki_ss_family;      /* address family */
2026         char            vki___ss_pad1[VKI__SS_PAD1SIZE];
2027         __int64_t       vki___ss_align;     /* force desired struct alignment */
2028         char            vki___ss_pad2VKI_[VKI__SS_PAD2SIZE];
2029 };
2030 
2031 //----------------------------------------------------------------------
2032 // From sys/captrights.h
2033 //----------------------------------------------------------------------
2034 
2035 #define VKI_CAP_RIGHTS_VERSION_00   0
2036 #define VKI_CAP_RIGHTS_VERSION      VKI_CAP_RIGHTS_VERSION_00
2037 
2038 struct vki_cap_rights {
2039         vki_uint64_t        cki_cr_rights[VKI_CAP_RIGHTS_VERSION + 2];
2040 };
2041 
2042 typedef struct vki_cap_rights       vki_cap_rights_t;
2043 
2044 
2045 //----------------------------------------------------------------------
2046 // From sys/user.h
2047 //----------------------------------------------------------------------
2048 
2049 #define VKI_KVME_TYPE_NONE          0
2050 #define VKI_KVME_TYPE_DEFAULT       1
2051 #define VKI_KVME_TYPE_VNODE         2
2052 #define VKI_KVME_TYPE_SWAP          3
2053 #define VKI_KVME_TYPE_DEVICE        4
2054 #define VKI_KVME_TYPE_PHYS          5
2055 #define VKI_KVME_TYPE_DEAD          6
2056 #define VKI_KVME_TYPE_MGTDEVICE     8
2057 #define VKI_KVME_TYPE_GUARD         9
2058 #define VKI_KVME_TYPE_UNKNOWN       255
2059 
2060 #define VKI_KVME_PROT_READ          0x00000001
2061 #define VKI_KVME_PROT_WRITE         0x00000002
2062 #define VKI_KVME_PROT_EXEC          0x00000004
2063 
2064 #define VKI_KVME_FLAG_COW           0x00000001
2065 #define VKI_KVME_FLAG_NEEDS_COPY    0x00000002
2066 #define VKI_KVME_FLAG_NOCOREDUMP    0x00000004
2067 #define VKI_KVME_FLAG_SUPER         0x00000008
2068 #define VKI_KVME_FLAG_GROWS_UP      0x00000010
2069 #define VKI_KVME_FLAG_GROWS_DOWN    0x00000020
2070 #define VKI_KVME_FLAG_USER_WIRED    0x00000040
2071 
2072 struct vki_kinfo_vmentry {
2073    int   kve_structsize;
2074    int   kve_type;
2075    ULong kve_start;
2076    ULong kve_end;
2077    ULong   kve_offset;
2078    ULong   kve_fileid;
2079    UInt    kve_vn_fsid_freebsd11;
2080    int   kve_flags;
2081    int   kve_resident;
2082    int   kve_private_resident;
2083    int   kve_protection;
2084    int   kve_ref_count;
2085    int   kve_shadow_count;
2086    int      kve_vn_type;
2087    ULong kve_vn_size;
2088    UInt kve_vn_rdev_freebsd11;
2089    UShort kve_vn_mode;
2090    UShort kve_status;
2091    ULong kve_vn_fsid;
2092    ULong kve_vn_rdev;
2093    int      _kve_ispare[8];
2094    char  kve_path[VKI_PATH_MAX];
2095 };
2096 
2097 #define VKI_KINFO_FILE_SIZE 1392
2098 
2099 struct vki_kinfo_file {
2100    int      vki_kf_structsize;      /* Variable size of record. */
2101    int      vki_kf_type;        /* Descriptor type. */
2102    int      vki_kf_fd;          /* Array index. */
2103    int      vki_kf_ref_count;       /* Reference count. */
2104    int      vki_kf_flags;       /* Flags. */
2105    int      vki_kf_pad0;        /* Round to 64 bit alignment. */
2106    Off64T   vki_kf_offset;      /* Seek location. */
2107    union {
2108       struct {
2109          /* API compatiblity with FreeBSD < 12. */
2110          int        vki_kf_vnode_type;
2111          int        vki_kf_sock_domain;
2112          int        vki_kf_sock_type;
2113          int        kf_sock_protocol;
2114          struct vki_sockaddr_storage vki_kf_sa_local;
2115          struct vki_sockaddr_storage    vki_kf_sa_peer;
2116       };
2117       union {
2118          struct {
2119             /* Sendq size */
2120             vki_uint32_t    vki_kf_sock_sendq;
2121             /* Socket domain. */
2122             int     vki_kf_sock_domain0;
2123             /* Socket type. */
2124             int     vki_kf_sock_type0;
2125             /* Socket protocol. */
2126             int     vki_kf_sock_protocol0;
2127             /* Socket address. */
2128             struct vki_sockaddr_storage vki_kf_sa_local;
2129             /* Peer address. */
2130             struct vki_sockaddr_storage vki_kf_sa_peer;
2131             /* Address of so_pcb. */
2132             vki_uint64_t    vki_kf_sock_pcb;
2133             /* Address of inp_ppcb. */
2134             vki_uint64_t    vki_kf_sock_inpcb;
2135             /* Address of unp_conn. */
2136             vki_uint64_t    vki_kf_sock_unpconn;
2137             /* Send buffer state. */
2138             vki_uint16_t    vki_kf_sock_snd_sb_state;
2139             /* Receive buffer state. */
2140             vki_uint16_t    vki_kf_sock_rcv_sb_state;
2141             /* Recvq size. */
2142             vki_uint32_t    vki_kf_sock_recvq;
2143          } vki_kf_sock;
2144          struct {
2145             /* Vnode type. */
2146             int     vki_kf_file_type;
2147             /* Space for future use */
2148             int     vki_kf_spareint[3];
2149             vki_uint64_t    vki_kf_spareint64[30];
2150             /* Vnode filesystem id. */
2151             vki_uint64_t    vki_kf_file_fsid;
2152             /* File device. */
2153             vki_uint64_t    vki_kf_file_rdev;
2154             /* Global file id. */
2155             vki_uint64_t    vki_kf_file_fileid;
2156             /* File size. */
2157             vki_uint64_t    vki_kf_file_size;
2158             /* Vnode filesystem id, FreeBSD 11 compat. */
2159             vki_uint32_t    vki_kf_file_fsid_freebsd11;
2160             /* File device, FreeBSD 11 compat. */
2161             vki_uint32_t    kf_file_rdev_freebsd11;
2162             /* File mode. */
2163             vki_uint16_t    vki_kf_file_mode;
2164             /* Round to 64 bit alignment. */
2165             vki_uint16_t    vki_kf_file_pad0;
2166             vki_uint32_t    kf_file_pad1;
2167          } kf_file;
2168          struct {
2169             vki_uint32_t    vki_kf_spareint[4];
2170             vki_uint64_t    vki_kf_spareint64[32];
2171             vki_uint32_t    vki_kf_sem_value;
2172             vki_uint16_t    vki_kf_sem_mode;
2173          } kf_sem;
2174          struct {
2175             vki_uint32_t    vki_kf_spareint[4];
2176             vki_uint64_t    vki_kf_spareint64[32];
2177             vki_uint64_t    vki_kf_pipe_addr;
2178             vki_uint64_t    vki_kf_pipe_peer;
2179             vki_uint32_t    vki_kf_pipe_buffer_cnt;
2180             /* Round to 64 bit alignment. */
2181             vki_uint32_t    vki_kf_pipe_pad0[3];
2182          } kf_pipe;
2183          struct {
2184             vki_uint32_t    vki_kf_spareint[4];
2185             vki_uint64_t    vki_kf_spareint64[32];
2186             vki_uint32_t    vki_kf_pts_dev_freebsd11;
2187             vki_uint32_t    vki_kf_pts_pad0;
2188             vki_uint64_t    vki_kf_pts_dev;
2189             /* Round to 64 bit alignment. */
2190             vki_uint32_t    vki_kf_pts_pad1[4];
2191          } kf_pts;
2192          struct {
2193             vki_uint32_t    vki_kf_spareint[4];
2194             vki_uint64_t    vki_kf_spareint64[32];
2195             vki_pid_t       vki_kf_pid;
2196          } vki_kf_proc;
2197          struct {
2198             vki_uint64_t    vki_kf_eventfd_value;
2199             vki_uint32_t    vki_kf_eventfd_flags;
2200          } vki_kf_eventfd;
2201       } vki_kf_un;
2202    };
2203    vki_uint16_t vki_kf_status;      /* Status flags. */
2204    vki_uint16_t vki_kf_pad1;        /* Round to 32 bit alignment. */
2205    int      vki__kf_ispare0;        /* Space for more stuff. */
2206    vki_cap_rights_t vki_kf_cap_rights;      /* Capability rights. */
2207    vki_uint64_t vki__kf_cap_spare;      /* Space for future cap_rights_t. */
2208    /* Truncated before copyout in sysctl */
2209    char     vki_kf_path[VKI_PATH_MAX];  /* Path to file, if any. */
2210 };
2211 
2212 //----------------------------------------------------------------------
2213 // From sys/kenv.h
2214 //----------------------------------------------------------------------
2215 #define VKI_KENV_GET    0
2216 #define VKI_KENV_SET    1
2217 #define VKI_KENV_UNSET     2
2218 #define VKI_KENV_DUMP      3
2219 
2220 //----------------------------------------------------------------------
2221 // From sys/sysctl.h (and related)
2222 //----------------------------------------------------------------------
2223 
2224 #include <sys/sysctl.h>
2225 
2226 #define VKI_CTL_KERN         CTL_KERN
2227 #define VKI_CTL_HW           CTL_HW
2228 #define VKI_KERN_PROC        KERN_PROC
2229 #define VKI_KERN_PROC_VMMAP  KERN_PROC_VMMAP
2230 #define VKI_KERN_PROC_FILEDESC KERN_PROC_FILEDESC
2231 #define VKI_HW_MACHINE       HW_MACHINE
2232 
2233 //----------------------------------------------------------------------
2234 // From sys/thr.h
2235 //----------------------------------------------------------------------
2236 
2237 struct vki_thr_param {
2238    void  (*start_func)(void *);
2239    void  *arg;
2240    char  *stack_base;
2241    vki_size_t  stack_size;
2242    char  *tls_base;
2243    vki_size_t  tls_size;
2244    long  *child_tid;
2245    long  *parent_tid;
2246    int   flags;
2247    struct vki_rtprio *rtp;
2248    void  *spare[3];
2249 };
2250 
2251 //----------------------------------------------------------------------
2252 // From sys/linker.h
2253 //----------------------------------------------------------------------
2254 
2255 struct vki_kld_file_stat {
2256    int         version;        /* set to sizeof(struct kld_file_stat) */
2257    char        name[MAXPATHLEN];
2258    int         refs;
2259    int         id;
2260    vki_caddr_t     address;        /* load address */
2261    vki_size_t      size;           /* size in bytes */
2262    char        pathname[MAXPATHLEN];
2263 };
2264 
2265 
2266 struct vki_kld_sym_lookup {
2267    int         version;        /* set to sizeof(struct kld_sym_lookup) */
2268    char        *symname;       /* Symbol name we are looking up */
2269    unsigned long symvalue;
2270    vki_size_t  symsize;
2271 };
2272 
2273 #if !defined(VKI_INIT_ARCH_ELF_STATE)
2274 /* This structure is used to preserve architecture specific data during
2275    the loading of an ELF file, throughout the checking of architecture
2276    specific ELF headers & through to the point where the ELF load is
2277    known to be proceeding. This implementation is a dummy for
2278    architectures which require no specific state. */
2279 struct vki_arch_elf_state {
2280 };
2281 
2282 #  define VKI_INIT_ARCH_ELF_STATE { }
2283 
2284 #endif
2285 
2286 //----------------------------------------------------------------------
2287 // From ufs/ufs/quota.h
2288 //----------------------------------------------------------------------
2289 
2290 #define VKI_Q_QUOTAON       0x0100
2291 #define VKI_Q_QUOTAOFF      0x0200
2292 #define VKI_Q_GETQUOTA32    0x0300
2293 #define VKI_Q_SETQUOTA32    0x0400
2294 #define VKI_Q_SETUSE32      0x0500
2295 #define VKI_Q_SYNC          0x0600
2296 #define VKI_Q_GETQUOTA      0x0700
2297 #define VKI_Q_SETQUOTA      0x0800
2298 #define VKI_Q_SETUSE        0x0900
2299 #define VKI_Q_GETQUOTASIZE  0x0A00
2300 
2301 //----------------------------------------------------------------------
2302 // From sys/_bitset.h
2303 //----------------------------------------------------------------------
2304 
2305 #define  VKI_BITSET_BITS      (sizeof(long) * 8)
2306 
2307 #define  vki__howmany(x, y)   (((x) + ((y) - 1)) / (y))
2308 
2309 #define  vki__bitset_words(_s)   (vki__howmany(_s, VKI_BITSET_BITS))
2310 
2311 #define  VKI_BITSET_DEFINE(t, _s)                  \
2312 struct t {                       \
2313         long    __bits[vki__bitset_words((_s))];            \
2314 }
2315 
2316 //----------------------------------------------------------------------
2317 // From sys/_domainset.h
2318 //----------------------------------------------------------------------
2319 
2320 #define  VKI_DOMAINSET_MAXSIZE   256
2321 
2322 #ifndef  VKI_DOMAINSET_SETSIZE
2323 #define  VKI_DOMAINSET_SETSIZE   VKI_DOMAINSET_MAXSIZE
2324 #endif
2325 
2326 VKI_BITSET_DEFINE(vki_domainset, VKI_DOMAINSET_SETSIZE);
2327 
2328 typedef struct vki_domainset vki_domainset_t;
2329 
2330 //----------------------------------------------------------------------
2331 // From sys/procctl.h
2332 //----------------------------------------------------------------------
2333 
2334 #define VKI_PROC_SPROTECT           1
2335 #define VKI_PROC_REAP_ACQUIRE       2
2336 #define VKI_PROC_REAP_RELEASE       3
2337 #define VKI_PROC_REAP_STATUS        4
2338 #define VKI_PROC_REAP_GETPIDS       5
2339 #define VKI_PROC_REAP_KILL          6
2340 #define VKI_PROC_TRACE_CTL          7
2341 #define VKI_PROC_TRACE_STATUS       8
2342 #define VKI_PROC_TRAPCAP_CTL        9
2343 #define VKI_PROC_TRAPCAP_STATUS     10
2344 #define VKI_PROC_PDEATHSIG_CTL      11
2345 #define VKI_PROC_PDEATHSIG_STATUS   12
2346 #define VKI_PROC_ASLR_CTL           13
2347 #define VKI_PROC_ASLR_STATUS        14
2348 #define VKI_PROC_STACKGAP_CTL       17
2349 #define VKI_PROC_STACKGAP_STATUS    18
2350 #define VKI_PROC_NO_NEW_PRIVS_CTL   19
2351 #define VKI_PROC_NO_NEW_PRIVS_STATUS 20
2352 #define VKI_PROC_WXMAP_CTL          21
2353 #define VKI_PROC_WXMAP_STATUS       22
2354 
2355 struct vki_procctl_reaper_status {
2356    vki_u_int   rs_flags;
2357    vki_u_int   rs_children;
2358    vki_u_int   rs_descendants;
2359    vki_pid_t   rs_reaper;
2360    vki_pid_t   rs_pid;
2361    vki_u_int   rs_pad0[15];
2362 };
2363 
2364 struct vki_procctl_reaper_pidinfo;
2365 
2366 struct vki_procctl_reaper_pids {
2367    vki_u_int   rp_count;
2368    vki_u_int   rp_pad0[15];
2369    struct vki_procctl_reaper_pidinfo *rp_pids;
2370 };
2371 
2372 struct vki_procctl_reaper_kill {
2373    int     rk_sig;
2374    vki_u_int   rk_flags;
2375    vki_pid_t   rk_subtree;
2376    vki_u_int   rk_killed;
2377    vki_pid_t   rk_fpid;
2378    vki_u_int   rk_pad0[15];
2379 };
2380 
2381 //----------------------------------------------------------------------
2382 // From sys/jail.h
2383 //----------------------------------------------------------------------
2384 
2385 struct vki_jail {
2386    uint32_t        version;
2387    char            *path;
2388    char            *hostname;
2389    char            *jailname;
2390    uint32_t        ip4s;
2391    uint32_t        ip6s;
2392    struct in_addr  *ip4;
2393    struct in6_addr *ip6;
2394 };
2395 
2396 //----------------------------------------------------------------------
2397 // From sys/exec.h
2398 //----------------------------------------------------------------------
2399 
2400 struct vki_ps_strings {
2401    char** ps_argvstr;
2402    unsigned int ps_nargvstr;
2403 
2404    char** ps_envstr;
2405    unsigned int ps_nenvstr;
2406 };
2407 
2408 //----------------------------------------------------------------------
2409 // From sys/elf_common.h
2410 //----------------------------------------------------------------------
2411 
2412 #define VKI_AT_NULL 0
2413 #define VKI_AT_IGNORE 1
2414 #define VKI_AT_EXECFD 2
2415 #define VKI_AT_PHDR 3
2416 #define VKI_AT_PHENT 4
2417 #define VKI_AT_PHNUM 5
2418 #define VKI_AT_PAGESZ 6
2419 #define VKI_AT_BASE 7
2420 #define VKI_AT_FLAGS 8
2421 #define VKI_AT_ENTRY 9
2422 #define VKI_AT_NOTELF 10
2423 #define VKI_AT_UID 11
2424 #define VKI_AT_EUID 12
2425 #define VKI_AT_GID 13
2426 #define VKI_AT_EGID 14
2427 #define VKI_AT_EXECPATH 15
2428 #define VKI_AT_CANARY 16
2429 #define VKI_AT_CANARYLEN 17
2430 #define VKI_AT_OSRELDATE 18
2431 #define VKI_AT_NCPUS    19
2432 #define VKI_AT_PAGESIZES 20
2433 #define VKI_AT_PAGESIZESLEN 21
2434 #define VKI_AT_TIMEKEEP 22
2435 #define VKI_AT_STACKPROT 23
2436 #define VKI_AT_EHDRFLAGS 24
2437 #define VKI_AT_HWCAP 25
2438 #define VKI_AT_HWCAP2 26
2439 /* added in FreeBSD 13 */
2440 #define VKI_AT_BSDFLAGS 27
2441 #define VKI_AT_ARGC 28
2442 #define VKI_AT_ARGV 29
2443 #define VKI_AT_ENVC 30
2444 #define VKI_AT_ENVV 31
2445 #define VKI_AT_PS_STRINGS 32
2446 /* added in FreeBSD 13.1 */
2447 #define VKI_AT_FXRNG    33
2448 #define VKI_AT_KPRELOAD 34
2449 /* added in FreeBSD 14 */
2450 #define VKI_AT_USRSTACKBASE 35
2451 #define VKI_AT_USRSTACKLIM 36
2452 
2453 /* AT_COUNT depends on the FreeBSD version, not currently used */
2454 
2455 
2456 #define VKI_NT_FREEBSD_ABI_TAG 1
2457 #define VKI_NT_FREEBSD_FEATURE_CTL 4
2458 #define VKI_NT_FREEBSD_FCTL_STKGAP_DISABLE 0x00000004
2459 #define VKI_NT_FREEBSD_FCTL_WXNEEDED 0x00000008
2460 
2461 
2462 /*
2463  * PJF this is a bit messy
2464  *
2465  * mode_t is uint16_t
2466  * No problem on x86/amd64
2467  * On arm64 there are syscalls that take mode_t but that doesn't
2468  * work with memcheck validation - arm64 doesn't have any 16bit
2469  * registers.
2470  *
2471  * I can't just change mode_t to be 32bit. that will mess up
2472  * the 'stat' structures in this file.
2473  *
2474  * Instead I'll just do what the compiler does, and promote
2475  * it to 32bits.
2476  *
2477  * In the kernel, the syscall interface just pushes all
2478  * possible syscall args onto the stack and then
2479  * memcpy's them into an array of register sized args.
2480  * There's a struct defined for each syscall's arguments
2481  * that uses padding to type pun the values back to
2482  * the type passed in from userland. The structs are
2483  * generated from the syscall table.
2484  *
2485  * vki_mode_t is only used in syswrap files so there shouldn't
2486  * be any other side effects.
2487  */
2488 
2489 #if defined(VGP_arm64_freebsd)
2490 #define vki_mode_t vki_int32_t
2491 #endif
2492 
2493 //----------------------------------------------------------------------
2494 // From sys/pciio.h
2495 //----------------------------------------------------------------------
2496 
2497 typedef unsigned long vki_u_long;
2498 typedef unsigned int vki_u_int;
2499 #define VKI_PCI_MAXNAMELEN  16
2500 
2501 typedef enum {
2502    VKI_PCI_GETCONF_LAST_DEVICE,
2503    VKI_PCI_GETCONF_LIST_CHANGED,
2504    VKI_PCI_GETCONF_MORE_DEVS,
2505    VKI_PCI_GETCONF_ERROR
2506 } vki_pci_getconf_status;
2507 
2508 typedef enum {
2509    VKI_PCI_GETCONF_NO_MATCH            = 0x0000,
2510    VKI_PCI_GETCONF_MATCH_DOMAIN        = 0x0001,
2511    VKI_PCI_GETCONF_MATCH_BUS           = 0x0002,
2512    VKI_PCI_GETCONF_MATCH_DEV           = 0x0004,
2513    VKI_PCI_GETCONF_MATCH_FUNC          = 0x0008,
2514    VKI_PCI_GETCONF_MATCH_NAME          = 0x0010,
2515    VKI_PCI_GETCONF_MATCH_UNIT          = 0x0020,
2516    VKI_PCI_GETCONF_MATCH_VENDOR        = 0x0040,
2517    VKI_PCI_GETCONF_MATCH_DEVICE        = 0x0080,
2518    VKI_PCI_GETCONF_MATCH_CLASS         = 0x0100
2519 } vki_pci_getconf_flags;
2520 
2521 struct vki_pcisel {
2522    vki_uint32_t   pc_domain;      /* domain number */
2523    vki_uint8_t    pc_bus;         /* bus number */
2524    vki_uint8_t    pc_dev;         /* device on this bus */
2525    vki_uint8_t    pc_func;        /* function on this device */
2526 };
2527 
2528 struct vki_pci_conf {
2529    struct vki_pcisel   pc_sel;         /* domain+bus+slot+function */
2530    vki_uint8_t    pc_hdr;         /* PCI header type */
2531    vki_uint16_t   pc_subvendor;   /* card vendor ID */
2532    vki_uint16_t   pc_subdevice;   /* card device ID, assigned by
2533                                            card vendor */
2534    vki_uint16_t   pc_vendor;      /* chip vendor ID */
2535    vki_uint16_t   pc_device;      /* chip device ID, assigned by
2536                                            chip vendor */
2537    vki_uint8_t    pc_class;       /* chip PCI class */
2538    vki_uint8_t    pc_subclass;    /* chip PCI subclass */
2539    vki_uint8_t    pc_progif;      /* chip PCI programming interface */
2540    vki_uint8_t    pc_revid;       /* chip revision ID */
2541    char        pd_name[VKI_PCI_MAXNAMELEN + 1];  /* device name */
2542    vki_u_long     pd_unit;        /* device unit number */
2543 };
2544 
2545 struct vki_pci_match_conf {
2546    struct vki_pcisel       pc_sel;         /* domain+bus+slot+function */
2547    char                pd_name[VKI_PCI_MAXNAMELEN + 1];  /* device name */
2548    vki_u_long             pd_unit;        /* Unit number */
2549    vki_uint16_t           pc_vendor;      /* PCI Vendor ID */
2550    vki_uint16_t           pc_device;      /* PCI Device ID */
2551    vki_uint8_t            pc_class;       /* PCI class */
2552    vki_pci_getconf_flags   flags;          /* Matching expression */
2553 };
2554 
2555 struct vki_pci_conf_io {
2556    vki_uint32_t           pat_buf_len;    /* pattern buffer length */
2557    vki_uint32_t           num_patterns;   /* number of patterns */
2558    struct vki_pci_match_conf   *patterns;      /* pattern buffer */
2559    vki_uint32_t           match_buf_len;  /* match buffer length */
2560    vki_uint32_t           num_matches;    /* number of matches returned */
2561    struct vki_pci_conf     *matches;       /* match buffer */
2562    vki_uint32_t           offset;         /* offset into device list */
2563    vki_uint32_t           generation;     /* device list generation */
2564    vki_pci_getconf_status  status;         /* request status */
2565 };
2566 
2567 #define VKI_PCIOCGETCONF    _VKI_IOWR('p', 5, struct vki_pci_conf_io)
2568 
2569 //----------------------------------------------------------------------
2570 // From cam/cam.h
2571 //----------------------------------------------------------------------
2572 
2573 #define VKI_CAM_MAX_CDBLEN 16
2574 
2575 typedef unsigned int vki_path_id_t;
2576 typedef unsigned int vki_target_id_t;
2577 typedef unsigned int vki_lun_id_t;
2578 
2579 typedef struct {
2580    vki_uint32_t priority;
2581    vki_uint32_t generation;
2582    int       index;
2583 } vki_cam_pinfo;
2584 
2585 
2586 //----------------------------------------------------------------------
2587 // From sys/ata.h
2588 //----------------------------------------------------------------------
2589 
2590 struct vki_ata_params {
2591    /*000*/ vki_u_int16_t   config;         /* configuration info */
2592    /*001*/ vki_u_int16_t   cylinders;              /* # of cylinders */
2593    /*002*/ vki_u_int16_t   specconf;               /* specific configuration */
2594    /*003*/ vki_u_int16_t   heads;                  /* # heads */
2595    vki_u_int16_t   obsolete4;
2596    vki_u_int16_t   obsolete5;
2597    /*006*/ vki_u_int16_t   sectors;                /* # sectors/track */
2598    /*007*/ vki_u_int16_t   vendor7[3];
2599    /*010*/ vki_u_int8_t    serial[20];             /* serial number */
2600    /*020*/ vki_u_int16_t   retired20;
2601    vki_u_int16_t   retired21;
2602    vki_u_int16_t   obsolete22;
2603    /*023*/ vki_u_int8_t    revision[8];            /* firmware revision */
2604    /*027*/ vki_u_int8_t    model[40];              /* model name */
2605    /*047*/ vki_u_int16_t   sectors_intr;           /* sectors per interrupt */
2606    /*048*/ vki_u_int16_t   usedmovsd;              /* double word read/write? */
2607    /*049*/ vki_u_int16_t   capabilities1;
2608    /*050*/ vki_u_int16_t   capabilities2;
2609    /*051*/ vki_u_int16_t   retired_piomode;        /* PIO modes 0-2 */
2610    /*052*/ vki_u_int16_t   retired_dmamode;        /* DMA modes */
2611    /*053*/ vki_u_int16_t   atavalid;               /* fields valid */
2612    /*054*/ vki_u_int16_t   current_cylinders;
2613    /*055*/ vki_u_int16_t   current_heads;
2614    /*056*/ vki_u_int16_t   current_sectors;
2615    /*057*/ vki_u_int16_t   current_size_1;
2616    /*058*/ vki_u_int16_t   current_size_2;
2617    /*059*/ vki_u_int16_t   multi;
2618    /*060*/ vki_u_int16_t   lba_size_1;
2619    vki_u_int16_t   lba_size_2;
2620    vki_u_int16_t   obsolete62;
2621    /*063*/ vki_u_int16_t   mwdmamodes;             /* multiword DMA modes */
2622    /*064*/ vki_u_int16_t   apiomodes;              /* advanced PIO modes */
2623 
2624    /*065*/ vki_u_int16_t   mwdmamin;               /* min. M/W DMA time/word ns */
2625    /*066*/ vki_u_int16_t   mwdmarec;               /* rec. M/W DMA time ns */
2626    /*067*/ vki_u_int16_t   pioblind;               /* min. PIO cycle w/o flow */
2627    /*068*/ vki_u_int16_t   pioiordy;               /* min. PIO cycle IORDY flow */
2628    /*069*/ vki_u_int16_t   support3;
2629    vki_u_int16_t   reserved70;
2630    /*071*/ vki_u_int16_t   rlsovlap;               /* rel time (us) for overlap */
2631    /*072*/ vki_u_int16_t   rlsservice;             /* rel time (us) for service */
2632    vki_u_int16_t   reserved73;
2633    vki_u_int16_t   reserved74;
2634    /*075*/ vki_u_int16_t   queue;
2635    /*76*/  vki_u_int16_t   satacapabilities;
2636    /*77*/  vki_u_int16_t   satacapabilities2;
2637    /*78*/  vki_u_int16_t   satasupport;
2638    /*79*/  vki_u_int16_t   sataenabled;
2639    /*080*/ vki_u_int16_t   version_major;
2640    /*081*/ vki_u_int16_t   version_minor;
2641 
2642    struct {
2643       /*082/085*/ vki_u_int16_t   command1;
2644       /*083/086*/ vki_u_int16_t   command2;
2645       /*084/087*/ vki_u_int16_t   extension;
2646    } __packed support, enabled;
2647 
2648    /*088*/ vki_u_int16_t   udmamodes;              /* UltraDMA modes */
2649    /*089*/ vki_u_int16_t   erase_time;
2650    /*090*/ vki_u_int16_t   enhanced_erase_time;
2651    /*091*/ vki_u_int16_t   apm_value;
2652    /*092*/ vki_u_int16_t   master_passwd_revision;
2653    /*093*/ vki_u_int16_t   hwres;
2654    /*094*/ vki_u_int16_t   acoustic;
2655    /*095*/ vki_u_int16_t   stream_min_req_size;
2656    /*096*/ vki_u_int16_t   stream_transfer_time;
2657    /*097*/ vki_u_int16_t   stream_access_latency;
2658    /*098*/ vki_u_int32_t   stream_granularity;
2659    /*100*/ vki_u_int16_t   lba_size48_1;
2660    vki_u_int16_t   lba_size48_2;
2661    vki_u_int16_t   lba_size48_3;
2662    vki_u_int16_t   lba_size48_4;
2663    vki_u_int16_t   reserved104;
2664    /*105*/ vki_u_int16_t   max_dsm_blocks;
2665    /*106*/ vki_u_int16_t   pss;
2666    /*107*/ vki_u_int16_t   isd;
2667    /*108*/ vki_u_int16_t   wwn[4];
2668    vki_u_int16_t   reserved112[5];
2669    /*117*/ vki_u_int16_t   lss_1;
2670    /*118*/ vki_u_int16_t   lss_2;
2671    /*119*/ vki_u_int16_t   support2;
2672    /*120*/ vki_u_int16_t   enabled2;
2673    vki_u_int16_t   reserved121[6];
2674    /*127*/ vki_u_int16_t   removable_status;
2675    /*128*/ vki_u_int16_t   security_status;
2676    vki_u_int16_t   reserved129[31];
2677    /*160*/ vki_u_int16_t   cfa_powermode1;
2678    vki_u_int16_t   reserved161;
2679    /*162*/ vki_u_int16_t   cfa_kms_support;
2680    /*163*/ vki_u_int16_t   cfa_trueide_modes;
2681    /*164*/ vki_u_int16_t   cfa_memory_modes;
2682    vki_u_int16_t   reserved165[4];
2683    /*169*/ vki_u_int16_t   support_dsm;
2684    vki_u_int16_t   reserved170[6];
2685    /*176*/ vki_u_int8_t    media_serial[60];
2686    /*206*/ vki_u_int16_t   sct;
2687    vki_u_int16_t   reserved206[2];
2688    /*209*/ vki_u_int16_t   lsalign;
2689    /*210*/ vki_u_int16_t   wrv_sectors_m3_1;
2690    vki_u_int16_t   wrv_sectors_m3_2;
2691    /*212*/ vki_u_int16_t   wrv_sectors_m2_1;
2692    vki_u_int16_t   wrv_sectors_m2_2;
2693    /*214*/ vki_u_int16_t   nv_cache_caps;
2694    /*215*/ vki_u_int16_t   nv_cache_size_1;
2695    vki_u_int16_t   nv_cache_size_2;
2696    /*217*/ vki_u_int16_t   media_rotation_rate;
2697    vki_u_int16_t   reserved218;
2698    /*219*/ vki_u_int16_t   nv_cache_opt;
2699    /*220*/ vki_u_int16_t   wrv_mode;
2700    vki_u_int16_t   reserved221;
2701    /*222*/ vki_u_int16_t   transport_major;
2702    /*223*/ vki_u_int16_t   transport_minor;
2703    vki_u_int16_t   reserved224[31];
2704    /*255*/ vki_u_int16_t   integrity;
2705 } __packed;
2706 
2707 //----------------------------------------------------------------------
2708 // From sys/callout.h
2709 //----------------------------------------------------------------------
2710 
2711 struct vki_callout_handle {
2712    struct vki_callout *callout;
2713 };
2714 
2715 
2716 //----------------------------------------------------------------------
2717 // From cam/scsi/scsi_all.h
2718 //----------------------------------------------------------------------
2719 
2720 struct vki_scsi_sense_data {
2721    vki_u_int8_t error_code;
2722    vki_u_int8_t segment;
2723    vki_u_int8_t flags;
2724    vki_u_int8_t info[4];
2725    vki_u_int8_t extra_len;
2726    vki_u_int8_t cmd_spec_info[4];
2727    vki_u_int8_t add_sense_code;
2728    vki_u_int8_t add_sense_code_qual;
2729    vki_u_int8_t fru;
2730    vki_u_int8_t sense_key_spec[3];
2731    vki_u_int8_t extra_bytes[14];
2732 #define VKI_SSD_FULL_SIZE sizeof(struct vki_scsi_sense_data)
2733 };
2734 
2735 struct vki_scsi_inquiry_data {
2736    vki_uint8_t device;
2737    vki_uint8_t dev_qual2;
2738    vki_uint8_t version;
2739    vki_uint8_t response_format;
2740    vki_uint8_t additional_length;
2741    vki_uint8_t spc3_flags;
2742    vki_uint8_t spc2_flags;
2743    vki_uint8_t flags;
2744 #define VKI_SID_VENDOR_SIZE   8
2745    char     vendor[VKI_SID_VENDOR_SIZE];
2746 #define VKI_SID_PRODUCT_SIZE  16
2747    char     product[VKI_SID_PRODUCT_SIZE];
2748 #define VKI_SID_REVISION_SIZE 4
2749    char     revision[VKI_SID_REVISION_SIZE];
2750 #define VKI_SID_VENDOR_SPECIFIC_0_SIZE      20
2751    vki_uint8_t vendor_specific0[VKI_SID_VENDOR_SPECIFIC_0_SIZE];
2752    vki_uint8_t spi3data;
2753    vki_uint8_t reserved2;
2754    /*
2755     * Version Descriptors, stored 2 byte values.
2756     */
2757    vki_uint8_t version1[2];
2758    vki_uint8_t version2[2];
2759    vki_uint8_t version3[2];
2760    vki_uint8_t version4[2];
2761    vki_uint8_t version5[2];
2762    vki_uint8_t version6[2];
2763    vki_uint8_t version7[2];
2764    vki_uint8_t version8[2];
2765 
2766    vki_uint8_t reserved3[22];
2767 
2768 #define VKI_SID_VENDOR_SPECIFIC_1_SIZE      160
2769    vki_uint8_t vendor_specific1[VKI_SID_VENDOR_SPECIFIC_1_SIZE];
2770 };
2771 
2772 //----------------------------------------------------------------------
2773 // From sys/queue.h
2774 //----------------------------------------------------------------------
2775 
2776 #define VKI_SLIST_ENTRY(type)                                               \
2777 struct {                                                                \
2778         struct type *sle_next;  /* next element */                      \
2779 }
2780 
2781 #define VKI_LIST_ENTRY(type)                                                \
2782 struct {                                                                \
2783         struct type *le_next;   /* next element */                      \
2784         struct type **le_prev;  /* address of previous next element */  \
2785 }
2786 
2787 #define VKI_STAILQ_ENTRY(type)                                              \
2788 struct {                                                                \
2789         struct type *stqe_next; /* next element */                      \
2790 }
2791 
2792 #ifdef VKI_QUEUE_MACRO_DEBUG_TRACE
2793 struct vki_qm_trace {
2794    unsigned long    lastline;
2795    unsigned long    prevline;
2796    const char      *lastfile;
2797    const char      *prevfile;
2798 };
2799 
2800 #define VKI_TRACEBUF        struct vki_qm_trace trace;
2801 #else
2802 #define VKI_TRACEBUF
2803 #endif
2804 
2805 #define VKI_TAILQ_ENTRY(type)                                               \
2806 struct {                                                                \
2807         struct type *tqe_next;  /* next element */                      \
2808         struct type **tqe_prev; /* address of previous next element */  \
2809         VKI_TRACEBUF                                                        \
2810 }
2811 
2812 
2813 //----------------------------------------------------------------------
2814 // From cam/cam_ccb.h
2815 //----------------------------------------------------------------------
2816 
2817 #define VKI_CAM_VERSION 0x1a    /* Hex value for current version */
2818 
2819 typedef union {
2820    VKI_LIST_ENTRY(vki_ccb_hdr) le;
2821    VKI_SLIST_ENTRY(vki_ccb_hdr) sle;
2822    VKI_TAILQ_ENTRY(vki_ccb_hdr) tqe;
2823    VKI_STAILQ_ENTRY(vki_ccb_hdr) stqe;
2824 } vki_camq_entry;
2825 
2826 typedef enum {
2827    /* Function code flags are bits greater than 0xff */
2828    VKI_XPT_FC_QUEUED           = 0x100,
2829    /* Non-immediate function code */
2830    VKI_XPT_FC_USER_CCB         = 0x200,
2831    VKI_XPT_FC_XPT_ONLY         = 0x400,
2832    /* Only for the transport layer device */
2833    VKI_XPT_FC_DEV_QUEUED       = 0x800 | VKI_XPT_FC_QUEUED,
2834    /* Passes through the device queues */
2835    /* Common function commands: 0x00->0x0F */
2836    VKI_XPT_NOOP                = 0x00,
2837    /* Execute Nothing */
2838    VKI_XPT_SCSI_IO             = 0x01 | VKI_XPT_FC_DEV_QUEUED,
2839    /* Execute the requested I/O operation */
2840    VKI_XPT_GDEV_TYPE           = 0x02,
2841    /* Get type information for specified device */
2842    VKI_XPT_GDEVLIST            = 0x03,
2843    /* Get a list of peripheral devices */
2844    VKI_XPT_PATH_INQ            = 0x04,
2845    /* Path routing inquiry */
2846    VKI_XPT_REL_SIMQ            = 0x05,
2847    /* Release a frozen device queue */
2848    VKI_XPT_SASYNC_CB           = 0x06,
2849    /* Set Asynchronous Callback Parameters */
2850    VKI_XPT_SDEV_TYPE           = 0x07,
2851    /* Set device type information */
2852    VKI_XPT_SCAN_BUS            = 0x08 | VKI_XPT_FC_QUEUED | VKI_XPT_FC_USER_CCB
2853                                  | VKI_XPT_FC_XPT_ONLY,
2854    /* (Re)Scan the SCSI Bus */
2855    VKI_XPT_DEV_MATCH           = 0x09 | VKI_XPT_FC_XPT_ONLY,
2856    /* Get EDT entries matching the given pattern */
2857    VKI_XPT_DEBUG               = 0x0a,
2858    /* Turn on debugging for a bus, target or lun */
2859    VKI_XPT_PATH_STATS          = 0x0b,
2860    /* Path statistics (error counts, etc.) */
2861    VKI_XPT_GDEV_STATS          = 0x0c,
2862    /* Device statistics (error counts, etc.) */
2863    VKI_XPT_FREEZE_QUEUE        = 0x0d,
2864    /* Freeze device queue */
2865    /* SCSI Control Functions: 0x10->0x1F */
2866    VKI_XPT_ABORT               = 0x10,
2867    /* Abort the specified CCB */
2868    VKI_XPT_RESET_BUS           = 0x11 | VKI_XPT_FC_XPT_ONLY,
2869    /* Reset the specified SCSI bus */
2870    VKI_XPT_RESET_DEV           = 0x12 | VKI_XPT_FC_DEV_QUEUED,
2871    /* Bus Device Reset the specified SCSI device */
2872    VKI_XPT_TERM_IO             = 0x13,
2873    /* Terminate the I/O process */
2874    VKI_XPT_SCAN_LUN            = 0x14 | VKI_XPT_FC_QUEUED | VKI_XPT_FC_USER_CCB
2875                                  | VKI_XPT_FC_XPT_ONLY,
2876    /* Scan Logical Unit */
2877    VKI_XPT_GET_TRAN_SETTINGS   = 0x15,
2878    /*
2879     * Get default/user transfer settings
2880     * for the target
2881     */
2882    VKI_XPT_SET_TRAN_SETTINGS   = 0x16,
2883    /*
2884     * Set transfer rate/width
2885     * negotiation settings
2886     */
2887    VKI_XPT_CALC_GEOMETRY       = 0x17,
2888    /*
2889     * Calculate the geometry parameters for
2890     * a device give the sector size and
2891     * volume size.
2892     */
2893    VKI_XPT_ATA_IO              = 0x18 | VKI_XPT_FC_DEV_QUEUED,
2894    /* Execute the requested ATA I/O operation */
2895    VKI_XPT_GET_SIM_KNOB        = 0x18,
2896    /*
2897     * Get SIM specific knob values.
2898     */
2899 
2900    VKI_XPT_SET_SIM_KNOB        = 0x19,
2901    /*
2902     * Set SIM specific knob values.
2903     */
2904    /* HBA engine commands 0x20->0x2F */
2905    VKI_XPT_ENG_INQ             = 0x20 | VKI_XPT_FC_XPT_ONLY,
2906    /* HBA engine feature inquiry */
2907    VKI_XPT_ENG_EXEC            = 0x21 | VKI_XPT_FC_DEV_QUEUED,
2908    /* HBA execute engine request */
2909 
2910    /* Target mode commands: 0x30->0x3F */
2911    VKI_XPT_EN_LUN              = 0x30,
2912    /* Enable LUN as a target */
2913    VKI_XPT_TARGET_IO           = 0x31 | VKI_XPT_FC_DEV_QUEUED,
2914    /* Execute target I/O request */
2915    VKI_XPT_ACCEPT_TARGET_IO    = 0x32 | VKI_XPT_FC_QUEUED | VKI_XPT_FC_USER_CCB,
2916    /* Accept Host Target Mode CDB */
2917    VKI_XPT_CONT_TARGET_IO      = 0x33 | VKI_XPT_FC_DEV_QUEUED,
2918    /* Continue Host Target I/O Connection */
2919    VKI_XPT_IMMED_NOTIFY        = 0x34 | VKI_XPT_FC_QUEUED | VKI_XPT_FC_USER_CCB,
2920    /* Notify Host Target driver of event (obsolete) */
2921    VKI_XPT_NOTIFY_ACK          = 0x35,
2922    /* Acknowledgement of event (obsolete) */
2923    VKI_XPT_IMMEDIATE_NOTIFY    = 0x36 | VKI_XPT_FC_QUEUED | VKI_XPT_FC_USER_CCB,
2924    /* Notify Host Target driver of event */
2925    VKI_XPT_NOTIFY_ACKNOWLEDGE  = 0x37 | VKI_XPT_FC_QUEUED | VKI_XPT_FC_USER_CCB,
2926    /* Acknowledgement of event */
2927    VKI_XPT_REPROBE_LUN      = 0x38 | VKI_XPT_FC_QUEUED | VKI_XPT_FC_USER_CCB,
2928    /* Query device capacity and notify GEOM */
2929 
2930    VKI_XPT_MMC_SET_TRAN_SETTINGS = 0x40 | VKI_XPT_FC_DEV_QUEUED,
2931    VKI_XPT_MMC_GET_TRAN_SETTINGS = 0x41 | VKI_XPT_FC_DEV_QUEUED,
2932    /* Vendor Unique codes: 0x80->0x8F */
2933    VKI_XPT_VUNIQUE             = 0x80
2934 } vki_xpt_opcode;
2935 
2936 
2937 /* CAM CCB flags */
2938 typedef enum {
2939    VKI_CAM_CDB_POINTER         = 0x00000001,/* The CDB field is a pointer    */
2940    VKI_CAM_unused1             = 0x00000002,
2941    VKI_CAM_unused2             = 0x00000004,
2942    VKI_CAM_NEGOTIATE           = 0x00000008,/*
2943                                               * Perform transport negotiation
2944                                               * with this command.
2945                                               */
2946    VKI_CAM_DATA_ISPHYS         = 0x00000010,/* Data type with physical addrs */
2947    VKI_CAM_DIS_AUTOSENSE       = 0x00000020,/* Disable autosense feature     */
2948    VKI_CAM_DIR_BOTH            = 0x00000000,/* Data direction (00:IN/OUT)  */
2949    VKI_CAM_DIR_IN              = 0x00000040,/* Data direction (01:DATA IN)   */
2950    VKI_CAM_DIR_OUT             = 0x00000080,/* Data direction (10:DATA OUT)  */
2951    VKI_CAM_DIR_NONE            = 0x000000C0,/* Data direction (11:no data)   */
2952    VKI_CAM_DIR_MASK            = 0x000000C0,/* Data direction Mask           */
2953    VKI_CAM_DATA_VADDR       = 0x00000000,/* Data type (000:Virtual)       */
2954    VKI_CAM_DATA_PADDR       = 0x00000010,/* Data type (001:Physical)      */
2955    VKI_CAM_DATA_SG      = 0x00040000,/* Data type (010:sglist)        */
2956    VKI_CAM_DATA_SG_PADDR    = 0x00040010,/* Data type (011:sglist phys)   */
2957    VKI_CAM_DATA_BIO     = 0x00200000,/* Data type (100:bio)           */
2958    VKI_CAM_DATA_MASK        = 0x00240010,/* Data type mask                */
2959    VKI_CAM_unused3      = 0x00000100,
2960    VKI_CAM_unused4      = 0x00000200,
2961    VKI_CAM_DEV_QFRZDIS         = 0x00000400,/* Disable DEV Q freezing        */
2962    VKI_CAM_DEV_QFREEZE         = 0x00000800,/* Freeze DEV Q on execution     */
2963    VKI_CAM_HIGH_POWER          = 0x00001000,/* Command takes a lot of power  */
2964    VKI_CAM_SENSE_PTR           = 0x00002000,/* Sense data is a pointer       */
2965    VKI_CAM_SENSE_PHYS          = 0x00004000,/* Sense pointer is physical addr*/
2966    VKI_CAM_TAG_ACTION_VALID    = 0x00008000,/* Use the tag action in this ccb*/
2967    VKI_CAM_PASS_ERR_RECOVER    = 0x00010000,/* Pass driver does err. recovery*/
2968    VKI_CAM_DIS_DISCONNECT      = 0x00020000,/* Disable disconnect            */
2969    VKI_CAM_unused5             = 0x00080000,
2970    VKI_CAM_unused6             = 0x00100000,
2971    VKI_CAM_CDB_PHYS            = 0x00400000,/* CDB poiner is physical        */
2972    VKI_CAM_unused7             = 0x00800000,
2973 
2974    /* Phase cognizant mode flags */
2975    VKI_CAM_unused8             = 0x01000000,
2976    VKI_CAM_unused9             = 0x02000000,
2977    VKI_CAM_unused10            = 0x04000000,
2978    VKI_CAM_unused11            = 0x08000000,
2979    VKI_CAM_unused12            = 0x10000000,
2980    VKI_CAM_unused13            = 0x20000000,
2981    VKI_CAM_unused14            = 0x40000000,
2982 
2983    /* Host target Mode flags */
2984    VKI_CAM_SEND_SENSE          = 0x08000000,/* Send sense data with status   */
2985    VKI_CAM_unused15            = 0x10000000,
2986    VKI_CAM_unused16            = 0x20000000,
2987    VKI_CAM_SEND_STATUS         = 0x40000000, /* Send status after data phase  */
2988 
2989    VKI_CAM_UNLOCKED     = 0x80000000 /* Call callback without lock.   */
2990 } vki_ccb_flags;
2991 
2992 typedef union {
2993    void            *ptr;
2994    vki_u_long      field;
2995    vki_uint8_t     bytes[sizeof(vki_uintptr_t)];
2996 } vki_ccb_priv_entry;
2997 
2998 #define VKI_IOCDBLEN  VKI_CAM_MAX_CDBLEN  /* Space for CDB bytes/pointer */
2999 #define VKI_CCB_PERIPH_PRIV_SIZE    2   /* size of peripheral private area */
3000 #define VKI_CCB_SIM_PRIV_SIZE       2   /* size of sim private area */
3001 
3002 typedef union {
3003    vki_ccb_priv_entry entries[VKI_CCB_PERIPH_PRIV_SIZE];
3004    vki_uint8_t        bytes[VKI_CCB_PERIPH_PRIV_SIZE * sizeof(vki_ccb_priv_entry)];
3005 } vki_ccb_ppriv_area;
3006 
3007 typedef union {
3008    vki_ccb_priv_entry entries[VKI_CCB_SIM_PRIV_SIZE];
3009    vki_uint8_t        bytes[VKI_CCB_SIM_PRIV_SIZE * sizeof(vki_ccb_priv_entry)];
3010 } vki_ccb_spriv_area;
3011 
3012 union vki_ccb;
3013 struct vki_cam_periph;
3014 
3015 typedef struct {
3016    struct vki_timeval   *etime;
3017    vki_uintptr_t    sim_data;
3018    vki_uintptr_t    periph_data;
3019 } vki_ccb_qos_area;
3020 
3021 struct vki_ccb_hdr {
3022    vki_cam_pinfo   pinfo;          /* Info for priority scheduling */
3023    vki_camq_entry  xpt_links;      /* For chaining in the XPT layer */
3024    vki_camq_entry  sim_links;      /* For chaining in the SIM layer */
3025    vki_camq_entry  periph_links;   /* For chaining in the type driver */
3026 #if BYTE_ORDER == LITTLE_ENDIAN
3027    vki_uint16_t       retry_count;
3028    vki_uint16_t       alloc_flags;  /* ccb_alloc_flags */
3029 #else
3030    vki_uint16_t       alloc_flags;  /* ccb_alloc_flags */
3031    vki_uint16_t       retry_count;
3032 #endif
3033    void         (*cbfcnp)(struct vki_cam_periph *, union vki_ccb *);
3034    /* Callback on completion function */
3035    vki_xpt_opcode  func_code;      /* XPT function code */
3036    vki_uint32_t    status;         /* Status returned by CAM subsystem */
3037    struct      vki_cam_path *path; /* Compiled path for this ccb */
3038    vki_path_id_t   path_id;        /* Path ID for the request */
3039    vki_target_id_t target_id;      /* Target device ID */
3040    vki_lun_id_t    target_lun;     /* Target LUN number */
3041    vki_uint32_t    flags;          /* ccb_flags */
3042    vki_uint32_t xflags;     /* Extended flags */
3043    vki_ccb_ppriv_area  periph_priv;
3044    vki_ccb_spriv_area  sim_priv;
3045    vki_ccb_qos_area qos;
3046    vki_uint32_t timeout;    /* Hard timeout value in mseconds */
3047    struct vki_timeval   softtimeout;    /* Soft timeout value in sec + usec */
3048 };
3049 
3050 typedef union {
3051    vki_u_int8_t  *cdb_ptr;             /* Pointer to the CDB bytes to send */
3052    /* Area for the CDB send */
3053    vki_u_int8_t  cdb_bytes[VKI_IOCDBLEN];
3054 } vki_cdb_t;
3055 
3056 
3057 /*
3058  * SCSI I/O Request CCB used for the XPT_SCSI_IO and XPT_CONT_TARGET_IO
3059  * function codes.
3060  */
3061 struct vki_ccb_scsiio {
3062    struct     vki_ccb_hdr ccb_h;
3063    union      vki_ccb *next_ccb;   /* Ptr for next CCB for action */
3064    vki_u_int8_t   *req_map;        /* Ptr to mapping info */
3065    vki_u_int8_t   *data_ptr;       /* Ptr to the data buf/SG list */
3066    vki_u_int32_t  dxfer_len;       /* Data transfer length */
3067    /* Autosense storage */
3068    struct     vki_scsi_sense_data sense_data;
3069    vki_u_int8_t   sense_len;       /* Number of bytes to autosense */
3070    vki_u_int8_t   cdb_len;         /* Number of bytes for the CDB */
3071    vki_u_int16_t  sglist_cnt;      /* Number of SG list entries */
3072    vki_u_int8_t   scsi_status;     /* Returned SCSI status */
3073    vki_u_int8_t   sense_resid;     /* Autosense resid length: 2's comp */
3074    vki_u_int32_t  resid;           /* Transfer residual length: 2's comp */
3075    vki_cdb_t      cdb_io;          /* Union for CDB bytes/pointer */
3076    vki_u_int8_t   *msg_ptr;        /* Pointer to the message buffer */
3077    vki_u_int16_t  msg_len;         /* Number of bytes for the Message */
3078    vki_u_int8_t   tag_action;      /* What to do for tag queueing */
3079    /*
3080     * The tag action should be either the define below (to send a
3081     * non-tagged transaction) or one of the defined scsi tag messages
3082     * from scsi_message.h.
3083     */
3084    vki_uint8_t     priority;        /* Command priority for SIMPLE tag */
3085    vki_u_int      tag_id;          /* tag id from initator (target mode) */
3086    vki_u_int      init_id;         /* initiator id of who selected */
3087 };
3088 
3089 typedef enum {
3090    VKI_CAM_DEV_MATCH_LAST,
3091    VKI_CAM_DEV_MATCH_MORE,
3092    VKI_CAM_DEV_MATCH_LIST_CHANGED,
3093    VKI_CAM_DEV_MATCH_SIZE_ERROR,
3094    VKI_CAM_DEV_MATCH_ERROR
3095 } vki_ccb_dev_match_status;
3096 
3097 
3098 struct vki_dev_match_pattern;
3099 
3100 typedef enum {
3101    VKI_DEV_MATCH_PERIPH,
3102    VKI_DEV_MATCH_DEVICE,
3103    VKI_DEV_MATCH_BUS
3104 } vki_dev_match_type;
3105 
3106 #define VKI_DEV_IDLEN       16          /* ASCII string len for device names */
3107 
3108 struct vki_periph_match_result {
3109    char                    periph_name[VKI_DEV_IDLEN];
3110    vki_uint32_t            unit_number;
3111    vki_path_id_t           path_id;
3112    vki_target_id_t         target_id;
3113    vki_lun_id_t            target_lun;
3114 };
3115 
3116 typedef enum {
3117    VKI_PROTO_UNKNOWN,
3118    VKI_PROTO_UNSPECIFIED,
3119    VKI_PROTO_SCSI,     /* Small Computer System Interface */
3120    VKI_PROTO_ATA,      /* AT Attachment */
3121    VKI_PROTO_ATAPI,    /* AT Attachment Packetized Interface */
3122    VKI_PROTO_SATAPM,   /* SATA Port Multiplier */
3123    VKI_PROTO_SEMB,  /* SATA Enclosure Management Bridge */
3124    VKI_PROTO_NVME,  /* NVME */
3125    VKI_PROTO_MMCSD, /* MMC, SD, SDIO */
3126 } vki_cam_proto;
3127 
3128 typedef enum {
3129    VKI_DEV_RESULT_NOFLAG               = 0x00,
3130    VKI_DEV_RESULT_UNCONFIGURED         = 0x01
3131 } vki_dev_result_flags;
3132 
3133 
3134 struct vki_device_match_result {
3135    vki_path_id_t                   path_id;
3136    vki_target_id_t                 target_id;
3137    vki_lun_id_t                    target_lun;
3138    vki_cam_proto                   protocol;
3139    struct vki_scsi_inquiry_data    inq_data;
3140    struct vki_ata_params           ident_data;
3141    vki_dev_result_flags            flags;
3142 };
3143 
3144 struct vki_bus_match_result {
3145    vki_path_id_t   path_id;
3146    char            dev_name[VKI_DEV_IDLEN];
3147    vki_uint32_t    unit_number;
3148    vki_uint32_t    bus_id;
3149 };
3150 
3151 union vki_match_result {
3152    struct vki_periph_match_result      periph_result;
3153    struct vki_device_match_result      device_result;
3154    struct vki_bus_match_result         bus_result;
3155 };
3156 
3157 struct vki_dev_match_result {
3158    vki_dev_match_type          type;
3159    union vki_match_result      result;
3160 };
3161 
3162 typedef enum {
3163    VKI_CAM_DEV_POS_NONE        = 0x000,
3164    VKI_CAM_DEV_POS_BUS         = 0x001,
3165    VKI_CAM_DEV_POS_TARGET      = 0x002,
3166    VKI_CAM_DEV_POS_DEVICE      = 0x004,
3167    VKI_CAM_DEV_POS_PERIPH      = 0x008,
3168    VKI_CAM_DEV_POS_PDPTR       = 0x010,
3169    VKI_CAM_DEV_POS_TYPEMASK    = 0xf00,
3170    VKI_CAM_DEV_POS_EDT         = 0x100,
3171    VKI_CAM_DEV_POS_PDRV        = 0x200
3172 } vki_dev_pos_type;
3173 
3174 struct vki_ccb_dm_cookie {
3175    void    *bus;
3176    void    *target;
3177    void    *device;
3178    void    *periph;
3179    void    *pdrv;
3180 };
3181 
3182 struct vki_ccb_dev_position {
3183    vki_u_int                generations[4];
3184 #define VKI_CAM_BUS_GENERATION      0x00
3185 #define VKI_CAM_TARGET_GENERATION   0x01
3186 #define VKI_CAM_DEV_GENERATION      0x02
3187 #define VKI_CAM_PERIPH_GENERATION   0x03
3188    vki_dev_pos_type        position_type;
3189    struct vki_ccb_dm_cookie cookie;
3190 };
3191 
3192 struct vki_ccb_dev_match {
3193    struct vki_ccb_hdr              ccb_h;
3194    vki_ccb_dev_match_status        status;
3195    vki_uint32_t                    num_patterns;
3196    vki_uint32_t                    pattern_buf_len;
3197    struct vki_dev_match_pattern    *patterns;
3198    vki_uint32_t                    num_matches;
3199    vki_uint32_t                    match_buf_len;
3200    struct vki_dev_match_result     *matches;
3201    struct vki_ccb_dev_position     pos;
3202 };
3203 
3204 /*
3205  * Union of all CCB types for kernel space allocation.  This union should
3206  * never be used for manipulating CCBs - its only use is for the allocation
3207  * and deallocation of raw CCB space and is the return type of xpt_ccb_alloc
3208  * and the argument to xpt_ccb_free.
3209  */
3210 union vki_ccb {
3211    /* Only letting out ones currently handled */
3212    struct  vki_ccb_hdr             ccb_h;  /* For convenience */
3213    struct  vki_ccb_scsiio          csio;
3214 #if 0
3215    struct  ccb_getdev              cgd;
3216    struct  ccb_getdevlist          cgdl;
3217    struct  ccb_pathinq             cpi;
3218    struct  ccb_relsim              crs;
3219    struct  ccb_setasync            csa;
3220    struct  ccb_setdev              csd;
3221    struct  ccb_pathstats           cpis;
3222    struct  ccb_getdevstats         cgds;
3223 #endif
3224    struct  vki_ccb_dev_match       cdm;
3225 #if 0
3226    struct  ccb_trans_settings      cts;
3227    struct  ccb_calc_geometry       ccg;
3228    struct  ccb_sim_knob            knob;
3229    struct  ccb_abort               cab;
3230    struct  ccb_resetbus            crb;
3231    struct  ccb_resetdev            crd;
3232    struct  ccb_termio              tio;
3233    struct  ccb_accept_tio          atio;
3234    struct  ccb_scsiio              ctio;
3235    struct  ccb_en_lun              cel;
3236    struct  ccb_immed_notify        cin;
3237    struct  ccb_notify_ack          cna;
3238    struct  ccb_immediate_notify    cin1;
3239    struct  ccb_notify_acknowledge  cna2;
3240    struct  ccb_eng_inq             cei;
3241    struct  ccb_eng_exec            cee;
3242    struct  ccb_rescan              crcn;
3243    struct  ccb_debug               cdbg;
3244    struct  ccb_ataio               ataio;
3245 #endif
3246    char make_union_right_size[0x4E0];
3247 };
3248 
3249 #define VKI_CAMIOCOMMAND _VKI_IOWR(VKI_CAM_VERSION, 2, union vki_ccb)
3250 
3251 
3252 /*--------------------------------------------------------------------*/
3253 /*--- end                                                          ---*/
3254 /*--------------------------------------------------------------------*/