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-2017
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        // Yes, the reserved field is really glibc specific. The kernel
262        // doesn't have it and uses an unsigned long for sa_flags.
263        // The glibc and the kernel agreed this is fine and the
264        // __glibc_reserved0 field can be undefined.
265        // See https://sourceware.org/ml/libc-alpha/2014-09/msg00161.html
266        int __glibc_reserved0;
267        int sa_flags;
268        void (*sa_restorer)(void);
269        vki_sigset_t sa_mask;               /* mask last for extensibility */
270};
271
272struct vki_k_sigaction {
273        struct vki_sigaction sa;
274};
275
276
277/* On Linux we use the same type for passing sigactions to
278   and from the kernel.  Hence: */
279typedef  struct vki_sigaction  vki_sigaction_toK_t;
280typedef  struct vki_sigaction  vki_sigaction_fromK_t;
281
282
283typedef struct vki_sigaltstack {
284	void __user *ss_sp;
285	int ss_flags;
286	vki_size_t ss_size;
287} vki_stack_t;
288
289
290//----------------------------------------------------------------------
291// From linux-2.6.16.60/include/asm-s390/mman.h
292//----------------------------------------------------------------------
293
294#define VKI_PROT_NONE   0x0             /* No page permissions */
295#define VKI_PROT_READ   0x1             /* page can be read */
296#define VKI_PROT_WRITE  0x2             /* page can be written */
297#define VKI_PROT_EXEC   0x4             /* page can be executed */
298#define VKI_PROT_GROWSDOWN 0x01000000   /* mprotect flag: extend
299					   change to start of
300					   growsdown vma */
301#define VKI_PROT_GROWSUP   0x02000000   /* mprotect flag:
302					   extend change to end
303					   of growsup vma */
304
305#define VKI_MAP_SHARED		0x0001  /* Share changes */
306#define VKI_MAP_PRIVATE 	0x0002	/*  */
307#define VKI_MAP_FIXED   	0x0010	/*  */
308#define VKI_MAP_ANONYMOUS	0x0020	/*  */
309
310
311//----------------------------------------------------------------------
312// From linux-2.6.16.60/include/asm-s390/fcntl.h
313//----------------------------------------------------------------------
314
315#define VKI_O_RDONLY        00000000
316#define VKI_O_WRONLY        00000001
317#define VKI_O_RDWR          00000002
318#define VKI_O_ACCMODE       00000003
319#define VKI_O_CREAT         00000100        /* not fcntl */
320#define VKI_O_EXCL          00000200        /* not fcntl */
321#define VKI_O_NOCTTY        00000400        /* not fcntl */
322#define VKI_O_TRUNC         00001000        /* not fcntl */
323#define VKI_O_APPEND        00002000
324#define VKI_O_NONBLOCK      00004000
325
326#define VKI_AT_FDCWD            -100
327
328#define VKI_F_DUPFD	0	/* dup */
329#define VKI_F_GETFD	1	/* get close_on_exec */
330#define VKI_F_SETFD	2	/* set/clear close_on_exec */
331#define VKI_F_GETFL	3	/* get file->f_flags */
332#define VKI_F_SETFL	4	/* set file->f_flags */
333#define VKI_F_GETLK	5
334#define VKI_F_SETLK	6
335#define VKI_F_SETLKW	7
336#define VKI_F_SETOWN	8	/* for sockets. */
337#define VKI_F_GETOWN	9	/* for sockets. */
338#define VKI_F_SETSIG	10	/* for sockets. */
339#define VKI_F_GETSIG	11	/* for sockets. */
340
341#define VKI_F_SETOWN_EX		15
342#define VKI_F_GETOWN_EX		16
343
344#define VKI_F_OFD_GETLK		36
345#define VKI_F_OFD_SETLK		37
346#define VKI_F_OFD_SETLKW	38
347
348#define VKI_F_OWNER_TID		0
349#define VKI_F_OWNER_PID		1
350#define VKI_F_OWNER_PGRP	2
351
352struct vki_f_owner_ex {
353	int	type;
354	__vki_kernel_pid_t	pid;
355};
356
357#define VKI_FD_CLOEXEC  1  /* actually anything with low bit set goes */
358
359#define VKI_F_LINUX_SPECIFIC_BASE   1024
360
361
362//----------------------------------------------------------------------
363// From linux-2.6.16.60/include/asm-s390x/resource.h
364//----------------------------------------------------------------------
365
366// which just does #include <asm-generic/resource.h>
367
368#define VKI_RLIMIT_DATA             2       /* max data size */
369#define VKI_RLIMIT_STACK            3       /* max stack size */
370#define VKI_RLIMIT_CORE             4       /* max core file size */
371#define VKI_RLIMIT_NOFILE           7       /* max number of open files */
372
373
374//----------------------------------------------------------------------
375// From linux-2.6.16.60/include/asm-s390/socket.h
376//----------------------------------------------------------------------
377
378#define VKI_SOL_SOCKET      1
379
380#define VKI_SO_TYPE         3
381
382#define VKI_SO_ATTACH_FILTER        26
383
384//----------------------------------------------------------------------
385// From linux-2.6.16.60/include/asm-s390/sockios.h
386//----------------------------------------------------------------------
387
388#define VKI_SIOCSPGRP       0x8902
389#define VKI_SIOCGPGRP       0x8904
390#define VKI_SIOCATMARK      0x8905
391#define VKI_SIOCGSTAMP      0x8906          /* Get stamp (timeval) */
392/* since 2.6.22 */
393#define VKI_SIOCGSTAMPNS    0x8907          /* Get stamp (timespec) */
394
395
396//----------------------------------------------------------------------
397// From linux-2.6.16.60/include/asm-s390/stat.h
398//----------------------------------------------------------------------
399
400#ifndef VGA_s390x
401struct vki_stat {
402        unsigned short st_dev;
403        unsigned short __pad1;
404        unsigned long  st_ino;
405        unsigned short st_mode;
406        unsigned short st_nlink;
407        unsigned short st_uid;
408        unsigned short st_gid;
409        unsigned short st_rdev;
410        unsigned short __pad2;
411        unsigned long  st_size;
412        unsigned long  st_blksize;
413        unsigned long  st_blocks;
414        unsigned long  st_atime;
415        unsigned long  st_atime_nsec;
416        unsigned long  st_mtime;
417        unsigned long  st_mtime_nsec;
418        unsigned long  st_ctime;
419        unsigned long  st_ctime_nsec;
420        unsigned long  __unused4;
421        unsigned long  __unused5;
422};
423
424/* This matches struct stat64 in glibc2.1, hence the absolutely
425 * insane amounts of padding around dev_t's.
426 */
427struct vki_stat64 {
428        unsigned long long	st_dev;
429        unsigned int    __pad1;
430        unsigned long   __st_ino;
431        unsigned int    st_mode;
432        unsigned int    st_nlink;
433        unsigned long   st_uid;
434        unsigned long   st_gid;
435        unsigned long long	st_rdev;
436        unsigned int    __pad3;
437        long long	st_size;
438        unsigned long   st_blksize;
439        unsigned char   __pad4[4];
440        unsigned long   __pad5;     /* future possible st_blocks high bits */
441        unsigned long   st_blocks;  /* Number 512-byte blocks allocated. */
442        unsigned long   st_atime;
443        unsigned long   st_atime_nsec;
444        unsigned long   st_mtime;
445        unsigned long   st_mtime_nsec;
446        unsigned long   st_ctime;
447        unsigned long   st_ctime_nsec;  /* will be high 32 bits of ctime someday */
448        unsigned long long	st_ino;
449};
450
451#else
452
453struct vki_stat {
454        unsigned long  st_dev;
455        unsigned long  st_ino;
456        unsigned long  st_nlink;
457        unsigned int   st_mode;
458        unsigned int   st_uid;
459        unsigned int   st_gid;
460        unsigned int   __pad1;
461        unsigned long  st_rdev;
462        unsigned long  st_size;
463        unsigned long  st_atime;
464	unsigned long  st_atime_nsec;
465        unsigned long  st_mtime;
466	unsigned long  st_mtime_nsec;
467        unsigned long  st_ctime;
468	unsigned long  st_ctime_nsec;
469        unsigned long  st_blksize;
470        long           st_blocks;
471        unsigned long  __unused0[3];
472};
473
474#endif /* VGA_s390x */
475
476
477//----------------------------------------------------------------------
478// From linux-2.6.16.60/include/asm-s390/statfs.h
479//----------------------------------------------------------------------
480
481struct vki_statfs {
482        int  f_type;
483        int  f_bsize;
484        long f_blocks;
485        long f_bfree;
486        long f_bavail;
487        long f_files;
488        long f_ffree;
489        __vki_kernel_fsid_t f_fsid;
490        int  f_namelen;
491        int  f_frsize;
492        int  f_spare[5];
493};
494
495
496//----------------------------------------------------------------------
497// From linux-2.6.16.60/include/asm-s390/termios.h
498//----------------------------------------------------------------------
499
500struct vki_winsize {
501	unsigned short ws_row;
502	unsigned short ws_col;
503	unsigned short ws_xpixel;
504	unsigned short ws_ypixel;
505};
506
507#define VKI_NCC 8
508struct vki_termio {
509	unsigned short c_iflag;		/* input mode flags */
510	unsigned short c_oflag;		/* output mode flags */
511	unsigned short c_cflag;		/* control mode flags */
512	unsigned short c_lflag;		/* local mode flags */
513	unsigned char c_line;		/* line discipline */
514	unsigned char c_cc[VKI_NCC];	/* control characters */
515};
516
517
518//----------------------------------------------------------------------
519// From linux-2.6.16.60/include/asm-s390/termbits.h
520//----------------------------------------------------------------------
521
522typedef unsigned char   vki_cc_t;
523typedef unsigned int    vki_tcflag_t;
524
525#define VKI_NCCS 19
526struct vki_termios {
527	vki_tcflag_t c_iflag;		/* input mode flags */
528	vki_tcflag_t c_oflag;		/* output mode flags */
529	vki_tcflag_t c_cflag;		/* control mode flags */
530	vki_tcflag_t c_lflag;		/* local mode flags */
531	vki_cc_t c_line;		/* line discipline */
532	vki_cc_t c_cc[VKI_NCCS];	/* control characters */
533};
534
535
536//----------------------------------------------------------------------
537// From linux-2.6.16.60/include/asm-s390/ioctl.h
538//----------------------------------------------------------------------
539
540#define _VKI_IOC_NRBITS		8
541#define _VKI_IOC_TYPEBITS	8
542#define _VKI_IOC_SIZEBITS	14
543#define _VKI_IOC_DIRBITS	2
544
545#define _VKI_IOC_NRMASK		((1 << _VKI_IOC_NRBITS)-1)
546#define _VKI_IOC_TYPEMASK	((1 << _VKI_IOC_TYPEBITS)-1)
547#define _VKI_IOC_SIZEMASK	((1 << _VKI_IOC_SIZEBITS)-1)
548#define _VKI_IOC_DIRMASK	((1 << _VKI_IOC_DIRBITS)-1)
549
550#define _VKI_IOC_NRSHIFT	0
551#define _VKI_IOC_TYPESHIFT	(_VKI_IOC_NRSHIFT+_VKI_IOC_NRBITS)
552#define _VKI_IOC_SIZESHIFT	(_VKI_IOC_TYPESHIFT+_VKI_IOC_TYPEBITS)
553#define _VKI_IOC_DIRSHIFT	(_VKI_IOC_SIZESHIFT+_VKI_IOC_SIZEBITS)
554
555#define _VKI_IOC_NONE	0U
556#define _VKI_IOC_WRITE	1U
557#define _VKI_IOC_READ	2U
558
559#define _VKI_IOC(dir,type,nr,size) \
560	(((dir)  << _VKI_IOC_DIRSHIFT) | \
561	 ((type) << _VKI_IOC_TYPESHIFT) | \
562	 ((nr)   << _VKI_IOC_NRSHIFT) | \
563	 ((size) << _VKI_IOC_SIZESHIFT))
564
565/* used to create numbers */
566#define _VKI_IO(type,nr)	_VKI_IOC(_VKI_IOC_NONE,(type),(nr),0)
567#define _VKI_IOR(type,nr,size)	_VKI_IOC(_VKI_IOC_READ,(type),(nr),(_VKI_IOC_TYPECHECK(size)))
568#define _VKI_IOW(type,nr,size)	_VKI_IOC(_VKI_IOC_WRITE,(type),(nr),(_VKI_IOC_TYPECHECK(size)))
569#define _VKI_IOWR(type,nr,size)	_VKI_IOC(_VKI_IOC_READ|_VKI_IOC_WRITE,(type),(nr),(_VKI_IOC_TYPECHECK(size)))
570
571/* used to decode ioctl numbers.. */
572#define _VKI_IOC_DIR(nr)	(((nr) >> _VKI_IOC_DIRSHIFT) & _VKI_IOC_DIRMASK)
573#define _VKI_IOC_TYPE(nr)	(((nr) >> _VKI_IOC_TYPESHIFT) & _VKI_IOC_TYPEMASK)
574#define _VKI_IOC_NR(nr)		(((nr) >> _VKI_IOC_NRSHIFT) & _VKI_IOC_NRMASK)
575#define _VKI_IOC_SIZE(nr)	(((nr) >> _VKI_IOC_SIZESHIFT) & _VKI_IOC_SIZEMASK)
576
577//----------------------------------------------------------------------
578// From linux-2.6.16.60/include/asm-s390/ioctls.h
579//----------------------------------------------------------------------
580
581/* 0x54 is just a magic number to make these relatively unique ('T') */
582
583#define VKI_TCGETS	0x5401
584#define VKI_TCSETS	0x5402
585#define VKI_TCSETSW	0x5403
586#define VKI_TCSETSF	0x5404
587#define VKI_TCGETA	0x5405
588#define VKI_TCSETA	0x5406
589#define VKI_TCSETAW	0x5407
590#define VKI_TCSETAF	0x5408
591#define VKI_TCSBRK	0x5409
592#define VKI_TCXONC	0x540A
593#define VKI_TCFLSH	0x540B
594
595#define VKI_TIOCSCTTY	0x540E
596#define VKI_TIOCGPGRP	0x540F
597#define VKI_TIOCSPGRP	0x5410
598#define VKI_TIOCOUTQ	0x5411
599
600#define VKI_TIOCGWINSZ	0x5413
601#define VKI_TIOCSWINSZ	0x5414
602#define VKI_TIOCMGET	0x5415
603#define VKI_TIOCMBIS	0x5416
604#define VKI_TIOCMBIC	0x5417
605#define VKI_TIOCMSET	0x5418
606
607#define VKI_FIONREAD	0x541B
608#define VKI_TIOCLINUX	0x541C
609
610#define VKI_FIONBIO	0x5421
611#define VKI_TIOCNOTTY	0x5422
612
613#define VKI_TCSBRKP	0x5425	/* Needed for POSIX tcsendbreak() */
614
615#define VKI_TIOCGPTN	_VKI_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
616#define VKI_TIOCSPTLCK	_VKI_IOW('T',0x31, int)  /* Lock/unlock Pty */
617
618#define VKI_FIONCLEX	0x5450
619#define VKI_FIOCLEX	0x5451
620#define VKI_FIOASYNC	0x5452
621
622#define VKI_TIOCSERGETLSR       0x5459 /* Get line status register */
623
624#define VKI_TIOCGICOUNT	0x545D	/* read serial port inline interrupt counts */
625
626//----------------------------------------------------------------------
627// From linux-2.6.39-rc2/arch/s390/include/asm/ioctls.h
628//----------------------------------------------------------------------
629
630#define VKI_FIOQSIZE 0x545E
631
632//----------------------------------------------------------------------
633// From linux-2.6.16.60/include/asm-s390/poll.h
634//----------------------------------------------------------------------
635
636struct vki_pollfd {
637	int fd;
638	short events;
639	short revents;
640};
641
642#define VKI_POLLIN          0x0001
643
644//----------------------------------------------------------------------
645// From linux-2.6.16.60/include/asm-s390/ptrace.h
646//----------------------------------------------------------------------
647#define VKI_NUM_GPRS	16
648#define VKI_NUM_FPRS	16
649#define VKI_NUM_CRS	16
650#define VKI_NUM_ACRS	16
651
652typedef union
653{
654	float   f;
655	double  d;
656        __vki_u64   ui;
657	struct
658	{
659		__vki_u32 hi;
660		__vki_u32 lo;
661	} fp;
662} vki_freg_t;
663
664typedef struct
665{
666	__vki_u32   fpc;
667	vki_freg_t  fprs[VKI_NUM_FPRS];
668} vki_s390_fp_regs;
669
670typedef struct
671{
672        unsigned long mask;
673        unsigned long addr;
674} __attribute__ ((aligned(8))) vki_psw_t;
675
676typedef struct
677{
678	vki_psw_t psw;
679	unsigned long gprs[VKI_NUM_GPRS];
680	unsigned int  acrs[VKI_NUM_ACRS];
681	unsigned long orig_gpr2;
682} vki_s390_regs;
683
684/*
685 * Now for the program event recording (trace) definitions.
686 */
687typedef struct
688{
689	unsigned long cr[3];
690} vki_per_cr_words;
691
692typedef	struct
693{
694#ifdef VGA_s390x
695	unsigned                       : 32;
696#endif /* VGA_s390x */
697	unsigned em_branching          : 1;
698	unsigned em_instruction_fetch  : 1;
699	/*
700	 * Switching on storage alteration automatically fixes
701	 * the storage alteration event bit in the users std.
702	 */
703	unsigned em_storage_alteration : 1;
704	unsigned em_gpr_alt_unused     : 1;
705	unsigned em_store_real_address : 1;
706	unsigned                       : 3;
707	unsigned branch_addr_ctl       : 1;
708	unsigned                       : 1;
709	unsigned storage_alt_space_ctl : 1;
710	unsigned                       : 21;
711	unsigned long starting_addr;
712	unsigned long ending_addr;
713} vki_per_cr_bits;
714
715typedef struct
716{
717	unsigned short perc_atmid;
718	unsigned long address;
719	unsigned char access_id;
720} vki_per_lowcore_words;
721
722typedef struct
723{
724	unsigned perc_branching          : 1;
725	unsigned perc_instruction_fetch  : 1;
726	unsigned perc_storage_alteration : 1;
727	unsigned perc_gpr_alt_unused     : 1;
728	unsigned perc_store_real_address : 1;
729	unsigned                         : 3;
730	unsigned atmid_psw_bit_31        : 1;
731	unsigned atmid_validity_bit      : 1;
732	unsigned atmid_psw_bit_32        : 1;
733	unsigned atmid_psw_bit_5         : 1;
734	unsigned atmid_psw_bit_16        : 1;
735	unsigned atmid_psw_bit_17        : 1;
736	unsigned si                      : 2;
737	unsigned long address;
738	unsigned                         : 4;
739	unsigned access_id               : 4;
740} vki_per_lowcore_bits;
741
742typedef struct
743{
744	union {
745		vki_per_cr_words   words;
746		vki_per_cr_bits    bits;
747	} control_regs;
748	/*
749	 * Use these flags instead of setting em_instruction_fetch
750	 * directly they are used so that single stepping can be
751	 * switched on & off while not affecting other tracing
752	 */
753	unsigned  single_step       : 1;
754	unsigned  instruction_fetch : 1;
755	unsigned                    : 30;
756	/*
757	 * These addresses are copied into cr10 & cr11 if single
758	 * stepping is switched off
759	 */
760	unsigned long starting_addr;
761	unsigned long ending_addr;
762	union {
763		vki_per_lowcore_words words;
764		vki_per_lowcore_bits  bits;
765	} lowcore;
766} vki_per_struct;
767
768/*
769 * The user_regs_struct defines the way the user registers are
770 * store on the stack for signal handling.
771 */
772struct vki_user_regs_struct
773{
774	vki_psw_t psw;
775	unsigned long gprs[VKI_NUM_GPRS];
776	unsigned int  acrs[VKI_NUM_ACRS];
777	unsigned long orig_gpr2;
778	vki_s390_fp_regs fp_regs;
779	/*
780	 * These per registers are in here so that gdb can modify them
781	 * itself as there is no "official" ptrace interface for hardware
782	 * watchpoints. This is the way intel does it.
783	 */
784	vki_per_struct per_info;
785	unsigned long ieee_instruction_pointer;
786	/* Used to give failing instruction back to user for ieee exceptions */
787};
788
789typedef struct
790{
791	unsigned int  vki_len;
792	unsigned long vki_kernel_addr;
793	unsigned long vki_process_addr;
794} vki_ptrace_area;
795
796/*
797 * S/390 specific non posix ptrace requests
798 */
799#define VKI_PTRACE_PEEKUSR_AREA       0x5000
800#define VKI_PTRACE_POKEUSR_AREA       0x5001
801
802//----------------------------------------------------------------------
803// From linux-3.18/include/asm-s390/elf.h
804//----------------------------------------------------------------------
805
806typedef vki_s390_fp_regs vki_elf_fpregset_t;
807typedef vki_s390_regs vki_elf_gregset_t;
808
809#define VKI_HWCAP_S390_TE           1024
810#define VKI_HWCAP_S390_VXRS         2048
811
812
813//----------------------------------------------------------------------
814// From linux-2.6.16.60/include/asm-s390/ucontext.h
815//----------------------------------------------------------------------
816
817struct vki_ucontext {
818	unsigned long	      uc_flags;
819	struct vki_ucontext  *uc_link;
820	vki_stack_t	      uc_stack;
821	_vki_sigregs          uc_mcontext;
822	vki_sigset_t	      uc_sigmask; /* mask last for extensibility */
823};
824
825typedef char vki_modify_ldt_t;
826
827//----------------------------------------------------------------------
828// From linux-2.6.16.60/include/asm-s390/ipcbuf.h
829//----------------------------------------------------------------------
830
831struct vki_ipc64_perm
832{
833	__vki_kernel_key_t	key;
834	__vki_kernel_uid32_t	uid;
835	__vki_kernel_gid32_t	gid;
836	__vki_kernel_uid32_t	cuid;
837	__vki_kernel_gid32_t	cgid;
838	__vki_kernel_mode_t	mode;
839	unsigned short		__pad1;
840	unsigned short		seq;
841#ifndef VGA_s390x
842	unsigned short		__pad2;
843#endif /* ! VGA_s390x */
844	unsigned long		__unused1;
845	unsigned long		__unused2;
846};
847
848
849//----------------------------------------------------------------------
850// From linux-2.6.16.60/include/asm-s390/sembuf.h
851//----------------------------------------------------------------------
852
853struct vki_semid64_ds {
854	struct vki_ipc64_perm sem_perm;		/* permissions .. see ipc.h */
855	__vki_kernel_time_t   sem_otime;	/* last semop time */
856#ifndef VGA_s390x
857	unsigned long	__unused1;
858#endif /* ! VGA_s390x */
859	__vki_kernel_time_t   sem_ctime;	/* last change time */
860#ifndef VGA_s390x
861	unsigned long	__unused2;
862#endif /* ! VGA_s390x */
863	unsigned long	sem_nsems;		/* no. of semaphores in array */
864	unsigned long	__unused3;
865	unsigned long	__unused4;
866};
867
868
869//----------------------------------------------------------------------
870// From linux-2.6.16.60/include/asm-s390/msgbuf.h
871//----------------------------------------------------------------------
872
873struct vki_msqid64_ds {
874	struct vki_ipc64_perm msg_perm;
875	__vki_kernel_time_t msg_stime;	/* last msgsnd time */
876#ifndef VGA_s390x
877	unsigned long	__unused1;
878#endif /* ! VGA_s390x */
879	__vki_kernel_time_t msg_rtime;	/* last msgrcv time */
880#ifndef VGA_s390x
881	unsigned long	__unused2;
882#endif /* ! VGA_s390x */
883	__vki_kernel_time_t msg_ctime;	/* last change time */
884#ifndef VGA_s390x
885	unsigned long	__unused3;
886#endif /* ! VGA_s390x */
887	unsigned long  msg_cbytes;	/* current number of bytes on queue */
888	unsigned long  msg_qnum;	/* number of messages in queue */
889	unsigned long  msg_qbytes;	/* max number of bytes on queue */
890	__vki_kernel_pid_t msg_lspid;	/* pid of last msgsnd */
891	__vki_kernel_pid_t msg_lrpid;	/* last receive pid */
892	unsigned long  __unused4;
893	unsigned long  __unused5;
894};
895
896
897//----------------------------------------------------------------------
898// From linux-2.6.16.60/include/asm-s390/ipc.h
899//----------------------------------------------------------------------
900
901struct vki_ipc_kludge {
902	struct vki_msgbuf __user *msgp;
903	long msgtyp;
904};
905
906#define VKI_SEMOP	 1
907#define VKI_SEMGET	 2
908#define VKI_SEMCTL	 3
909#define VKI_SEMTIMEDOP	 4
910#define VKI_MSGSND	11
911#define VKI_MSGRCV	12
912#define VKI_MSGGET	13
913#define VKI_MSGCTL	14
914#define VKI_SHMAT	21
915#define VKI_SHMDT	22
916#define VKI_SHMGET	23
917#define VKI_SHMCTL	24
918
919
920//----------------------------------------------------------------------
921// From linux-2.6.16.60/include/asm-s390/shmbuf.h
922//----------------------------------------------------------------------
923
924struct vki_shmid64_ds {
925	struct vki_ipc64_perm	shm_perm;	/* operation perms */
926	vki_size_t		shm_segsz;	/* size of segment (bytes) */
927	__vki_kernel_time_t	shm_atime;	/* last attach time */
928#ifndef VGA_s390x
929	unsigned long		__unused1;
930#endif /* ! VGA_s390x */
931	__vki_kernel_time_t	shm_dtime;	/* last detach time */
932#ifndef VGA_s390x
933	unsigned long		__unused2;
934#endif /* ! VGA_s390x */
935	__vki_kernel_time_t	shm_ctime;	/* last change time */
936#ifndef VGA_s390x
937	unsigned long		__unused3;
938#endif /* ! VGA_s390x */
939	__vki_kernel_pid_t	shm_cpid;	/* pid of creator */
940	__vki_kernel_pid_t	shm_lpid;	/* pid of last operator */
941	unsigned long		shm_nattch;	/* no. of current attaches */
942	unsigned long		__unused4;
943	unsigned long		__unused5;
944};
945
946struct vki_shminfo64 {
947	unsigned long	shmmax;
948	unsigned long	shmmin;
949	unsigned long	shmmni;
950	unsigned long	shmseg;
951	unsigned long	shmall;
952	unsigned long	__unused1;
953	unsigned long	__unused2;
954	unsigned long	__unused3;
955	unsigned long	__unused4;
956};
957
958
959//----------------------------------------------------------------------
960// The following are defined in the VKI namespace but are nowhere found
961// in the linux headers.
962//----------------------------------------------------------------------
963#define VKI_BIG_ENDIAN      1
964#define VKI_MAX_PAGE_SHIFT  VKI_PAGE_SHIFT
965#define VKI_MAX_PAGE_SIZE   VKI_PAGE_SIZE
966
967//----------------------------------------------------------------------
968// From linux-2.6.35.4/arch/s390x/include/asm/shmparam.h
969//----------------------------------------------------------------------
970
971#define VKI_SHMLBA  VKI_PAGE_SIZE
972
973/* If a system call returns a value >= VKI_MAX_ERRNO then that is considered
974   an error condition. I.e. the system call failed. */
975#define VKI_MAX_ERRNO       -125
976
977//----------------------------------------------------------------------
978// From linux-2.6.8.1/include/asm-generic/errno.h
979//----------------------------------------------------------------------
980
981#define	VKI_ENOSYS       38  /* Function not implemented */
982#define	VKI_EOVERFLOW    75  /* Value too large for defined data type */
983
984//----------------------------------------------------------------------
985// From linux-3.19.0/include/uapi/asm-generic/ioctls.h
986//----------------------------------------------------------------------
987
988#define VKI_TIOCGSERIAL     0x541E
989#define VKI_TIOCSSERIAL     0x541F
990
991#endif // __VKI_S390X_LINUX_H
992
993/*--------------------------------------------------------------------*/
994/*--- end                                                          ---*/
995/*--------------------------------------------------------------------*/
996