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