Home | History | Annotate | Download | only in vki
      1 
      2 /*--------------------------------------------------------------------*/
      3 /*--- mips/Linux-specific kernel interface.     vki-mips64-linux.h ---*/
      4 /*--------------------------------------------------------------------*/
      5 
      6 /*
      7    This file is part of Valgrind, a dynamic binary instrumentation
      8    framework.
      9 
     10    Copyright (C) 2010-2013 RT-RK
     11       mips-valgrind (at) rt-rk.com
     12 
     13    This program is free software; you can redistribute it and/or
     14    modify it under the terms of the GNU General Public License as
     15    published by the Free Software Foundation; either version 2 of the
     16    License, or (at your option) any later version.
     17 
     18    This program is distributed in the hope that it will be useful, but
     19    WITHOUT ANY WARRANTY; without even the implied warranty of
     20    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     21    General Public License for more details.
     22 
     23    You should have received a copy of the GNU General Public License
     24    along with this program; if not, write to the Free Software
     25    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
     26    02111-1307, USA.
     27 */
     28 
     29 #ifndef __VKI_MIPS64_LINUX_H
     30 #define __VKI_MIPS64_LINUX_H
     31 
     32 #include <config.h>
     33 
     34 // mips endian
     35 #if defined (_MIPSEL)
     36 #define VKI_LITTLE_ENDIAN  1
     37 #elif defined (_MIPSEB)
     38 #define VKI_BIG_ENDIAN  1
     39 #endif
     40 
     41 //----------------------------------------------------------------------
     42 // From linux-2.6.35.9/include/asm-mips/cachectl.h
     43 //----------------------------------------------------------------------
     44 
     45 #define VKI_ICACHE  (1<<0)          /* flush instruction cache        */
     46 #define VKI_DCACHE  (1<<1)          /* writeback and flush data cache */
     47 #define VKI_BCACHE  (VKI_ICACHE | VKI_DCACHE) /* flush both caches    */
     48 
     49 //----------------------------------------------------------------------
     50 // From linux-2.6.35.9/include/mips-mips/types.h
     51 //----------------------------------------------------------------------
     52 
     53 typedef __signed__ char __vki_s8;
     54 typedef unsigned   char __vki_u8;
     55 
     56 typedef __signed__ short __vki_s16;
     57 typedef unsigned   short __vki_u16;
     58 
     59 typedef __signed__ int __vki_s32;
     60 typedef unsigned   int __vki_u32;
     61 
     62 typedef __signed char vki_s8;
     63 typedef unsigned char vki_u8;
     64 
     65 typedef __signed short vki_s16;
     66 typedef unsigned short vki_u16;
     67 
     68 typedef __signed int vki_s32;
     69 typedef unsigned int vki_u32;
     70 
     71 #if (_MIPS_SZLONG == 64)
     72 typedef __signed__ long __vki_s64;
     73 typedef unsigned   long __vki_u64;
     74 #else
     75 typedef __signed__ long long __vki_s64;
     76 typedef unsigned   long long __vki_u64;
     77 #endif
     78 
     79 //----------------------------------------------------------------------
     80 // From linux-2.6.35.9/include/asm-mips/page.h
     81 //----------------------------------------------------------------------
     82 
     83 /* PAGE_SHIFT determines the page size */
     84 #define VKI_PAGE_SHIFT  MIPS_PAGE_SHIFT
     85 #define VKI_PAGE_SIZE   (1UL << VKI_PAGE_SHIFT)
     86 #define VKI_PAGE_MASK   (~(VKI_PAGE_SIZE-1))
     87 #define VKI_MAX_PAGE_SHIFT      VKI_PAGE_SHIFT
     88 #define VKI_MAX_PAGE_SIZE       VKI_PAGE_SIZE
     89 
     90 //----------------------------------------------------------------------
     91 // From linux-2.6.35.9/arch/mips/include/bits/shm.h
     92 //----------------------------------------------------------------------
     93 
     94 #define VKI_SHMLBA  0x40000
     95 
     96 //----------------------------------------------------------------------
     97 // From linux-2.6.35.9/include/asm-mips/signal.h
     98 //----------------------------------------------------------------------
     99 
    100 #define VKI_MINSIGSTKSZ 2048
    101 
    102 #define VKI_SIG_BLOCK   1  /* for blocking signals */
    103 #define VKI_SIG_UNBLOCK 2  /* for unblocking signals */
    104 #define VKI_SIG_SETMASK 3  /* for setting the signal mask */
    105 
    106 /* Type of a signal handler.  */
    107 typedef void __vki_signalfn_t(int);
    108 typedef __vki_signalfn_t __user *__vki_sighandler_t;
    109 
    110 typedef void __vki_restorefn_t(void);
    111 typedef __vki_restorefn_t __user *__vki_sigrestore_t;
    112 
    113 #define VKI_SIG_DFL     ((__vki_sighandler_t)0)   /* default signal handling */
    114 #define VKI_SIG_IGN     ((__vki_sighandler_t)1)   /* ignore signal */
    115 #define VKI_SIG_ERR     ((__vki_sighandler_t)-1)  /* error return from signal */
    116 
    117 #define _VKI_NSIG       128
    118 #define _VKI_NSIG_BPW   64
    119 #define _VKI_NSIG_WORDS (_VKI_NSIG / _VKI_NSIG_BPW)
    120 
    121 typedef unsigned long vki_old_sigset_t;  /* at least 32 bits */
    122 
    123 typedef struct {
    124         unsigned long sig[_VKI_NSIG_WORDS];
    125 } vki_sigset_t;
    126 
    127 #define VKI_SIGHUP           1          /* Hangup (POSIX).                    */
    128 #define VKI_SIGINT           2          /* Interrupt (ANSI).                  */
    129 #define VKI_SIGQUIT          3          /* Quit (POSIX).                      */
    130 #define VKI_SIGILL           4          /* Illegal instruction (ANSI).        */
    131 #define VKI_SIGTRAP          5          /* Trace trap (POSIX).                */
    132 #define VKI_SIGIOT           6          /* IOT trap (4.2 BSD).                */
    133 #define VKI_SIGABRT          VKI_SIGIOT /* Abort (ANSI).                      */
    134 #define VKI_SIGEMT           7
    135 #define VKI_SIGFPE           8          /* Floating-point exception (ANSI).   */
    136 #define VKI_SIGKILL          9          /* Kill, unblockable (POSIX).         */
    137 #define VKI_SIGBUS          10          /* BUS error (4.2 BSD).               */
    138 #define VKI_SIGSEGV         11          /* Segmentation violation (ANSI).     */
    139 #define VKI_SIGSYS          12
    140 #define VKI_SIGPIPE         13          /* Broken pipe (POSIX).               */
    141 #define VKI_SIGALRM         14          /* Alarm clock (POSIX).               */
    142 #define VKI_SIGTERM         15          /* Termination (ANSI).                */
    143 #define VKI_SIGUSR1         16          /* User-defined signal 1 (POSIX).     */
    144 #define VKI_SIGUSR2         17          /* User-defined signal 2 (POSIX).     */
    145 #define VKI_SIGCHLD         18          /* Child status has changed (POSIX).  */
    146 #define VKI_SIGCLD          VKI_SIGCHLD /* Same as SIGCHLD (System V).        */
    147 #define VKI_SIGPWR          19          /* Power failure restart (System V).  */
    148 #define VKI_SIGWINCH        20          /* Window size change (4.3 BSD, Sun). */
    149 #define VKI_SIGURG          21          /* Urgent condition on socket.        */
    150 #define VKI_SIGIO           22          /* I/O now possible (4.2 BSD).        */
    151 #define VKI_SIGPOLL         VKI_SIGIO   /* Pollable event occurred (System V).*/
    152 #define VKI_SIGSTOP         23          /* Stop, unblockable (POSIX).         */
    153 #define VKI_SIGTSTP         24          /* Keyboard stop (POSIX).             */
    154 #define VKI_SIGCONT         25          /* Continue (POSIX).                  */
    155 #define VKI_SIGTTIN         26          /* Background read from tty (POSIX).  */
    156 #define VKI_SIGTTOU         27          /* Background write to tty (POSIX).   */
    157 #define VKI_SIGVTALRM       28          /* Virtual alarm clock (4.2 BSD).     */
    158 #define VKI_SIGPROF         29          /* Profiling alarm clock (4.2 BSD).   */
    159 #define VKI_SIGXCPU         30          /* CPU limit exceeded (4.2 BSD).      */
    160 #define VKI_SIGXFSZ         31          /* File size limit exceeded (4.2 BSD).*/
    161 
    162 /* These should not be considered constants from userland.  */
    163 #define VKI_SIGRTMIN    32
    164 // [[This was (_NSIG-1) in 2.4.X... not sure if it matters.]]
    165 #define VKI_SIGRTMAX    (_VKI_NSIG - 1)
    166 
    167 #define VKI_SA_ONSTACK      0x08000000u
    168 #define VKI_SA_RESETHAND    0x80000000u
    169 #define VKI_SA_RESTART      0x10000000u
    170 #define VKI_SA_SIGINFO      0x00000008u
    171 #define VKI_SA_NODEFER      0x40000000u
    172 #define VKI_SA_NOCLDWAIT    0x00010000u
    173 #define VKI_SA_NOCLDSTOP    0x00000001u
    174 
    175 #define VKI_SA_NOMASK           VKI_SA_NODEFER
    176 #define VKI_SA_ONESHOT          VKI_SA_RESETHAND
    177 //#define VKI_SA_INTERRUPT      0x20000000  /* dummy -- ignored */
    178 
    179 #define VKI_SA_RESTORER         0x04000000
    180 
    181 #define VKI_SS_ONSTACK          1
    182 #define VKI_SS_DISABLE          2
    183 
    184 struct vki_old_sigaction {
    185        // [[Nb: a 'k' prefix is added to "sa_handler" because
    186        // bits/sigaction.h (which gets dragged in somehow via signal.h)
    187        // #defines it as something else.  Since that is done for glibc's
    188        // purposes, which we don't care about here, we use our own name.]]
    189        unsigned long sa_flags;
    190        __vki_sighandler_t ksa_handler;
    191        vki_old_sigset_t sa_mask;
    192        __vki_sigrestore_t sa_restorer;
    193 };
    194 
    195 struct vki_sigaction {
    196        unsigned int    sa_flags;
    197        __vki_sighandler_t  sa_handler;
    198        vki_sigset_t        sa_mask;
    199 };
    200 
    201 
    202 struct vki_sigaction_base {
    203        // [[See comment about extra 'k' above]]
    204        unsigned int sa_flags;
    205        __vki_sighandler_t ksa_handler;
    206        vki_sigset_t sa_mask;           // mask last for extensibility
    207        __vki_sigrestore_t sa_restorer;
    208 };
    209 
    210 /* On Linux we use the same type for passing sigactions to
    211    and from the kernel.  Hence: */
    212 typedef  struct vki_sigaction_base  vki_sigaction_toK_t;
    213 typedef  struct vki_sigaction_base  vki_sigaction_fromK_t;
    214 
    215 typedef struct vki_sigaltstack {
    216         void __user *ss_sp;
    217         vki_size_t ss_size;
    218         int ss_flags;
    219 } vki_stack_t;
    220 
    221 //----------------------------------------------------------------------
    222 // From linux-2.6.35.9/include/asm-mips/sigcontext.h
    223 //----------------------------------------------------------------------
    224 
    225 struct _vki_fpreg {
    226        unsigned short significand[4];
    227        unsigned short exponent;
    228 };
    229 
    230 struct _vki_fpxreg {
    231        unsigned short significand[4];
    232        unsigned short exponent;
    233        unsigned short padding[3];
    234 };
    235 
    236 struct _vki_xmmreg {
    237        unsigned long element[4];
    238 };
    239 
    240 struct _vki_fpstate {
    241        /* Regular FPU environment */
    242        unsigned long    cw;
    243        unsigned long    sw;
    244        unsigned long    tag;
    245        unsigned long    ipoff;
    246        unsigned long    cssel;
    247        unsigned long    dataoff;
    248        unsigned long    datasel;
    249        struct _vki_fpreg    _st[8];
    250        unsigned short   status;
    251        unsigned short   magic;           /* 0xffff = regular FPU data only */
    252 
    253        /* FXSR FPU environment */
    254        unsigned long    _fxsr_env[6];    /* FXSR FPU env is ignored */
    255        unsigned long    mxcsr;
    256        unsigned long    reserved;
    257        struct _vki_fpxreg   _fxsr_st[8]; /* FXSR FPU reg data is ignored */
    258        struct _vki_xmmreg   _xmm[8];
    259        unsigned long    padding[56];
    260 };
    261 
    262 //----------------------------------------------------------------------
    263 // From linux-2.6.35.9/include/asm-mips/sigcontext.h
    264 //----------------------------------------------------------------------
    265 struct vki_sigcontext {
    266        __vki_u64   sc_regs[32];
    267        __vki_u64   sc_fpregs[32];
    268        __vki_u64   sc_mdhi;
    269        __vki_u64   sc_hi1;
    270        __vki_u64   sc_hi2;
    271        __vki_u64   sc_hi3;
    272        __vki_u64   sc_mdlo;
    273        __vki_u64   sc_lo1;
    274        __vki_u64   sc_lo2;
    275        __vki_u64   sc_lo3;
    276        __vki_u64   sc_pc;
    277        __vki_u64   sc_fpc_csr;
    278        __vki_u64   sc_used_math;
    279        __vki_u64   sc_dsp;
    280        __vki_u64   sc_reserved;
    281 };
    282 
    283 //----------------------------------------------------------------------
    284 // From linux-2.6.35.9/include/asm-mips/mman.h
    285 //----------------------------------------------------------------------
    286 
    287 #define VKI_PROT_NONE       0x0      /* No page permissions */
    288 #define VKI_PROT_READ       0x1      /* page can be read */
    289 #define VKI_PROT_WRITE      0x2      /* page can be written */
    290 #define VKI_PROT_EXEC       0x4      /* page can be executed */
    291 #define VKI_PROT_GROWSDOWN  0x01000000  /* mprotect flag: extend change to start
    292                                            of growsdown vma */
    293 #define VKI_PROT_GROWSUP    0x02000000  /* mprotect flag: extend change to end
    294                                            of growsup vma */
    295 
    296 #define VKI_MAP_SHARED      0x001     /* Share changes */
    297 #define VKI_MAP_PRIVATE     0x002     /* Changes are private */
    298 //#define VKI_MAP_TYPE      0x0f        /* Mask for type of mapping */
    299 #define VKI_MAP_FIXED       0x010     /* Interpret addr exactly */
    300 
    301 #define VKI_MAP_NORESERVE   0x0400   /* don't reserve swap pages */
    302 
    303 /* These are linux-specific */
    304 #define VKI_MAP_NORESERVE   0x0400          /* don't check for reservations */
    305 #define VKI_MAP_ANONYMOUS   0x0800          /* don't use a file */
    306 #define VKI_MAP_GROWSDOWN   0x1000          /* stack-like segment */
    307 #define VKI_MAP_DENYWRITE   0x2000          /* ETXTBSY */
    308 #define VKI_MAP_EXECUTABLE  0x4000          /* mark it as an executable */
    309 #define VKI_MAP_LOCKED      0x8000          /* pages are locked */
    310 #define VKI_MAP_POPULATE    0x10000         /* populate (prefault) pagetables */
    311 #define VKI_MAP_NONBLOCK    0x20000         /* do not block on IO */
    312 
    313 //----------------------------------------------------------------------
    314 // From linux-2.6.35.9/include/asm-mips/fcntl.h
    315 //----------------------------------------------------------------------
    316 
    317 #define VKI_O_RDONLY        00
    318 #define VKI_O_WRONLY        01
    319 #define VKI_O_RDWR          02
    320 #define VKI_O_ACCMODE       03
    321 
    322 #define VKI_O_CREAT         0x0100      /* not fcntl */
    323 #define VKI_O_EXCL          0x0400      /* not fcntl */
    324 
    325 #define VKI_O_TRUNC         0x0200      /* not fcntl */
    326 
    327 #define VKI_O_APPEND        0x0008
    328 #define VKI_O_NONBLOCK      0x0080
    329 #define VKI_O_LARGEFILE     0x2000
    330 
    331 #define VKI_AT_FDCWD        -100
    332 
    333 #define VKI_F_DUPFD         0           /* dup */
    334 #define VKI_F_GETFD         1           /* get close_on_exec */
    335 #define VKI_F_SETFD         2           /* set/clear close_on_exec */
    336 #define VKI_F_GETFL         3           /* get file->f_flags */
    337 #define VKI_F_SETFL         4           /* set file->f_flags */
    338 
    339 #define VKI_F_GETLK         14
    340 #define VKI_F_SETLK         6
    341 #define VKI_F_SETLKW        7
    342 
    343 #define VKI_F_SETOWN        24          /*  for sockets. */
    344 #define VKI_F_GETOWN        23          /*  for sockets. */
    345 #define VKI_F_SETSIG        10          /*  for sockets. */
    346 #define VKI_F_GETSIG        11          /*  for sockets. */
    347 
    348 #define VKI_F_SETOWN_EX     15
    349 #define VKI_F_GETOWN_EX     16
    350 
    351 #define VKI_F_GETLK64       33          /*  using 'struct flock64' */
    352 #define VKI_F_SETLK64       34
    353 #define VKI_F_SETLKW64      35
    354 
    355 /* for F_[GET|SET]FL */
    356 #define VKI_FD_CLOEXEC      1      /* actually anything with low bit set goes */
    357 
    358 #define VKI_F_LINUX_SPECIFIC_BASE 1024
    359 
    360 struct vki_f_owner_ex {
    361        int type;
    362        __vki_kernel_pid_t pid;
    363 };
    364 
    365 //----------------------------------------------------------------------
    366 // From linux-2.6.35.9/include/asm-mips/resource.h
    367 //----------------------------------------------------------------------
    368 
    369 #define VKI_RLIMIT_DATA     2   /* max data size */
    370 #define VKI_RLIMIT_STACK    3   /* max stack size */
    371 #define VKI_RLIMIT_CORE     4   /* max core file size */
    372 #define VKI_RLIMIT_NOFILE   5   /* max number of open files */
    373 
    374 //----------------------------------------------------------------------
    375 // From linux-2.6.35.9/include/asm-mips/socket.h
    376 //----------------------------------------------------------------------
    377 
    378 #define VKI_SOL_SOCKET   0xffff
    379 
    380 #define VKI_SO_TYPE      0x1008
    381 
    382 #define VKI_SO_ATTACH_FILTER	26
    383 
    384 //----------------------------------------------------------------------
    385 // From linux-2.6.35.9/include/asm-i386/sockios.h
    386 //----------------------------------------------------------------------
    387 
    388 #define VKI_SIOCSPGRP           0x8902
    389 #define VKI_SIOCGPGRP           0x8904
    390 #define VKI_SIOCGSTAMP          0x8906      /* Get stamp (timeval) */
    391 #define VKI_SIOCGSTAMPNS        0x8907      /* Get stamp (timespec) */
    392 
    393 //----------------------------------------------------------------------
    394 // From linux-2.6.35.9/include/asm-mips/stat.h
    395 //----------------------------------------------------------------------
    396 
    397 struct vki_stat {
    398         unsigned int    st_dev;
    399         unsigned int    st_pad0[3];     /* Reserved for st_dev expansion  */
    400 
    401         unsigned long   st_ino;
    402 
    403         int             st_mode;
    404         unsigned int    st_nlink;
    405 
    406         unsigned int    st_uid;
    407         unsigned int    st_gid;
    408 
    409         unsigned int    st_rdev;
    410         unsigned int    st_pad1[3];     /* Reserved for st_rdev expansion  */
    411 
    412         long            st_size;
    413 
    414         /*
    415          * Actually this should be timestruc_t st_atime, st_mtime and st_ctime
    416          * but we don't have it under Linux.
    417          */
    418         unsigned int    st_atime;
    419         unsigned int    st_atime_nsec;  /* Reserved for st_atime expansion  */
    420 
    421         unsigned int    st_mtime;
    422         unsigned int    st_mtime_nsec;  /* Reserved for st_mtime expansion  */
    423 
    424         unsigned int    st_ctime;
    425         unsigned int    st_ctime_nsec;  /* Reserved for st_ctime expansion  */
    426 
    427         unsigned int    st_blksize;
    428         unsigned int    st_pad2;
    429 
    430         long long       st_blocks;
    431 };
    432 
    433 struct vki_stat64 {
    434         unsigned long   st_dev;
    435         unsigned long   st_pad0[3];     /* Reserved for st_dev expansion  */
    436 
    437         unsigned long long      st_ino;
    438 
    439         int             st_mode;
    440         unsigned int    st_nlink;
    441 
    442         unsigned int    st_uid;
    443         unsigned int    st_gid;
    444 
    445         unsigned long   st_rdev;
    446         unsigned long   st_pad1[3];     /* Reserved for st_rdev expansion  */
    447 
    448         long long       st_size;
    449 
    450         /*
    451          * Actually this should be timestruc_t st_atime, st_mtime and st_ctime
    452          * but we don't have it under Linux.
    453          */
    454         unsigned long   st_atime;
    455         unsigned long   st_atime_nsec;  /* Reserved for st_atime expansion  */
    456 
    457         unsigned long   st_mtime;
    458         unsigned long   st_mtime_nsec;  /* Reserved for st_mtime expansion  */
    459 
    460         unsigned long   st_ctime;
    461         unsigned long   st_ctime_nsec;  /* Reserved for st_ctime expansion  */
    462 
    463         unsigned long   st_blksize;
    464         unsigned long   st_pad2;
    465 
    466         long long       st_blocks;
    467 };
    468 
    469 //----------------------------------------------------------------------
    470 // From linux-2.6.35.9/include/asm-mips/statfs.h
    471 //----------------------------------------------------------------------
    472 
    473 struct vki_statfs {
    474        __vki_u32 f_type;
    475 #define f_fstyp f_type
    476        __vki_u32 f_bsize;
    477        __vki_u32 f_frsize;
    478        __vki_u32 f_blocks;
    479        __vki_u32 f_bfree;
    480        __vki_u32 f_files;
    481        __vki_u32 f_ffree;
    482        __vki_u32 f_bavail;
    483        __vki_kernel_fsid_t f_fsid;
    484        __vki_u32 f_namelen;
    485        __vki_u32 f_spare[6];
    486 };
    487 
    488 //----------------------------------------------------------------------
    489 // From linux-2.6.35.9/include/asm-mips/termios.h
    490 //----------------------------------------------------------------------
    491 
    492 struct vki_winsize {
    493        unsigned short ws_row;
    494        unsigned short ws_col;
    495        unsigned short ws_xpixel;
    496        unsigned short ws_ypixel;
    497 };
    498 
    499 #define NCC     8
    500 #define NCCS    23
    501 struct vki_termio {
    502        unsigned short c_iflag;      /* input mode flags */
    503        unsigned short c_oflag;      /* output mode flags */
    504        unsigned short c_cflag;      /* control mode flags */
    505        unsigned short c_lflag;      /* local mode flags */
    506        char           c_line;       /* line discipline */
    507        unsigned char  c_cc[NCCS];   /* control characters */
    508 };
    509 
    510 //----------------------------------------------------------------------
    511 // From linux-2.6.35.9/include/asm-mips/termbits.h
    512 //----------------------------------------------------------------------
    513 
    514 typedef unsigned char   vki_cc_t;
    515 typedef unsigned long   vki_speed_t;
    516 typedef unsigned long   vki_tcflag_t;
    517 
    518 struct vki_termios {
    519        vki_tcflag_t c_iflag;        /* input mode flags */
    520        vki_tcflag_t c_oflag;        /* output mode flags */
    521        vki_tcflag_t c_cflag;        /* control mode flags */
    522        vki_tcflag_t c_lflag;        /* local mode flags */
    523        vki_cc_t c_line;             /* line discipline */
    524        vki_cc_t c_cc[NCCS];         /* control characters */
    525 };
    526 
    527 //----------------------------------------------------------------------
    528 // From linux-2.6.35.9/include/asm-mips/ioctl.h
    529 //----------------------------------------------------------------------
    530 
    531 #define _VKI_IOC_NRBITS     8
    532 #define _VKI_IOC_TYPEBITS   8
    533 #define _VKI_IOC_SIZEBITS   13
    534 #define _VKI_IOC_DIRBITS    3
    535 
    536 #define _VKI_IOC_NRMASK     ((1 << _VKI_IOC_NRBITS)-1)
    537 #define _VKI_IOC_TYPEMASK   ((1 << _VKI_IOC_TYPEBITS)-1)
    538 #define _VKI_IOC_SIZEMASK   ((1 << _VKI_IOC_SIZEBITS)-1)
    539 #define _VKI_IOC_DIRMASK    ((1 << _VKI_IOC_DIRBITS)-1)
    540 
    541 #define _VKI_IOC_NRSHIFT    0
    542 #define _VKI_IOC_TYPESHIFT  (_VKI_IOC_NRSHIFT+_VKI_IOC_NRBITS)
    543 #define _VKI_IOC_SIZESHIFT  (_VKI_IOC_TYPESHIFT+_VKI_IOC_TYPEBITS)
    544 #define _VKI_IOC_DIRSHIFT   (_VKI_IOC_SIZESHIFT+_VKI_IOC_SIZEBITS)
    545 
    546 #define _VKI_IOC_NONE   1U
    547 #define _VKI_IOC_READ   2U
    548 #define _VKI_IOC_WRITE  4U
    549 
    550 #define _VKI_IOC(dir,type,nr,size) \
    551                 (((dir)  << _VKI_IOC_DIRSHIFT) | \
    552                 ((type) << _VKI_IOC_TYPESHIFT) | \
    553                 ((nr)   << _VKI_IOC_NRSHIFT) | \
    554                 ((size) << _VKI_IOC_SIZESHIFT))
    555 
    556 /* provoke compile error for invalid uses of size argument */
    557 extern unsigned int __VKI_invalid_size_argument_for_IOC;
    558 /* used to create numbers */
    559 #define _VKI_IO(type,nr)        _VKI_IOC(_VKI_IOC_NONE,(type),(nr),0)
    560 #define _VKI_IOR(type,nr,size)  _VKI_IOC(_VKI_IOC_READ,(type),(nr), \
    561                                 (_VKI_IOC_TYPECHECK(size)))
    562 #define _VKI_IOW(type,nr,size)  _VKI_IOC(_VKI_IOC_WRITE,(type),(nr), \
    563                                 (_VKI_IOC_TYPECHECK(size)))
    564 #define _VKI_IOWR(type,nr,size) _VKI_IOC(_VKI_IOC_READ|_VKI_IOC_WRITE,(type), \
    565                                 (nr),(_VKI_IOC_TYPECHECK(size)))
    566 
    567 /* used to decode ioctl numbers.. */
    568 #define _VKI_IOC_DIR(nr)    (((nr) >> _VKI_IOC_DIRSHIFT) & _VKI_IOC_DIRMASK)
    569 #define _VKI_IOC_TYPE(nr)   (((nr) >> _VKI_IOC_TYPESHIFT) & _VKI_IOC_TYPEMASK)
    570 #define _VKI_IOC_NR(nr)     (((nr) >> _VKI_IOC_NRSHIFT) & _VKI_IOC_NRMASK)
    571 #define _VKI_IOC_SIZE(nr)   (((nr) >> _VKI_IOC_SIZESHIFT) & _VKI_IOC_SIZEMASK)
    572 
    573 //----------------------------------------------------------------------
    574 // From linux-2.6.35.9/include/asm-mips/ioctls.h
    575 //----------------------------------------------------------------------
    576 
    577 #define VKI_TCGETA              0x5401
    578 #define VKI_TCSETA              0x5402 /* Clashes with SNDCTL_TMR_START
    579                                           sound ioctl */
    580 #define VKI_TCSETAW             0x5403
    581 #define VKI_TCSETAF             0x5404
    582 
    583 #define VKI_TCSBRK              0x5405
    584 #define VKI_TCXONC              0x5406
    585 #define VKI_TCFLSH              0x5407
    586 
    587 #define VKI_TCGETS              0x540d
    588 #define VKI_TCSETS              0x540e
    589 #define VKI_TCSETSW             0x540f
    590 #define VKI_TCSETSF             0x5410
    591 
    592 #define VKI_TIOCEXCL            0x740d  /* set exclusive use of tty */
    593 #define VKI_TIOCNXCL            0x740e  /* reset exclusive use of tty */
    594 #define VKI_TIOCOUTQ            0x7472  /* output queue size */
    595 #define VKI_TIOCSTI             0x5472  /* simulate terminal input */
    596 #define VKI_TIOCMGET            0x741d  /* get all modem bits */
    597 #define VKI_TIOCMBIS            0x741b  /* bis modem bits */
    598 #define VKI_TIOCMBIC            0x741c  /* bic modem bits */
    599 #define VKI_TIOCMSET            0x741a  /* set all modem bits */
    600 #define VKI_TIOCPKT             0x5470  /* pty: set/clear packet mode */
    601 #define VKI_TIOCPKT_DATA        0x00    /* data packet */
    602 #define VKI_TIOCPKT_FLUSHREAD   0x01    /* flush packet */
    603 #define VKI_TIOCPKT_FLUSHWRITE  0x02    /* flush packet */
    604 #define VKI_TIOCPKT_STOP        0x04    /* stop output */
    605 #define VKI_TIOCPKT_START       0x08    /* start output */
    606 #define VKI_TIOCPKT_NOSTOP      0x10    /* no more ^S, ^Q */
    607 #define VKI_TIOCPKT_DOSTOP      0x20    /* now do ^S ^Q */
    608 
    609 /* set window size */
    610 #define VKI_TIOCSWINSZ          _VKI_IOW('t', 103, struct vki_winsize)
    611 /* get window size */
    612 #define VKI_TIOCGWINSZ          _VKI_IOR('t', 104, struct vki_winsize)
    613 #define VKI_TIOCNOTTY           0x5471 /* void tty association */
    614 #define VKI_TIOCSETD            0x7401
    615 #define VKI_TIOCGETD            0x7400
    616 
    617 #define VKI_FIOCLEX             0x6601
    618 #define VKI_FIONCLEX            0x6602
    619 #define VKI_FIOASYNC            0x667d
    620 #define VKI_FIONBIO             0x667e
    621 #define VKI_FIOQSIZE            0x667f
    622 
    623 #define VKI_TIOCGLTC            0x7474 /* get special local chars */
    624 #define VKI_TIOCSLTC            0x7475 /* set special local chars */
    625 #define VKI_TIOCSPGRP           _VKI_IOW('t', 118, int) /* set pgrp of tty */
    626 #define VKI_TIOCGPGRP           _VKI_IOR('t', 119, int) /* get pgrp of tty */
    627 #define VKI_TIOCCONS            _VKI_IOW('t', 120, int) /* become virtual
    628                                                            console */
    629 
    630 #define VKI_FIONREAD            0x467f
    631 #define VKI_TIOCINQ             FIONREAD
    632 
    633 #define VKI_TIOCGETP            0x7408
    634 #define VKI_TIOCSETP            0x7409
    635 #define VKI_TIOCSETN            0x740a /* TIOCSETP wo flush */
    636 
    637 #define VKI_TIOCSBRK            0x5427 /* BSD compatibility */
    638 #define VKI_TIOCCBRK            0x5428 /* BSD compatibility */
    639 #define VKI_TIOCGSID            0x7416 /* Return the session ID of FD */
    640 #define VKI_TIOCGPTN            _VKI_IOR('T',0x30, unsigned int) /* Get Pty
    641                                                    Number (of pty-mux device) */
    642 #define VKI_TIOCSPTLCK          _VKI_IOW('T',0x31, int) /* Lock/unlock Pty */
    643 
    644 /* I hope the range from 0x5480 on is free ... */
    645 #define VKI_TIOCSCTTY           0x5480 /* become controlling tty */
    646 #define VKI_TIOCGSOFTCAR        0x5481
    647 #define VKI_TIOCSSOFTCAR        0x5482
    648 #define VKI_TIOCLINUX           0x5483
    649 #define VKI_TIOCGSERIAL         0x5484
    650 #define VKI_TIOCSSERIAL         0x5485
    651 #define VKI_TCSBRKP             0x5486 /* Needed for POSIX tcsendbreak() */
    652 #define VKI_TIOCSERCONFIG       0x5488
    653 #define VKI_TIOCSERGWILD        0x5489
    654 #define VKI_TIOCSERSWILD        0x548a
    655 #define VKI_TIOCGLCKTRMIOS      0x548b
    656 #define VKI_TIOCSLCKTRMIOS      0x548c
    657 #define VKI_TIOCSERGSTRUCT      0x548d /* For debugging only */
    658 #define VKI_TIOCSERGETLSR       0x548e /* Get line status register */
    659 #define VKI_TIOCSERGETMULTI     0x548f /* Get multiport config  */
    660 #define VKI_TIOCSERSETMULTI     0x5490 /* Set multiport config */
    661 #define VKI_TIOCMIWAIT          0x5491 /* wait for a change on serial input
    662                                           line(s) */
    663 #define VKI_TIOCGICOUNT         0x5492 /* read serial port inline interrupt
    664                                           counts */
    665 #define VKI_TIOCGHAYESESP       0x5493 /* Get Hayes ESP configuration */
    666 #define VKI_TIOCSHAYESESP       0x5494 /* Set Hayes ESP configuration */
    667 
    668 //----------------------------------------------------------------------
    669 // From asm-generic/poll.h
    670 //----------------------------------------------------------------------
    671 
    672 /* These are specified by iBCS2 */
    673 #define VKI_POLLIN              0x0001
    674 
    675 struct vki_pollfd {
    676        int fd;
    677        short events;
    678        short revents;
    679 };
    680 //----------------------------------------------------------------------
    681 // From linux-2.6.35.9/include/asm-mips/elf.h
    682 //----------------------------------------------------------------------
    683 
    684 #define VKI_ELF_NGREG           45  /* includes nip, msr, lr, etc. */
    685 #define VKI_ELF_NFPREG          33  /* includes fpscr */
    686 
    687 typedef unsigned long vki_elf_greg_t;
    688 typedef vki_elf_greg_t vki_elf_gregset_t[VKI_ELF_NGREG];
    689 
    690 typedef double vki_elf_fpreg_t;
    691 typedef vki_elf_fpreg_t vki_elf_fpregset_t[VKI_ELF_NFPREG];
    692 
    693 typedef struct vki_user_fxsr_struct vki_elf_fpxregset_t;
    694 
    695 #define VKI_AT_SYSINFO          32
    696 //----------------------------------------------------------------------
    697 // From linux-2.6.35.9/include/asm-mips/ucontext.h
    698 //----------------------------------------------------------------------
    699 
    700 struct vki_ucontext {
    701        unsigned long          uc_flags;
    702        struct vki_ucontext    *uc_link;
    703        vki_stack_t            uc_stack;
    704        struct vki_sigcontext  uc_mcontext;
    705        vki_sigset_t           uc_sigmask;  /* mask last for extensibility */
    706 };
    707 
    708 //----------------------------------------------------------------------
    709 // From linux-2.6.35.9/include/asm-mips/ipcbuf.h
    710 //----------------------------------------------------------------------
    711 
    712 struct vki_ipc64_perm {
    713        __vki_kernel_key_t  key;
    714        __vki_kernel_uid_t  uid;
    715        __vki_kernel_gid_t  gid;
    716        __vki_kernel_uid_t  cuid;
    717        __vki_kernel_gid_t  cgid;
    718        __vki_kernel_mode_t mode;
    719        unsigned short  seq;
    720        unsigned short  __pad1;
    721        unsigned long   __unused1;
    722        unsigned long   __unused2;
    723 };
    724 
    725 //----------------------------------------------------------------------
    726 // From linux-2.6.35.9/include/asm-mips/sembuf.h
    727 //----------------------------------------------------------------------
    728 
    729 struct vki_semid64_ds {
    730        struct vki_ipc64_perm sem_perm;         /* permissions .. see ipc.h */
    731        __vki_kernel_time_t sem_otime;          /* last semop time */
    732        __vki_kernel_time_t sem_ctime;          /* last change time */
    733        unsigned long   sem_nsems;              /* no. of semaphores in array */
    734        unsigned long   __unused1;
    735        unsigned long   __unused2;
    736 };
    737 
    738 //----------------------------------------------------------------------
    739 // From linux-2.6.35.9/include/asm-mips/msgbuf.h
    740 //----------------------------------------------------------------------
    741 
    742 struct vki_msqid64_ds {
    743        struct vki_ipc64_perm msg_perm;
    744        __vki_kernel_time_t msg_stime;     /* last msgsnd time */
    745        __vki_kernel_time_t msg_rtime;     /* last msgrcv time */
    746        __vki_kernel_time_t msg_ctime;     /* last change time */
    747        unsigned long  msg_cbytes;         /* current number of bytes on queue */
    748        unsigned long  msg_qnum;           /* number of messages in queue */
    749        unsigned long  msg_qbytes;         /* max number of bytes on queue */
    750        __vki_kernel_pid_t msg_lspid;      /* pid of last msgsnd */
    751        __vki_kernel_pid_t msg_lrpid;      /* last receive pid */
    752        unsigned long  __unused4;
    753        unsigned long  __unused5;
    754 };
    755 
    756 //----------------------------------------------------------------------
    757 // From linux-2.6.35.9/include/asm-mips/ipc.h
    758 //----------------------------------------------------------------------
    759 
    760 struct vki_ipc_kludge {
    761        struct vki_msgbuf __user *msgp;
    762        long msgtyp;
    763 };
    764 
    765 #define VKI_SEMOP            1
    766 #define VKI_SEMGET           2
    767 #define VKI_SEMCTL           3
    768 #define VKI_SEMTIMEDOP       4
    769 #define VKI_MSGSND          11
    770 #define VKI_MSGRCV          12
    771 #define VKI_MSGGET          13
    772 #define VKI_MSGCTL          14
    773 #define VKI_SHMAT           21
    774 #define VKI_SHMDT           22
    775 #define VKI_SHMGET          23
    776 #define VKI_SHMCTL          24
    777 
    778 //----------------------------------------------------------------------
    779 // From linux-2.6.35.9/include/asm-mips/shmbuf.h
    780 //----------------------------------------------------------------------
    781 
    782 struct vki_shmid64_ds {
    783        struct vki_ipc64_perm       shm_perm;       /* operation perms */
    784        vki_size_t                  shm_segsz;      /* size of segment (bytes) */
    785        __vki_kernel_time_t         shm_atime;      /* last attach time */
    786        __vki_kernel_time_t         shm_dtime;      /* last detach time */
    787        __vki_kernel_time_t         shm_ctime;      /* last change time */
    788        __vki_kernel_pid_t          shm_cpid;       /* pid of creator */
    789        __vki_kernel_pid_t          shm_lpid;       /* pid of last operator */
    790        unsigned long               shm_nattch;     /* no. of current attaches */
    791        unsigned long               __unused1;
    792        unsigned long               __unused2;
    793 };
    794 
    795 struct vki_shminfo64 {
    796        unsigned long   shmmax;
    797        unsigned long   shmmin;
    798        unsigned long   shmmni;
    799        unsigned long   shmseg;
    800        unsigned long   shmall;
    801        unsigned long   __unused1;
    802        unsigned long   __unused2;
    803        unsigned long   __unused3;
    804        unsigned long   __unused4;
    805 };
    806 
    807 //----------------------------------------------------------------------
    808 // From linux-2.6.35.9/include/asm-mips/ptrace.h
    809 //----------------------------------------------------------------------
    810 
    811 struct vki_pt_regs {
    812 #ifdef CONFIG_32BIT
    813         /* Pad bytes for argument save space on the stack. */
    814        unsigned long pad0[6];
    815 #endif
    816 
    817        /* Saved main processor registers. */
    818        unsigned long regs[32];
    819 
    820        /* Saved special registers. */
    821        unsigned long cp0_status;
    822        unsigned long hi;
    823        unsigned long lo;
    824 #ifdef CONFIG_CPU_HAS_SMARTMIPS
    825        unsigned long acx;
    826 #endif
    827        unsigned long cp0_badvaddr;
    828        unsigned long cp0_cause;
    829        unsigned long cp0_epc;
    830 #ifdef CONFIG_MIPS_MT_SMTC
    831        unsigned long cp0_tcstatus;
    832 #endif /* CONFIG_MIPS_MT_SMTC */
    833 #ifdef CONFIG_CPU_CAVIUM_OCTEON
    834        unsigned long long mpl[3];        /* MTM{0,1,2} */
    835        unsigned long long mtp[3];        /* MTP{0,1,2} */
    836 #endif
    837 } __attribute__ ((aligned (8)));
    838 
    839 
    840 #define vki_user_regs_struct vki_pt_regs
    841 
    842 #define MIPS_lo     lo
    843 #define MIPS_hi     hi
    844 #define MIPS_r31    regs[31]
    845 #define MIPS_r30    regs[30]
    846 #define MIPS_r29    regs[29]
    847 #define MIPS_r28    regs[28]
    848 #define MIPS_r27    regs[27]
    849 #define MIPS_r26    regs[26]
    850 #define MIPS_r25    regs[25]
    851 #define MIPS_r24    regs[24]
    852 #define MIPS_r23    regs[23]
    853 #define MIPS_r22    regs[22]
    854 #define MIPS_r21    regs[21]
    855 #define MIPS_r20    regs[20]
    856 #define MIPS_r19    regs[19]
    857 #define MIPS_r18    regs[18]
    858 #define MIPS_r17    regs[17]
    859 #define MIPS_r16    regs[16]
    860 #define MIPS_r15    regs[15]
    861 #define MIPS_r14    regs[14]
    862 #define MIPS_r13    regs[13]
    863 #define MIPS_r12    regs[12]
    864 #define MIPS_r11    regs[11]
    865 #define MIPS_r10    regs[10]
    866 #define MIPS_r9     regs[9]
    867 #define MIPS_r8     regs[8]
    868 #define MIPS_r7     regs[7]
    869 #define MIPS_r6     regs[6]
    870 #define MIPS_r5     regs[5]
    871 #define MIPS_r4     regs[4]
    872 #define MIPS_r3     regs[3]
    873 #define MIPS_r2     regs[2]
    874 #define MIPS_r1     regs[1]
    875 #define MIPS_r0     regs[0]
    876 
    877 //----------------------------------------------------------------------
    878 // From linux-2.6.35.9/include/asm-i386/ptrace.h
    879 //----------------------------------------------------------------------
    880 
    881 #define VKI_PTRACE_GETREGS            12
    882 #define VKI_PTRACE_SETREGS            13
    883 #define VKI_PTRACE_GETFPREGS          14
    884 #define VKI_PTRACE_SETFPREGS          15
    885 #define VKI_PTRACE_GETFPXREGS         18
    886 #define VKI_PTRACE_SETFPXREGS         19
    887 
    888 /* Calls to trace a 64bit program from a 32bit program.  */
    889 #define VKI_PTRACE_PEEKTEXT_3264    0xc0
    890 #define VKI_PTRACE_PEEKDATA_3264    0xc1
    891 #define VKI_PTRACE_POKETEXT_3264    0xc2
    892 #define VKI_PTRACE_POKEDATA_3264    0xc3
    893 #define VKI_PTRACE_GET_THREAD_AREA_3264     0xc4s
    894 
    895 //----------------------------------------------------------------------
    896 // From linux-2.6.35.9/include/asm-generic/siginfo.h
    897 //----------------------------------------------------------------------
    898 
    899 #define HAVE_ARCH_SIGINFO_T
    900 typedef union vki_sigval {
    901         int sival_int;
    902         void __user *sival_ptr;
    903 } vki_sigval_t;
    904 
    905 #ifndef __VKI_ARCH_SI_PREAMBLE_SIZE
    906 #define __VKI_ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int))
    907 #endif
    908 
    909 #define VKI_SI_MAX_SIZE 128
    910 
    911 #ifndef VKI_SI_PAD_SIZE
    912 #define VKI_SI_PAD_SIZE ((VKI_SI_MAX_SIZE - __VKI_ARCH_SI_PREAMBLE_SIZE) / sizeof(int))
    913 #endif
    914 
    915 #ifndef __VKI_ARCH_SI_UID_T
    916 #define __VKI_ARCH_SI_UID_T vki_uid_t
    917 #endif
    918 
    919 #ifndef __VKI_ARCH_SI_BAND_T
    920 #define __VKI_ARCH_SI_BAND_T long
    921 #endif
    922 
    923 typedef struct vki_siginfo {
    924         int si_signo;
    925         int si_code;
    926         int si_errno;
    927         int __pad0[VKI_SI_MAX_SIZE / sizeof(int) - VKI_SI_PAD_SIZE - 3];
    928 
    929         union {
    930                 int _pad[VKI_SI_PAD_SIZE];
    931 
    932                 /* kill() */
    933                 struct {
    934                         vki_pid_t _pid;             /* sender's pid */
    935                         __VKI_ARCH_SI_UID_T _uid;   /* sender's uid */
    936                 } _kill;
    937 
    938                 /* POSIX.1b timers */
    939                 struct {
    940                         vki_timer_t _tid;           /* timer id */
    941                         int _overrun;           /* overrun count */
    942                         char _pad[sizeof( __VKI_ARCH_SI_UID_T) - sizeof(int)];
    943                         vki_sigval_t _sigval;       /* same as below */
    944                         int _sys_private;       /* not to be passed to user */
    945                 } _timer;
    946 
    947                 /* POSIX.1b signals */
    948                 struct {
    949                         vki_pid_t _pid;             /* sender's pid */
    950                         __VKI_ARCH_SI_UID_T _uid;   /* sender's uid */
    951                         vki_sigval_t _sigval;
    952                 } _rt;
    953 
    954                 /* SIGCHLD */
    955                 struct {
    956                         vki_pid_t _pid;             /* which child */
    957                         __VKI_ARCH_SI_UID_T _uid;   /* sender's uid */
    958                         int _status;            /* exit code */
    959                         vki_clock_t _utime;
    960                         vki_clock_t _stime;
    961                 } _sigchld;
    962 
    963                 /* IRIX SIGCHLD */
    964                 struct {
    965                         vki_pid_t _pid;             /* which child */
    966                         vki_clock_t _utime;
    967                         int _status;            /* exit code */
    968                         vki_clock_t _stime;
    969                 } _irix_sigchld;
    970 
    971                 /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
    972                 struct {
    973                         void __user *_addr; /* faulting insn/memory ref. */
    974 #ifdef __ARCH_SI_TRAPNO
    975                         int _trapno;    /* TRAP # which caused the signal */
    976 #endif
    977                 } _sigfault;
    978 
    979                 /* SIGPOLL, SIGXFSZ (To do ...)  */
    980                 struct {
    981                         __VKI_ARCH_SI_BAND_T _band; /* POLL_IN, POLL_OUT, POLL_MSG */
    982                         int _fd;
    983                 } _sigpoll;
    984         } _sifields;
    985 } vki_siginfo_t;
    986 
    987 //----------------------------------------------------------------------
    988 // From linux-2.6.35.5/include/asm/break.h
    989 //----------------------------------------------------------------------
    990 #define VKI_BRK_OVERFLOW 6  /* Overflow check */
    991 #define VKI_BRK_DIVZERO  7  /* Divide by zero check */
    992 
    993 //----------------------------------------------------------------------
    994 // From linux-3.6.35.5/arch/mips/include/socket.h
    995 //----------------------------------------------------------------------
    996 enum vki_sock_type {
    997         VKI_SOCK_STREAM = 2,
    998         // [[others omitted]]
    999 };
   1000 #define ARCH_HAS_SOCKET_TYPES 1
   1001 
   1002 //----------------------------------------------------------------------
   1003 // From linux-3.13.0/include/asm/errno.h
   1004 //----------------------------------------------------------------------
   1005 
   1006 #define	VKI_ENOSYS       89  /* Function not implemented */
   1007 #define	VKI_EOVERFLOW    79  /* Value too large for defined data type */
   1008 
   1009 #endif // __VKI_MIPS64_LINUX_H
   1010 
   1011 /*--------------------------------------------------------------------*/
   1012 /*--- end                                       vki-mips64-linux.h ---*/
   1013 /*--------------------------------------------------------------------*/
   1014