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