blob: 951fb24ca37c3c5f9348004c3b2f47f6b9f8a4dc [file] [log] [blame]
nethercote73b526f2004-10-31 18:48:21 +00001
2/*--------------------------------------------------------------------*/
njn4de47b12005-05-16 03:25:12 +00003/*--- Linux-specific kernel interface. vki-linux.h ---*/
nethercote73b526f2004-10-31 18:48:21 +00004/*--------------------------------------------------------------------*/
5
6/*
njnb9c427c2004-12-01 14:14:42 +00007 This file is part of Valgrind, a dynamic binary instrumentation
8 framework.
nethercote73b526f2004-10-31 18:48:21 +00009
njn53612422005-03-12 16:22:54 +000010 Copyright (C) 2000-2005 Julian Seward
nethercote73b526f2004-10-31 18:48:21 +000011 jseward@acm.org
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/* This file defines types and constants for the kernel interface, and to
32 make that clear everything is prefixed VKI_/vki_.
33
34 All code is copied verbatim from kernel source files, except that:
35 - VKI_/vki_ prefixes are added
36 - a few extra constants are defined (eg. VKI_MAP_NOSYMS); these are
37 marked 'internal'
38 - some extra explanatory comments are included; they are all within
39 "[[ ]]"
40 - for some types, we only care about the size; for a few of them (big
41 ones that are painful to fully drag in here), a VKI_SIZEOF_* constant
42 is used.
43
44 The files the code is taken from is indicated.
45
46 Note especially that the types are not the glibc versions, many of which
47 are different to those in here.
48
njnac7924c2005-05-02 13:24:14 +000049 Also note that this file contains all the generic header info, ie. that
sewardjedef1462005-05-02 17:11:58 +000050 from linux/include/linux/ *.h. The arch-specific header info, eg. that
njn4de47b12005-05-16 03:25:12 +000051 from linux/include/asm-i386/ *.h, is in vki-$PLATFORM.h and
52 vki_posixtypes-$PLATFORM.h. (Two files are required to avoid
njnac7924c2005-05-02 13:24:14 +000053 circular dependencies between the generic VKI header and the
54 arch-specific VKI header. It's possible in the future, as more stuff
55 gets pulled in, that we might have to split files up some more to avoid
56 further circular dependencies.)
57
nethercote73b526f2004-10-31 18:48:21 +000058 Finally, note that it is assumed that __KERNEL__ is set for all these
59 definitions, which affects some of them.
60*/
61
njn4de47b12005-05-16 03:25:12 +000062#ifndef __VKI_LINUX_H
63#define __VKI_LINUX_H
nethercote73b526f2004-10-31 18:48:21 +000064
65//----------------------------------------------------------------------
66// Arch-specific POSIX types
67//----------------------------------------------------------------------
68
njn4de47b12005-05-16 03:25:12 +000069#if defined(VGA_x86)
70# include "vki_posixtypes-x86-linux.h"
71#elif defined(VGA_amd64)
72# include "vki_posixtypes-amd64-linux.h"
cerion85665ca2005-06-20 15:51:07 +000073#elif defined(VGA_ppc32)
74# include "vki_posixtypes-ppc32-linux.h"
njn4de47b12005-05-16 03:25:12 +000075#else
76# error Unknown platform
77#endif
nethercote73b526f2004-10-31 18:48:21 +000078
79//----------------------------------------------------------------------
80// From linux-2.6.8.1/include/linux/compiler.h
81//----------------------------------------------------------------------
82
83# define __user
84
85# define __attribute_const__ /* unimplemented */
86
87//----------------------------------------------------------------------
88// From linux-2.6.8.1/include/linux/posix_types.h
89//----------------------------------------------------------------------
90
nethercotef1049bf2004-11-14 17:03:47 +000091#undef __VKI_NFDBITS
92#define __VKI_NFDBITS (8 * sizeof(unsigned long))
93
94#undef __VKI_FD_SETSIZE
95#define __VKI_FD_SETSIZE 1024
96
97#undef __VKI_FDSET_LONGS
98#define __VKI_FDSET_LONGS (__VKI_FD_SETSIZE/__VKI_NFDBITS)
99
100#undef __VKI_FDELT
101#define __VKI_FDELT(d) ((d) / __VKI_NFDBITS)
102
103#undef __VKI_FDMASK
104#define __VKI_FDMASK(d) (1UL << ((d) % __VKI_NFDBITS))
105
106typedef struct {
107 unsigned long fds_bits [__VKI_FDSET_LONGS];
108} __vki_kernel_fd_set;
109
nethercote73b526f2004-10-31 18:48:21 +0000110typedef int __vki_kernel_key_t;
nethercote330abb52004-11-16 12:58:04 +0000111typedef int __vki_kernel_mqd_t;
nethercote73b526f2004-10-31 18:48:21 +0000112
113//----------------------------------------------------------------------
114// From linux-2.6.8.1/include/linux/types.h
115//----------------------------------------------------------------------
116
nethercotef1049bf2004-11-14 17:03:47 +0000117typedef __vki_kernel_fd_set vki_fd_set;
nethercote73b526f2004-10-31 18:48:21 +0000118typedef __vki_kernel_mode_t vki_mode_t;
119typedef __vki_kernel_off_t vki_off_t;
120typedef __vki_kernel_pid_t vki_pid_t;
121typedef __vki_kernel_key_t vki_key_t;
122typedef __vki_kernel_suseconds_t vki_suseconds_t;
123typedef __vki_kernel_timer_t vki_timer_t;
nethercote92b2fd52004-11-16 16:15:41 +0000124typedef __vki_kernel_clockid_t vki_clockid_t;
nethercote330abb52004-11-16 12:58:04 +0000125typedef __vki_kernel_mqd_t vki_mqd_t;
nethercote73b526f2004-10-31 18:48:21 +0000126
127// [[Nb: it's a bit unclear due to a #ifdef, but I think this is right. --njn]]
128typedef __vki_kernel_uid32_t vki_uid_t;
129typedef __vki_kernel_gid32_t vki_gid_t;
130
nethercotec6851dd2004-11-11 18:00:47 +0000131typedef __vki_kernel_old_uid_t vki_old_uid_t;
132typedef __vki_kernel_old_gid_t vki_old_gid_t;
133
nethercote73b526f2004-10-31 18:48:21 +0000134typedef __vki_kernel_loff_t vki_loff_t;
135
136typedef __vki_kernel_size_t vki_size_t;
137typedef __vki_kernel_time_t vki_time_t;
138typedef __vki_kernel_clock_t vki_clock_t;
139typedef __vki_kernel_caddr_t vki_caddr_t;
140
nethercote5b653bc2004-11-15 14:32:12 +0000141typedef unsigned long vki_u_long;
142
nethercote7f7e4d12004-11-15 12:28:58 +0000143typedef unsigned int vki_uint;
144
nethercote73b526f2004-10-31 18:48:21 +0000145//----------------------------------------------------------------------
146// Now the rest of the arch-specific stuff
147//----------------------------------------------------------------------
148
njn4de47b12005-05-16 03:25:12 +0000149#if defined(VGA_x86)
150# include "vki-x86-linux.h"
151#elif defined(VGA_amd64)
152# include "vki-amd64-linux.h"
cerion85665ca2005-06-20 15:51:07 +0000153#elif defined(VGA_ppc32)
154# include "vki-ppc32-linux.h"
njn4de47b12005-05-16 03:25:12 +0000155#else
156# error Unknown platform
157#endif
nethercote73b526f2004-10-31 18:48:21 +0000158
159//----------------------------------------------------------------------
160// From linux-2.6.8.1/include/linux/limits.h
161//----------------------------------------------------------------------
162
163#define VKI_PATH_MAX 4096 /* # chars in a path name including nul */
164
165//----------------------------------------------------------------------
166// From linux-2.6.8.1/include/linux/kernel.h
167//----------------------------------------------------------------------
168
169struct vki_sysinfo {
170 long uptime; /* Seconds since boot */
171 unsigned long loads[3]; /* 1, 5, and 15 minute load averages */
172 unsigned long totalram; /* Total usable main memory size */
173 unsigned long freeram; /* Available memory size */
174 unsigned long sharedram; /* Amount of shared memory */
175 unsigned long bufferram; /* Memory used by buffers */
176 unsigned long totalswap; /* Total swap space size */
177 unsigned long freeswap; /* swap space still available */
178 unsigned short procs; /* Number of current processes */
179 unsigned short pad; /* explicit padding for m68k */
180 unsigned long totalhigh; /* Total high memory size */
181 unsigned long freehigh; /* Available high memory size */
182 unsigned int mem_unit; /* Memory unit size in bytes */
183 char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding: libc5 uses this.. */
184};
185
186//----------------------------------------------------------------------
187// From linux-2.6.8.1/include/linux/byteorder/swab.h
188//----------------------------------------------------------------------
189
190#define ___vki_swab16(x) \
191({ \
192 __vki_u16 __x = (x); \
193 ((__vki_u16)( \
194 (((__vki_u16)(__x) & (__vki_u16)0x00ffU) << 8) | \
195 (((__vki_u16)(__x) & (__vki_u16)0xff00U) >> 8) )); \
196})
197
198/*
199 * provide defaults when no architecture-specific optimization is detected
200 */
201#ifndef __vki_arch__swab16
202# define __vki_arch__swab16(x) ({ __vki_u16 __tmp = (x) ; ___vki_swab16(__tmp); })
203#endif
204
205// [[Nb: using the non-OPTIMIZE version here -- easier to understand, and
206// we don't need the optimised version as we use this very rarely]]
207# define __vki_swab16(x) __vki_fswab16(x)
208
209static __inline__ __attribute_const__ __vki_u16 __vki_fswab16(__vki_u16 x)
210{
211 return __vki_arch__swab16(x);
212}
213
214//----------------------------------------------------------------------
215// From linux-2.6.8.1/include/linux/byteorder/little_endian.h
216//----------------------------------------------------------------------
217
218#ifdef VKI_LITTLE_ENDIAN
219#define __vki_be16_to_cpu(x) __vki_swab16((x))
220#endif // VKI_LITTLE_ENDIAN
221
222//----------------------------------------------------------------------
223// From linux-2.6.8.1/include/linux/byteorder/big_endian.h
224//----------------------------------------------------------------------
225
226#ifdef VKI_BIG_ENDIAN
227#define __vki_be16_to_cpu(x) ((__vki_u16)(x))
228#endif // VKI_BIG_ENDIAN
229
230//----------------------------------------------------------------------
231// From linux-2.6.8.1/include/linux/byteorder/generic.h
232//----------------------------------------------------------------------
233
234#define ___vki_ntohs(x) __vki_be16_to_cpu(x)
235
236#define vki_ntohs(x) ___vki_ntohs(x)
237
238//----------------------------------------------------------------------
239// From linux-2.6.8.1/include/linux/time.h
240//----------------------------------------------------------------------
241
242struct vki_timespec {
243 vki_time_t tv_sec; /* seconds */
244 long tv_nsec; /* nanoseconds */
245};
246
247struct vki_timeval {
248 vki_time_t tv_sec; /* seconds */
249 vki_suseconds_t tv_usec; /* microseconds */
250};
251
252struct vki_timezone {
253 int tz_minuteswest; /* minutes west of Greenwich */
254 int tz_dsttime; /* type of dst correction */
255};
256
257struct vki_itimerspec {
258 struct vki_timespec it_interval; /* timer period */
259 struct vki_timespec it_value; /* timer expiration */
260};
261
262struct vki_itimerval {
263 struct vki_timeval it_interval; /* timer interval */
264 struct vki_timeval it_value; /* current value */
265};
266
267//----------------------------------------------------------------------
268// From linux-2.6.8.1/include/linux/timex.h
269//----------------------------------------------------------------------
270
271struct vki_timex {
272 unsigned int modes; /* mode selector */
273 long offset; /* time offset (usec) */
274 long freq; /* frequency offset (scaled ppm) */
275 long maxerror; /* maximum error (usec) */
276 long esterror; /* estimated error (usec) */
277 int status; /* clock command/status */
278 long constant; /* pll time constant */
279 long precision; /* clock precision (usec) (read only) */
280 long tolerance; /* clock frequency tolerance (ppm)
281 * (read only)
282 */
283 struct vki_timeval time; /* (read only) */
284 long tick; /* (modified) usecs between clock ticks */
285
286 long ppsfreq; /* pps frequency (scaled ppm) (ro) */
287 long jitter; /* pps jitter (us) (ro) */
288 int shift; /* interval duration (s) (shift) (ro) */
289 long stabil; /* pps stability (scaled ppm) (ro) */
290 long jitcnt; /* jitter limit exceeded (ro) */
291 long calcnt; /* calibration intervals (ro) */
292 long errcnt; /* calibration errors (ro) */
293 long stbcnt; /* stability limit exceeded (ro) */
294
295 int :32; int :32; int :32; int :32;
296 int :32; int :32; int :32; int :32;
297 int :32; int :32; int :32; int :32;
298};
299
300//#define ADJ_OFFSET 0x0001 /* time offset */
301#define ADJ_FREQUENCY 0x0002 /* frequency offset */
302#define ADJ_MAXERROR 0x0004 /* maximum time error */
303#define ADJ_ESTERROR 0x0008 /* estimated time error */
304#define ADJ_STATUS 0x0010 /* clock status */
305#define ADJ_TIMECONST 0x0020 /* pll time constant */
306#define ADJ_TICK 0x4000 /* tick value */
307//#define ADJ_OFFSET_SINGLESHOT 0x8001 /* old-fashioned adjtime */
308
309//----------------------------------------------------------------------
310// From linux-2.6.8.1/include/linux/times.h
311//----------------------------------------------------------------------
312
313struct vki_tms {
314 vki_clock_t tms_utime;
315 vki_clock_t tms_stime;
316 vki_clock_t tms_cutime;
317 vki_clock_t tms_cstime;
318};
319
320//----------------------------------------------------------------------
321// From linux-2.6.8.1/include/linux/utime.h
322//----------------------------------------------------------------------
323
324struct vki_utimbuf {
325 vki_time_t actime;
326 vki_time_t modtime;
327};
328
329//----------------------------------------------------------------------
330// From linux-2.6.8.1/include/linux/sched.h
331//----------------------------------------------------------------------
332
sewardjb5f6f512005-03-10 23:59:00 +0000333#define VKI_CSIGNAL 0x000000ff /* signal mask to be sent at exit */
nethercote73b526f2004-10-31 18:48:21 +0000334#define VKI_CLONE_VM 0x00000100 /* set if VM shared between processes */
335#define VKI_CLONE_FS 0x00000200 /* set if fs info shared between processes */
336#define VKI_CLONE_FILES 0x00000400 /* set if open files shared between processes */
337#define VKI_CLONE_SIGHAND 0x00000800 /* set if signal handlers and blocked signals shared */
sewardjb5f6f512005-03-10 23:59:00 +0000338#define VKI_CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */
339#define VKI_CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */
nethercote73b526f2004-10-31 18:48:21 +0000340#define VKI_CLONE_THREAD 0x00010000 /* Same thread group? */
sewardjb5f6f512005-03-10 23:59:00 +0000341#define VKI_CLONE_SYSVSEM 0x00040000 /* share system V SEM_UNDO semantics */
342#define VKI_CLONE_SETTLS 0x00080000 /* create a new TLS for the child */
nethercote73b526f2004-10-31 18:48:21 +0000343#define VKI_CLONE_PARENT_SETTID 0x00100000 /* set the TID in the parent */
344#define VKI_CLONE_CHILD_CLEARTID 0x00200000 /* clear the TID in the child */
345#define VKI_CLONE_DETACHED 0x00400000 /* Unused, ignored */
346#define VKI_CLONE_CHILD_SETTID 0x01000000 /* set the TID in the child */
347
348struct vki_sched_param {
349 int sched_priority;
350};
351
352//----------------------------------------------------------------------
353// From linux-2.6.8.1/include/asm-generic/siginfo.h
354//----------------------------------------------------------------------
355
356typedef union vki_sigval {
357 int sival_int;
358 void __user *sival_ptr;
359} vki_sigval_t;
360
361#ifndef __VKI_ARCH_SI_PREAMBLE_SIZE
362#define __VKI_ARCH_SI_PREAMBLE_SIZE (3 * sizeof(int))
363#endif
364
365#define VKI_SI_MAX_SIZE 128
366
367#ifndef VKI_SI_PAD_SIZE
368#define VKI_SI_PAD_SIZE ((VKI_SI_MAX_SIZE - __VKI_ARCH_SI_PREAMBLE_SIZE) / sizeof(int))
369#endif
370
371#ifndef __VKI_ARCH_SI_UID_T
372#define __VKI_ARCH_SI_UID_T vki_uid_t
373#endif
374
375#ifndef __VKI_ARCH_SI_BAND_T
376#define __VKI_ARCH_SI_BAND_T long
377#endif
378
379// [[Nb: this type changed between 2.4 and 2.6, but not in a way that
380// affects Valgrind.]]
381typedef struct vki_siginfo {
382 int si_signo;
383 int si_errno;
384 int si_code;
385
386 union {
387 int _pad[VKI_SI_PAD_SIZE];
388
389 /* kill() */
390 struct {
391 vki_pid_t _pid; /* sender's pid */
392 __VKI_ARCH_SI_UID_T _uid; /* sender's uid */
393 } _kill;
394
395 /* POSIX.1b timers */
396 struct {
397 vki_timer_t _tid; /* timer id */
398 int _overrun; /* overrun count */
399 char _pad[sizeof( __VKI_ARCH_SI_UID_T) - sizeof(int)];
400 vki_sigval_t _sigval; /* same as below */
401 int _sys_private; /* not to be passed to user */
402 } _timer;
403
404 /* POSIX.1b signals */
405 struct {
406 vki_pid_t _pid; /* sender's pid */
407 __VKI_ARCH_SI_UID_T _uid; /* sender's uid */
408 vki_sigval_t _sigval;
409 } _rt;
410
411 /* SIGCHLD */
412 struct {
413 vki_pid_t _pid; /* which child */
414 __VKI_ARCH_SI_UID_T _uid; /* sender's uid */
415 int _status; /* exit code */
416 vki_clock_t _utime;
417 vki_clock_t _stime;
418 } _sigchld;
419
420 /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
421 struct {
422 void __user *_addr; /* faulting insn/memory ref. */
423#ifdef __ARCH_SI_TRAPNO
424 int _trapno; /* TRAP # which caused the signal */
425#endif
426 } _sigfault;
427
428 /* SIGPOLL */
429 struct {
430 __VKI_ARCH_SI_BAND_T _band; /* POLL_IN, POLL_OUT, POLL_MSG */
431 int _fd;
432 } _sigpoll;
433 } _sifields;
434} vki_siginfo_t;
435
436/*
437 * si_code values
438 * Digital reserves positive values for kernel-generated signals.
439 */
440#define VKI_SI_USER 0 /* sent by kill, sigsend, raise */
441#define VKI_SI_TKILL -6 /* sent by tkill system call */
442
443#define VKI_SIGEV_MAX_SIZE 64
444#ifndef VKI_SIGEV_PAD_SIZE
445#define VKI_SIGEV_PAD_SIZE ((VKI_SIGEV_MAX_SIZE/sizeof(int)) - 3)
446#endif
447
448// [[Nb: in 2.6.8.1, this constant is never defined...]]
449#ifndef HAVE_ARCH_SIGEVENT_T
450
451typedef struct vki_sigevent {
452 vki_sigval_t sigev_value;
453 int sigev_signo;
454 int sigev_notify;
455 union {
456 int _pad[VKI_SIGEV_PAD_SIZE];
457 int _tid;
458
459 struct {
460 void (*_function)(vki_sigval_t);
461 void *_attribute; /* really pthread_attr_t */
462 } _sigev_thread;
463 } _sigev_un;
464} vki_sigevent_t;
465
466#endif
467
468//----------------------------------------------------------------------
469// From elsewhere...
470//----------------------------------------------------------------------
471
472// [[The kernel actually uses the numbers 0,1,2 directly here, believe it or
473// not. So we introduce our own constants, based on the glibc ones.]]
474#define VKI_SEEK_SET 0
475#define VKI_SEEK_CUR 1
476#define VKI_SEEK_END 2
477
478// [[Our own additional mmap flags]]
479#define VKI_MAP_NOSYMS 0x40000000 // internal: disable symbol loading
480#define VKI_MAP_CLIENT 0x80000000 // internal: distinguish client mappings
481
482//----------------------------------------------------------------------
483// From linux-2.6.8.1/include/linux/net.h
484//----------------------------------------------------------------------
485
486#define VKI_SYS_SOCKET 1 /* sys_socket(2) */
487#define VKI_SYS_BIND 2 /* sys_bind(2) */
488#define VKI_SYS_CONNECT 3 /* sys_connect(2) */
489#define VKI_SYS_LISTEN 4 /* sys_listen(2) */
490#define VKI_SYS_ACCEPT 5 /* sys_accept(2) */
491#define VKI_SYS_GETSOCKNAME 6 /* sys_getsockname(2) */
492#define VKI_SYS_GETPEERNAME 7 /* sys_getpeername(2) */
493#define VKI_SYS_SOCKETPAIR 8 /* sys_socketpair(2) */
494#define VKI_SYS_SEND 9 /* sys_send(2) */
495#define VKI_SYS_RECV 10 /* sys_recv(2) */
496#define VKI_SYS_SENDTO 11 /* sys_sendto(2) */
497#define VKI_SYS_RECVFROM 12 /* sys_recvfrom(2) */
498#define VKI_SYS_SHUTDOWN 13 /* sys_shutdown(2) */
499#define VKI_SYS_SETSOCKOPT 14 /* sys_setsockopt(2) */
500#define VKI_SYS_GETSOCKOPT 15 /* sys_getsockopt(2) */
501#define VKI_SYS_SENDMSG 16 /* sys_sendmsg(2) */
502#define VKI_SYS_RECVMSG 17 /* sys_recvmsg(2) */
503
njnca0518d2004-11-26 19:34:36 +0000504enum vki_sock_type {
505 VKI_SOCK_STREAM = 1,
506 // [[others omitted]]
507};
508
nethercote73b526f2004-10-31 18:48:21 +0000509//----------------------------------------------------------------------
510// From linux-2.6.8.1/include/linux/uio.h
511//----------------------------------------------------------------------
512
513struct vki_iovec
514{
515 void __user *iov_base; /* BSD uses caddr_t (1003.1g requires void *) */
516 __vki_kernel_size_t iov_len; /* Must be size_t (1003.1g) */
517};
518
519//----------------------------------------------------------------------
520// From linux-2.6.8.1/include/linux/socket.h
521//----------------------------------------------------------------------
522
523// [[Resolved arbitrarily; doesn't really matter whether it's '__inline__'
524// or 'inline']]
525#define __KINLINE static __inline__
526
527typedef unsigned short vki_sa_family_t;
528
529struct vki_sockaddr {
530 vki_sa_family_t sa_family; /* address family, AF_xxx */
531 char sa_data[14]; /* 14 bytes of protocol address */
532};
533
534struct vki_msghdr {
535 void * msg_name; /* Socket name */
536 int msg_namelen; /* Length of name */
537 struct vki_iovec * msg_iov; /* Data blocks */
538 __vki_kernel_size_t msg_iovlen; /* Number of blocks */
539 void * msg_control; /* Per protocol magic (eg BSD file descriptor passing) */
540 __vki_kernel_size_t msg_controllen; /* Length of cmsg list */
541 unsigned msg_flags;
542};
543
544struct vki_cmsghdr {
545 __vki_kernel_size_t cmsg_len; /* data byte count, including hdr */
546 int cmsg_level; /* originating protocol */
547 int cmsg_type; /* protocol-specific type */
548};
549
550#define __VKI_CMSG_NXTHDR(ctl, len, cmsg) __vki_cmsg_nxthdr((ctl),(len),(cmsg))
551#define VKI_CMSG_NXTHDR(mhdr, cmsg) vki_cmsg_nxthdr((mhdr), (cmsg))
552
553#define VKI_CMSG_ALIGN(len) ( ((len)+sizeof(long)-1) & ~(sizeof(long)-1) )
554
555#define VKI_CMSG_DATA(cmsg) ((void *)((char *)(cmsg) + VKI_CMSG_ALIGN(sizeof(struct vki_cmsghdr))))
556
557#define __VKI_CMSG_FIRSTHDR(ctl,len) ((len) >= sizeof(struct vki_cmsghdr) ? \
558 (struct vki_cmsghdr *)(ctl) : \
559 (struct vki_cmsghdr *)NULL)
560#define VKI_CMSG_FIRSTHDR(msg) __VKI_CMSG_FIRSTHDR((msg)->msg_control, (msg)->msg_controllen)
561
562// [[Urgh, this is revolting...]
563__KINLINE struct vki_cmsghdr * __vki_cmsg_nxthdr(void *__ctl, __vki_kernel_size_t __size,
564 struct vki_cmsghdr *__cmsg)
565{
566 struct vki_cmsghdr * __ptr;
567
568 __ptr = (struct vki_cmsghdr*)(((unsigned char *) __cmsg) + VKI_CMSG_ALIGN(__cmsg->cmsg_len));
569 if ((unsigned long)((char*)(__ptr+1) - (char *) __ctl) > __size)
570 return (struct vki_cmsghdr *)0;
571
572 return __ptr;
573}
574
575__KINLINE struct vki_cmsghdr * vki_cmsg_nxthdr (struct vki_msghdr *__msg, struct vki_cmsghdr *__cmsg)
576{
577 return __vki_cmsg_nxthdr(__msg->msg_control, __msg->msg_controllen, __cmsg);
578}
579
580#define VKI_SCM_RIGHTS 0x01 /* rw: access rights (array of int) */
581
582#define VKI_AF_UNIX 1 /* Unix domain sockets */
583#define VKI_AF_INET 2 /* Internet IP Protocol */
584#define VKI_AF_INET6 10 /* IP version 6 */
585
586#define VKI_MSG_NOSIGNAL 0x4000 /* Do not generate SIGPIPE */
587
588//----------------------------------------------------------------------
589// From linux-2.6.8.1/include/linux/in.h
590//----------------------------------------------------------------------
591
592struct vki_in_addr {
593 __vki_u32 s_addr;
594};
595
596/* Structure describing an Internet (IP) socket address. */
597#define __VKI_SOCK_SIZE__ 16 /* sizeof(struct sockaddr) */
598struct vki_sockaddr_in {
599 vki_sa_family_t sin_family; /* Address family */
600 unsigned short int sin_port; /* Port number */
601 struct vki_in_addr sin_addr; /* Internet address */
602
603 /* Pad to size of `struct sockaddr'. */
604 unsigned char __pad[__VKI_SOCK_SIZE__ - sizeof(short int) -
605 sizeof(unsigned short int) - sizeof(struct vki_in_addr)];
606};
607
608//----------------------------------------------------------------------
609// From linux-2.6.8.1/include/linux/in6.h
610//----------------------------------------------------------------------
611
612struct vki_in6_addr
613{
614 union
615 {
616 __vki_u8 u6_addr8[16];
617 __vki_u16 u6_addr16[8];
618 __vki_u32 u6_addr32[4];
619 } vki_in6_u;
620#define vki_s6_addr vki_in6_u.u6_addr8
621#define vki_s6_addr16 vki_in6_u.u6_addr16
622#define vki_s6_addr32 vki_in6_u.u6_addr32
623};
624
625struct vki_sockaddr_in6 {
626 unsigned short int sin6_family; /* AF_INET6 */
627 __vki_u16 sin6_port; /* Transport layer port # */
628 __vki_u32 sin6_flowinfo; /* IPv6 flow information */
629 struct vki_in6_addr sin6_addr; /* IPv6 address */
630 __vki_u32 sin6_scope_id; /* scope id (new in RFC2553) */
631};
632
633//----------------------------------------------------------------------
634// From linux-2.6.8.1/include/linux/un.h
635//----------------------------------------------------------------------
636
637#define VKI_UNIX_PATH_MAX 108
638
639struct vki_sockaddr_un {
640 vki_sa_family_t sun_family; /* AF_UNIX */
641 char sun_path[VKI_UNIX_PATH_MAX]; /* pathname */
642};
643
644//----------------------------------------------------------------------
645// From linux-2.6.8.1/include/linux/if.h
646//----------------------------------------------------------------------
647
648#define VKI_IFNAMSIZ 16
649
650struct vki_ifmap
651{
652 unsigned long mem_start;
653 unsigned long mem_end;
654 unsigned short base_addr;
655 unsigned char irq;
656 unsigned char dma;
657 unsigned char port;
658 /* 3 bytes spare */
659};
660
661struct vki_if_settings
662{
663 unsigned int type; /* Type of physical device or protocol */
664 unsigned int size; /* Size of the data allocated by the caller */
665 union {
666 // [[Nb: converted these all to void* to avoid pulling in
667 // unnecessary headers]]]
668 /* {atm/eth/dsl}_settings anyone ? */
669 void /*raw_hdlc_proto */__user *raw_hdlc;
670 void /*cisco_proto */__user *cisco;
671 void /*fr_proto */__user *fr;
672 void /*fr_proto_pvc */__user *fr_pvc;
673 void /*fr_proto_pvc_info */__user *fr_pvc_info;
674
675 /* interface settings */
676 void /*sync_serial_settings */__user *sync;
677 void /*te1_settings */__user *te1;
678 } ifs_ifsu;
679};
680
681struct vki_ifreq
682{
683#define VKI_IFHWADDRLEN 6
684 union
685 {
686 char ifrn_name[VKI_IFNAMSIZ]; /* if name, e.g. "en0" */
687 } ifr_ifrn;
688
689 union {
690 struct vki_sockaddr ifru_addr;
691 struct vki_sockaddr ifru_dstaddr;
692 struct vki_sockaddr ifru_broadaddr;
693 struct vki_sockaddr ifru_netmask;
694 struct vki_sockaddr ifru_hwaddr;
695 short ifru_flags;
696 int ifru_ivalue;
697 int ifru_mtu;
698 struct vki_ifmap ifru_map;
699 char ifru_slave[VKI_IFNAMSIZ]; /* Just fits the size */
700 char ifru_newname[VKI_IFNAMSIZ];
701 void __user * ifru_data;
702 struct vki_if_settings ifru_settings;
703 } ifr_ifru;
704};
705
706#define vki_ifr_name ifr_ifrn.ifrn_name /* interface name */
707#define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */
708#define ifr_addr ifr_ifru.ifru_addr /* address */
709#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-p lnk */
710#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */
711#define ifr_netmask ifr_ifru.ifru_netmask /* interface net mask */
712#define vki_ifr_flags ifr_ifru.ifru_flags /* flags */
713#define vki_ifr_metric ifr_ifru.ifru_ivalue /* metric */
714#define vki_ifr_mtu ifr_ifru.ifru_mtu /* mtu */
715#define ifr_map ifr_ifru.ifru_map /* device map */
716#define ifr_slave ifr_ifru.ifru_slave /* slave device */
717#define vki_ifr_data ifr_ifru.ifru_data /* for use by interface */
718#define vki_ifr_ifindex ifr_ifru.ifru_ivalue /* interface index */
719#define ifr_bandwidth ifr_ifru.ifru_ivalue /* link bandwidth */
720#define ifr_qlen ifr_ifru.ifru_ivalue /* Queue length */
721#define ifr_newname ifr_ifru.ifru_newname /* New name */
722#define ifr_settings ifr_ifru.ifru_settings /* Device/proto settings*/
723
724struct vki_ifconf
725{
726 int ifc_len; /* size of buffer */
727 union
728 {
729 char __user *ifcu_buf;
730 struct vki_ifreq __user *ifcu_req;
731 } ifc_ifcu;
732};
733#define vki_ifc_buf ifc_ifcu.ifcu_buf /* buffer address */
734
735//----------------------------------------------------------------------
736// From linux-2.6.8.1/include/linux/if_arp.h
737//----------------------------------------------------------------------
738
739struct vki_arpreq {
740 struct vki_sockaddr arp_pa; /* protocol address */
741 struct vki_sockaddr arp_ha; /* hardware address */
742 int arp_flags; /* flags */
743 struct vki_sockaddr arp_netmask; /* netmask (only for proxy arps) */
744 char arp_dev[16];
745};
746
747//----------------------------------------------------------------------
748// From linux-2.6.8.1/include/linux/route.h
749//----------------------------------------------------------------------
750
751struct vki_rtentry
752{
753 unsigned long rt_pad1;
754 struct vki_sockaddr rt_dst; /* target address */
755 struct vki_sockaddr rt_gateway; /* gateway addr (RTF_GATEWAY) */
756 struct vki_sockaddr rt_genmask; /* target network mask (IP) */
757 unsigned short rt_flags;
758 short rt_pad2;
759 unsigned long rt_pad3;
760 void *rt_pad4;
761 short rt_metric; /* +1 for binary compatibility! */
762 char __user *rt_dev; /* forcing the device at add */
763 unsigned long rt_mtu; /* per route MTU/Window */
764// [[Not important for Valgrind]]
765//#ifndef __KERNEL__
766//#define rt_mss rt_mtu /* Compatibility :-( */
767//#endif
768 unsigned long rt_window; /* Window clamping */
769 unsigned short rt_irtt; /* Initial RTT */
770};
771
772//----------------------------------------------------------------------
773// From linux-2.6.8.1/include/linux/resource.h
774//----------------------------------------------------------------------
775
776struct vki_rusage {
777 struct vki_timeval ru_utime; /* user time used */
778 struct vki_timeval ru_stime; /* system time used */
779 long ru_maxrss; /* maximum resident set size */
780 long ru_ixrss; /* integral shared memory size */
781 long ru_idrss; /* integral unshared data size */
782 long ru_isrss; /* integral unshared stack size */
783 long ru_minflt; /* page reclaims */
784 long ru_majflt; /* page faults */
785 long ru_nswap; /* swaps */
786 long ru_inblock; /* block input operations */
787 long ru_oublock; /* block output operations */
788 long ru_msgsnd; /* messages sent */
789 long ru_msgrcv; /* messages received */
790 long ru_nsignals; /* signals received */
791 long ru_nvcsw; /* voluntary context switches */
792 long ru_nivcsw; /* involuntary " */
793};
794
795struct vki_rlimit {
796 unsigned long rlim_cur;
797 unsigned long rlim_max;
798};
799
800//----------------------------------------------------------------------
801// From linux-2.6.8.1/include/linux/elfcore.h
802//----------------------------------------------------------------------
803
804struct vki_elf_siginfo
805{
806 int si_signo; /* signal number */
807 int si_code; /* extra code */
808 int si_errno; /* errno */
809};
810
811// [[Removed some commented out lines here]]
812struct vki_elf_prstatus
813{
814 struct vki_elf_siginfo pr_info; /* Info associated with signal */
815 short pr_cursig; /* Current signal */
816 unsigned long pr_sigpend; /* Set of pending signals */
817 unsigned long pr_sighold; /* Set of held signals */
818 vki_pid_t pr_pid;
819 vki_pid_t pr_ppid;
820 vki_pid_t pr_pgrp;
821 vki_pid_t pr_sid;
822 struct vki_timeval pr_utime; /* User time */
823 struct vki_timeval pr_stime; /* System time */
824 struct vki_timeval pr_cutime; /* Cumulative user time */
825 struct vki_timeval pr_cstime; /* Cumulative system time */
826 vki_elf_gregset_t pr_reg; /* GP registers */
827 int pr_fpvalid; /* True if math co-processor being used. */
828};
829
830#define VKI_ELF_PRARGSZ (80) /* Number of chars for args */
831
832struct vki_elf_prpsinfo
833{
834 char pr_state; /* numeric process state */
835 char pr_sname; /* char for pr_state */
836 char pr_zomb; /* zombie */
837 char pr_nice; /* nice val */
838 unsigned long pr_flag; /* flags */
839 __vki_kernel_uid_t pr_uid;
840 __vki_kernel_gid_t pr_gid;
841 vki_pid_t pr_pid, pr_ppid, pr_pgrp, pr_sid;
842 /* Lots missing */
843 char pr_fname[16]; /* filename of executable */
844 char pr_psargs[VKI_ELF_PRARGSZ]; /* initial part of arg list */
845};
846
847//----------------------------------------------------------------------
njn40e73582005-06-24 21:41:28 +0000848// From linux-2.6.12.1/include/linux/eventpoll.h
nethercote73b526f2004-10-31 18:48:21 +0000849//----------------------------------------------------------------------
850
njn40e73582005-06-24 21:41:28 +0000851/* Valid opcodes to issue to sys_epoll_ctl() */
852#define VKI_EPOLL_CTL_ADD 1
853#define VKI_EPOLL_CTL_DEL 2
854#define VKI_EPOLL_CTL_MOD 3
855
nethercote73b526f2004-10-31 18:48:21 +0000856#ifdef __x86_64__
857#define VKI_EPOLL_PACKED __attribute__((packed))
858#else
859#define VKI_EPOLL_PACKED
860#endif
861
njn40e73582005-06-24 21:41:28 +0000862struct vki_epoll_event {
nethercote73b526f2004-10-31 18:48:21 +0000863 __vki_u32 events;
864 __vki_u64 data;
865} VKI_EPOLL_PACKED;
866
867
868//----------------------------------------------------------------------
869// From linux-2.6.8.1/include/linux/mqueue.h
870//----------------------------------------------------------------------
871
872struct vki_mq_attr {
873 long mq_flags; /* message queue flags */
874 long mq_maxmsg; /* maximum number of messages */
875 long mq_msgsize; /* maximum message size */
876 long mq_curmsgs; /* number of messages currently queued */
877 long __reserved[4]; /* ignored for input, zeroed for output */
878};
879
880//----------------------------------------------------------------------
881// From linux-2.6.8.1/include/linux/utsname.h
882//----------------------------------------------------------------------
883
nethercote73b526f2004-10-31 18:48:21 +0000884struct vki_new_utsname {
885 char sysname[65];
886 char nodename[65];
887 char release[65];
888 char version[65];
889 char machine[65];
890 char domainname[65];
891};
892
893//----------------------------------------------------------------------
894// From linux-2.6.8.1/include/linux/mii.h
895//----------------------------------------------------------------------
896
897/* This structure is used in all SIOCxMIIxxx ioctl calls */
898struct vki_mii_ioctl_data {
899 vki_u16 phy_id;
900 vki_u16 reg_num;
901 vki_u16 val_in;
902 vki_u16 val_out;
903};
904
905//----------------------------------------------------------------------
906// From linux-2.6.8.1/include/linux/capability.h
907//----------------------------------------------------------------------
908
909// [[capget()/capset() man page says this, ominously:
910//
911// The kernel API is likely to change and use of these functions (in
912// particular the format of the cap_user_*_t types) is subject to
913// change with each kernel revision.
914//
915// However, the format hasn't changed since at least Linux 2.4.6.]]
916
917typedef struct __vki_user_cap_header_struct {
918 __vki_u32 version;
919 int pid;
920} __user *vki_cap_user_header_t;
921
922typedef struct __vki_user_cap_data_struct {
923 __vki_u32 effective;
924 __vki_u32 permitted;
925 __vki_u32 inheritable;
926} __user *vki_cap_user_data_t;
927
928
929//----------------------------------------------------------------------
930// From linux-2.6.8.1/include/linux/module.h
931//----------------------------------------------------------------------
932
933// [[We do a VKI_SIZEOF_* here because this type is so big, and its size
934// depends on the word size, so see vki_arch.h]]
935
936//----------------------------------------------------------------------
937// From linux-2.6.8.1/include/linux/ipc.h
938//----------------------------------------------------------------------
939
940/* Obsolete, used only for backwards compatibility and libc5 compiles */
941struct vki_ipc_perm
942{
943 __vki_kernel_key_t key;
944 __vki_kernel_uid_t uid;
945 __vki_kernel_gid_t gid;
946 __vki_kernel_uid_t cuid;
947 __vki_kernel_gid_t cgid;
948 __vki_kernel_mode_t mode;
949 unsigned short seq;
950};
951
952#define VKI_IPC_CREAT 00001000 /* create if key is nonexistent */
953#define VKI_IPC_EXCL 00002000 /* fail if key exists */
954#define VKI_IPC_NOWAIT 00004000 /* return error on wait */
955
956//#define VKI_IPC_RMID 0 /* remove resource */
957#define VKI_IPC_SET 1 /* set ipc_perm options */
958#define VKI_IPC_STAT 2 /* get ipc_perm options */
959#define VKI_IPC_INFO 3 /* see ipcs */
960
961#define VKI_IPC_64 0x0100 /* New version (support 32-bit UIDs, bigger
962 message sizes, etc. */
963
964//----------------------------------------------------------------------
965// From linux-2.6.8.1/include/linux/sem.h
966//----------------------------------------------------------------------
967
968#define VKI_GETALL 13 /* get all semval's */
969#define VKI_SETVAL 16 /* set semval */
970#define VKI_SETALL 17 /* set all semval's */
971
972#define VKI_SEM_STAT 18
973#define VKI_SEM_INFO 19
974
975/* Obsolete, used only for backwards compatibility and libc5 compiles */
976struct vki_semid_ds {
977 struct vki_ipc_perm sem_perm; /* permissions .. see ipc.h */
978 __vki_kernel_time_t sem_otime; /* last semop time */
979 __vki_kernel_time_t sem_ctime; /* last change time */
980 // [[Use void* to avoid excess header copying]]
981 void/*struct sem */*sem_base; /* ptr to first semaphore in array */
982 void/*struct sem_queue */*sem_pending; /* pending operations to be processed */
983 void/*struct sem_queue */**sem_pending_last; /* last pending operation */
984 void/*struct sem_undo */*undo; /* undo requests on this array */
985 unsigned short sem_nsems; /* no. of semaphores in array */
986};
987
988struct vki_sembuf {
989 unsigned short sem_num; /* semaphore index in array */
990 short sem_op; /* semaphore operation */
991 short sem_flg; /* operation flags */
992};
993
994union vki_semun {
995 int val; /* value for SETVAL */
996 struct vki_semid_ds __user *buf; /* buffer for IPC_STAT & IPC_SET */
997 unsigned short __user *array; /* array for GETALL & SETALL */
998 struct vki_seminfo __user *__buf; /* buffer for IPC_INFO */
999 void __user *__pad;
1000};
1001
1002struct vki_seminfo {
1003 int semmap;
1004 int semmni;
1005 int semmns;
1006 int semmnu;
1007 int semmsl;
1008 int semopm;
1009 int semume;
1010 int semusz;
1011 int semvmx;
1012 int semaem;
1013};
1014
1015//----------------------------------------------------------------------
1016// From linux-2.6.8.1/include/asm-generic/errno-base.h
1017//----------------------------------------------------------------------
1018
1019#define VKI_EPERM 1 /* Operation not permitted */
1020#define VKI_ESRCH 3 /* No such process */
1021#define VKI_EINTR 4 /* Interrupted system call */
1022#define VKI_EBADF 9 /* Bad file number */
sewardjb5f6f512005-03-10 23:59:00 +00001023#define VKI_EAGAIN 11 /* Try again */
1024#define VKI_EWOULDBLOCK VKI_EAGAIN
nethercote73b526f2004-10-31 18:48:21 +00001025#define VKI_ENOMEM 12 /* Out of memory */
1026#define VKI_EACCES 13 /* Permission denied */
1027#define VKI_EFAULT 14 /* Bad address */
1028#define VKI_EEXIST 17 /* File exists */
1029#define VKI_EINVAL 22 /* Invalid argument */
1030#define VKI_EMFILE 24 /* Too many open files */
1031
1032//----------------------------------------------------------------------
1033// From linux-2.6.8.1/include/asm-generic/errno.h
1034//----------------------------------------------------------------------
1035
1036#define VKI_ENOSYS 38 /* Function not implemented */
1037
1038//----------------------------------------------------------------------
1039// From linux-2.6.8.1/include/linux/wait.h
1040//----------------------------------------------------------------------
1041
1042#define VKI_WNOHANG 0x00000001
1043
1044#define __VKI_WALL 0x40000000 /* Wait on all children, regardless of type */
1045#define __VKI_WCLONE 0x80000000 /* Wait only on non-SIGCHLD children */
1046
1047//----------------------------------------------------------------------
1048// From linux-2.6.8.1/include/linux/mman.h
1049//----------------------------------------------------------------------
1050
1051#define VKI_MREMAP_MAYMOVE 1
1052#define VKI_MREMAP_FIXED 2
1053
1054//----------------------------------------------------------------------
sewardjb5f6f512005-03-10 23:59:00 +00001055// From linux-2.6.10-rc3-mm1/include/linux/futex.h
nethercote73b526f2004-10-31 18:48:21 +00001056//----------------------------------------------------------------------
1057
1058#define VKI_FUTEX_WAIT (0)
sewardjb5f6f512005-03-10 23:59:00 +00001059#define VKI_FUTEX_WAKE (1)
nethercote73b526f2004-10-31 18:48:21 +00001060#define VKI_FUTEX_FD (2)
1061#define VKI_FUTEX_REQUEUE (3)
sewardjb5f6f512005-03-10 23:59:00 +00001062#define VKI_FUTEX_CMP_REQUEUE (4)
nethercote73b526f2004-10-31 18:48:21 +00001063
1064//----------------------------------------------------------------------
1065// From linux-2.6.8.1/include/linux/errno.h
1066//----------------------------------------------------------------------
1067
1068#define VKI_ERESTARTSYS 512
1069
1070//----------------------------------------------------------------------
1071// From linux-2.6.8.1/include/linux/stat.h
1072//----------------------------------------------------------------------
1073
1074#define VKI_S_IRUSR 00400
1075#define VKI_S_IWUSR 00200
1076
1077//----------------------------------------------------------------------
1078// From linux-2.6.8.1/include/linux/dirent.h
1079//----------------------------------------------------------------------
1080
1081struct vki_dirent {
1082 long d_ino;
1083 __vki_kernel_off_t d_off;
1084 unsigned short d_reclen;
1085 char d_name[256]; /* We must not include limits.h! */
1086};
1087
1088//----------------------------------------------------------------------
njncfb8ad52004-11-23 14:57:49 +00001089// From linux-2.6.8.1/include/linux/fcntl.h
1090//----------------------------------------------------------------------
1091
1092#define VKI_F_SETLEASE (VKI_F_LINUX_SPECIFIC_BASE+0)
1093#define VKI_F_GETLEASE (VKI_F_LINUX_SPECIFIC_BASE+1)
1094
1095#define VKI_F_NOTIFY (VKI_F_LINUX_SPECIFIC_BASE+2)
1096
1097//----------------------------------------------------------------------
nethercote73b526f2004-10-31 18:48:21 +00001098// From linux-2.6.8.1/include/linux/sysctl.h
1099//----------------------------------------------------------------------
1100
1101struct __vki_sysctl_args {
1102 int __user *name;
1103 int nlen;
1104 void __user *oldval;
1105 vki_size_t __user *oldlenp;
1106 void __user *newval;
1107 vki_size_t newlen;
1108 unsigned long __unused[4];
1109};
1110
1111//----------------------------------------------------------------------
1112// From linux-2.6.8.1/include/linux/aio_abi.h
1113//----------------------------------------------------------------------
1114
1115typedef unsigned long vki_aio_context_t;
1116
1117enum {
1118 VKI_IOCB_CMD_PREAD = 0,
1119 VKI_IOCB_CMD_PWRITE = 1,
1120};
1121
1122/* read() from /dev/aio returns these structures. */
1123struct vki_io_event {
1124 __vki_u64 data; /* the data field from the iocb */
1125 __vki_u64 obj; /* what iocb this event came from */
1126 // [[Nb: These fields renamed from 'res' and 'res2' because 'res' is
1127 // a macro in vg_syscalls.c!]]
1128 __vki_s64 result; /* result code for this event */
1129 __vki_s64 result2; /* secondary result */
1130};
1131
nethercote73b526f2004-10-31 18:48:21 +00001132#if defined(VKI_LITTLE_ENDIAN)
cerion85665ca2005-06-20 15:51:07 +00001133# define VKI_PADDED(x,y) x, y
nethercote73b526f2004-10-31 18:48:21 +00001134#elif defined(VKI_BIG_ENDIAN)
cerion85665ca2005-06-20 15:51:07 +00001135# define VKI_PADDED(x,y) y, x
nethercote73b526f2004-10-31 18:48:21 +00001136#else
1137#error edit for your odd byteorder.
1138#endif
1139
1140struct vki_iocb {
1141 /* these are internal to the kernel/libc. */
1142 __vki_u64 aio_data; /* data to be returned in event's data */
1143 __vki_u32 VKI_PADDED(aio_key, aio_reserved1);
1144 /* the kernel sets aio_key to the req # */
1145
1146 /* common fields */
1147 __vki_u16 aio_lio_opcode; /* see IOCB_CMD_ above */
1148 __vki_s16 aio_reqprio;
1149 __vki_u32 aio_fildes;
1150
1151 __vki_u64 aio_buf;
1152 __vki_u64 aio_nbytes;
1153 __vki_s64 aio_offset;
1154
1155 /* extra parameters */
1156 __vki_u64 aio_reserved2; /* TODO: use this for a (struct sigevent *) */
1157 __vki_u64 aio_reserved3;
1158}; /* 64 bytes */
1159
1160//----------------------------------------------------------------------
1161// From linux-2.6.8.1/include/linux/aio.h
1162//----------------------------------------------------------------------
1163
1164struct vki_aio_ring {
1165 unsigned id; /* kernel internal index number */
1166 unsigned nr; /* number of io_events */
1167 unsigned head;
1168 unsigned tail;
1169
1170 unsigned magic;
1171 unsigned compat_features;
1172 unsigned incompat_features;
1173 unsigned header_length; /* size of aio_ring */
1174
1175 struct vki_io_event io_events[0];
1176}; /* 128 bytes + ring size */
1177
1178//----------------------------------------------------------------------
1179// From linux-2.6.8.1/include/linux/msg.h
1180//----------------------------------------------------------------------
1181
1182#define VKI_MSG_STAT 11
1183#define VKI_MSG_INFO 12
1184
1185struct vki_msqid_ds {
1186 struct vki_ipc_perm msg_perm;
1187 struct vki_msg *msg_first; /* first message on queue,unused */
1188 struct vki_msg *msg_last; /* last message in queue,unused */
1189 __vki_kernel_time_t msg_stime; /* last msgsnd time */
1190 __vki_kernel_time_t msg_rtime; /* last msgrcv time */
1191 __vki_kernel_time_t msg_ctime; /* last change time */
1192 unsigned long msg_lcbytes; /* Reuse junk fields for 32 bit */
1193 unsigned long msg_lqbytes; /* ditto */
1194 unsigned short msg_cbytes; /* current number of bytes on queue */
1195 unsigned short msg_qnum; /* number of messages in queue */
1196 unsigned short msg_qbytes; /* max number of bytes on queue */
1197 __vki_kernel_ipc_pid_t msg_lspid; /* pid of last msgsnd */
1198 __vki_kernel_ipc_pid_t msg_lrpid; /* last receive pid */
1199};
1200
1201struct vki_msgbuf {
1202 long mtype; /* type of message */
1203 char mtext[1]; /* message text */
1204};
1205
1206struct vki_msginfo {
1207 int msgpool;
1208 int msgmap;
1209 int msgmax;
1210 int msgmnb;
1211 int msgmni;
1212 int msgssz;
1213 int msgtql;
1214 unsigned short msgseg;
1215};
1216
1217//----------------------------------------------------------------------
1218// From linux-2.6.8.1/include/linux/shm.h
1219//----------------------------------------------------------------------
1220
1221struct vki_shmid_ds {
1222 struct vki_ipc_perm shm_perm; /* operation perms */
1223 int shm_segsz; /* size of segment (bytes) */
1224 __vki_kernel_time_t shm_atime; /* last attach time */
1225 __vki_kernel_time_t shm_dtime; /* last detach time */
1226 __vki_kernel_time_t shm_ctime; /* last change time */
1227 __vki_kernel_ipc_pid_t shm_cpid; /* pid of creator */
1228 __vki_kernel_ipc_pid_t shm_lpid; /* pid of last operator */
1229 unsigned short shm_nattch; /* no. of current attaches */
1230 unsigned short shm_unused; /* compatibility */
1231 void *shm_unused2; /* ditto - used by DIPC */
1232 void *shm_unused3; /* unused */
1233};
1234
1235#define VKI_SHM_STAT 13
1236#define VKI_SHM_INFO 14
1237
1238/* Obsolete, used only for backwards compatibility */
1239struct vki_shminfo {
1240 int shmmax;
1241 int shmmin;
1242 int shmmni;
1243 int shmseg;
1244 int shmall;
1245};
1246
1247struct vki_shm_info {
1248 int used_ids;
1249 unsigned long shm_tot; /* total allocated shm */
1250 unsigned long shm_rss; /* total resident shm */
1251 unsigned long shm_swp; /* total swapped shm */
1252 unsigned long swap_attempts;
1253 unsigned long swap_successes;
1254};
1255
1256//----------------------------------------------------------------------
1257// From linux-2.6.8.1/include/linux/rtc.h
1258//----------------------------------------------------------------------
1259
1260struct vki_rtc_time {
1261 int tm_sec;
1262 int tm_min;
1263 int tm_hour;
1264 int tm_mday;
1265 int tm_mon;
1266 int tm_year;
1267 int tm_wday;
1268 int tm_yday;
1269 int tm_isdst;
1270};
1271
1272#define VKI_RTC_AIE_ON _VKI_IO('p', 0x01) /* Alarm int. enable on */
1273#define VKI_RTC_AIE_OFF _VKI_IO('p', 0x02) /* ... off */
1274#define VKI_RTC_UIE_ON _VKI_IO('p', 0x03) /* Update int. enable on*/
1275#define VKI_RTC_UIE_OFF _VKI_IO('p', 0x04) /* ... off */
1276#define VKI_RTC_PIE_ON _VKI_IO('p', 0x05) /* Periodic int. enable on*/
1277#define VKI_RTC_PIE_OFF _VKI_IO('p', 0x06) /* ... off */
1278
1279#define VKI_RTC_ALM_SET _VKI_IOW('p', 0x07, struct vki_rtc_time) /* Set alarm time */
1280#define VKI_RTC_ALM_READ _VKI_IOR('p', 0x08, struct vki_rtc_time) /* Read alarm time */
1281#define VKI_RTC_RD_TIME _VKI_IOR('p', 0x09, struct vki_rtc_time) /* Read RTC time */
1282//#define RTC_SET_TIME _IOW('p', 0x0a, struct rtc_time) /* Set RTC time */
1283#define VKI_RTC_IRQP_READ _VKI_IOR('p', 0x0b, unsigned long) /* Read IRQ rate */
1284#define VKI_RTC_IRQP_SET _VKI_IOW('p', 0x0c, unsigned long) /* Set IRQ rate */
1285
1286//----------------------------------------------------------------------
1287// From linux-2.6.8.1/include/linux/isdn.h
1288//----------------------------------------------------------------------
1289
nethercote95a97862004-11-06 16:31:43 +00001290// [[Nb: Resolved this for the common case where CONFIG_COBALT_MICRO_SERVER
1291// is not defined]]
1292#define VKI_ISDN_MAX_CHANNELS 64
1293
nethercote73b526f2004-10-31 18:48:21 +00001294#define VKI_IIOCGETCPS _VKI_IO('I',21)
1295
1296#define VKI_IIOCNETGPN _VKI_IO('I',34)
1297
1298#define VKI_ISDN_MSNLEN 32
1299
1300typedef struct {
1301 char name[10];
1302 char phone[VKI_ISDN_MSNLEN];
1303 int outgoing;
1304} vki_isdn_net_ioctl_phone;
1305
1306//----------------------------------------------------------------------
1307// From linux-2.6.8.1/include/linux/sockios.h
1308//----------------------------------------------------------------------
1309
1310#define VKI_SIOCOUTQ VKI_TIOCOUTQ
1311
1312#define VKI_SIOCADDRT 0x890B /* add routing table entry */
1313#define VKI_SIOCDELRT 0x890C /* delete routing table entry */
1314
1315#define VKI_SIOCGIFNAME 0x8910 /* get iface name */
1316#define VKI_SIOCGIFCONF 0x8912 /* get iface list */
1317#define VKI_SIOCGIFFLAGS 0x8913 /* get flags */
1318#define VKI_SIOCSIFFLAGS 0x8914 /* set flags */
1319#define VKI_SIOCGIFADDR 0x8915 /* get PA address */
1320#define VKI_SIOCSIFADDR 0x8916 /* set PA address */
1321#define VKI_SIOCGIFDSTADDR 0x8917 /* get remote PA address */
1322#define VKI_SIOCSIFDSTADDR 0x8918 /* set remote PA address */
1323#define VKI_SIOCGIFBRDADDR 0x8919 /* get broadcast PA address */
1324#define VKI_SIOCSIFBRDADDR 0x891a /* set broadcast PA address */
1325#define VKI_SIOCGIFNETMASK 0x891b /* get network PA mask */
1326#define VKI_SIOCSIFNETMASK 0x891c /* set network PA mask */
1327#define VKI_SIOCGIFMETRIC 0x891d /* get metric */
1328#define VKI_SIOCSIFMETRIC 0x891e /* set metric */
1329#define VKI_SIOCGIFMTU 0x8921 /* get MTU size */
1330#define VKI_SIOCSIFMTU 0x8922 /* set MTU size */
1331#define VKI_SIOCSIFHWADDR 0x8924 /* set hardware address */
1332#define VKI_SIOCGIFHWADDR 0x8927 /* Get hardware address */
1333#define VKI_SIOCGIFINDEX 0x8933 /* name -> if_index mapping */
1334
1335#define VKI_SIOCGIFTXQLEN 0x8942 /* Get the tx queue length */
1336#define VKI_SIOCSIFTXQLEN 0x8943 /* Set the tx queue length */
1337
1338#define VKI_SIOCGMIIPHY 0x8947 /* Get address of MII PHY in use. */
1339#define VKI_SIOCGMIIREG 0x8948 /* Read MII PHY register. */
1340#define VKI_SIOCSMIIREG 0x8949 /* Write MII PHY register. */
1341
1342#define VKI_SIOCDARP 0x8953 /* delete ARP table entry */
1343#define VKI_SIOCGARP 0x8954 /* get ARP table entry */
1344#define VKI_SIOCSARP 0x8955 /* set ARP table entry */
1345
1346#define VKI_SIOCDRARP 0x8960 /* delete RARP table entry */
1347#define VKI_SIOCGRARP 0x8961 /* get RARP table entry */
1348#define VKI_SIOCSRARP 0x8962 /* set RARP table entry */
1349
1350#define VKI_SIOCGIFMAP 0x8970 /* Get device parameters */
1351#define VKI_SIOCSIFMAP 0x8971 /* Set device parameters */
1352
1353//----------------------------------------------------------------------
1354// From linux-2.6.8.1/include/linux/ppdev.h
1355//----------------------------------------------------------------------
1356
1357#define VKI_PP_MAJOR 99
1358
1359#define VKI_PP_IOCTL 'p'
1360
1361/* Set mode for read/write (e.g. IEEE1284_MODE_EPP) */
1362#define VKI_PPSETMODE _VKI_IOW(VKI_PP_IOCTL, 0x80, int)
1363
1364/* Read status */
1365#define VKI_PPRSTATUS _VKI_IOR(VKI_PP_IOCTL, 0x81, unsigned char)
1366//#define PPWSTATUS OBSOLETE__IOW(PP_IOCTL, 0x82, unsigned char)
1367
1368/* Read/write control */
1369#define VKI_PPRCONTROL _VKI_IOR(VKI_PP_IOCTL, 0x83, unsigned char)
1370#define VKI_PPWCONTROL _VKI_IOW(VKI_PP_IOCTL, 0x84, unsigned char)
1371
1372struct vki_ppdev_frob_struct {
1373 unsigned char mask;
1374 unsigned char val;
1375};
1376#define VKI_PPFCONTROL _VKI_IOW(VKI_PP_IOCTL, 0x8e, struct vki_ppdev_frob_struct)
1377
1378/* Read/write data */
1379#define VKI_PPRDATA _VKI_IOR(VKI_PP_IOCTL, 0x85, unsigned char)
1380#define VKI_PPWDATA _VKI_IOW(VKI_PP_IOCTL, 0x86, unsigned char)
1381
1382/* Claim the port to start using it */
1383#define VKI_PPCLAIM _VKI_IO(VKI_PP_IOCTL, 0x8b)
1384
1385/* Release the port when you aren't using it */
1386#define VKI_PPRELEASE _VKI_IO(VKI_PP_IOCTL, 0x8c)
1387
1388/* Yield the port (release it if another driver is waiting,
1389 * then reclaim) */
1390#define VKI_PPYIELD _VKI_IO(VKI_PP_IOCTL, 0x8d)
1391
1392/* Register device exclusively (must be before PPCLAIM). */
1393#define VKI_PPEXCL _VKI_IO(VKI_PP_IOCTL, 0x8f)
1394
1395/* Data line direction: non-zero for input mode. */
1396#define VKI_PPDATADIR _VKI_IOW(VKI_PP_IOCTL, 0x90, int)
1397
1398/* Negotiate a particular IEEE 1284 mode. */
1399#define VKI_PPNEGOT _VKI_IOW(VKI_PP_IOCTL, 0x91, int)
1400
1401/* Set control lines when an interrupt occurs. */
1402#define VKI_PPWCTLONIRQ _VKI_IOW(VKI_PP_IOCTL, 0x92, unsigned char)
1403
1404/* Clear (and return) interrupt count. */
1405#define VKI_PPCLRIRQ _VKI_IOR(VKI_PP_IOCTL, 0x93, int)
1406
1407/* Set the IEEE 1284 phase that we're in (e.g. IEEE1284_PH_FWD_IDLE) */
1408#define VKI_PPSETPHASE _VKI_IOW(VKI_PP_IOCTL, 0x94, int)
1409
1410/* Set and get port timeout (struct timeval's) */
1411#define VKI_PPGETTIME _VKI_IOR(VKI_PP_IOCTL, 0x95, struct vki_timeval)
1412#define VKI_PPSETTIME _VKI_IOW(VKI_PP_IOCTL, 0x96, struct vki_timeval)
1413
1414#define VKI_PPGETMODES _VKI_IOR(VKI_PP_IOCTL, 0x97, unsigned int)
1415
1416#define VKI_PPGETMODE _VKI_IOR(VKI_PP_IOCTL, 0x98, int)
1417#define VKI_PPGETPHASE _VKI_IOR(VKI_PP_IOCTL, 0x99, int)
1418
1419#define VKI_PPGETFLAGS _VKI_IOR(VKI_PP_IOCTL, 0x9a, int)
1420#define VKI_PPSETFLAGS _VKI_IOW(VKI_PP_IOCTL, 0x9b, int)
1421
1422//----------------------------------------------------------------------
1423// From linux-2.6.8.1/include/linux/fs.h
1424//----------------------------------------------------------------------
1425
nethercote95a97862004-11-06 16:31:43 +00001426#define VKI_BLKGETSIZE _VKI_IO(0x12,96) /* return device size /512 (long *arg) */
1427
nethercote73b526f2004-10-31 18:48:21 +00001428#define VKI_FIBMAP _VKI_IO(0x00,1) /* bmap access */
1429#define VKI_FIGETBSZ _VKI_IO(0x00,2) /* get the block size used for bmap */
1430
1431//----------------------------------------------------------------------
1432// From linux-2.6.8.1/include/scsi/sg.h
1433//----------------------------------------------------------------------
1434
1435typedef struct vki_sg_io_hdr
1436{
1437 int interface_id; /* [i] 'S' for SCSI generic (required) */
1438 int dxfer_direction; /* [i] data transfer direction */
1439 unsigned char cmd_len; /* [i] SCSI command length ( <= 16 bytes) */
1440 unsigned char mx_sb_len; /* [i] max length to write to sbp */
1441 unsigned short iovec_count; /* [i] 0 implies no scatter gather */
1442 unsigned int dxfer_len; /* [i] byte count of data transfer */
1443 void __user *dxferp; /* [i], [*io] points to data transfer memory
1444 or scatter gather list */
1445 unsigned char __user *cmdp; /* [i], [*i] points to command to perform */
1446 void __user *sbp; /* [i], [*o] points to sense_buffer memory */
1447 unsigned int timeout; /* [i] MAX_UINT->no timeout (unit: millisec) */
1448 unsigned int flags; /* [i] 0 -> default, see SG_FLAG... */
1449 int pack_id; /* [i->o] unused internally (normally) */
1450 void __user * usr_ptr; /* [i->o] unused internally */
1451 unsigned char status; /* [o] scsi status */
1452 unsigned char masked_status;/* [o] shifted, masked scsi status */
1453 unsigned char msg_status; /* [o] messaging level data (optional) */
1454 unsigned char sb_len_wr; /* [o] byte count actually written to sbp */
1455 unsigned short host_status; /* [o] errors from host adapter */
1456 unsigned short driver_status;/* [o] errors from software driver */
1457 int resid; /* [o] dxfer_len - actual_transferred */
1458 unsigned int duration; /* [o] time taken by cmd (unit: millisec) */
1459 unsigned int info; /* [o] auxiliary information */
1460} vki_sg_io_hdr_t; /* 64 bytes long (on i386) */
1461
1462typedef struct vki_sg_scsi_id { /* used by SG_GET_SCSI_ID ioctl() */
1463 int host_no; /* as in "scsi<n>" where 'n' is one of 0, 1, 2 etc */
1464 int channel;
1465 int scsi_id; /* scsi id of target device */
1466 int lun;
1467 int scsi_type; /* TYPE_... defined in scsi/scsi.h */
1468 short h_cmd_per_lun;/* host (adapter) maximum commands per lun */
1469 short d_queue_depth;/* device (or adapter) maximum queue length */
1470 int unused[2]; /* probably find a good use, set 0 for now */
1471} vki_sg_scsi_id_t; /* 32 bytes long on i386 */
1472
1473#define VKI_SG_EMULATED_HOST 0x2203 /* true for emulated host adapter (ATAPI) */
1474
1475#define VKI_SG_SET_RESERVED_SIZE 0x2275 /* request a new reserved buffer size */
1476#define VKI_SG_GET_RESERVED_SIZE 0x2272 /* actual size of reserved buffer */
1477
1478#define VKI_SG_GET_SCSI_ID 0x2276 /* Yields fd's bus, chan, dev, lun + type */
1479
1480#define VKI_SG_GET_SG_TABLESIZE 0x227F /* 0 implies can't do scatter gather */
1481
1482#define VKI_SG_GET_VERSION_NUM 0x2282 /* Example: version 2.1.34 yields 20134 */
1483
1484#define VKI_SG_IO 0x2285 /* similar effect as write() followed by read() */
1485
1486#define VKI_SG_SET_TIMEOUT 0x2201 /* unit: jiffies (10ms on i386) */
1487#define VKI_SG_GET_TIMEOUT 0x2202 /* yield timeout as _return_ value */
1488
1489//#define SG_GET_COMMAND_Q 0x2270 /* Yields 0 (queuing off) or 1 (on) */
1490#define VKI_SG_SET_COMMAND_Q 0x2271 /* Change queuing state with 0 or 1 */
1491
1492//----------------------------------------------------------------------
1493// From linux-2.6.8.1/include/linux/cdrom.h
1494//----------------------------------------------------------------------
1495
1496#define VKI_CDROMPLAYMSF 0x5303 /* Play Audio MSF (struct cdrom_msf) */
1497#define VKI_CDROMREADTOCHDR 0x5305 /* Read TOC header
1498 (struct cdrom_tochdr) */
1499#define VKI_CDROMREADTOCENTRY 0x5306 /* Read TOC entry
1500 (struct cdrom_tocentry) */
1501#define VKI_CDROMSUBCHNL 0x530b /* Read subchannel data
1502 (struct cdrom_subchnl) */
1503#define VKI_CDROMREADMODE2 0x530c /* Read CDROM mode 2 data (2336 Bytes)
1504 (struct cdrom_read) */
1505#define VKI_CDROMREADAUDIO 0x530e /* (struct cdrom_read_audio) */
1506#define VKI_CDROMMULTISESSION 0x5310 /* Obtain the start-of-last-session
1507 address of multi session disks
1508 (struct cdrom_multisession) */
1509#define VKI_CDROM_GET_MCN 0x5311 /* Obtain the "Universal Product Code"
1510 if available (struct cdrom_mcn) */
1511#define VKI_CDROMVOLREAD 0x5313 /* Get the drive's volume setting
1512 (struct cdrom_volctrl) */
1513#define VKI_CDROM_CLEAR_OPTIONS 0x5321 /* Clear behavior options */
1514#define VKI_CDROM_DRIVE_STATUS 0x5326 /* Get tray position, etc. */
1515
1516#define VKI_CDROM_SEND_PACKET 0x5393 /* send a packet to the drive */
1517
1518struct vki_cdrom_msf0
1519{
1520 __vki_u8 minute;
1521 __vki_u8 second;
1522 __vki_u8 frame;
1523};
1524
1525union vki_cdrom_addr
1526{
1527 struct vki_cdrom_msf0 msf;
1528 int lba;
1529};
1530
1531struct vki_cdrom_msf
1532{
1533 __vki_u8 cdmsf_min0; /* start minute */
1534 __vki_u8 cdmsf_sec0; /* start second */
1535 __vki_u8 cdmsf_frame0; /* start frame */
1536 __vki_u8 cdmsf_min1; /* end minute */
1537 __vki_u8 cdmsf_sec1; /* end second */
1538 __vki_u8 cdmsf_frame1; /* end frame */
1539};
1540
1541struct vki_cdrom_tochdr
1542{
1543 __vki_u8 cdth_trk0; /* start track */
1544 __vki_u8 cdth_trk1; /* end track */
1545};
1546
1547struct vki_cdrom_volctrl
1548{
1549 __vki_u8 channel0;
1550 __vki_u8 channel1;
1551 __vki_u8 channel2;
1552 __vki_u8 channel3;
1553};
1554
1555struct vki_cdrom_subchnl
1556{
1557 __vki_u8 cdsc_format;
1558 __vki_u8 cdsc_audiostatus;
1559 __vki_u8 cdsc_adr: 4;
1560 __vki_u8 cdsc_ctrl: 4;
1561 __vki_u8 cdsc_trk;
1562 __vki_u8 cdsc_ind;
1563 union vki_cdrom_addr cdsc_absaddr;
1564 union vki_cdrom_addr cdsc_reladdr;
1565};
1566
1567struct vki_cdrom_tocentry
1568{
1569 __vki_u8 cdte_track;
1570 __vki_u8 cdte_adr :4;
1571 __vki_u8 cdte_ctrl :4;
1572 __vki_u8 cdte_format;
1573 union vki_cdrom_addr cdte_addr;
1574 __vki_u8 cdte_datamode;
1575};
1576
1577struct vki_cdrom_read
1578{
1579 int cdread_lba;
1580 char *cdread_bufaddr;
1581 int cdread_buflen;
1582};
1583
1584struct vki_cdrom_read_audio
1585{
1586 union vki_cdrom_addr addr; /* frame address */
1587 __vki_u8 addr_format; /* CDROM_LBA or CDROM_MSF */
1588 int nframes; /* number of 2352-byte-frames to read at once */
1589 __vki_u8 __user *buf; /* frame buffer (size: nframes*2352 bytes) */
1590};
1591
1592struct vki_cdrom_multisession
1593{
1594 union vki_cdrom_addr addr; /* frame address: start-of-last-session
1595 (not the new "frame 16"!). Only valid
1596 if the "xa_flag" is true. */
1597 __vki_u8 xa_flag; /* 1: "is XA disk" */
1598 __vki_u8 addr_format; /* CDROM_LBA or CDROM_MSF */
1599};
1600
1601struct vki_cdrom_mcn
1602{
1603 __vki_u8 medium_catalog_number[14]; /* 13 ASCII digits, null-terminated */
1604};
1605
1606#define VKI_CDROM_PACKET_SIZE 12
1607
1608struct vki_cdrom_generic_command
1609{
1610 unsigned char cmd[VKI_CDROM_PACKET_SIZE];
1611 unsigned char __user *buffer;
1612 unsigned int buflen;
1613 int stat;
1614 // [[replace with void* to reduce inclusion amounts]]
1615 void/*struct vki_request_sense */__user *sense;
1616 unsigned char data_direction;
1617 int quiet;
1618 int timeout;
1619 void __user *reserved[1]; /* unused, actually */
1620};
1621
1622#define VKI_CD_SYNC_SIZE 12 /* 12 sync bytes per raw data frame */
1623#define VKI_CD_HEAD_SIZE 4 /* header (address) bytes per raw data frame */
1624#define VKI_CD_FRAMESIZE_RAW 2352 /* bytes per frame, "raw" mode */
1625#define VKI_CD_FRAMESIZE_RAW0 (VKI_CD_FRAMESIZE_RAW-VKI_CD_SYNC_SIZE-VKI_CD_HEAD_SIZE) /*2336*/
1626
1627//----------------------------------------------------------------------
1628// From linux-2.6.8.1/include/linux/soundcard.h
1629//----------------------------------------------------------------------
1630
1631#ifndef _VKI_SIOWR
1632#if defined(_VKI_IOWR) && (defined(_AIX) || (!defined(sun) && !defined(sparc) && !defined(__sparc__) && !defined(__INCioctlh) && !defined(__Lynx__)))
1633/* Use already defined ioctl defines if they exist (except with Sun or Sparc) */
1634#define _VKI_SIO _VKI_IO
1635#define _VKI_SIOR _VKI_IOR
1636#define _VKI_SIOW _VKI_IOW
1637#define _VKI_SIOWR _VKI_IOWR
1638#else
1639// [[Valgrind: Install this case if/when necessary]
1640#error Valgrind: Cannot handle sparc/sun case yet...
1641# endif /* _IOWR */
1642#endif /* !_VKI_SIOWR */
1643
1644#define VKI_SNDCTL_SEQ_CTRLRATE _VKI_SIOWR('Q', 3, int) /* Set/get timer resolution (HZ) */
1645#define VKI_SNDCTL_SEQ_GETOUTCOUNT _VKI_SIOR ('Q', 4, int)
1646#define VKI_SNDCTL_SEQ_GETINCOUNT _VKI_SIOR ('Q', 5, int)
1647#define VKI_SNDCTL_SEQ_PERCMODE _VKI_SIOW ('Q', 6, int)
1648#define VKI_SNDCTL_SEQ_TESTMIDI _VKI_SIOW ('Q', 8, int)
1649#define VKI_SNDCTL_SEQ_RESETSAMPLES _VKI_SIOW ('Q', 9, int)
1650#define VKI_SNDCTL_SEQ_NRSYNTHS _VKI_SIOR ('Q',10, int)
1651#define VKI_SNDCTL_SEQ_NRMIDIS _VKI_SIOR ('Q',11, int)
1652#define VKI_SNDCTL_SEQ_GETTIME _VKI_SIOR ('Q',19, int)
1653
1654#define VKI_SNDCTL_TMR_TIMEBASE _VKI_SIOWR('T', 1, int)
1655#define VKI_SNDCTL_TMR_TEMPO _VKI_SIOWR('T', 5, int)
1656#define VKI_SNDCTL_TMR_SOURCE _VKI_SIOWR('T', 6, int)
1657
1658#define VKI_SNDCTL_MIDI_PRETIME _VKI_SIOWR('m', 0, int)
1659#define VKI_SNDCTL_MIDI_MPUMODE _VKI_SIOWR('m', 1, int)
1660
1661#define VKI_SNDCTL_DSP_RESET _VKI_SIO ('P', 0)
1662#define VKI_SNDCTL_DSP_SYNC _VKI_SIO ('P', 1)
1663#define VKI_SNDCTL_DSP_SPEED _VKI_SIOWR('P', 2, int)
1664#define VKI_SNDCTL_DSP_STEREO _VKI_SIOWR('P', 3, int)
1665#define VKI_SNDCTL_DSP_GETBLKSIZE _VKI_SIOWR('P', 4, int)
1666#define VKI_SNDCTL_DSP_CHANNELS _VKI_SIOWR('P', 6, int)
1667#define VKI_SOUND_PCM_WRITE_FILTER _VKI_SIOWR('P', 7, int)
1668#define VKI_SNDCTL_DSP_POST _VKI_SIO ('P', 8)
1669#define VKI_SNDCTL_DSP_SUBDIVIDE _VKI_SIOWR('P', 9, int)
1670#define VKI_SNDCTL_DSP_SETFRAGMENT _VKI_SIOWR('P',10, int)
1671
1672#define VKI_SNDCTL_DSP_GETFMTS _VKI_SIOR ('P',11, int) /* Returns a mask */
1673
1674typedef struct vki_audio_buf_info {
1675 int fragments; /* # of available fragments (partially usend ones not counted) */
1676 int fragstotal; /* Total # of fragments allocated */
1677 int fragsize; /* Size of a fragment in bytes */
1678
1679 int bytes; /* Available space in bytes (includes partially used fragments) */
1680 /* Note! 'bytes' could be more than fragments*fragsize */
1681 } vki_audio_buf_info;
1682
1683#define VKI_SNDCTL_DSP_GETOSPACE _VKI_SIOR ('P',12, vki_audio_buf_info)
1684#define VKI_SNDCTL_DSP_GETISPACE _VKI_SIOR ('P',13, vki_audio_buf_info)
1685//#define VKI_SNDCTL_DSP_NONBLOCK _VKI_SIO ('P',14)
1686#define VKI_SNDCTL_DSP_GETCAPS _VKI_SIOR ('P',15, int)
1687
1688#define VKI_SNDCTL_DSP_GETTRIGGER _VKI_SIOR ('P',16, int)
1689#define VKI_SNDCTL_DSP_SETTRIGGER _VKI_SIOW ('P',16, int)
1690
1691#define VKI_SNDCTL_DSP_SETSYNCRO _VKI_SIO ('P', 21)
1692#define VKI_SNDCTL_DSP_SETDUPLEX _VKI_SIO ('P', 22)
1693#define VKI_SNDCTL_DSP_GETODELAY _VKI_SIOR ('P', 23, int)
1694
nethercote95a97862004-11-06 16:31:43 +00001695#define VKI_SNDCTL_DSP_GETCHANNELMASK _VKI_SIOWR('P', 64, int)
1696#define VKI_SNDCTL_DSP_BIND_CHANNEL _VKI_SIOWR('P', 65, int)
1697
nethercote73b526f2004-10-31 18:48:21 +00001698#define VKI_SNDCTL_DSP_SETSPDIF _VKI_SIOW ('P', 66, int)
1699#define VKI_SNDCTL_DSP_GETSPDIF _VKI_SIOR ('P', 67, int)
1700
1701#define VKI_SOUND_PCM_READ_RATE _VKI_SIOR ('P', 2, int)
1702#define VKI_SOUND_PCM_READ_CHANNELS _VKI_SIOR ('P', 6, int)
1703#define VKI_SOUND_PCM_READ_BITS _VKI_SIOR ('P', 5, int)
1704#define VKI_SOUND_PCM_READ_FILTER _VKI_SIOR ('P', 7, int)
1705
1706
1707//----------------------------------------------------------------------
1708// From linux-2.6.8.1/include/linux/hdreg.h
1709//----------------------------------------------------------------------
1710
1711#define VKI_HDIO_GET_IDENTITY 0x030d /* get IDE identification info */
1712
1713// [[Nb: done like this because the original type is a huge struct that will
1714// always be the same size.]]
1715#define VKI_SIZEOF_STRUCT_HD_DRIVEID 512
1716
1717//----------------------------------------------------------------------
1718// From linux-2.6.8.1/include/linux/fb.h
1719//----------------------------------------------------------------------
1720
1721#define VKI_FBIOGET_VSCREENINFO 0x4600
1722#define VKI_FBIOGET_FSCREENINFO 0x4602
1723
1724struct vki_fb_fix_screeninfo {
1725 char id[16]; /* identification string eg "TT Builtin" */
1726 unsigned long smem_start; /* Start of frame buffer mem */
1727 /* (physical address) */
1728 __vki_u32 smem_len; /* Length of frame buffer mem */
1729 __vki_u32 type; /* see FB_TYPE_* */
1730 __vki_u32 type_aux; /* Interleave for interleaved Planes */
1731 __vki_u32 visual; /* see FB_VISUAL_* */
1732 __vki_u16 xpanstep; /* zero if no hardware panning */
1733 __vki_u16 ypanstep; /* zero if no hardware panning */
1734 __vki_u16 ywrapstep; /* zero if no hardware ywrap */
1735 __vki_u32 line_length; /* length of a line in bytes */
1736 unsigned long mmio_start; /* Start of Memory Mapped I/O */
1737 /* (physical address) */
1738 __vki_u32 mmio_len; /* Length of Memory Mapped I/O */
1739 __vki_u32 accel; /* Indicate to driver which */
1740 /* specific chip/card we have */
1741 __vki_u16 reserved[3]; /* Reserved for future compatibility */
1742};
1743
1744struct vki_fb_bitfield {
1745 __vki_u32 offset; /* beginning of bitfield */
1746 __vki_u32 length; /* length of bitfield */
1747 __vki_u32 msb_right; /* != 0 : Most significant bit is */
1748 /* right */
1749};
1750
1751struct vki_fb_var_screeninfo {
1752 __vki_u32 xres; /* visible resolution */
1753 __vki_u32 yres;
1754 __vki_u32 xres_virtual; /* virtual resolution */
1755 __vki_u32 yres_virtual;
1756 __vki_u32 xoffset; /* offset from virtual to visible */
1757 __vki_u32 yoffset; /* resolution */
1758
1759 __vki_u32 bits_per_pixel; /* guess what */
1760 __vki_u32 grayscale; /* != 0 Graylevels instead of colors */
1761
1762 struct vki_fb_bitfield red; /* bitfield in fb mem if true color, */
1763 struct vki_fb_bitfield green; /* else only length is significant */
1764 struct vki_fb_bitfield blue;
1765 struct vki_fb_bitfield transp; /* transparency */
1766
1767 __vki_u32 nonstd; /* != 0 Non standard pixel format */
1768
1769 __vki_u32 activate; /* see FB_ACTIVATE_* */
1770
1771 __vki_u32 height; /* height of picture in mm */
1772 __vki_u32 width; /* width of picture in mm */
1773
1774 __vki_u32 accel_flags; /* (OBSOLETE) see fb_info.flags */
1775
1776 /* Timing: All values in pixclocks, except pixclock (of course) */
1777 __vki_u32 pixclock; /* pixel clock in ps (pico seconds) */
1778 __vki_u32 left_margin; /* time from sync to picture */
1779 __vki_u32 right_margin; /* time from picture to sync */
1780 __vki_u32 upper_margin; /* time from sync to picture */
1781 __vki_u32 lower_margin;
1782 __vki_u32 hsync_len; /* length of horizontal sync */
1783 __vki_u32 vsync_len; /* length of vertical sync */
1784 __vki_u32 sync; /* see FB_SYNC_* */
1785 __vki_u32 vmode; /* see FB_VMODE_* */
1786 __vki_u32 rotate; /* angle we rotate counter clockwise */
1787 __vki_u32 reserved[5]; /* Reserved for future compatibility */
1788};
1789
thughesb3d3bcf2004-11-13 00:36:15 +00001790//----------------------------------------------------------------------
1791// From linux-2.6.9/include/linux/kb.h
1792//----------------------------------------------------------------------
1793
1794#define VKI_GIO_FONT 0x4B60 /* gets font in expanded form */
1795#define VKI_PIO_FONT 0x4B61 /* use font in expanded form */
1796
1797#define VKI_GIO_FONTX 0x4B6B /* get font using struct consolefontdesc */
1798#define VKI_PIO_FONTX 0x4B6C /* set font using struct consolefontdesc */
1799struct vki_consolefontdesc {
1800 unsigned short charcount; /* characters in font (256 or 512) */
1801 unsigned short charheight; /* scan lines per character (1-32) */
1802 char __user *chardata; /* font data in expanded form */
1803};
1804
1805#define VKI_PIO_FONTRESET 0x4B6D /* reset to default font */
1806
1807#define VKI_GIO_CMAP 0x4B70 /* gets colour palette on VGA+ */
1808#define VKI_PIO_CMAP 0x4B71 /* sets colour palette on VGA+ */
1809
1810#define VKI_KIOCSOUND 0x4B2F /* start sound generation (0 for off) */
1811#define VKI_KDMKTONE 0x4B30 /* generate tone */
1812
1813#define VKI_KDGETLED 0x4B31 /* return current led state */
1814#define VKI_KDSETLED 0x4B32 /* set led state [lights, not flags] */
1815
1816#define VKI_KDGKBTYPE 0x4B33 /* get keyboard type */
1817
1818#define VKI_KDADDIO 0x4B34 /* add i/o port as valid */
1819#define VKI_KDDELIO 0x4B35 /* del i/o port as valid */
1820#define VKI_KDENABIO 0x4B36 /* enable i/o to video board */
1821#define VKI_KDDISABIO 0x4B37 /* disable i/o to video board */
1822
1823#define VKI_KDSETMODE 0x4B3A /* set text/graphics mode */
1824#define VKI_KDGETMODE 0x4B3B /* get current mode */
1825
1826#define VKI_KDMAPDISP 0x4B3C /* map display into address space */
1827#define VKI_KDUNMAPDISP 0x4B3D /* unmap display from address space */
1828
1829#define VKI_E_TABSZ 256
1830#define VKI_GIO_SCRNMAP 0x4B40 /* get screen mapping from kernel */
1831#define VKI_PIO_SCRNMAP 0x4B41 /* put screen mapping table in kernel */
1832#define VKI_GIO_UNISCRNMAP 0x4B69 /* get full Unicode screen mapping */
1833#define VKI_PIO_UNISCRNMAP 0x4B6A /* set full Unicode screen mapping */
1834
1835#define VKI_GIO_UNIMAP 0x4B66 /* get unicode-to-font mapping from kernel */
1836#define VKI_PIO_UNIMAP 0x4B67 /* put unicode-to-font mapping in kernel */
1837#define VKI_PIO_UNIMAPCLR 0x4B68 /* clear table, possibly advise hash algorithm */
1838
1839#define VKI_KDGKBMODE 0x4B44 /* gets current keyboard mode */
1840#define VKI_KDSKBMODE 0x4B45 /* sets current keyboard mode */
1841
1842#define VKI_KDGKBMETA 0x4B62 /* gets meta key handling mode */
1843#define VKI_KDSKBMETA 0x4B63 /* sets meta key handling mode */
1844
1845#define VKI_KDGKBLED 0x4B64 /* get led flags (not lights) */
1846#define VKI_KDSKBLED 0x4B65 /* set led flags (not lights) */
1847
1848struct vki_kbentry {
1849 unsigned char kb_table;
1850 unsigned char kb_index;
1851 unsigned short kb_value;
1852};
1853#define VKI_KDGKBENT 0x4B46 /* gets one entry in translation table */
1854#define VKI_KDSKBENT 0x4B47 /* sets one entry in translation table */
1855
1856struct vki_kbsentry {
1857 unsigned char kb_func;
1858 unsigned char kb_string[512];
1859};
1860#define VKI_KDGKBSENT 0x4B48 /* gets one function key string entry */
1861#define VKI_KDSKBSENT 0x4B49 /* sets one function key string entry */
1862
1863struct vki_kbdiacr {
1864 unsigned char diacr, base, result;
1865};
1866struct vki_kbdiacrs {
1867 unsigned int kb_cnt; /* number of entries in following array */
1868 struct vki_kbdiacr kbdiacr[256]; /* MAX_DIACR from keyboard.h */
1869};
1870#define VKI_KDGKBDIACR 0x4B4A /* read kernel accent table */
1871#define VKI_KDSKBDIACR 0x4B4B /* write kernel accent table */
1872
1873struct vki_kbkeycode {
1874 unsigned int scancode, keycode;
1875};
1876#define VKI_KDGETKEYCODE 0x4B4C /* read kernel keycode table entry */
1877#define VKI_KDSETKEYCODE 0x4B4D /* write kernel keycode table entry */
1878
1879#define VKI_KDSIGACCEPT 0x4B4E /* accept kbd generated signals */
1880
1881struct vki_kbd_repeat {
1882 int delay; /* in msec; <= 0: don't change */
1883 int period; /* in msec; <= 0: don't change */
1884 /* earlier this field was misnamed "rate" */
1885};
1886#define VKI_KDKBDREP 0x4B52 /* set keyboard delay/repeat rate;
1887 * actually used values are returned */
1888
1889#define VKI_KDFONTOP 0x4B72 /* font operations */
1890
nethercote5b653bc2004-11-15 14:32:12 +00001891//----------------------------------------------------------------------
1892// From linux-2.6.9/include/linux/kb.h
1893//----------------------------------------------------------------------
1894
1895typedef __vki_kernel_uid32_t vki_qid_t; /* Type in which we store ids in memory */
1896
njnca0518d2004-11-26 19:34:36 +00001897//----------------------------------------------------------------------
1898// From linux-2.6.9/include/linux/ptrace.h
1899//----------------------------------------------------------------------
1900
1901#define VKI_PTRACE_PEEKTEXT 1
1902#define VKI_PTRACE_PEEKDATA 2
1903#define VKI_PTRACE_PEEKUSR 3
nethercote5b653bc2004-11-15 14:32:12 +00001904
njn4de47b12005-05-16 03:25:12 +00001905#endif // __VKI_LINUX_H
nethercote73b526f2004-10-31 18:48:21 +00001906
1907/*--------------------------------------------------------------------*/
1908/*--- end ---*/
1909/*--------------------------------------------------------------------*/