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-2017 RT-RK
11       mips-valgrind@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 /* MIPS64 uses runtime pagesize detection */
84 extern UWord VKI_PAGE_SHIFT;
85 extern UWord VKI_PAGE_SIZE;
86 #define VKI_PAGE_MASK           (~(VKI_PAGE_SIZE-1))
87 #define VKI_MAX_PAGE_SHIFT      16
88 #define VKI_MAX_PAGE_SIZE       (1UL << VKI_MAX_PAGE_SHIFT)
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   (__SIZEOF_LONG__ * 8)
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_OFD_GETLK     36
352 #define VKI_F_OFD_SETLK     37
353 #define VKI_F_OFD_SETLKW    38
354 
355 #define VKI_F_GETLK64       33          /*  using 'struct flock64' */
356 #define VKI_F_SETLK64       34
357 #define VKI_F_SETLKW64      35
358 
359 /* for F_[GET|SET]FL */
360 #define VKI_FD_CLOEXEC      1      /* actually anything with low bit set goes */
361 
362 #define VKI_F_LINUX_SPECIFIC_BASE 1024
363 
364 struct vki_f_owner_ex {
365        int type;
366        __vki_kernel_pid_t pid;
367 };
368 
369 //----------------------------------------------------------------------
370 // From linux-2.6.35.9/include/asm-mips/resource.h
371 //----------------------------------------------------------------------
372 
373 #define VKI_RLIMIT_DATA     2   /* max data size */
374 #define VKI_RLIMIT_STACK    3   /* max stack size */
375 #define VKI_RLIMIT_CORE     4   /* max core file size */
376 #define VKI_RLIMIT_NOFILE   5   /* max number of open files */
377 
378 //----------------------------------------------------------------------
379 // From linux-2.6.35.9/include/asm-mips/socket.h
380 //----------------------------------------------------------------------
381 
382 #define VKI_SOL_SOCKET   0xffff
383 
384 #define VKI_SO_TYPE      0x1008
385 
386 #define VKI_SO_ATTACH_FILTER	26
387 
388 //----------------------------------------------------------------------
389 // From linux-2.6.35.9/include/asm-i386/sockios.h
390 //----------------------------------------------------------------------
391 
392 #define VKI_SIOCATMARK          _VKI_IOR('s', 7, int)
393 #define VKI_SIOCSPGRP           _VKI_IOW('s', 8, vki_pid_t)
394 #define VKI_SIOCGPGRP           _VKI_IOR('s', 9, vki_pid_t)
395 #define VKI_SIOCGSTAMP          0x8906      /* Get stamp (timeval) */
396 #define VKI_SIOCGSTAMPNS        0x8907      /* Get stamp (timespec) */
397 
398 //----------------------------------------------------------------------
399 // From linux-2.6.35.9/include/asm-mips/stat.h
400 //----------------------------------------------------------------------
401 
402 /* Size of kernel long is different from Valgrind MIPS n32 long size, so we have to
403 use long long instead long type. */
404 struct vki_stat {
405         unsigned int    st_dev;
406         unsigned int    st_pad0[3];     /* Reserved for st_dev expansion  */
407 
408 #if defined(VGABI_N32)
409         unsigned long long st_ino;
410 #else
411         unsigned long   st_ino;
412 #endif
413 
414         int             st_mode;
415         unsigned int    st_nlink;
416 
417         unsigned int    st_uid;
418         unsigned int    st_gid;
419 
420         unsigned int    st_rdev;
421         unsigned int    st_pad1[3];     /* Reserved for st_rdev expansion  */
422 
423 #if defined(VGABI_N32)
424         long long       st_size;
425 #else
426         long            st_size;
427 #endif
428 
429         /*
430          * Actually this should be timestruc_t st_atime, st_mtime and st_ctime
431          * but we don't have it under Linux.
432          */
433         unsigned int    st_atime;
434         unsigned int    st_atime_nsec;  /* Reserved for st_atime expansion  */
435 
436         unsigned int    st_mtime;
437         unsigned int    st_mtime_nsec;  /* Reserved for st_mtime expansion  */
438 
439         unsigned int    st_ctime;
440         unsigned int    st_ctime_nsec;  /* Reserved for st_ctime expansion  */
441 
442         unsigned int    st_blksize;
443         unsigned int    st_pad2;
444 
445         long long       st_blocks;
446 };
447 
448 struct vki_stat64 {
449         unsigned long   st_dev;
450         unsigned long   st_pad0[3];     /* Reserved for st_dev expansion  */
451 
452         unsigned long long      st_ino;
453 
454         int             st_mode;
455         unsigned int    st_nlink;
456 
457         unsigned int    st_uid;
458         unsigned int    st_gid;
459 
460         unsigned long   st_rdev;
461         unsigned long   st_pad1[3];     /* Reserved for st_rdev expansion  */
462 
463         long long       st_size;
464 
465         /*
466          * Actually this should be timestruc_t st_atime, st_mtime and st_ctime
467          * but we don't have it under Linux.
468          */
469         unsigned long   st_atime;
470         unsigned long   st_atime_nsec;  /* Reserved for st_atime expansion  */
471 
472         unsigned long   st_mtime;
473         unsigned long   st_mtime_nsec;  /* Reserved for st_mtime expansion  */
474 
475         unsigned long   st_ctime;
476         unsigned long   st_ctime_nsec;  /* Reserved for st_ctime expansion  */
477 
478         unsigned long   st_blksize;
479         unsigned long   st_pad2;
480 
481         long long       st_blocks;
482 };
483 
484 //----------------------------------------------------------------------
485 // From linux-2.6.35.9/include/asm-mips/statfs.h
486 //----------------------------------------------------------------------
487 
488 struct vki_statfs {
489        __vki_u32 f_type;
490 #define f_fstyp f_type
491        __vki_u32 f_bsize;
492        __vki_u32 f_frsize;
493        __vki_u32 f_blocks;
494        __vki_u32 f_bfree;
495        __vki_u32 f_files;
496        __vki_u32 f_ffree;
497        __vki_u32 f_bavail;
498        __vki_kernel_fsid_t f_fsid;
499        __vki_u32 f_namelen;
500        __vki_u32 f_spare[6];
501 };
502 
503 //----------------------------------------------------------------------
504 // From linux-2.6.35.9/include/asm-mips/termios.h
505 //----------------------------------------------------------------------
506 
507 struct vki_winsize {
508        unsigned short ws_row;
509        unsigned short ws_col;
510        unsigned short ws_xpixel;
511        unsigned short ws_ypixel;
512 };
513 
514 #define NCC     8
515 #define NCCS    23
516 struct vki_termio {
517        unsigned short c_iflag;      /* input mode flags */
518        unsigned short c_oflag;      /* output mode flags */
519        unsigned short c_cflag;      /* control mode flags */
520        unsigned short c_lflag;      /* local mode flags */
521        char           c_line;       /* line discipline */
522        unsigned char  c_cc[NCCS];   /* control characters */
523 };
524 
525 //----------------------------------------------------------------------
526 // From linux-2.6.35.9/include/asm-mips/termbits.h
527 //----------------------------------------------------------------------
528 
529 typedef unsigned char   vki_cc_t;
530 typedef unsigned long   vki_speed_t;
531 typedef unsigned long   vki_tcflag_t;
532 
533 struct vki_termios {
534        vki_tcflag_t c_iflag;        /* input mode flags */
535        vki_tcflag_t c_oflag;        /* output mode flags */
536        vki_tcflag_t c_cflag;        /* control mode flags */
537        vki_tcflag_t c_lflag;        /* local mode flags */
538        vki_cc_t c_line;             /* line discipline */
539        vki_cc_t c_cc[NCCS];         /* control characters */
540 };
541 
542 //----------------------------------------------------------------------
543 // From linux-2.6.35.9/include/asm-mips/ioctl.h
544 //----------------------------------------------------------------------
545 
546 #define _VKI_IOC_NRBITS     8
547 #define _VKI_IOC_TYPEBITS   8
548 #define _VKI_IOC_SIZEBITS   13
549 #define _VKI_IOC_DIRBITS    3
550 
551 #define _VKI_IOC_NRMASK     ((1 << _VKI_IOC_NRBITS)-1)
552 #define _VKI_IOC_TYPEMASK   ((1 << _VKI_IOC_TYPEBITS)-1)
553 #define _VKI_IOC_SIZEMASK   ((1 << _VKI_IOC_SIZEBITS)-1)
554 #define _VKI_IOC_DIRMASK    ((1 << _VKI_IOC_DIRBITS)-1)
555 
556 #define _VKI_IOC_NRSHIFT    0
557 #define _VKI_IOC_TYPESHIFT  (_VKI_IOC_NRSHIFT+_VKI_IOC_NRBITS)
558 #define _VKI_IOC_SIZESHIFT  (_VKI_IOC_TYPESHIFT+_VKI_IOC_TYPEBITS)
559 #define _VKI_IOC_DIRSHIFT   (_VKI_IOC_SIZESHIFT+_VKI_IOC_SIZEBITS)
560 
561 #define _VKI_IOC_NONE   1U
562 #define _VKI_IOC_READ   2U
563 #define _VKI_IOC_WRITE  4U
564 
565 #define _VKI_IOC(dir,type,nr,size) \
566                 (((dir)  << _VKI_IOC_DIRSHIFT) | \
567                 ((type) << _VKI_IOC_TYPESHIFT) | \
568                 ((nr)   << _VKI_IOC_NRSHIFT) | \
569                 ((size) << _VKI_IOC_SIZESHIFT))
570 
571 /* provoke compile error for invalid uses of size argument */
572 extern unsigned int __VKI_invalid_size_argument_for_IOC;
573 /* used to create numbers */
574 #define _VKI_IO(type,nr)        _VKI_IOC(_VKI_IOC_NONE,(type),(nr),0)
575 #define _VKI_IOR(type,nr,size)  _VKI_IOC(_VKI_IOC_READ,(type),(nr), \
576                                 (_VKI_IOC_TYPECHECK(size)))
577 #define _VKI_IOW(type,nr,size)  _VKI_IOC(_VKI_IOC_WRITE,(type),(nr), \
578                                 (_VKI_IOC_TYPECHECK(size)))
579 #define _VKI_IOWR(type,nr,size) _VKI_IOC(_VKI_IOC_READ|_VKI_IOC_WRITE,(type), \
580                                 (nr),(_VKI_IOC_TYPECHECK(size)))
581 
582 /* used to decode ioctl numbers.. */
583 #define _VKI_IOC_DIR(nr)    (((nr) >> _VKI_IOC_DIRSHIFT) & _VKI_IOC_DIRMASK)
584 #define _VKI_IOC_TYPE(nr)   (((nr) >> _VKI_IOC_TYPESHIFT) & _VKI_IOC_TYPEMASK)
585 #define _VKI_IOC_NR(nr)     (((nr) >> _VKI_IOC_NRSHIFT) & _VKI_IOC_NRMASK)
586 #define _VKI_IOC_SIZE(nr)   (((nr) >> _VKI_IOC_SIZESHIFT) & _VKI_IOC_SIZEMASK)
587 
588 //----------------------------------------------------------------------
589 // From linux-2.6.35.9/include/asm-mips/ioctls.h
590 //----------------------------------------------------------------------
591 
592 #define VKI_TCGETA              0x5401
593 #define VKI_TCSETA              0x5402 /* Clashes with SNDCTL_TMR_START
594                                           sound ioctl */
595 #define VKI_TCSETAW             0x5403
596 #define VKI_TCSETAF             0x5404
597 
598 #define VKI_TCSBRK              0x5405
599 #define VKI_TCXONC              0x5406
600 #define VKI_TCFLSH              0x5407
601 
602 #define VKI_TCGETS              0x540d
603 #define VKI_TCSETS              0x540e
604 #define VKI_TCSETSW             0x540f
605 #define VKI_TCSETSF             0x5410
606 
607 #define VKI_TIOCEXCL            0x740d  /* set exclusive use of tty */
608 #define VKI_TIOCNXCL            0x740e  /* reset exclusive use of tty */
609 #define VKI_TIOCOUTQ            0x7472  /* output queue size */
610 #define VKI_TIOCSTI             0x5472  /* simulate terminal input */
611 #define VKI_TIOCMGET            0x741d  /* get all modem bits */
612 #define VKI_TIOCMBIS            0x741b  /* bis modem bits */
613 #define VKI_TIOCMBIC            0x741c  /* bic modem bits */
614 #define VKI_TIOCMSET            0x741a  /* set all modem bits */
615 #define VKI_TIOCPKT             0x5470  /* pty: set/clear packet mode */
616 #define VKI_TIOCPKT_DATA        0x00    /* data packet */
617 #define VKI_TIOCPKT_FLUSHREAD   0x01    /* flush packet */
618 #define VKI_TIOCPKT_FLUSHWRITE  0x02    /* flush packet */
619 #define VKI_TIOCPKT_STOP        0x04    /* stop output */
620 #define VKI_TIOCPKT_START       0x08    /* start output */
621 #define VKI_TIOCPKT_NOSTOP      0x10    /* no more ^S, ^Q */
622 #define VKI_TIOCPKT_DOSTOP      0x20    /* now do ^S ^Q */
623 
624 /* set window size */
625 #define VKI_TIOCSWINSZ          _VKI_IOW('t', 103, struct vki_winsize)
626 /* get window size */
627 #define VKI_TIOCGWINSZ          _VKI_IOR('t', 104, struct vki_winsize)
628 #define VKI_TIOCNOTTY           0x5471 /* void tty association */
629 #define VKI_TIOCSETD            0x7401
630 #define VKI_TIOCGETD            0x7400
631 
632 #define VKI_FIOCLEX             0x6601
633 #define VKI_FIONCLEX            0x6602
634 #define VKI_FIOASYNC            0x667d
635 #define VKI_FIONBIO             0x667e
636 #define VKI_FIOQSIZE            0x667f
637 
638 #define VKI_TIOCGLTC            0x7474 /* get special local chars */
639 #define VKI_TIOCSLTC            0x7475 /* set special local chars */
640 #define VKI_TIOCSPGRP           _VKI_IOW('t', 118, int) /* set pgrp of tty */
641 #define VKI_TIOCGPGRP           _VKI_IOR('t', 119, int) /* get pgrp of tty */
642 #define VKI_TIOCCONS            _VKI_IOW('t', 120, int) /* become virtual
643                                                            console */
644 
645 #define VKI_FIONREAD            0x467f
646 #define VKI_TIOCINQ             FIONREAD
647 
648 #define VKI_TIOCGETP            0x7408
649 #define VKI_TIOCSETP            0x7409
650 #define VKI_TIOCSETN            0x740a /* TIOCSETP wo flush */
651 
652 #define VKI_TIOCSBRK            0x5427 /* BSD compatibility */
653 #define VKI_TIOCCBRK            0x5428 /* BSD compatibility */
654 #define VKI_TIOCGSID            0x7416 /* Return the session ID of FD */
655 #define VKI_TIOCGPTN            _VKI_IOR('T',0x30, unsigned int) /* Get Pty
656                                                    Number (of pty-mux device) */
657 #define VKI_TIOCSPTLCK          _VKI_IOW('T',0x31, int) /* Lock/unlock Pty */
658 
659 /* I hope the range from 0x5480 on is free ... */
660 #define VKI_TIOCSCTTY           0x5480 /* become controlling tty */
661 #define VKI_TIOCGSOFTCAR        0x5481
662 #define VKI_TIOCSSOFTCAR        0x5482
663 #define VKI_TIOCLINUX           0x5483
664 #define VKI_TIOCGSERIAL         0x5484
665 #define VKI_TIOCSSERIAL         0x5485
666 #define VKI_TCSBRKP             0x5486 /* Needed for POSIX tcsendbreak() */
667 #define VKI_TIOCSERCONFIG       0x5488
668 #define VKI_TIOCSERGWILD        0x5489
669 #define VKI_TIOCSERSWILD        0x548a
670 #define VKI_TIOCGLCKTRMIOS      0x548b
671 #define VKI_TIOCSLCKTRMIOS      0x548c
672 #define VKI_TIOCSERGSTRUCT      0x548d /* For debugging only */
673 #define VKI_TIOCSERGETLSR       0x548e /* Get line status register */
674 #define VKI_TIOCSERGETMULTI     0x548f /* Get multiport config  */
675 #define VKI_TIOCSERSETMULTI     0x5490 /* Set multiport config */
676 #define VKI_TIOCMIWAIT          0x5491 /* wait for a change on serial input
677                                           line(s) */
678 #define VKI_TIOCGICOUNT         0x5492 /* read serial port inline interrupt
679                                           counts */
680 #define VKI_TIOCGHAYESESP       0x5493 /* Get Hayes ESP configuration */
681 #define VKI_TIOCSHAYESESP       0x5494 /* Set Hayes ESP configuration */
682 
683 //----------------------------------------------------------------------
684 // From asm-generic/poll.h
685 //----------------------------------------------------------------------
686 
687 /* These are specified by iBCS2 */
688 #define VKI_POLLIN              0x0001
689 
690 struct vki_pollfd {
691        int fd;
692        short events;
693        short revents;
694 };
695 //----------------------------------------------------------------------
696 // From linux-2.6.35.9/include/asm-mips/elf.h
697 //----------------------------------------------------------------------
698 
699 #define VKI_ELF_NGREG           45  /* includes nip, msr, lr, etc. */
700 #define VKI_ELF_NFPREG          33  /* includes fpscr */
701 
702 typedef unsigned long vki_elf_greg_t;
703 typedef vki_elf_greg_t vki_elf_gregset_t[VKI_ELF_NGREG];
704 
705 typedef double vki_elf_fpreg_t;
706 typedef vki_elf_fpreg_t vki_elf_fpregset_t[VKI_ELF_NFPREG];
707 
708 typedef struct vki_user_fxsr_struct vki_elf_fpxregset_t;
709 
710 #define VKI_AT_SYSINFO          32
711 //----------------------------------------------------------------------
712 // From linux-2.6.35.9/include/asm-mips/ucontext.h
713 //----------------------------------------------------------------------
714 
715 struct vki_ucontext {
716        unsigned long          uc_flags;
717        struct vki_ucontext    *uc_link;
718        vki_stack_t            uc_stack;
719        struct vki_sigcontext  uc_mcontext;
720        vki_sigset_t           uc_sigmask;  /* mask last for extensibility */
721 };
722 
723 typedef char vki_modify_ldt_t;
724 //----------------------------------------------------------------------
725 // From linux-2.6.35.9/include/asm-mips/ipcbuf.h
726 //----------------------------------------------------------------------
727 
728 struct vki_ipc64_perm {
729        __vki_kernel_key_t  key;
730        __vki_kernel_uid_t  uid;
731        __vki_kernel_gid_t  gid;
732        __vki_kernel_uid_t  cuid;
733        __vki_kernel_gid_t  cgid;
734        __vki_kernel_mode_t mode;
735        unsigned short  seq;
736        unsigned short  __pad1;
737        unsigned long   __unused1;
738        unsigned long   __unused2;
739 };
740 
741 //----------------------------------------------------------------------
742 // From linux-2.6.35.9/include/asm-mips/sembuf.h
743 //----------------------------------------------------------------------
744 
745 struct vki_semid64_ds {
746        struct vki_ipc64_perm sem_perm;         /* permissions .. see ipc.h */
747        __vki_kernel_time_t sem_otime;          /* last semop time */
748        __vki_kernel_time_t sem_ctime;          /* last change time */
749        unsigned long   sem_nsems;              /* no. of semaphores in array */
750        unsigned long   __unused1;
751        unsigned long   __unused2;
752 };
753 
754 //----------------------------------------------------------------------
755 // From linux-2.6.35.9/include/asm-mips/msgbuf.h
756 //----------------------------------------------------------------------
757 
758 struct vki_msqid64_ds {
759        struct vki_ipc64_perm msg_perm;
760        __vki_kernel_time_t msg_stime;     /* last msgsnd time */
761        __vki_kernel_time_t msg_rtime;     /* last msgrcv time */
762        __vki_kernel_time_t msg_ctime;     /* last change time */
763        unsigned long  msg_cbytes;         /* current number of bytes on queue */
764        unsigned long  msg_qnum;           /* number of messages in queue */
765        unsigned long  msg_qbytes;         /* max number of bytes on queue */
766        __vki_kernel_pid_t msg_lspid;      /* pid of last msgsnd */
767        __vki_kernel_pid_t msg_lrpid;      /* last receive pid */
768        unsigned long  __unused4;
769        unsigned long  __unused5;
770 };
771 
772 //----------------------------------------------------------------------
773 // From linux-2.6.35.9/include/asm-mips/ipc.h
774 //----------------------------------------------------------------------
775 
776 struct vki_ipc_kludge {
777        struct vki_msgbuf __user *msgp;
778        long msgtyp;
779 };
780 
781 #define VKI_SEMOP            1
782 #define VKI_SEMGET           2
783 #define VKI_SEMCTL           3
784 #define VKI_SEMTIMEDOP       4
785 #define VKI_MSGSND          11
786 #define VKI_MSGRCV          12
787 #define VKI_MSGGET          13
788 #define VKI_MSGCTL          14
789 #define VKI_SHMAT           21
790 #define VKI_SHMDT           22
791 #define VKI_SHMGET          23
792 #define VKI_SHMCTL          24
793 
794 //----------------------------------------------------------------------
795 // From linux-2.6.35.9/include/asm-mips/shmbuf.h
796 //----------------------------------------------------------------------
797 
798 struct vki_shmid64_ds {
799        struct vki_ipc64_perm       shm_perm;       /* operation perms */
800        vki_size_t                  shm_segsz;      /* size of segment (bytes) */
801        __vki_kernel_time_t         shm_atime;      /* last attach time */
802        __vki_kernel_time_t         shm_dtime;      /* last detach time */
803        __vki_kernel_time_t         shm_ctime;      /* last change time */
804        __vki_kernel_pid_t          shm_cpid;       /* pid of creator */
805        __vki_kernel_pid_t          shm_lpid;       /* pid of last operator */
806        unsigned long               shm_nattch;     /* no. of current attaches */
807        unsigned long               __unused1;
808        unsigned long               __unused2;
809 };
810 
811 struct vki_shminfo64 {
812        unsigned long   shmmax;
813        unsigned long   shmmin;
814        unsigned long   shmmni;
815        unsigned long   shmseg;
816        unsigned long   shmall;
817        unsigned long   __unused1;
818        unsigned long   __unused2;
819        unsigned long   __unused3;
820        unsigned long   __unused4;
821 };
822 
823 //----------------------------------------------------------------------
824 // From linux-2.6.35.9/include/asm-mips/ptrace.h
825 //----------------------------------------------------------------------
826 
827 struct vki_pt_regs {
828 #ifdef CONFIG_32BIT
829         /* Pad bytes for argument save space on the stack. */
830        unsigned long pad0[6];
831 #endif
832 
833        /* Saved main processor registers. */
834        unsigned long regs[32];
835 
836        /* Saved special registers. */
837        unsigned long cp0_status;
838        unsigned long hi;
839        unsigned long lo;
840 #ifdef CONFIG_CPU_HAS_SMARTMIPS
841        unsigned long acx;
842 #endif
843        unsigned long cp0_badvaddr;
844        unsigned long cp0_cause;
845        unsigned long cp0_epc;
846 #ifdef CONFIG_MIPS_MT_SMTC
847        unsigned long cp0_tcstatus;
848 #endif /* CONFIG_MIPS_MT_SMTC */
849 #ifdef CONFIG_CPU_CAVIUM_OCTEON
850        unsigned long long mpl[3];        /* MTM{0,1,2} */
851        unsigned long long mtp[3];        /* MTP{0,1,2} */
852 #endif
853 } __attribute__ ((aligned (8)));
854 
855 //----------------------------------------------------------------------
856 // From linux-4.5/arch/mips/include/uapi/asm/reg.h
857 //----------------------------------------------------------------------
858 
859 #define VKI_MIPS64_EF_R0             0
860 #define VKI_MIPS64_EF_R1             1
861 #define VKI_MIPS64_EF_R2             2
862 #define VKI_MIPS64_EF_R3             3
863 #define VKI_MIPS64_EF_R4             4
864 #define VKI_MIPS64_EF_R5             5
865 #define VKI_MIPS64_EF_R6             6
866 #define VKI_MIPS64_EF_R7             7
867 #define VKI_MIPS64_EF_R8             8
868 #define VKI_MIPS64_EF_R9             9
869 #define VKI_MIPS64_EF_R10           10
870 #define VKI_MIPS64_EF_R11           11
871 #define VKI_MIPS64_EF_R12           12
872 #define VKI_MIPS64_EF_R13           13
873 #define VKI_MIPS64_EF_R14           14
874 #define VKI_MIPS64_EF_R15           15
875 #define VKI_MIPS64_EF_R16           16
876 #define VKI_MIPS64_EF_R17           17
877 #define VKI_MIPS64_EF_R18           18
878 #define VKI_MIPS64_EF_R19           19
879 #define VKI_MIPS64_EF_R20           20
880 #define VKI_MIPS64_EF_R21           21
881 #define VKI_MIPS64_EF_R22           22
882 #define VKI_MIPS64_EF_R23           23
883 #define VKI_MIPS64_EF_R24           24
884 #define VKI_MIPS64_EF_R25           25
885 #define VKI_MIPS64_EF_R26           26
886 #define VKI_MIPS64_EF_R27           27
887 #define VKI_MIPS64_EF_R28           28
888 #define VKI_MIPS64_EF_R29           29
889 #define VKI_MIPS64_EF_R30           30
890 #define VKI_MIPS64_EF_R31           31
891 #define VKI_MIPS64_EF_LO            32
892 #define VKI_MIPS64_EF_HI            33
893 #define VKI_MIPS64_EF_CP0_EPC       34
894 #define VKI_MIPS64_EF_CP0_BADVADDR  35
895 #define VKI_MIPS64_EF_CP0_STATUS    36
896 #define VKI_MIPS64_EF_CP0_CAUSE     37
897 
898 //----------------------------------------------------------------------
899 // From linux-2.6.35.9/include/asm-i386/ptrace.h
900 //----------------------------------------------------------------------
901 
902 #define VKI_PTRACE_GETREGS            12
903 #define VKI_PTRACE_SETREGS            13
904 #define VKI_PTRACE_GETFPREGS          14
905 #define VKI_PTRACE_SETFPREGS          15
906 #define VKI_PTRACE_GETFPXREGS         18
907 #define VKI_PTRACE_SETFPXREGS         19
908 
909 /* Calls to trace a 64bit program from a 32bit program.  */
910 #define VKI_PTRACE_PEEKTEXT_3264    0xc0
911 #define VKI_PTRACE_PEEKDATA_3264    0xc1
912 #define VKI_PTRACE_POKETEXT_3264    0xc2
913 #define VKI_PTRACE_POKEDATA_3264    0xc3
914 #define VKI_PTRACE_GET_THREAD_AREA_3264     0xc4s
915 
916 //----------------------------------------------------------------------
917 // From linux-2.6.35.9/include/asm-generic/siginfo.h
918 //----------------------------------------------------------------------
919 
920 #define HAVE_ARCH_SIGINFO_T
921 typedef union vki_sigval {
922         int sival_int;
923         void __user *sival_ptr;
924 } vki_sigval_t;
925 
926 #ifndef __VKI_ARCH_SI_PREAMBLE_SIZE
927 #if defined(VGABI_64)
928  #define __VKI_ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int))
929 #elif defined(VGABI_N32)
930 #define __VKI_ARCH_SI_PREAMBLE_SIZE (3 * sizeof(int))
931 #else
932 #error unknown mips64 abi
933 #endif
934 #endif
935 
936 #define VKI_SI_MAX_SIZE 128
937 
938 #ifndef VKI_SI_PAD_SIZE
939 #define VKI_SI_PAD_SIZE ((VKI_SI_MAX_SIZE - __VKI_ARCH_SI_PREAMBLE_SIZE) / sizeof(int))
940 #endif
941 
942 #ifndef __VKI_ARCH_SI_UID_T
943 #define __VKI_ARCH_SI_UID_T vki_uid_t
944 #endif
945 
946 #ifndef __VKI_ARCH_SI_BAND_T
947 #define __VKI_ARCH_SI_BAND_T long
948 #endif
949 
950 typedef struct vki_siginfo {
951         int si_signo;
952         int si_code;
953         int si_errno;
954         int __pad0[VKI_SI_MAX_SIZE / sizeof(int) - VKI_SI_PAD_SIZE - 3];
955 
956         union {
957                 int _pad[VKI_SI_PAD_SIZE];
958 
959                 /* kill() */
960                 struct {
961                         vki_pid_t _pid;             /* sender's pid */
962                         __VKI_ARCH_SI_UID_T _uid;   /* sender's uid */
963                 } _kill;
964 
965                 /* POSIX.1b timers */
966                 struct {
967                         vki_timer_t _tid;           /* timer id */
968                         int _overrun;           /* overrun count */
969                         char _pad[sizeof( __VKI_ARCH_SI_UID_T) - sizeof(int)];
970                         vki_sigval_t _sigval;       /* same as below */
971                         int _sys_private;       /* not to be passed to user */
972                 } _timer;
973 
974                 /* POSIX.1b signals */
975                 struct {
976                         vki_pid_t _pid;             /* sender's pid */
977                         __VKI_ARCH_SI_UID_T _uid;   /* sender's uid */
978                         vki_sigval_t _sigval;
979                 } _rt;
980 
981                 /* SIGCHLD */
982                 struct {
983                         vki_pid_t _pid;             /* which child */
984                         __VKI_ARCH_SI_UID_T _uid;   /* sender's uid */
985                         int _status;            /* exit code */
986                         vki_clock_t _utime;
987                         vki_clock_t _stime;
988                 } _sigchld;
989 
990                 /* IRIX SIGCHLD */
991                 struct {
992                         vki_pid_t _pid;             /* which child */
993                         vki_clock_t _utime;
994                         int _status;            /* exit code */
995                         vki_clock_t _stime;
996                 } _irix_sigchld;
997 
998                 /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
999                 struct {
1000                         void __user *_addr; /* faulting insn/memory ref. */
1001 #ifdef __ARCH_SI_TRAPNO
1002                         int _trapno;    /* TRAP # which caused the signal */
1003 #endif
1004                 } _sigfault;
1005 
1006                 /* SIGPOLL, SIGXFSZ (To do ...)  */
1007                 struct {
1008                         __VKI_ARCH_SI_BAND_T _band; /* POLL_IN, POLL_OUT, POLL_MSG */
1009                         int _fd;
1010                 } _sigpoll;
1011         } _sifields;
1012 } vki_siginfo_t;
1013 
1014 //----------------------------------------------------------------------
1015 // From linux-2.6.35.5/include/asm/break.h
1016 //----------------------------------------------------------------------
1017 #define VKI_BRK_OVERFLOW 6  /* Overflow check */
1018 #define VKI_BRK_DIVZERO  7  /* Divide by zero check */
1019 
1020 //----------------------------------------------------------------------
1021 // From linux-3.6.35.5/arch/mips/include/socket.h
1022 //----------------------------------------------------------------------
1023 enum vki_sock_type {
1024         VKI_SOCK_STREAM = 2,
1025         // [[others omitted]]
1026 };
1027 #define ARCH_HAS_SOCKET_TYPES 1
1028 
1029 //----------------------------------------------------------------------
1030 // From linux-3.13.0/include/asm/errno.h
1031 //----------------------------------------------------------------------
1032 
1033 #define	VKI_ENOSYS       89  /* Function not implemented */
1034 #define	VKI_EOVERFLOW    79  /* Value too large for defined data type */
1035 
1036 //----------------------------------------------------------------------
1037 // From linux-3.7.0/arch/mips/include/uapi/asm/errno.h
1038 //----------------------------------------------------------------------
1039 
1040 #define VKI_EOPNOTSUPP   122 /* Operation not supported on transport
1041                                 endpoint */
1042 
1043 #endif // __VKI_MIPS64_LINUX_H
1044 
1045 /*--------------------------------------------------------------------*/
1046 /*--- end                                       vki-mips64-linux.h ---*/
1047 /*--------------------------------------------------------------------*/
1048