
/*--------------------------------------------------------------------*/
/*--- mips/Linux-specific kernel interface.     vki-mips32-linux.h ---*/
/*--------------------------------------------------------------------*/

/*
   This file is part of Valgrind, a dynamic binary instrumentation
   framework.

   Copyright (C) 2010-2017 RT-RK

   This program is free software; you can redistribute it and/or
   modify it under the terms of the GNU General Public License as
   published by the Free Software Foundation; either version 2 of the
   License, or (at your option) any later version.

   This program is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, see <http://www.gnu.org/licenses/>.

   The GNU General Public License is contained in the file COPYING.
*/

#ifndef __VKI_MIPS32_LINUX_H
#define __VKI_MIPS32_LINUX_H

#include <config.h>

// mips endian
#if defined (_MIPSEL)
#define VKI_LITTLE_ENDIAN  1
#elif defined (_MIPSEB)
#define VKI_BIG_ENDIAN  1
#endif


//----------------------------------------------------------------------
// From linux-2.6.35.5/include/asm-generic/int-ll64.h
//----------------------------------------------------------------------

typedef __signed__ char __vki_s8;
typedef unsigned char __vki_u8;

typedef __signed__ short __vki_s16;
typedef unsigned short __vki_u16;

typedef __signed__ int __vki_s32;
typedef unsigned int __vki_u32;

typedef __signed char vki_s8;
typedef unsigned char vki_u8;

typedef __signed short vki_s16;
typedef unsigned short vki_u16;

typedef __signed int vki_s32;
typedef unsigned int vki_u32;

typedef __signed__ long long __vki_s64;
typedef unsigned long long __vki_u64;


//----------------------------------------------------------------------
// From linux-2.6.35.5/include/asm-mips/page.h
//----------------------------------------------------------------------

/* MIPS32 uses runtime pagesize detection */
extern UWord VKI_PAGE_SHIFT;
extern UWord VKI_PAGE_SIZE;
#define VKI_PAGE_MASK           (~(VKI_PAGE_SIZE-1))
#define VKI_MAX_PAGE_SHIFT      16
#define VKI_MAX_PAGE_SIZE       (1UL << VKI_MAX_PAGE_SHIFT)

//----------------------------------------------------------------------
// From linux-2.6.35.9/arch/mips/include/bits/shm.h
//----------------------------------------------------------------------

#define VKI_SHMLBA  0x40000

//----------------------------------------------------------------------
// From linux-2.6.35.5/include/asm/signal.h
//----------------------------------------------------------------------

#define VKI_MINSIGSTKSZ     2048

#define VKI_SIG_BLOCK       1    /* for blocking signals */
#define VKI_SIG_UNBLOCK     2    /* for unblocking signals */
#define VKI_SIG_SETMASK     3    /* for setting the signal mask */

/* Type of a signal handler.  */
typedef void __vki_signalfn_t(int);
typedef __vki_signalfn_t __user *__vki_sighandler_t;

typedef void __vki_restorefn_t(void);
typedef __vki_restorefn_t __user *__vki_sigrestore_t;

#define VKI_SIG_DFL	((__vki_sighandler_t)0)	/* default signal handling */
#define VKI_SIG_IGN	((__vki_sighandler_t)1)	/* ignore signal */

#define _VKI_NSIG		128
#define _VKI_NSIG_BPW	32
#define _VKI_NSIG_WORDS	(_VKI_NSIG / _VKI_NSIG_BPW)

typedef unsigned long vki_old_sigset_t;		/* at least 32 bits */

typedef struct {
        unsigned long sig[_VKI_NSIG_WORDS];
} vki_sigset_t;

#define VKI_SIGHUP		 1	/* Hangup (POSIX).  */
#define VKI_SIGINT		 2	/* Interrupt (ANSI).  */
#define VKI_SIGQUIT		 3	/* Quit (POSIX).  */
#define VKI_SIGILL		 4	/* Illegal instruction (ANSI).  */
#define VKI_SIGTRAP		 5	/* Trace trap (POSIX).  */
#define VKI_SIGIOT		 6	/* IOT trap (4.2 BSD).  */
#define VKI_SIGABRT		 VKI_SIGIOT	/* Abort (ANSI).  */
#define VKI_SIGEMT		 7
#define VKI_SIGFPE		 8	/* Floating-point exception (ANSI).  */
#define VKI_SIGKILL		 9	/* Kill, unblockable (POSIX).  */
#define VKI_SIGBUS		10	/* BUS error (4.2 BSD).  */
#define VKI_SIGSEGV		11	/* Segmentation violation (ANSI).  */
#define VKI_SIGSYS		12
#define VKI_SIGPIPE		13	/* Broken pipe (POSIX).  */
#define VKI_SIGALRM		14	/* Alarm clock (POSIX).  */
#define VKI_SIGTERM		15	/* Termination (ANSI).  */
#define VKI_SIGUSR1		16	/* User-defined signal 1 (POSIX).  */
#define VKI_SIGUSR2		17	/* User-defined signal 2 (POSIX).  */
#define VKI_SIGCHLD		18	/* Child status has changed (POSIX).  */
#define VKI_SIGCLD		VKI_SIGCHLD	/* Same as SIGCHLD (System V).  */
#define VKI_SIGPWR		19	/* Power failure restart (System V).  */
#define VKI_SIGWINCH	20	/* Window size change (4.3 BSD, Sun).  */
#define VKI_SIGURG		21	/* Urgent condition on socket (4.2 BSD).  */
#define VKI_SIGIO		22	/* I/O now possible (4.2 BSD).  */
#define VKI_SIGPOLL		VKI_SIGIO	/* Pollable event occurred (System V).  */
#define VKI_SIGSTOP		23	/* Stop, unblockable (POSIX).  */
#define VKI_SIGTSTP		24	/* Keyboard stop (POSIX).  */
#define VKI_SIGCONT		25	/* Continue (POSIX).  */
#define VKI_SIGTTIN		26	/* Background read from tty (POSIX).  */
#define VKI_SIGTTOU		27	/* Background write to tty (POSIX).  */
#define VKI_SIGVTALRM	28	/* Virtual alarm clock (4.2 BSD).  */
#define VKI_SIGPROF		29	/* Profiling alarm clock (4.2 BSD).  */
#define VKI_SIGXCPU		30	/* CPU limit exceeded (4.2 BSD).  */
#define VKI_SIGXFSZ		31	/* File size limit exceeded (4.2 BSD).  */

/* These should not be considered constants from userland.  */
#define VKI_SIGRTMIN    32
// [[This was (_NSIG-1) in 2.4.X... not sure if it matters.]]
#define VKI_SIGRTMAX    _VKI_NSIG

#define VKI_SA_ONSTACK		0x08000000
#define VKI_SA_RESETHAND	0x80000000
#define VKI_SA_RESTART		0x10000000
#define VKI_SA_SIGINFO		0x00000008
#define VKI_SA_NODEFER		0x40000000
#define VKI_SA_NOCLDWAIT	0x00010000
#define VKI_SA_NOCLDSTOP	0x00000001

#define VKI_SA_NOMASK		VKI_SA_NODEFER
#define VKI_SA_ONESHOT		VKI_SA_RESETHAND
//#define VKI_SA_INTERRUPT	0x20000000 /* dummy -- ignored */

#define VKI_SA_RESTORER		0x04000000

#define VKI_SS_ONSTACK		1
#define VKI_SS_DISABLE		2

struct vki_old_sigaction {
        // [[Nb: a 'k' prefix is added to "sa_handler" because
        // bits/sigaction.h (which gets dragged in somehow via signal.h)
        // #defines it as something else.  Since that is done for glibc's
        // purposes, which we don't care about here, we use our own name.]]
    unsigned long sa_flags;
        __vki_sighandler_t ksa_handler;
        vki_old_sigset_t sa_mask;
        __vki_sigrestore_t sa_restorer;
};

struct vki_sigaction {
        unsigned int    sa_flags;
        __vki_sighandler_t  sa_handler;
        vki_sigset_t        sa_mask;
};


struct vki_sigaction_base {
        // [[See comment about extra 'k' above]]
        unsigned long sa_flags;
	__vki_sighandler_t ksa_handler;

	vki_sigset_t sa_mask;		/* mask last for extensibility */
        __vki_sigrestore_t sa_restorer;
};

/* On Linux we use the same type for passing sigactions to
   and from the kernel.  Hence: */
typedef  struct vki_sigaction_base  vki_sigaction_toK_t;
typedef  struct vki_sigaction_base  vki_sigaction_fromK_t;

typedef struct vki_sigaltstack {
	void __user *ss_sp;
	vki_size_t ss_size;
	int ss_flags;

} vki_stack_t;


//----------------------------------------------------------------------
// From 2.6.35.5/include/asm-mips/sigcontext.h
//----------------------------------------------------------------------

struct _vki_fpreg {
	unsigned short significand[4];
	unsigned short exponent;
};

struct _vki_fpxreg {
	unsigned short significand[4];
	unsigned short exponent;
	unsigned short padding[3];
};

struct _vki_xmmreg {
	unsigned long element[4];
};

struct _vki_fpstate {
	/* Regular FPU environment */
	unsigned long 	cw;
	unsigned long	sw;
	unsigned long	tag;
	unsigned long	ipoff;
	unsigned long	cssel;
	unsigned long	dataoff;
	unsigned long	datasel;
	struct _vki_fpreg	_st[8];
	unsigned short	status;
	unsigned short	magic;		/* 0xffff = regular FPU data only */

	/* FXSR FPU environment */
	unsigned long	_fxsr_env[6];	/* FXSR FPU env is ignored */
	unsigned long	mxcsr;
	unsigned long	reserved;
	struct _vki_fpxreg	_fxsr_st[8];	/* FXSR FPU reg data is ignored */
	struct _vki_xmmreg	_xmm[8];
	unsigned long	padding[56];
};

//----------------------------------------------------------------------
// From linux-2.6.35.5/include/asm-mips/sigcontext.h
//----------------------------------------------------------------------

struct vki_sigcontext {
        unsigned int            sc_regmask;     /* Unused */
        unsigned int            sc_status;      /* Unused */
        unsigned long long      sc_pc;
        unsigned long long      sc_regs[32];
        unsigned long long      sc_fpregs[32];
        unsigned int            sc_acx;         /* Was sc_ownedfp */
        unsigned int            sc_fpc_csr;
        unsigned int            sc_fpc_eir;     /* Unused */
        unsigned int            sc_used_math;
        unsigned int            sc_dsp;         /* dsp status, was sc_ssflags */
        unsigned long long      sc_mdhi;
        unsigned long long      sc_mdlo;
        unsigned long           sc_hi1;         /* Was sc_cause */
        unsigned long           sc_lo1;         /* Was sc_badvaddr */
        unsigned long           sc_hi2;         /* Was sc_sigset[4] */
        unsigned long           sc_lo2;
        unsigned long           sc_hi3;
        unsigned long           sc_lo3;
};

//----------------------------------------------------------------------
// From linux-2.6.35.5/include/asm-mips/mman.h
//----------------------------------------------------------------------

#define VKI_PROT_NONE		0x0      /* No page permissions */
#define VKI_PROT_READ		0x1      /* page can be read */
#define VKI_PROT_WRITE		0x2      /* page can be written */
#define VKI_PROT_EXEC		0x4      /* page can be executed */
#define VKI_PROT_GROWSDOWN	0x01000000	/* mprotect flag: extend change to start of growsdown vma */
#define VKI_PROT_GROWSUP	0x02000000	/* mprotect flag: extend change to end of growsup vma */

#define VKI_MAP_SHARED		0x001     /* Share changes */
#define VKI_MAP_PRIVATE		0x002     /* Changes are private */
#define VKI_MAP_FIXED		0x010     /* Interpret addr exactly */

#define VKI_MAP_NORESERVE	0x0400   /* don't reserve swap pages */

/* These are linux-specific */
#define VKI_MAP_NORESERVE   0x0400          /* don't check for reservations */
#define VKI_MAP_ANONYMOUS   0x0800          /* don't use a file */
#define VKI_MAP_GROWSDOWN   0x1000          /* stack-like segment */
#define VKI_MAP_DENYWRITE   0x2000          /* ETXTBSY */
#define VKI_MAP_EXECUTABLE  0x4000          /* mark it as an executable */
#define VKI_MAP_LOCKED      0x8000          /* pages are locked */
#define VKI_MAP_POPULATE    0x10000         /* populate (prefault) pagetables */
#define VKI_MAP_NONBLOCK    0x20000         /* do not block on IO */


//----------------------------------------------------------------------
// From linux-2.6.35.5/include/asm-mips/fcntl.h
//----------------------------------------------------------------------

#define VKI_O_ACCMODE		   03
#define VKI_O_RDONLY		   00
#define VKI_O_WRONLY		   01
#define VKI_O_RDWR		   02

#define VKI_O_CREAT		0x0100		/* not fcntl */
#define VKI_O_EXCL		0x0400		/* not fcntl */

#define VKI_O_TRUNC		0x0200	/* not fcntl */

#define VKI_O_APPEND		0x0008
#define VKI_O_NONBLOCK		0x0080
#define VKI_O_LARGEFILE     	0x2000
#define VKI_O_DIRECT            0x8000

#define VKI_AT_FDCWD            -100

#define VKI_F_DUPFD		 0			/* dup */
#define VKI_F_GETFD		 1			/* get close_on_exec */
#define VKI_F_SETFD		 2			/* set/clear close_on_exec */
#define VKI_F_GETFL		 3			/* get file->f_flags */
#define VKI_F_SETFL		 4			/* set file->f_flags */

#define VKI_F_GETLK		 14
#define VKI_F_SETLK		 6
#define VKI_F_SETLKW		 7

#define VKI_F_SETOWN		 24			/*  for sockets. */
#define VKI_F_GETOWN		 23			/*  for sockets. */
#define VKI_F_SETSIG		 10			/*  for sockets. */
#define VKI_F_GETSIG		 11			/*  for sockets. */

#define VKI_F_SETOWN_EX		15
#define VKI_F_GETOWN_EX		16

#define VKI_F_OFD_GETLK		36
#define VKI_F_OFD_SETLK		37
#define VKI_F_OFD_SETLKW	38

#define VKI_F_GETLK64		33			/*  using 'struct flock64' */
#define VKI_F_SETLK64		34
#define VKI_F_SETLKW64		35

/* for F_[GET|SET]FL */
#define VKI_FD_CLOEXEC	 1		/* actually anything with low bit set goes */

#define VKI_F_LINUX_SPECIFIC_BASE	1024

struct vki_f_owner_ex {
	int	type;
	__vki_kernel_pid_t	pid;
};

//----------------------------------------------------------------------
// From linux-2.6.35.5/include/asm-mips/resource.h
//----------------------------------------------------------------------

#define VKI_RLIMIT_DATA		2   /* max data size */
#define VKI_RLIMIT_STACK	3   /* max stack size */
#define VKI_RLIMIT_CORE		4   /* max core file size */
#define VKI_RLIMIT_NOFILE	5   /* max number of open files */
#define VKI_RLIM_INFINITY 0x7fffffffUL

//----------------------------------------------------------------------
// From linux-2.6.35.5/include/asm-mips/socket.h
//----------------------------------------------------------------------

#define VKI_SOL_SOCKET	0xffff

#define VKI_SO_TYPE	0x1008

#define VKI_SO_ATTACH_FILTER	26

//----------------------------------------------------------------------
// From linux-2.6.35.5/include/asm-i386/sockios.h
//----------------------------------------------------------------------

#define VKI_SIOCATMARK          _VKI_IOR('s', 7, int)
#define VKI_SIOCSPGRP           _VKI_IOW('s', 8, vki_pid_t)
#define VKI_SIOCGPGRP           _VKI_IOR('s', 9, vki_pid_t)
#define VKI_SIOCGSTAMP          0x8906      /* Get stamp (timeval) */
#define VKI_SIOCGSTAMPNS        0x8907      /* Get stamp (timespec) */

//----------------------------------------------------------------------
// From linux-2.6.35.5/include/asm-mips/stat.h
//----------------------------------------------------------------------

struct vki_stat {
	unsigned	st_dev;
	long		st_pad1[3];		/* Reserved for network id */
	unsigned long	st_ino;
	unsigned int	st_mode;
	unsigned long	st_nlink;
	unsigned int	st_uid;
	unsigned int	st_gid;
	unsigned 	st_rdev;
	long		st_pad2[2];
	long		st_size;
	long		st_pad3;
	/*
	 * Actually this should be timestruc_t st_atime, st_mtime and st_ctime
	 * but we don't have it under Linux.
	 */
	long		st_atime;
	long		st_atime_nsec;
	long		st_mtime;
	long		st_mtime_nsec;
	long		st_ctime;
	long		st_ctime_nsec;
	long		st_blksize;
	long		st_blocks;
	long		st_pad4[14];
};

/*
 * This matches struct stat64 in glibc2.1, hence the absolutely insane
 * amounts of padding around dev_t's.  The memory layout is the same as of
 * struct stat of the 64-bit kernel.
 */

struct vki_stat64 {
	unsigned long	st_dev;
	unsigned long	st_pad0[3];	/* Reserved for st_dev expansion  */

	unsigned long long	st_ino;

	unsigned int	st_mode;
	unsigned long	st_nlink;

	unsigned int	st_uid;
	unsigned int	st_gid;

	unsigned long	st_rdev;
	unsigned long	st_pad1[3];	/* Reserved for st_rdev expansion  */

	long long	st_size;

	/*
	 * Actually this should be timestruc_t st_atime, st_mtime and st_ctime
	 * but we don't have it under Linux.
	 */
	long		st_atime;
	unsigned long	st_atime_nsec;	/* Reserved for st_atime expansion  */

	long		st_mtime;
	unsigned long	st_mtime_nsec;	/* Reserved for st_mtime expansion  */

	long		st_ctime;
	unsigned long	st_ctime_nsec;	/* Reserved for st_ctime expansion  */

	unsigned long	st_blksize;
	unsigned long	st_pad2;

	long long	st_blocks;
};

//----------------------------------------------------------------------
// From linux-2.6.35.5/include/asm-mips/statfs.h
//----------------------------------------------------------------------

struct vki_statfs {
	long		f_type;
	long		f_bsize;
	long		f_frsize;	/* Fragment size - unsupported */
	long		f_blocks;
	long		f_bfree;
	long		f_files;
	long		f_ffree;
	long		f_bavail;

	/* Linux specials */
	__vki_kernel_fsid_t	f_fsid;
	long		f_namelen;
	long		f_spare[6];
};

//----------------------------------------------------------------------
// From linux-2.6.35.5/include/asm-mips/termios.h
//----------------------------------------------------------------------

struct vki_winsize {
	unsigned short ws_row;
	unsigned short ws_col;
	unsigned short ws_xpixel;
	unsigned short ws_ypixel;
};

#define NCC	8
#define NCCS	23
struct vki_termio {
	unsigned short c_iflag;		/* input mode flags */
	unsigned short c_oflag;		/* output mode flags */
	unsigned short c_cflag;		/* control mode flags */
	unsigned short c_lflag;		/* local mode flags */
	char c_line;			/* line discipline */
	unsigned char c_cc[NCCS];	/* control characters */
};


//----------------------------------------------------------------------
// From linux-2.6.35.5/include/asm-mips/termbits.h
//----------------------------------------------------------------------

typedef unsigned char   vki_cc_t;
typedef unsigned long   vki_speed_t;
typedef unsigned long   vki_tcflag_t;

struct vki_termios {
	vki_tcflag_t c_iflag;		/* input mode flags */
	vki_tcflag_t c_oflag;		/* output mode flags */
	vki_tcflag_t c_cflag;		/* control mode flags */
	vki_tcflag_t c_lflag;		/* local mode flags */
	vki_cc_t c_line;			/* line discipline */
	vki_cc_t c_cc[NCCS];		/* control characters */
};

//----------------------------------------------------------------------
// From linux-2.6.35.5/include/asm-mips/ioctl.h
//----------------------------------------------------------------------

#define _VKI_IOC_NRBITS		8
#define _VKI_IOC_TYPEBITS	8
#define _VKI_IOC_SIZEBITS	13
#define _VKI_IOC_DIRBITS	3

#define _VKI_IOC_NRMASK		((1 << _VKI_IOC_NRBITS)-1)
#define _VKI_IOC_TYPEMASK	((1 << _VKI_IOC_TYPEBITS)-1)
#define _VKI_IOC_SIZEMASK	((1 << _VKI_IOC_SIZEBITS)-1)
#define _VKI_IOC_DIRMASK	((1 << _VKI_IOC_DIRBITS)-1)

#define _VKI_IOC_NRSHIFT	0
#define _VKI_IOC_TYPESHIFT	(_VKI_IOC_NRSHIFT+_VKI_IOC_NRBITS)
#define _VKI_IOC_SIZESHIFT	(_VKI_IOC_TYPESHIFT+_VKI_IOC_TYPEBITS)
#define _VKI_IOC_DIRSHIFT	(_VKI_IOC_SIZESHIFT+_VKI_IOC_SIZEBITS)

#define _VKI_IOC_NONE	1U
#define _VKI_IOC_READ	2U
#define _VKI_IOC_WRITE	4U

#define _VKI_IOC(dir,type,nr,size) \
	(((dir)  << _VKI_IOC_DIRSHIFT) | \
	 ((type) << _VKI_IOC_TYPESHIFT) | \
	 ((nr)   << _VKI_IOC_NRSHIFT) | \
	 ((size) << _VKI_IOC_SIZESHIFT))

/* provoke compile error for invalid uses of size argument */
extern unsigned int __VKI_invalid_size_argument_for_IOC;
/* used to create numbers */
#define _VKI_IO(type,nr)	_VKI_IOC(_VKI_IOC_NONE,(type),(nr),0)
#define _VKI_IOR(type,nr,size)	_VKI_IOC(_VKI_IOC_READ,(type),(nr),(_VKI_IOC_TYPECHECK(size)))
#define _VKI_IOW(type,nr,size)	_VKI_IOC(_VKI_IOC_WRITE,(type),(nr),(_VKI_IOC_TYPECHECK(size)))
#define _VKI_IOWR(type,nr,size)	_VKI_IOC(_VKI_IOC_READ|_VKI_IOC_WRITE,(type),(nr),(_VKI_IOC_TYPECHECK(size)))

/* used to decode ioctl numbers.. */
#define _VKI_IOC_DIR(nr)	(((nr) >> _VKI_IOC_DIRSHIFT) & _VKI_IOC_DIRMASK)
#define _VKI_IOC_TYPE(nr)	(((nr) >> _VKI_IOC_TYPESHIFT) & _VKI_IOC_TYPEMASK)
#define _VKI_IOC_NR(nr)		(((nr) >> _VKI_IOC_NRSHIFT) & _VKI_IOC_NRMASK)
#define _VKI_IOC_SIZE(nr)	(((nr) >> _VKI_IOC_SIZESHIFT) & _VKI_IOC_SIZEMASK)

//----------------------------------------------------------------------
// From linux-2.6.35.5/include/asm-mips/ioctls.h
//----------------------------------------------------------------------

#define VKI_TCGETA		0x5401
#define VKI_TCSETA		0x5402	/* Clashes with SNDCTL_TMR_START sound ioctl */
#define VKI_TCSETAW		0x5403
#define VKI_TCSETAF		0x5404

#define VKI_TCSBRK		0x5405
#define VKI_TCXONC		0x5406
#define VKI_TCFLSH		0x5407

#define VKI_TCGETS		0x540d
#define VKI_TCSETS		0x540e
#define VKI_TCSETSW		0x540f
#define VKI_TCSETSF		0x5410

#define VKI_TIOCEXCL		0x740d		/* set exclusive use of tty */
#define VKI_TIOCNXCL		0x740e		/* reset exclusive use of tty */
#define VKI_TIOCOUTQ		0x7472		/* output queue size */
#define VKI_TIOCSTI		0x5472		/* simulate terminal input */
#define VKI_TIOCMGET		0x741d		/* get all modem bits */
#define VKI_TIOCMBIS		0x741b		/* bis modem bits */
#define VKI_TIOCMBIC		0x741c		/* bic modem bits */
#define VKI_TIOCMSET		0x741a		/* set all modem bits */
#define VKI_TIOCPKT		0x5470		/* pty: set/clear packet mode */
#define	 VKI_TIOCPKT_DATA		0x00	/* data packet */
#define	 VKI_TIOCPKT_FLUSHREAD		0x01	/* flush packet */
#define	 VKI_TIOCPKT_FLUSHWRITE		0x02	/* flush packet */
#define	 VKI_TIOCPKT_STOP		0x04	/* stop output */
#define	 VKI_TIOCPKT_START		0x08	/* start output */
#define	 VKI_TIOCPKT_NOSTOP		0x10	/* no more ^S, ^Q */
#define	 VKI_TIOCPKT_DOSTOP		0x20	/* now do ^S ^Q */
/* #define  TIOCPKT_IOCTL		0x40	state change of pty driver */
#define VKI_TIOCSWINSZ	_VKI_IOW('t', 103, struct vki_winsize)	/* set window size */
#define VKI_TIOCGWINSZ	_VKI_IOR('t', 104, struct vki_winsize)	/* get window size */
#define VKI_TIOCNOTTY	0x5471		/* void tty association */
#define VKI_TIOCSETD	0x7401
#define VKI_TIOCGETD	0x7400

#define VKI_FIOCLEX		0x6601
#define VKI_FIONCLEX		0x6602
#define VKI_FIOASYNC		0x667d
#define VKI_FIONBIO		0x667e
#define VKI_FIOQSIZE		0x667f

#define VKI_TIOCGLTC		0x7474			/* get special local chars */
#define VKI_TIOCSLTC		0x7475			/* set special local chars */
#define VKI_TIOCSPGRP		_VKI_IOW('t', 118, int)	/* set pgrp of tty */
#define VKI_TIOCGPGRP		_VKI_IOR('t', 119, int)	/* get pgrp of tty */
#define VKI_TIOCCONS		_VKI_IOW('t', 120, int)	/* become virtual console */

#define VKI_FIONREAD		0x467f
#define VKI_TIOCINQ		FIONREAD

#define VKI_TIOCGETP        	0x7408
#define VKI_TIOCSETP        	0x7409
#define VKI_TIOCSETN        	0x740a			/* TIOCSETP wo flush */

#define VKI_TIOCSBRK	0x5427  /* BSD compatibility */
#define VKI_TIOCCBRK	0x5428  /* BSD compatibility */
#define VKI_TIOCGSID	0x7416  /* Return the session ID of FD */
#define VKI_TIOCGPTN	_VKI_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
#define VKI_TIOCSPTLCK	_VKI_IOW('T',0x31, int)  /* Lock/unlock Pty */

/* I hope the range from 0x5480 on is free ... */
#define VKI_TIOCSCTTY		0x5480		/* become controlling tty */
#define VKI_TIOCGSOFTCAR	0x5481
#define VKI_TIOCSSOFTCAR	0x5482
#define VKI_TIOCLINUX		0x5483
#define VKI_TIOCGSERIAL		0x5484
#define VKI_TIOCSSERIAL		0x5485
#define VKI_TCSBRKP		0x5486	/* Needed for POSIX tcsendbreak() */
#define VKI_TIOCSERCONFIG	0x5488
#define VKI_TIOCSERGWILD	0x5489
#define VKI_TIOCSERSWILD	0x548a
#define VKI_TIOCGLCKTRMIOS	0x548b
#define VKI_TIOCSLCKTRMIOS	0x548c
#define VKI_TIOCSERGSTRUCT	0x548d /* For debugging only */
#define VKI_TIOCSERGETLSR   	0x548e /* Get line status register */
#define VKI_TIOCSERGETMULTI 	0x548f /* Get multiport config  */
#define VKI_TIOCSERSETMULTI 	0x5490 /* Set multiport config */
#define VKI_TIOCMIWAIT      	0x5491 /* wait for a change on serial input line(s) */
#define VKI_TIOCGICOUNT     	0x5492 /* read serial port inline interrupt counts */
#define VKI_TIOCGHAYESESP	0x5493 /* Get Hayes ESP configuration */
#define VKI_TIOCSHAYESESP	0x5494 /* Set Hayes ESP configuration */

//----------------------------------------------------------------------
// From asm-generic/poll.h
//----------------------------------------------------------------------

/* These are specified by iBCS2 */
#define VKI_POLLIN		0x0001

struct vki_pollfd {
	int fd;
	short events;
	short revents;
};
//----------------------------------------------------------------------
// From linux-2.6.35.5/include/asm-mips/ucontext.h
//----------------------------------------------------------------------

struct vki_ucontext {
	unsigned long		uc_flags;
	struct vki_ucontext    *uc_link;
	vki_stack_t		uc_stack;
	struct vki_sigcontext	uc_mcontext;
	vki_sigset_t		uc_sigmask;	/* mask last for extensibility */
};

// CAB: TODO
typedef char vki_modify_ldt_t;

//----------------------------------------------------------------------
// From linux-2.6.35.5/include/asm-mips/ipcbuf.h
//----------------------------------------------------------------------

struct vki_ipc64_perm
{
        __vki_kernel_key_t  key;
        __vki_kernel_uid_t  uid;
        __vki_kernel_gid_t  gid;
        __vki_kernel_uid_t  cuid;
        __vki_kernel_gid_t  cgid;
        __vki_kernel_mode_t mode;
        unsigned short  seq;
        unsigned short  __pad1;
        unsigned long   __unused1;
        unsigned long   __unused2;
};

//----------------------------------------------------------------------
// From linux-2.6.35.5/include/asm-mips/sembuf.h
//----------------------------------------------------------------------

struct vki_semid64_ds {
        struct vki_ipc64_perm sem_perm;             /* permissions .. see ipc.h */
        __vki_kernel_time_t sem_otime;              /* last semop time */
        __vki_kernel_time_t sem_ctime;              /* last change time */
        unsigned long   sem_nsems;              /* no. of semaphores in array */
        unsigned long   __unused1;
        unsigned long   __unused2;
};


//----------------------------------------------------------------------
// From linux-2.6.35.5/include/asm-mips/msgbuf.h
//----------------------------------------------------------------------

struct vki_msqid64_ds {
	struct vki_ipc64_perm msg_perm;
	__vki_kernel_time_t msg_stime;	/* last msgsnd time */
	unsigned long	__unused1;
	__vki_kernel_time_t msg_rtime;	/* last msgrcv time */
	unsigned long	__unused2;
	__vki_kernel_time_t msg_ctime;	/* last change time */
	unsigned long	__unused3;
	unsigned long  msg_cbytes;	/* current number of bytes on queue */
	unsigned long  msg_qnum;	/* number of messages in queue */
	unsigned long  msg_qbytes;	/* max number of bytes on queue */
	__vki_kernel_pid_t msg_lspid;	/* pid of last msgsnd */
	__vki_kernel_pid_t msg_lrpid;	/* last receive pid */
	unsigned long  __unused4;
	unsigned long  __unused5;
};

//----------------------------------------------------------------------
// From linux-2.6.35.5/include/asm-mips/ipc.h
//----------------------------------------------------------------------

struct vki_ipc_kludge {
        struct vki_msgbuf __user *msgp;
        long msgtyp;
};

#define VKI_SEMOP            1
#define VKI_SEMGET           2
#define VKI_SEMCTL           3
#define VKI_SEMTIMEDOP       4
#define VKI_MSGSND          11
#define VKI_MSGRCV          12
#define VKI_MSGGET          13
#define VKI_MSGCTL          14
#define VKI_SHMAT           21
#define VKI_SHMDT           22
#define VKI_SHMGET          23
#define VKI_SHMCTL          24

//----------------------------------------------------------------------
// From linux-2.6.35.5/include/asm-mips/shmbuf.h
//----------------------------------------------------------------------

struct vki_shmid64_ds {
        struct vki_ipc64_perm       shm_perm;       /* operation perms */
        vki_size_t                  shm_segsz;      /* size of segment (bytes) */
        __vki_kernel_time_t         shm_atime;      /* last attach time */
        __vki_kernel_time_t         shm_dtime;      /* last detach time */
        __vki_kernel_time_t         shm_ctime;      /* last change time */
        __vki_kernel_pid_t          shm_cpid;       /* pid of creator */
        __vki_kernel_pid_t          shm_lpid;       /* pid of last operator */
        unsigned long           shm_nattch;     /* no. of current attaches */
        unsigned long           __unused1;
        unsigned long           __unused2;
};

struct vki_shminfo64 {
        unsigned long   shmmax;
        unsigned long   shmmin;
        unsigned long   shmmni;
        unsigned long   shmseg;
        unsigned long   shmall;
        unsigned long   __unused1;
        unsigned long   __unused2;
        unsigned long   __unused3;
        unsigned long   __unused4;
};
//----------------------------------------------------------------------
// From linux-2.6.35.5/include/asm-mips/ptrace.h
//----------------------------------------------------------------------

struct vki_pt_regs {
#ifdef CONFIG_32BIT
        /* Pad bytes for argument save space on the stack. */
        unsigned long pad0[6];
#endif
        /* Saved main processor registers. */
        unsigned long regs[32];

        /* Saved special registers. */
        unsigned long cp0_status;
        unsigned long hi;
        unsigned long lo;
#ifdef CONFIG_CPU_HAS_SMARTMIPS
        unsigned long acx;
#endif
        unsigned long cp0_badvaddr;
        unsigned long cp0_cause;
        unsigned long cp0_epc;
#ifdef CONFIG_MIPS_MT_SMTC
        unsigned long cp0_tcstatus;
#endif /* CONFIG_MIPS_MT_SMTC */
#ifdef CONFIG_CPU_CAVIUM_OCTEON
        unsigned long long mpl[3];        /* MTM{0,1,2} */
        unsigned long long mtp[3];        /* MTP{0,1,2} */
#endif
} __attribute__ ((aligned (8)));

#define VKI_PTRACE_GETREGS            12
#define VKI_PTRACE_SETREGS            13
#define VKI_PTRACE_GETFPREGS          14
#define VKI_PTRACE_SETFPREGS          15
//----------------------------------------------------------------------
// From linux-4.5/arch/mips/include/uapi/asm/reg.h
//----------------------------------------------------------------------
#define VKI_MIPS32_EF_R0               6
#define VKI_MIPS32_EF_R1               7
#define VKI_MIPS32_EF_R2               8
#define VKI_MIPS32_EF_R3               9
#define VKI_MIPS32_EF_R4              10
#define VKI_MIPS32_EF_R5              11
#define VKI_MIPS32_EF_R6              12
#define VKI_MIPS32_EF_R7              13
#define VKI_MIPS32_EF_R8              14
#define VKI_MIPS32_EF_R9              15
#define VKI_MIPS32_EF_R10             16
#define VKI_MIPS32_EF_R11             17
#define VKI_MIPS32_EF_R12             18
#define VKI_MIPS32_EF_R13             19
#define VKI_MIPS32_EF_R14             20
#define VKI_MIPS32_EF_R15             21
#define VKI_MIPS32_EF_R16             22
#define VKI_MIPS32_EF_R17             23
#define VKI_MIPS32_EF_R18             24
#define VKI_MIPS32_EF_R19             25
#define VKI_MIPS32_EF_R20             26
#define VKI_MIPS32_EF_R21             27
#define VKI_MIPS32_EF_R22             28
#define VKI_MIPS32_EF_R23             29
#define VKI_MIPS32_EF_R24             30
#define VKI_MIPS32_EF_R25             31
#define VKI_MIPS32_EF_R26             32
#define VKI_MIPS32_EF_R27             33
#define VKI_MIPS32_EF_R28             34
#define VKI_MIPS32_EF_R29             35
#define VKI_MIPS32_EF_R30             36
#define VKI_MIPS32_EF_R31             37
#define VKI_MIPS32_EF_LO              38
#define VKI_MIPS32_EF_HI              39
#define VKI_MIPS32_EF_CP0_EPC         40
#define VKI_MIPS32_EF_CP0_BADVADDR    41
#define VKI_MIPS32_EF_CP0_STATUS      42
#define VKI_MIPS32_EF_CP0_CAUSE       43
#define VKI_MIPS32_EF_UNUSED0         44

//----------------------------------------------------------------------
// From linux-4.5/arch/mips/include/asm/elf.h
//----------------------------------------------------------------------
typedef unsigned long vki_elf_greg_t;

#define VKI_ELF_NGREG      45
#define VKI_ELF_NFPREG     33 /* includes fpscr */

typedef vki_elf_greg_t vki_elf_gregset_t[VKI_ELF_NGREG];

typedef double vki_elf_fpreg_t;
typedef vki_elf_fpreg_t vki_elf_fpregset_t[VKI_ELF_NFPREG];

typedef struct vki_user_fxsr_struct vki_elf_fpxregset_t;

#define VKI_AT_SYSINFO		32
//----------------------------------------------------------------------
// From linux-2.6.35.5/include/asm-generic/siginfo.h
//----------------------------------------------------------------------
#define HAVE_ARCH_SIGINFO_T

typedef union vki_sigval {
	int sival_int;
	void __user *sival_ptr;
} vki_sigval_t;

#ifndef __VKI_ARCH_SI_PREAMBLE_SIZE
#define __VKI_ARCH_SI_PREAMBLE_SIZE	(3 * sizeof(int))
#endif

#define VKI_SI_MAX_SIZE	128

#ifndef VKI_SI_PAD_SIZE
#define VKI_SI_PAD_SIZE	((VKI_SI_MAX_SIZE - __VKI_ARCH_SI_PREAMBLE_SIZE) / sizeof(int))
#endif

#ifndef __VKI_ARCH_SI_UID_T
#define __VKI_ARCH_SI_UID_T	vki_uid_t
#endif

#ifndef __VKI_ARCH_SI_BAND_T
#define __VKI_ARCH_SI_BAND_T long
#endif

typedef struct vki_siginfo {
        int si_signo;
        int si_code;
        int si_errno;
        int __pad0[VKI_SI_MAX_SIZE / sizeof(int) - VKI_SI_PAD_SIZE - 3];

        union {
                int _pad[VKI_SI_PAD_SIZE];

                /* kill() */
                struct {
                        vki_pid_t _pid;             /* sender's pid */
                        __VKI_ARCH_SI_UID_T _uid;   /* sender's uid */
                } _kill;

                /* POSIX.1b timers */
                struct {
                        vki_timer_t _tid;           /* timer id */
                        int _overrun;           /* overrun count */
                        char _pad[sizeof( __VKI_ARCH_SI_UID_T) - sizeof(int)];
                        vki_sigval_t _sigval;       /* same as below */
                        int _sys_private;       /* not to be passed to user */
                } _timer;

                /* POSIX.1b signals */
                struct {
                        vki_pid_t _pid;             /* sender's pid */
                        __VKI_ARCH_SI_UID_T _uid;   /* sender's uid */
                        vki_sigval_t _sigval;
                } _rt;

                /* SIGCHLD */
                struct {
                        vki_pid_t _pid;             /* which child */
                        __VKI_ARCH_SI_UID_T _uid;   /* sender's uid */
                        int _status;            /* exit code */
                        vki_clock_t _utime;
                        vki_clock_t _stime;
                } _sigchld;

                /* IRIX SIGCHLD */
                struct {
                        vki_pid_t _pid;             /* which child */
                        vki_clock_t _utime;
                        int _status;            /* exit code */
                        vki_clock_t _stime;
                } _irix_sigchld;

                /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
                struct {
                        void __user *_addr; /* faulting insn/memory ref. */
#ifdef __ARCH_SI_TRAPNO
                        int _trapno;    /* TRAP # which caused the signal */
#endif
                } _sigfault;

                /* SIGPOLL, SIGXFSZ (To do ...)  */
                struct {
                        __VKI_ARCH_SI_BAND_T _band; /* POLL_IN, POLL_OUT, POLL_MSG */
                        int _fd;
                } _sigpoll;
        } _sifields;
} vki_siginfo_t;

//----------------------------------------------------------------------
// From linux-2.6.35.5/include/asm/break.h
//----------------------------------------------------------------------
#define VKI_BRK_OVERFLOW         6    /* Overflow check */
#define VKI_BRK_DIVZERO          7    /* Divide by zero check */

//----------------------------------------------------------------------
// From linux-3.6.35.5/arch/mips/include/socket.h
//----------------------------------------------------------------------
enum vki_sock_type {
        VKI_SOCK_STREAM = 2,
        // [[others omitted]]
};
#define ARCH_HAS_SOCKET_TYPES 1

//----------------------------------------------------------------------
// From linux-3.7.0/arch/mips/include/uapi/asm/errno.h
//----------------------------------------------------------------------

#define VKI_ELIBBAD      84  /* Accessing a corrupted shared library */
#define VKI_EOPNOTSUPP   122 /* Operation not supported on transport
                                 endpoint */

//----------------------------------------------------------------------
// From linux-3.13.0/include/asm/errno.h
//----------------------------------------------------------------------

#define	VKI_ENOSYS       89  /* Function not implemented */
#define	VKI_EOVERFLOW    79  /* Value too large for defined data type */

//----------------------------------------------------------------------
// From linux-3.14.0/arch/mips/include/asm/elf.h
//----------------------------------------------------------------------

#define VKI_EF_MIPS_FP64    0x00000200

//----------------------------------------------------------------------
// From linux-4.1.0/arch/mips/include/asm/elf.h
//----------------------------------------------------------------------

#define VKI_MIPS_ABI_FP_UNKNOWN (-1)
#define VKI_MIPS_ABI_FP_ANY       0  /* FP ABI doesn't matter */
#define VKI_MIPS_ABI_FP_DOUBLE    1  /* -mdouble-float */
#define VKI_MIPS_ABI_FP_SINGLE    2  /* -msingle-float */
#define VKI_MIPS_ABI_FP_SOFT      3  /* -msoft-float */
#define VKI_MIPS_ABI_FP_OLD_64    4  /* -mips32r2 -mfp64 */
#define VKI_MIPS_ABI_FP_XX        5  /* -mfpxx */
#define VKI_MIPS_ABI_FP_64        6  /* -mips32r2 -mfp64 */
#define VKI_MIPS_ABI_FP_64A       7  /* -mips32r2 -mfp64 -mno-odd-spreg */

struct vki_arch_elf_state {
   int fp_abi;
   int interp_fp_abi;
   int overall_fp_mode;
};

#define VKI_INIT_ARCH_ELF_STATE {             \
   .fp_abi = VKI_MIPS_ABI_FP_UNKNOWN,         \
   .interp_fp_abi = VKI_MIPS_ABI_FP_UNKNOWN,  \
   .overall_fp_mode = -1,                     \
}

struct vki_mips_elf_abiflags_v0 {
   vki_u16 version;     /* Version of flags structure */
   vki_u8  isa_level;   /* The level of the ISA: 1-5, 32, 64 */
   vki_u8  isa_rev;     /* The revision of ISA: 0 for MIPS V and below,
                           1-n otherwise */
   vki_u8  gpr_size;    /* The size of general purpose registers */
   vki_u8  cpr1_size;   /* The size of co-processor 1 registers */
   vki_u8  cpr2_size;   /* The size of co-processor 2 registers */
   vki_u8  fp_abi;      /* The floating-point ABI */
   vki_u32 isa_ext;     /* Mask of processor-specific extensions */
   vki_u32 ases;        /* Mask of ASEs used */
   vki_u32 flags1;      /* Mask of general flags */
   vki_u32 flags2;
};

#define VKI_PT_MIPS_ABIFLAGS   0x70000003

//----------------------------------------------------------------------
// From linux-4.1.0/arch/mips/kernel/elf.c
//----------------------------------------------------------------------

enum {
   VKI_FP_FRE,
   VKI_FP_FR0,
   VKI_FP_FR1,
};

#endif // __VKI_MIPS32_LINUX_H

/*--------------------------------------------------------------------*/
/*--- end                                       vki-mips32-linux.h ---*/
/*--------------------------------------------------------------------*/
