1
2/*--------------------------------------------------------------------*/
3/*--- s390x/Linux-specific kernel interface.     vki-s390x-linux.h ---*/
4/*--------------------------------------------------------------------*/
5
6/*
7   This file is part of Valgrind, a dynamic binary instrumentation
8   framework.
9
10   Copyright IBM Corp. 2010-2013
11
12   This program is free software; you can redistribute it and/or
13   modify it under the terms of the GNU General Public License as
14   published by the Free Software Foundation; either version 2 of the
15   License, or (at your option) any later version.
16
17   This program is distributed in the hope that it will be useful, but
18   WITHOUT ANY WARRANTY; without even the implied warranty of
19   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20   General Public License for more details.
21
22   You should have received a copy of the GNU General Public License
23   along with this program; if not, write to the Free Software
24   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
25   02111-1307, USA.
26
27   The GNU General Public License is contained in the file COPYING.
28*/
29
30/* Contributed by Florian Krohm and Volker Sameske */
31
32#ifndef __VKI_S390X_LINUX_H
33#define __VKI_S390X_LINUX_H
34
35#define __force
36
37//----------------------------------------------------------------------
38// From linux-2.6.16.60/include/asm-s390/types.h
39//----------------------------------------------------------------------
40
41typedef __signed__ char __vki_s8;
42typedef unsigned char __vki_u8;
43
44typedef __signed__ short __vki_s16;
45typedef unsigned short __vki_u16;
46
47typedef __signed__ int __vki_s32;
48typedef unsigned int __vki_u32;
49
50typedef __signed__ long __vki_s64;
51typedef unsigned long __vki_u64;
52
53typedef unsigned short vki_u16;
54
55typedef unsigned int vki_u32;
56
57//----------------------------------------------------------------------
58// From linux-2.6.16.60/include/asm-s390/page.h
59//----------------------------------------------------------------------
60
61/* PAGE_SHIFT determines the page size */
62#define VKI_PAGE_SHIFT  12
63#define VKI_PAGE_SIZE   (1UL << VKI_PAGE_SHIFT)
64
65//----------------------------------------------------------------------
66// From linux-2.6.16.60/include/asm-s390/siginfo.h
67//----------------------------------------------------------------------
68
69/* We need that to ensure that sizeof(siginfo) == 128. */
70#ifdef __s390x__
71#define __VKI_ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int))
72#endif
73
74//----------------------------------------------------------------------
75// From linux-2.6.16.60/include/asm-s390/sigcontext.h
76//----------------------------------------------------------------------
77
78#define __VKI_NUM_GPRS 16
79#define __VKI_NUM_FPRS 16
80#define __VKI_NUM_ACRS 16
81
82#ifndef VGA_s390x
83
84/* Has to be at least _NSIG_WORDS from asm/signal.h */
85#define _VKI_SIGCONTEXT_NSIG	64
86#define _VKI_SIGCONTEXT_NSIG_BPW	32
87/* Size of stack frame allocated when calling signal handler. */
88#define __VKI_SIGNAL_FRAMESIZE	96
89
90#else /* VGA_s390x */
91
92/* Has to be at least _NSIG_WORDS from asm/signal.h */
93#define _VKI_SIGCONTEXT_NSIG	64
94#define _VKI_SIGCONTEXT_NSIG_BPW	64
95/* Size of stack frame allocated when calling signal handler. */
96#define __VKI_SIGNAL_FRAMESIZE	160
97
98#endif /* VGA_s390x */
99
100
101#define _VKI_SIGCONTEXT_NSIG_WORDS	(_VKI_SIGCONTEXT_NSIG / _VKI_SIGCONTEXT_NSIG_BPW)
102#define _VKI_SIGMASK_COPY_SIZE	(sizeof(unsigned long)*_VKI_SIGCONTEXT_NSIG_WORDS)
103
104typedef struct
105{
106	unsigned long mask;
107	unsigned long addr;
108} __attribute__ ((aligned(8))) _vki_psw_t;
109
110typedef struct
111{
112	_vki_psw_t psw;
113	unsigned long gprs[__VKI_NUM_GPRS];
114	unsigned int  acrs[__VKI_NUM_ACRS];
115} _vki_s390_regs_common;
116
117typedef struct
118{
119	unsigned int fpc;
120	double   fprs[__VKI_NUM_FPRS];
121} _vki_s390_fp_regs;
122
123typedef struct
124{
125	_vki_s390_regs_common regs;
126	_vki_s390_fp_regs     fpregs;
127} _vki_sigregs;
128
129
130struct vki_sigcontext
131{
132	unsigned long   oldmask[_VKI_SIGCONTEXT_NSIG_WORDS];
133	_vki_sigregs    __user *sregs;
134};
135
136
137//----------------------------------------------------------------------
138// From linux-2.6.16.60/include/asm-s390/signal.h
139//----------------------------------------------------------------------
140
141#define _VKI_NSIG           _VKI_SIGCONTEXT_NSIG
142#define _VKI_NSIG_BPW       _VKI_SIGCONTEXT_NSIG_BPW
143#define _VKI_NSIG_WORDS     _VKI_SIGCONTEXT_NSIG_WORDS
144
145typedef unsigned long vki_old_sigset_t;
146
147typedef struct {
148	unsigned long sig[_VKI_NSIG_WORDS];
149} vki_sigset_t;
150
151#define VKI_SIGHUP           1
152#define VKI_SIGINT           2
153#define VKI_SIGQUIT          3
154#define VKI_SIGILL           4
155#define VKI_SIGTRAP          5
156#define VKI_SIGABRT          6
157#define VKI_SIGIOT           6
158#define VKI_SIGBUS           7
159#define VKI_SIGFPE           8
160#define VKI_SIGKILL          9
161#define VKI_SIGUSR1         10
162#define VKI_SIGSEGV         11
163#define VKI_SIGUSR2         12
164#define VKI_SIGPIPE         13
165#define VKI_SIGALRM         14
166#define VKI_SIGTERM         15
167#define VKI_SIGSTKFLT       16
168#define VKI_SIGCHLD         17
169#define VKI_SIGCONT         18
170#define VKI_SIGSTOP         19
171#define VKI_SIGTSTP         20
172#define VKI_SIGTTIN         21
173#define VKI_SIGTTOU         22
174#define VKI_SIGURG          23
175#define VKI_SIGXCPU         24
176#define VKI_SIGXFSZ         25
177#define VKI_SIGVTALRM       26
178#define VKI_SIGPROF         27
179#define VKI_SIGWINCH        28
180#define VKI_SIGIO           29
181#define VKI_SIGPOLL         VKI_SIGIO
182/*
183#define VKI_SIGLOST         29
184*/
185#define VKI_SIGPWR          30
186#define VKI_SIGSYS	    31
187#define VKI_SIGUNUSED       31
188
189/* These should not be considered constants from userland.  */
190#define VKI_SIGRTMIN        32
191#define VKI_SIGRTMAX        _VKI_NSIG
192
193/*
194 * SA_FLAGS values:
195 *
196 * SA_ONSTACK indicates that a registered stack_t will be used.
197 * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the
198 * SA_RESTART flag to get restarting signals (which were the default long ago)
199 * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop.
200 * SA_RESETHAND clears the handler when the signal is delivered.
201 * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies.
202 * SA_NODEFER prevents the current signal from being masked in the handler.
203 *
204 * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single
205 * Unix names RESETHAND and NODEFER respectively.
206 */
207#define VKI_SA_NOCLDSTOP    0x00000001
208#define VKI_SA_NOCLDWAIT    0x00000002
209#define VKI_SA_SIGINFO      0x00000004
210#define VKI_SA_ONSTACK      0x08000000
211#define VKI_SA_RESTART      0x10000000
212#define VKI_SA_NODEFER      0x40000000
213#define VKI_SA_RESETHAND    0x80000000
214
215#define VKI_SA_NOMASK       VKI_SA_NODEFER
216#define VKI_SA_ONESHOT      VKI_SA_RESETHAND
217#define VKI_SA_INTERRUPT    0x20000000 /* dummy -- ignored */
218
219#define VKI_SA_RESTORER     0x04000000
220
221/*
222 * sigaltstack controls
223 */
224#define VKI_SS_ONSTACK      1
225#define VKI_SS_DISABLE      2
226
227#define VKI_MINSIGSTKSZ     2048
228#define VKI_SIGSTKSZ        8192
229
230
231/* Next lines asm-generic/signal.h */
232#define VKI_SIG_BLOCK          0 /* for blocking signals */
233#define VKI_SIG_UNBLOCK        1 /* for unblocking signals */
234#define VKI_SIG_SETMASK        2 /* for setting the signal mask */
235
236typedef void __vki_signalfn_t(int);
237typedef __vki_signalfn_t __user *__vki_sighandler_t;
238
239/* default signal handling */
240#define VKI_SIG_DFL ((__force __vki_sighandler_t)0)
241/* ignore signal */
242#define VKI_SIG_IGN ((__force __vki_sighandler_t)1)
243/* error return from signal */
244#define VKI_SIG_ERR ((__force __vki_sighandler_t)-1)
245/* Back to asm-s390/signal.h */
246
247struct vki_old_sigaction {
248        // [[Nb: a 'k' prefix is added to "sa_handler" because
249        // bits/sigaction.h (which gets dragged in somehow via signal.h)
250        // #defines it as something else.  Since that is done for glibc's
251        // purposes, which we don't care about here, we use our own name.]]
252        __vki_sighandler_t ksa_handler;
253        vki_old_sigset_t sa_mask;
254        unsigned long sa_flags;
255        void (*sa_restorer)(void);
256};
257
258struct vki_sigaction {
259        // [[See comment about extra 'k' above]]
260        __vki_sighandler_t ksa_handler;
261        unsigned long sa_flags;
262        void (*sa_restorer)(void);
263        vki_sigset_t sa_mask;               /* mask last for extensibility */
264};
265
266struct vki_k_sigaction {
267        struct vki_sigaction sa;
268};
269
270
271/* On Linux we use the same type for passing sigactions to
272   and from the kernel.  Hence: */
273typedef  struct vki_sigaction  vki_sigaction_toK_t;
274typedef  struct vki_sigaction  vki_sigaction_fromK_t;
275
276
277typedef struct vki_sigaltstack {
278	void __user *ss_sp;
279	int ss_flags;
280	vki_size_t ss_size;
281} vki_stack_t;
282
283
284//----------------------------------------------------------------------
285// From linux-2.6.16.60/include/asm-s390/mman.h
286//----------------------------------------------------------------------
287
288#define VKI_PROT_NONE   0x0             /* No page permissions */
289#define VKI_PROT_READ   0x1             /* page can be read */
290#define VKI_PROT_WRITE  0x2             /* page can be written */
291#define VKI_PROT_EXEC   0x4             /* page can be executed */
292#define VKI_PROT_GROWSDOWN 0x01000000   /* mprotect flag: extend
293					   change to start of
294					   growsdown vma */
295#define VKI_PROT_GROWSUP   0x02000000   /* mprotect flag:
296					   extend change to end
297					   of growsup vma */
298
299#define VKI_MAP_SHARED		0x0001  /* Share changes */
300#define VKI_MAP_PRIVATE 	0x0002	/*  */
301#define VKI_MAP_FIXED   	0x0010	/*  */
302#define VKI_MAP_ANONYMOUS	0x0020	/*  */
303
304
305//----------------------------------------------------------------------
306// From linux-2.6.16.60/include/asm-s390/fcntl.h
307//----------------------------------------------------------------------
308
309#define VKI_O_RDONLY        00000000
310#define VKI_O_WRONLY        00000001
311#define VKI_O_RDWR          00000002
312#define VKI_O_ACCMODE       00000003
313#define VKI_O_CREAT         00000100        /* not fcntl */
314#define VKI_O_EXCL          00000200        /* not fcntl */
315#define VKI_O_NOCTTY        00000400        /* not fcntl */
316#define VKI_O_TRUNC         00001000        /* not fcntl */
317#define VKI_O_APPEND        00002000
318#define VKI_O_NONBLOCK      00004000
319
320#define VKI_AT_FDCWD            -100
321
322#define VKI_F_DUPFD	0	/* dup */
323#define VKI_F_GETFD	1	/* get close_on_exec */
324#define VKI_F_SETFD	2	/* set/clear close_on_exec */
325#define VKI_F_GETFL	3	/* get file->f_flags */
326#define VKI_F_SETFL	4	/* set file->f_flags */
327#define VKI_F_GETLK	5
328#define VKI_F_SETLK	6
329#define VKI_F_SETLKW	7
330#define VKI_F_SETOWN	8	/* for sockets. */
331#define VKI_F_GETOWN	9	/* for sockets. */
332#define VKI_F_SETSIG	10	/* for sockets. */
333#define VKI_F_GETSIG	11	/* for sockets. */
334
335#define VKI_F_SETOWN_EX		15
336#define VKI_F_GETOWN_EX		16
337
338#define VKI_F_OWNER_TID		0
339#define VKI_F_OWNER_PID		1
340#define VKI_F_OWNER_PGRP	2
341
342struct vki_f_owner_ex {
343	int	type;
344	__vki_kernel_pid_t	pid;
345};
346
347#define VKI_FD_CLOEXEC  1  /* actually anything with low bit set goes */
348
349#define VKI_F_LINUX_SPECIFIC_BASE   1024
350
351
352//----------------------------------------------------------------------
353// From linux-2.6.16.60/include/asm-s390x/resource.h
354//----------------------------------------------------------------------
355
356// which just does #include <asm-generic/resource.h>
357
358#define VKI_RLIMIT_DATA             2       /* max data size */
359#define VKI_RLIMIT_STACK            3       /* max stack size */
360#define VKI_RLIMIT_CORE             4       /* max core file size */
361#define VKI_RLIMIT_NOFILE           7       /* max number of open files */
362
363
364//----------------------------------------------------------------------
365// From linux-2.6.16.60/include/asm-s390/socket.h
366//----------------------------------------------------------------------
367
368#define VKI_SOL_SOCKET      1
369
370#define VKI_SO_TYPE         3
371
372#define VKI_SO_ATTACH_FILTER        26
373
374//----------------------------------------------------------------------
375// From linux-2.6.16.60/include/asm-s390/sockios.h
376//----------------------------------------------------------------------
377
378#define VKI_SIOCSPGRP       0x8902
379#define VKI_SIOCGPGRP       0x8904
380#define VKI_SIOCGSTAMP      0x8906          /* Get stamp (timeval) */
381/* since 2.6.22 */
382#define VKI_SIOCGSTAMPNS    0x8907          /* Get stamp (timespec) */
383
384
385//----------------------------------------------------------------------
386// From linux-2.6.16.60/include/asm-s390/stat.h
387//----------------------------------------------------------------------
388
389#ifndef VGA_s390x
390struct vki_stat {
391        unsigned short st_dev;
392        unsigned short __pad1;
393        unsigned long  st_ino;
394        unsigned short st_mode;
395        unsigned short st_nlink;
396        unsigned short st_uid;
397        unsigned short st_gid;
398        unsigned short st_rdev;
399        unsigned short __pad2;
400        unsigned long  st_size;
401        unsigned long  st_blksize;
402        unsigned long  st_blocks;
403        unsigned long  st_atime;
404        unsigned long  st_atime_nsec;
405        unsigned long  st_mtime;
406        unsigned long  st_mtime_nsec;
407        unsigned long  st_ctime;
408        unsigned long  st_ctime_nsec;
409        unsigned long  __unused4;
410        unsigned long  __unused5;
411};
412
413/* This matches struct stat64 in glibc2.1, hence the absolutely
414 * insane amounts of padding around dev_t's.
415 */
416struct vki_stat64 {
417        unsigned long long	st_dev;
418        unsigned int    __pad1;
419        unsigned long   __st_ino;
420        unsigned int    st_mode;
421        unsigned int    st_nlink;
422        unsigned long   st_uid;
423        unsigned long   st_gid;
424        unsigned long long	st_rdev;
425        unsigned int    __pad3;
426        long long	st_size;
427        unsigned long   st_blksize;
428        unsigned char   __pad4[4];
429        unsigned long   __pad5;     /* future possible st_blocks high bits */
430        unsigned long   st_blocks;  /* Number 512-byte blocks allocated. */
431        unsigned long   st_atime;
432        unsigned long   st_atime_nsec;
433        unsigned long   st_mtime;
434        unsigned long   st_mtime_nsec;
435        unsigned long   st_ctime;
436        unsigned long   st_ctime_nsec;  /* will be high 32 bits of ctime someday */
437        unsigned long long	st_ino;
438};
439
440#else
441
442struct vki_stat {
443        unsigned long  st_dev;
444        unsigned long  st_ino;
445        unsigned long  st_nlink;
446        unsigned int   st_mode;
447        unsigned int   st_uid;
448        unsigned int   st_gid;
449        unsigned int   __pad1;
450        unsigned long  st_rdev;
451        unsigned long  st_size;
452        unsigned long  st_atime;
453	unsigned long  st_atime_nsec;
454        unsigned long  st_mtime;
455	unsigned long  st_mtime_nsec;
456        unsigned long  st_ctime;
457	unsigned long  st_ctime_nsec;
458        unsigned long  st_blksize;
459        long           st_blocks;
460        unsigned long  __unused[3];
461};
462
463#endif /* VGA_s390x */
464
465
466//----------------------------------------------------------------------
467// From linux-2.6.16.60/include/asm-s390/statfs.h
468//----------------------------------------------------------------------
469
470struct vki_statfs {
471        int  f_type;
472        int  f_bsize;
473        long f_blocks;
474        long f_bfree;
475        long f_bavail;
476        long f_files;
477        long f_ffree;
478        __vki_kernel_fsid_t f_fsid;
479        int  f_namelen;
480        int  f_frsize;
481        int  f_spare[5];
482};
483
484
485//----------------------------------------------------------------------
486// From linux-2.6.16.60/include/asm-s390/termios.h
487//----------------------------------------------------------------------
488
489struct vki_winsize {
490	unsigned short ws_row;
491	unsigned short ws_col;
492	unsigned short ws_xpixel;
493	unsigned short ws_ypixel;
494};
495
496#define VKI_NCC 8
497struct vki_termio {
498	unsigned short c_iflag;		/* input mode flags */
499	unsigned short c_oflag;		/* output mode flags */
500	unsigned short c_cflag;		/* control mode flags */
501	unsigned short c_lflag;		/* local mode flags */
502	unsigned char c_line;		/* line discipline */
503	unsigned char c_cc[VKI_NCC];	/* control characters */
504};
505
506
507//----------------------------------------------------------------------
508// From linux-2.6.16.60/include/asm-s390/termbits.h
509//----------------------------------------------------------------------
510
511typedef unsigned char   vki_cc_t;
512typedef unsigned int    vki_tcflag_t;
513
514#define VKI_NCCS 19
515struct vki_termios {
516	vki_tcflag_t c_iflag;		/* input mode flags */
517	vki_tcflag_t c_oflag;		/* output mode flags */
518	vki_tcflag_t c_cflag;		/* control mode flags */
519	vki_tcflag_t c_lflag;		/* local mode flags */
520	vki_cc_t c_line;		/* line discipline */
521	vki_cc_t c_cc[VKI_NCCS];	/* control characters */
522};
523
524
525//----------------------------------------------------------------------
526// From linux-2.6.16.60/include/asm-s390/ioctl.h
527//----------------------------------------------------------------------
528
529#define _VKI_IOC_NRBITS		8
530#define _VKI_IOC_TYPEBITS	8
531#define _VKI_IOC_SIZEBITS	14
532#define _VKI_IOC_DIRBITS	2
533
534#define _VKI_IOC_NRMASK		((1 << _VKI_IOC_NRBITS)-1)
535#define _VKI_IOC_TYPEMASK	((1 << _VKI_IOC_TYPEBITS)-1)
536#define _VKI_IOC_SIZEMASK	((1 << _VKI_IOC_SIZEBITS)-1)
537#define _VKI_IOC_DIRMASK	((1 << _VKI_IOC_DIRBITS)-1)
538
539#define _VKI_IOC_NRSHIFT	0
540#define _VKI_IOC_TYPESHIFT	(_VKI_IOC_NRSHIFT+_VKI_IOC_NRBITS)
541#define _VKI_IOC_SIZESHIFT	(_VKI_IOC_TYPESHIFT+_VKI_IOC_TYPEBITS)
542#define _VKI_IOC_DIRSHIFT	(_VKI_IOC_SIZESHIFT+_VKI_IOC_SIZEBITS)
543
544#define _VKI_IOC_NONE	0U
545#define _VKI_IOC_WRITE	1U
546#define _VKI_IOC_READ	2U
547
548#define _VKI_IOC(dir,type,nr,size) \
549	(((dir)  << _VKI_IOC_DIRSHIFT) | \
550	 ((type) << _VKI_IOC_TYPESHIFT) | \
551	 ((nr)   << _VKI_IOC_NRSHIFT) | \
552	 ((size) << _VKI_IOC_SIZESHIFT))
553
554/* used to create numbers */
555#define _VKI_IO(type,nr)	_VKI_IOC(_VKI_IOC_NONE,(type),(nr),0)
556#define _VKI_IOR(type,nr,size)	_VKI_IOC(_VKI_IOC_READ,(type),(nr),(_VKI_IOC_TYPECHECK(size)))
557#define _VKI_IOW(type,nr,size)	_VKI_IOC(_VKI_IOC_WRITE,(type),(nr),(_VKI_IOC_TYPECHECK(size)))
558#define _VKI_IOWR(type,nr,size)	_VKI_IOC(_VKI_IOC_READ|_VKI_IOC_WRITE,(type),(nr),(_VKI_IOC_TYPECHECK(size)))
559
560/* used to decode ioctl numbers.. */
561#define _VKI_IOC_DIR(nr)	(((nr) >> _VKI_IOC_DIRSHIFT) & _VKI_IOC_DIRMASK)
562#define _VKI_IOC_TYPE(nr)	(((nr) >> _VKI_IOC_TYPESHIFT) & _VKI_IOC_TYPEMASK)
563#define _VKI_IOC_NR(nr)		(((nr) >> _VKI_IOC_NRSHIFT) & _VKI_IOC_NRMASK)
564#define _VKI_IOC_SIZE(nr)	(((nr) >> _VKI_IOC_SIZESHIFT) & _VKI_IOC_SIZEMASK)
565
566//----------------------------------------------------------------------
567// From linux-2.6.16.60/include/asm-s390/ioctls.h
568//----------------------------------------------------------------------
569
570/* 0x54 is just a magic number to make these relatively unique ('T') */
571
572#define VKI_TCGETS	0x5401
573#define VKI_TCSETS	0x5402
574#define VKI_TCSETSW	0x5403
575#define VKI_TCSETSF	0x5404
576#define VKI_TCGETA	0x5405
577#define VKI_TCSETA	0x5406
578#define VKI_TCSETAW	0x5407
579#define VKI_TCSETAF	0x5408
580#define VKI_TCSBRK	0x5409
581#define VKI_TCXONC	0x540A
582#define VKI_TCFLSH	0x540B
583
584#define VKI_TIOCSCTTY	0x540E
585#define VKI_TIOCGPGRP	0x540F
586#define VKI_TIOCSPGRP	0x5410
587#define VKI_TIOCOUTQ	0x5411
588
589#define VKI_TIOCGWINSZ	0x5413
590#define VKI_TIOCSWINSZ	0x5414
591#define VKI_TIOCMGET	0x5415
592#define VKI_TIOCMBIS	0x5416
593#define VKI_TIOCMBIC	0x5417
594#define VKI_TIOCMSET	0x5418
595
596#define VKI_FIONREAD	0x541B
597#define VKI_TIOCLINUX	0x541C
598
599#define VKI_FIONBIO	0x5421
600
601#define VKI_TCSBRKP	0x5425	/* Needed for POSIX tcsendbreak() */
602
603#define VKI_TIOCGPTN	_VKI_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
604#define VKI_TIOCSPTLCK	_VKI_IOW('T',0x31, int)  /* Lock/unlock Pty */
605
606#define VKI_FIONCLEX	0x5450
607#define VKI_FIOCLEX	0x5451
608#define VKI_FIOASYNC	0x5452
609
610#define VKI_TIOCSERGETLSR       0x5459 /* Get line status register */
611
612#define VKI_TIOCGICOUNT	0x545D	/* read serial port inline interrupt counts */
613
614//----------------------------------------------------------------------
615// From linux-2.6.39-rc2/arch/s390/include/asm/ioctls.h
616//----------------------------------------------------------------------
617
618#define VKI_FIOQSIZE 0x545E
619
620//----------------------------------------------------------------------
621// From linux-2.6.16.60/include/asm-s390/poll.h
622//----------------------------------------------------------------------
623
624struct vki_pollfd {
625	int fd;
626	short events;
627	short revents;
628};
629
630#define VKI_POLLIN          0x0001
631
632//----------------------------------------------------------------------
633// From linux-2.6.16.60/include/asm-s390/ptrace.h
634//----------------------------------------------------------------------
635#define VKI_NUM_GPRS	16
636#define VKI_NUM_FPRS	16
637#define VKI_NUM_CRS	16
638#define VKI_NUM_ACRS	16
639
640typedef union
641{
642	float   f;
643	double  d;
644        __vki_u64   ui;
645	struct
646	{
647		__vki_u32 hi;
648		__vki_u32 lo;
649	} fp;
650} vki_freg_t;
651
652typedef struct
653{
654	__vki_u32   fpc;
655	vki_freg_t  fprs[VKI_NUM_FPRS];
656} vki_s390_fp_regs;
657
658typedef struct
659{
660        unsigned long mask;
661        unsigned long addr;
662} __attribute__ ((aligned(8))) vki_psw_t;
663
664typedef struct
665{
666	vki_psw_t psw;
667	unsigned long gprs[VKI_NUM_GPRS];
668	unsigned int  acrs[VKI_NUM_ACRS];
669	unsigned long orig_gpr2;
670} vki_s390_regs;
671
672/*
673 * Now for the program event recording (trace) definitions.
674 */
675typedef struct
676{
677	unsigned long cr[3];
678} vki_per_cr_words;
679
680typedef	struct
681{
682#ifdef VGA_s390x
683	unsigned                       : 32;
684#endif /* VGA_s390x */
685	unsigned em_branching          : 1;
686	unsigned em_instruction_fetch  : 1;
687	/*
688	 * Switching on storage alteration automatically fixes
689	 * the storage alteration event bit in the users std.
690	 */
691	unsigned em_storage_alteration : 1;
692	unsigned em_gpr_alt_unused     : 1;
693	unsigned em_store_real_address : 1;
694	unsigned                       : 3;
695	unsigned branch_addr_ctl       : 1;
696	unsigned                       : 1;
697	unsigned storage_alt_space_ctl : 1;
698	unsigned                       : 21;
699	unsigned long starting_addr;
700	unsigned long ending_addr;
701} vki_per_cr_bits;
702
703typedef struct
704{
705	unsigned short perc_atmid;
706	unsigned long address;
707	unsigned char access_id;
708} vki_per_lowcore_words;
709
710typedef struct
711{
712	unsigned perc_branching          : 1;
713	unsigned perc_instruction_fetch  : 1;
714	unsigned perc_storage_alteration : 1;
715	unsigned perc_gpr_alt_unused     : 1;
716	unsigned perc_store_real_address : 1;
717	unsigned                         : 3;
718	unsigned atmid_psw_bit_31        : 1;
719	unsigned atmid_validity_bit      : 1;
720	unsigned atmid_psw_bit_32        : 1;
721	unsigned atmid_psw_bit_5         : 1;
722	unsigned atmid_psw_bit_16        : 1;
723	unsigned atmid_psw_bit_17        : 1;
724	unsigned si                      : 2;
725	unsigned long address;
726	unsigned                         : 4;
727	unsigned access_id               : 4;
728} vki_per_lowcore_bits;
729
730typedef struct
731{
732	union {
733		vki_per_cr_words   words;
734		vki_per_cr_bits    bits;
735	} control_regs;
736	/*
737	 * Use these flags instead of setting em_instruction_fetch
738	 * directly they are used so that single stepping can be
739	 * switched on & off while not affecting other tracing
740	 */
741	unsigned  single_step       : 1;
742	unsigned  instruction_fetch : 1;
743	unsigned                    : 30;
744	/*
745	 * These addresses are copied into cr10 & cr11 if single
746	 * stepping is switched off
747	 */
748	unsigned long starting_addr;
749	unsigned long ending_addr;
750	union {
751		vki_per_lowcore_words words;
752		vki_per_lowcore_bits  bits;
753	} lowcore;
754} vki_per_struct;
755
756/*
757 * The user_regs_struct defines the way the user registers are
758 * store on the stack for signal handling.
759 */
760struct vki_user_regs_struct
761{
762	vki_psw_t psw;
763	unsigned long gprs[VKI_NUM_GPRS];
764	unsigned int  acrs[VKI_NUM_ACRS];
765	unsigned long orig_gpr2;
766	vki_s390_fp_regs fp_regs;
767	/*
768	 * These per registers are in here so that gdb can modify them
769	 * itself as there is no "official" ptrace interface for hardware
770	 * watchpoints. This is the way intel does it.
771	 */
772	vki_per_struct per_info;
773	unsigned long ieee_instruction_pointer;
774	/* Used to give failing instruction back to user for ieee exceptions */
775};
776
777typedef struct
778{
779	unsigned int  vki_len;
780	unsigned long vki_kernel_addr;
781	unsigned long vki_process_addr;
782} vki_ptrace_area;
783
784/*
785 * S/390 specific non posix ptrace requests
786 */
787#define VKI_PTRACE_PEEKUSR_AREA       0x5000
788#define VKI_PTRACE_POKEUSR_AREA       0x5001
789
790//----------------------------------------------------------------------
791// From linux-2.6.16.60/include/asm-s390/elf.h
792//----------------------------------------------------------------------
793
794typedef vki_s390_fp_regs vki_elf_fpregset_t;
795typedef vki_s390_regs vki_elf_gregset_t;
796
797
798//----------------------------------------------------------------------
799// From linux-2.6.16.60/include/asm-s390/ucontext.h
800//----------------------------------------------------------------------
801
802struct vki_ucontext {
803	unsigned long	      uc_flags;
804	struct vki_ucontext  *uc_link;
805	vki_stack_t	      uc_stack;
806	_vki_sigregs          uc_mcontext;
807	vki_sigset_t	      uc_sigmask; /* mask last for extensibility */
808};
809
810//----------------------------------------------------------------------
811// From linux-2.6.16.60/include/asm-s390/ipcbuf.h
812//----------------------------------------------------------------------
813
814struct vki_ipc64_perm
815{
816	__vki_kernel_key_t	key;
817	__vki_kernel_uid32_t	uid;
818	__vki_kernel_gid32_t	gid;
819	__vki_kernel_uid32_t	cuid;
820	__vki_kernel_gid32_t	cgid;
821	__vki_kernel_mode_t	mode;
822	unsigned short		__pad1;
823	unsigned short		seq;
824#ifndef VGA_s390x
825	unsigned short		__pad2;
826#endif /* ! VGA_s390x */
827	unsigned long		__unused1;
828	unsigned long		__unused2;
829};
830
831
832//----------------------------------------------------------------------
833// From linux-2.6.16.60/include/asm-s390/sembuf.h
834//----------------------------------------------------------------------
835
836struct vki_semid64_ds {
837	struct vki_ipc64_perm sem_perm;		/* permissions .. see ipc.h */
838	__vki_kernel_time_t   sem_otime;	/* last semop time */
839#ifndef VGA_s390x
840	unsigned long	__unused1;
841#endif /* ! VGA_s390x */
842	__vki_kernel_time_t   sem_ctime;	/* last change time */
843#ifndef VGA_s390x
844	unsigned long	__unused2;
845#endif /* ! VGA_s390x */
846	unsigned long	sem_nsems;		/* no. of semaphores in array */
847	unsigned long	__unused3;
848	unsigned long	__unused4;
849};
850
851
852//----------------------------------------------------------------------
853// From linux-2.6.16.60/include/asm-s390/msgbuf.h
854//----------------------------------------------------------------------
855
856struct vki_msqid64_ds {
857	struct vki_ipc64_perm msg_perm;
858	__vki_kernel_time_t msg_stime;	/* last msgsnd time */
859#ifndef VGA_s390x
860	unsigned long	__unused1;
861#endif /* ! VGA_s390x */
862	__vki_kernel_time_t msg_rtime;	/* last msgrcv time */
863#ifndef VGA_s390x
864	unsigned long	__unused2;
865#endif /* ! VGA_s390x */
866	__vki_kernel_time_t msg_ctime;	/* last change time */
867#ifndef VGA_s390x
868	unsigned long	__unused3;
869#endif /* ! VGA_s390x */
870	unsigned long  msg_cbytes;	/* current number of bytes on queue */
871	unsigned long  msg_qnum;	/* number of messages in queue */
872	unsigned long  msg_qbytes;	/* max number of bytes on queue */
873	__vki_kernel_pid_t msg_lspid;	/* pid of last msgsnd */
874	__vki_kernel_pid_t msg_lrpid;	/* last receive pid */
875	unsigned long  __unused4;
876	unsigned long  __unused5;
877};
878
879
880//----------------------------------------------------------------------
881// From linux-2.6.16.60/include/asm-s390/ipc.h
882//----------------------------------------------------------------------
883
884struct vki_ipc_kludge {
885	struct vki_msgbuf __user *msgp;
886	long msgtyp;
887};
888
889#define VKI_SEMOP	 1
890#define VKI_SEMGET	 2
891#define VKI_SEMCTL	 3
892#define VKI_SEMTIMEDOP	 4
893#define VKI_MSGSND	11
894#define VKI_MSGRCV	12
895#define VKI_MSGGET	13
896#define VKI_MSGCTL	14
897#define VKI_SHMAT	21
898#define VKI_SHMDT	22
899#define VKI_SHMGET	23
900#define VKI_SHMCTL	24
901
902
903//----------------------------------------------------------------------
904// From linux-2.6.16.60/include/asm-s390/shmbuf.h
905//----------------------------------------------------------------------
906
907struct vki_shmid64_ds {
908	struct vki_ipc64_perm	shm_perm;	/* operation perms */
909	vki_size_t		shm_segsz;	/* size of segment (bytes) */
910	__vki_kernel_time_t	shm_atime;	/* last attach time */
911#ifndef VGA_s390x
912	unsigned long		__unused1;
913#endif /* ! VGA_s390x */
914	__vki_kernel_time_t	shm_dtime;	/* last detach time */
915#ifndef VGA_s390x
916	unsigned long		__unused2;
917#endif /* ! VGA_s390x */
918	__vki_kernel_time_t	shm_ctime;	/* last change time */
919#ifndef VGA_s390x
920	unsigned long		__unused3;
921#endif /* ! VGA_s390x */
922	__vki_kernel_pid_t	shm_cpid;	/* pid of creator */
923	__vki_kernel_pid_t	shm_lpid;	/* pid of last operator */
924	unsigned long		shm_nattch;	/* no. of current attaches */
925	unsigned long		__unused4;
926	unsigned long		__unused5;
927};
928
929struct vki_shminfo64 {
930	unsigned long	shmmax;
931	unsigned long	shmmin;
932	unsigned long	shmmni;
933	unsigned long	shmseg;
934	unsigned long	shmall;
935	unsigned long	__unused1;
936	unsigned long	__unused2;
937	unsigned long	__unused3;
938	unsigned long	__unused4;
939};
940
941
942//----------------------------------------------------------------------
943// The following are defined in the VKI namespace but are nowhere found
944// in the linux headers.
945//----------------------------------------------------------------------
946#define VKI_BIG_ENDIAN      1
947#define VKI_MAX_PAGE_SHIFT  VKI_PAGE_SHIFT
948#define VKI_MAX_PAGE_SIZE   VKI_PAGE_SIZE
949
950//----------------------------------------------------------------------
951// From linux-2.6.35.4/arch/s390x/include/asm/shmparam.h
952//----------------------------------------------------------------------
953
954#define VKI_SHMLBA  VKI_PAGE_SIZE
955
956/* If a system call returns a value >= VKI_MAX_ERRNO then that is considered
957   an error condition. I.e. the system call failed. */
958#define VKI_MAX_ERRNO       -125
959
960//----------------------------------------------------------------------
961// From linux-2.6.8.1/include/asm-generic/errno.h
962//----------------------------------------------------------------------
963
964#define	VKI_ENOSYS       38  /* Function not implemented */
965#define	VKI_EOVERFLOW    75  /* Value too large for defined data type */
966
967#endif // __VKI_S390X_LINUX_H
968
969/*--------------------------------------------------------------------*/
970/*--- end                                                          ---*/
971/*--------------------------------------------------------------------*/
972