]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/valgrind/src/valgrind-3.6.0-svn/include/vki/vki-x86-l4re.h
update
[l4.git] / l4 / pkg / valgrind / src / valgrind-3.6.0-svn / include / vki / vki-x86-l4re.h
1
2 /*--------------------------------------------------------------------*/
3 /*--- x86/Linux-specific kernel interface.         vki-x86-linux.h ---*/
4 /*--------------------------------------------------------------------*/
5
6 /*
7    This file is part of Valgrind, a dynamic binary instrumentation
8    framework.
9
10    Copyright (C) 2000-2010 Julian Seward 
11       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 #ifndef __VKI_X86_LINUX_H
32 #define __VKI_X86_LINUX_H
33
34 // x86 is little-endian.
35 #define VKI_LITTLE_ENDIAN  1
36
37 //----------------------------------------------------------------------
38 // From linux-2.6.8.1/include/asm-i386/types.h
39 //----------------------------------------------------------------------
40
41 typedef unsigned char __vki_u8;
42
43 typedef __signed__ short __vki_s16;
44 typedef unsigned short __vki_u16;
45
46 typedef __signed__ int __vki_s32;
47 typedef unsigned int __vki_u32;
48
49 typedef __signed__ long long __vki_s64;
50 typedef unsigned long long __vki_u64;
51
52 typedef unsigned short vki_u16;
53
54 typedef unsigned int vki_u32;
55
56 //----------------------------------------------------------------------
57 // From linux-2.6.8.1/include/asm-i386/page.h
58 //----------------------------------------------------------------------
59
60 /* PAGE_SHIFT determines the page size */
61 #define VKI_PAGE_SHIFT  12
62 #define VKI_PAGE_SIZE   (1UL << VKI_PAGE_SHIFT)
63 #define VKI_MAX_PAGE_SHIFT      VKI_PAGE_SHIFT
64 #define VKI_MAX_PAGE_SIZE       VKI_PAGE_SIZE
65
66 //----------------------------------------------------------------------
67 // From linux-2.6.35.4/arch/x86/include/asm/shmparam.h
68 //----------------------------------------------------------------------
69
70 #define VKI_SHMLBA  VKI_PAGE_SIZE
71
72 //----------------------------------------------------------------------
73 // From linux-2.6.8.1/include/asm-i386/signal.h
74 //----------------------------------------------------------------------
75
76 #define VKI_MINSIGSTKSZ 2048
77
78 #define VKI_SIG_BLOCK          0        /* for blocking signals */
79 #define VKI_SIG_UNBLOCK        1        /* for unblocking signals */
80 #define VKI_SIG_SETMASK        2        /* for setting the signal mask */
81
82 /* Type of a signal handler.  */
83 typedef void __vki_signalfn_t(int);
84 typedef __vki_signalfn_t __user *__vki_sighandler_t;
85
86 typedef void __vki_restorefn_t(void);
87 typedef __vki_restorefn_t __user *__vki_sigrestore_t;
88
89 #define VKI_SIG_DFL     ((__vki_sighandler_t)0) /* default signal handling */
90 #define VKI_SIG_IGN     ((__vki_sighandler_t)1) /* ignore signal */
91
92 #define _VKI_NSIG       64
93 #define _VKI_NSIG_BPW   32
94 #define _VKI_NSIG_WORDS (_VKI_NSIG / _VKI_NSIG_BPW)
95
96 typedef unsigned long vki_old_sigset_t;         /* at least 32 bits */
97
98 typedef struct {
99         unsigned long sig[_VKI_NSIG_WORDS];
100 } vki_sigset_t;
101
102 #define VKI_SIGHUP               1
103 #define VKI_SIGINT               2
104 #define VKI_SIGQUIT              3
105 #define VKI_SIGILL               4
106 #define VKI_SIGTRAP              5
107 #define VKI_SIGABRT              6
108 //#define VKI_SIGIOT             6
109 #define VKI_SIGBUS               7
110 #define VKI_SIGFPE               8
111 #define VKI_SIGKILL              9
112 #define VKI_SIGUSR1             10
113 #define VKI_SIGSEGV             11
114 #define VKI_SIGUSR2             12
115 #define VKI_SIGPIPE             13
116 #define VKI_SIGALRM             14
117 #define VKI_SIGTERM             15
118 #define VKI_SIGSTKFLT           16
119 #define VKI_SIGCHLD             17
120 #define VKI_SIGCONT             18
121 #define VKI_SIGSTOP             19
122 #define VKI_SIGTSTP             20
123 #define VKI_SIGTTIN             21
124 #define VKI_SIGTTOU             22
125 #define VKI_SIGURG              23
126 #define VKI_SIGXCPU             24
127 #define VKI_SIGXFSZ             25
128 #define VKI_SIGVTALRM           26
129 #define VKI_SIGPROF             27
130 #define VKI_SIGWINCH            28
131 #define VKI_SIGIO               29
132 #define VKI_SIGPWR              30
133 #define VKI_SIGSYS              31
134 #define VKI_SIGUNUSED           31
135
136 /* These should not be considered constants from userland.  */
137 #define VKI_SIGRTMIN    32
138 // [[This was (_NSIG-1) in 2.4.X... not sure if it matters.]]
139 #define VKI_SIGRTMAX    _VKI_NSIG
140
141 #define VKI_SA_NOCLDSTOP        0x00000001u
142 #define VKI_SA_NOCLDWAIT        0x00000002u
143 #define VKI_SA_SIGINFO          0x00000004u
144 #define VKI_SA_ONSTACK          0x08000000u
145 #define VKI_SA_RESTART          0x10000000u
146 #define VKI_SA_NODEFER          0x40000000u
147 #define VKI_SA_RESETHAND        0x80000000u
148
149 #define VKI_SA_NOMASK           VKI_SA_NODEFER
150 #define VKI_SA_ONESHOT          VKI_SA_RESETHAND
151 //#define VKI_SA_INTERRUPT      0x20000000 /* dummy -- ignored */
152
153 #define VKI_SA_RESTORER         0x04000000
154
155 #define VKI_SS_ONSTACK  1
156 #define VKI_SS_DISABLE  2
157
158 /* These are 'legacy' sigactions in which the size of sa_mask is fixed
159    (cannot be expanded at any future point) because it is sandwiched
160    between two other fields.
161    (there is identical kludgery in vki-ppc32-linux.h) */
162 struct vki_old_sigaction {
163         // [[Nb: a 'k' prefix is added to "sa_handler" because
164         // bits/sigaction.h (which gets dragged in somehow via signal.h)
165         // #defines it as something else.  Since that is done for glibc's
166         // purposes, which we don't care about here, we use our own name.]]
167         __vki_sighandler_t ksa_handler;
168         vki_old_sigset_t sa_mask;
169         unsigned long sa_flags;
170         __vki_sigrestore_t sa_restorer;
171 };
172
173 struct vki_sigaction_base {
174         // [[See comment about extra 'k' above]]
175         __vki_sighandler_t ksa_handler;
176         unsigned long sa_flags;
177         __vki_sigrestore_t sa_restorer;
178         vki_sigset_t sa_mask;           /* mask last for extensibility */
179 };
180
181 /* On Linux we use the same type for passing sigactions to
182    and from the kernel.  Hence: */
183 typedef  struct vki_sigaction_base  vki_sigaction_toK_t;
184 typedef  struct vki_sigaction_base  vki_sigaction_fromK_t;
185
186
187 typedef struct vki_sigaltstack {
188         void __user *ss_sp;
189         int ss_flags;
190         vki_size_t ss_size;
191 } vki_stack_t;
192
193 //----------------------------------------------------------------------
194 // From linux-2.6.8.1/include/asm-i386/sigcontext.h
195 //----------------------------------------------------------------------
196
197 struct _vki_fpreg {
198         unsigned short significand[4];
199         unsigned short exponent;
200 };
201
202 struct _vki_fpxreg {
203         unsigned short significand[4];
204         unsigned short exponent;
205         unsigned short padding[3];
206 };
207
208 struct _vki_xmmreg {
209         unsigned long element[4];
210 };
211
212 struct _vki_fpstate {
213         /* Regular FPU environment */
214         unsigned long   cw;
215         unsigned long   sw;
216         unsigned long   tag;
217         unsigned long   ipoff;
218         unsigned long   cssel;
219         unsigned long   dataoff;
220         unsigned long   datasel;
221         struct _vki_fpreg       _st[8];
222         unsigned short  status;
223         unsigned short  magic;          /* 0xffff = regular FPU data only */
224
225         /* FXSR FPU environment */
226         unsigned long   _fxsr_env[6];   /* FXSR FPU env is ignored */
227         unsigned long   mxcsr;
228         unsigned long   reserved;
229         struct _vki_fpxreg      _fxsr_st[8];    /* FXSR FPU reg data is ignored */
230         struct _vki_xmmreg      _xmm[8];
231         unsigned long   padding[56];
232 };
233
234 struct vki_sigcontext {
235         unsigned short gs, __gsh;
236         unsigned short fs, __fsh;
237         unsigned short es, __esh;
238         unsigned short ds, __dsh;
239         unsigned long edi;
240         unsigned long esi;
241         unsigned long ebp;
242         unsigned long esp;
243         unsigned long ebx;
244         unsigned long edx;
245         unsigned long ecx;
246         unsigned long eax;
247         unsigned long trapno;
248         unsigned long err;
249         unsigned long eip;
250         unsigned short cs, __csh;
251         unsigned long eflags;
252         unsigned long esp_at_signal;
253         unsigned short ss, __ssh;
254         struct _vki_fpstate __user * fpstate;
255         unsigned long oldmask;
256         unsigned long cr2;
257 };
258
259 //----------------------------------------------------------------------
260 // From linux-2.6.8.1/include/asm-i386/mman.h
261 //----------------------------------------------------------------------
262
263 #define VKI_PROT_NONE   0x0             /* No page permissions */
264 #define VKI_PROT_READ   0x1             /* page can be read */
265 #define VKI_PROT_WRITE  0x2             /* page can be written */
266 #define VKI_PROT_EXEC   0x4             /* page can be executed */
267 #define VKI_PROT_GROWSDOWN      0x01000000      /* mprotect flag: extend change to start of growsdown vma */
268 #define VKI_PROT_GROWSUP        0x02000000      /* mprotect flag: extend change to end of growsup vma */
269
270 #define VKI_MAP_SHARED  0x01            /* Share changes */
271 #define VKI_MAP_PRIVATE 0x02            /* Changes are private */
272 //#define VKI_MAP_TYPE  0x0f            /* Mask for type of mapping */
273 #define VKI_MAP_FIXED   0x10            /* Interpret addr exactly */
274 #define VKI_MAP_ANONYMOUS       0x20    /* don't use a file */
275 #define VKI_MAP_NORESERVE       0x4000          /* don't check for reservations */
276
277 //----------------------------------------------------------------------
278 // From linux-2.6.8.1/include/asm-i386/fcntl.h
279 //----------------------------------------------------------------------
280
281 #define VKI_O_RDONLY         00
282 #define VKI_O_WRONLY         01
283 #define VKI_O_RDWR           02
284 #define VKI_O_CREAT        0100 /* not fcntl */
285 #define VKI_O_EXCL         0200 /* not fcntl */
286 #define VKI_O_TRUNC       01000 /* not fcntl */
287 #define VKI_O_APPEND      02000
288 #define VKI_O_NONBLOCK    04000
289 #if (VGO_l4re)
290 #define VKI_O_L4RE_MAGIC 010000 /* L4Re mode: register file mapping on open() */
291 #endif
292 #define VKI_O_LARGEFILE 0100000
293
294 #define VKI_AT_FDCWD            -100
295
296 #define VKI_F_DUPFD             0       /* dup */
297 #define VKI_F_GETFD             1       /* get close_on_exec */
298 #define VKI_F_SETFD             2       /* set/clear close_on_exec */
299 #define VKI_F_GETFL             3       /* get file->f_flags */
300 #define VKI_F_SETFL             4       /* set file->f_flags */
301 #define VKI_F_GETLK             5
302 #define VKI_F_SETLK             6
303 #define VKI_F_SETLKW            7
304
305 #define VKI_F_SETOWN            8       /*  for sockets. */
306 #define VKI_F_GETOWN            9       /*  for sockets. */
307 #define VKI_F_SETSIG            10      /*  for sockets. */
308 #define VKI_F_GETSIG            11      /*  for sockets. */
309
310 #define VKI_F_GETLK64           12      /*  using 'struct flock64' */
311 #define VKI_F_SETLK64           13
312 #define VKI_F_SETLKW64          14
313
314 /* for F_[GET|SET]FL */
315 #define VKI_FD_CLOEXEC  1       /* actually anything with low bit set goes */
316
317 #define VKI_F_LINUX_SPECIFIC_BASE       1024
318
319 //----------------------------------------------------------------------
320 // From linux-2.6.8.1/include/asm-i386/resource.h
321 //----------------------------------------------------------------------
322
323 #define VKI_RLIMIT_DATA         2       /* max data size */
324 #define VKI_RLIMIT_STACK        3       /* max stack size */
325 #define VKI_RLIMIT_CORE         4       /* max core file size */
326 #define VKI_RLIMIT_NOFILE       7       /* max number of open files */
327
328 //----------------------------------------------------------------------
329 // From linux-2.6.8.1/include/asm-i386/socket.h
330 //----------------------------------------------------------------------
331
332 #define VKI_SOL_SOCKET  1
333
334 #define VKI_SO_TYPE     3
335
336 //----------------------------------------------------------------------
337 // From linux-2.6.8.1/include/asm-i386/sockios.h
338 //----------------------------------------------------------------------
339
340 #define VKI_SIOCSPGRP           0x8902
341 #define VKI_SIOCGPGRP           0x8904
342 #define VKI_SIOCGSTAMP          0x8906          /* Get stamp (timeval) */
343 #define VKI_SIOCGSTAMPNS        0x8907          /* Get stamp (timespec) */
344
345 //----------------------------------------------------------------------
346 // From linux-2.6.8.1/include/asm-i386/stat.h
347 //----------------------------------------------------------------------
348
349 struct vki_stat {
350         unsigned long  st_dev;
351         unsigned long  st_ino;
352         unsigned short st_mode;
353         unsigned short st_nlink;
354         unsigned short st_uid;
355         unsigned short st_gid;
356         unsigned long  st_rdev;
357         unsigned long  st_size;
358         unsigned long  st_blksize;
359         unsigned long  st_blocks;
360         unsigned long  st_atime;
361         unsigned long  st_atime_nsec;
362         unsigned long  st_mtime;
363         unsigned long  st_mtime_nsec;
364         unsigned long  st_ctime;
365         unsigned long  st_ctime_nsec;
366         unsigned long  __unused4;
367         unsigned long  __unused5;
368 };
369
370 struct vki_stat64 {
371         unsigned long long      st_dev;
372         unsigned char   __pad0[4];
373
374 #define STAT64_HAS_BROKEN_ST_INO        1
375         unsigned long   __st_ino;
376
377         unsigned int    st_mode;
378         unsigned int    st_nlink;
379
380         unsigned long   st_uid;
381         unsigned long   st_gid;
382
383         unsigned long long      st_rdev;
384         unsigned char   __pad3[4];
385
386         long long       st_size;
387         unsigned long   st_blksize;
388
389         unsigned long   st_blocks;      /* Number 512-byte blocks allocated. */
390         unsigned long   __pad4;         /* future possible st_blocks high bits */
391
392         unsigned long   st_atime;
393         unsigned long   st_atime_nsec;
394
395         unsigned long   st_mtime;
396         unsigned int    st_mtime_nsec;
397
398         unsigned long   st_ctime;
399         unsigned long   st_ctime_nsec;
400
401         unsigned long long      st_ino;
402 };
403
404 //----------------------------------------------------------------------
405 // From linux-2.6.8.1/include/asm-i386/statfs.h
406 //----------------------------------------------------------------------
407
408 // [[Nb: asm-i386/statfs.h just #include asm-generic/statfs.h directly]]
409 struct vki_statfs {
410         __vki_u32 f_type;
411         __vki_u32 f_bsize;
412         __vki_u32 f_blocks;
413         __vki_u32 f_bfree;
414         __vki_u32 f_bavail;
415         __vki_u32 f_files;
416         __vki_u32 f_ffree;
417         __vki_kernel_fsid_t f_fsid;
418         __vki_u32 f_namelen;
419         __vki_u32 f_frsize;
420         __vki_u32 f_spare[5];
421 };
422
423 //----------------------------------------------------------------------
424 // From linux-2.6.8.1/include/asm-i386/termios.h
425 //----------------------------------------------------------------------
426
427 struct vki_winsize {
428         unsigned short ws_row;
429         unsigned short ws_col;
430         unsigned short ws_xpixel;
431         unsigned short ws_ypixel;
432 };
433
434 #define VKI_NCC 8
435 struct vki_termio {
436         unsigned short c_iflag;         /* input mode flags */
437         unsigned short c_oflag;         /* output mode flags */
438         unsigned short c_cflag;         /* control mode flags */
439         unsigned short c_lflag;         /* local mode flags */
440         unsigned char c_line;           /* line discipline */
441         unsigned char c_cc[VKI_NCC];    /* control characters */
442 };
443
444
445 //----------------------------------------------------------------------
446 // From linux-2.6.8.1/include/asm-i386/termbits.h
447 //----------------------------------------------------------------------
448
449 typedef unsigned char   vki_cc_t;
450 typedef unsigned int    vki_tcflag_t;
451
452 #define VKI_NCCS 19
453 struct vki_termios {
454         vki_tcflag_t c_iflag;           /* input mode flags */
455         vki_tcflag_t c_oflag;           /* output mode flags */
456         vki_tcflag_t c_cflag;           /* control mode flags */
457         vki_tcflag_t c_lflag;           /* local mode flags */
458         vki_cc_t c_line;                /* line discipline */
459         vki_cc_t c_cc[VKI_NCCS];        /* control characters */
460 };
461
462 //----------------------------------------------------------------------
463 // From linux-2.6.8.1/include/asm-i386/ioctl.h
464 //----------------------------------------------------------------------
465
466 #define _VKI_IOC_NRBITS         8
467 #define _VKI_IOC_TYPEBITS       8
468 #define _VKI_IOC_SIZEBITS       14
469 #define _VKI_IOC_DIRBITS        2
470
471 #define _VKI_IOC_NRMASK         ((1 << _VKI_IOC_NRBITS)-1)
472 #define _VKI_IOC_TYPEMASK       ((1 << _VKI_IOC_TYPEBITS)-1)
473 #define _VKI_IOC_SIZEMASK       ((1 << _VKI_IOC_SIZEBITS)-1)
474 #define _VKI_IOC_DIRMASK        ((1 << _VKI_IOC_DIRBITS)-1)
475
476 #define _VKI_IOC_NRSHIFT        0
477 #define _VKI_IOC_TYPESHIFT      (_VKI_IOC_NRSHIFT+_VKI_IOC_NRBITS)
478 #define _VKI_IOC_SIZESHIFT      (_VKI_IOC_TYPESHIFT+_VKI_IOC_TYPEBITS)
479 #define _VKI_IOC_DIRSHIFT       (_VKI_IOC_SIZESHIFT+_VKI_IOC_SIZEBITS)
480
481 #define _VKI_IOC_NONE   0U
482 #define _VKI_IOC_WRITE  1U
483 #define _VKI_IOC_READ   2U
484
485 #define _VKI_IOC(dir,type,nr,size) \
486         (((dir)  << _VKI_IOC_DIRSHIFT) | \
487          ((type) << _VKI_IOC_TYPESHIFT) | \
488          ((nr)   << _VKI_IOC_NRSHIFT) | \
489          ((size) << _VKI_IOC_SIZESHIFT))
490
491 /* provoke compile error for invalid uses of size argument */
492 #define _VKI_IOC_TYPECHECK(t)                                           \
493     (VKI_STATIC_ASSERT((sizeof(t) == sizeof(t[1])                       \
494                         && sizeof(t) < (1 << _VKI_IOC_SIZEBITS)))       \
495      + sizeof(t))
496
497 /* used to create numbers */
498 #define _VKI_IO(type,nr)        _VKI_IOC(_VKI_IOC_NONE,(type),(nr),0)
499 #define _VKI_IOR(type,nr,size)  _VKI_IOC(_VKI_IOC_READ,(type),(nr),(_VKI_IOC_TYPECHECK(size)))
500 #define _VKI_IOW(type,nr,size)  _VKI_IOC(_VKI_IOC_WRITE,(type),(nr),(_VKI_IOC_TYPECHECK(size)))
501 #define _VKI_IOWR(type,nr,size) _VKI_IOC(_VKI_IOC_READ|_VKI_IOC_WRITE,(type),(nr),(_VKI_IOC_TYPECHECK(size)))
502
503 /* used to decode ioctl numbers.. */
504 #define _VKI_IOC_DIR(nr)        (((nr) >> _VKI_IOC_DIRSHIFT) & _VKI_IOC_DIRMASK)
505 #define _VKI_IOC_TYPE(nr)       (((nr) >> _VKI_IOC_TYPESHIFT) & _VKI_IOC_TYPEMASK)
506 #define _VKI_IOC_NR(nr)         (((nr) >> _VKI_IOC_NRSHIFT) & _VKI_IOC_NRMASK)
507 #define _VKI_IOC_SIZE(nr)       (((nr) >> _VKI_IOC_SIZESHIFT) & _VKI_IOC_SIZEMASK)
508
509 //----------------------------------------------------------------------
510 // From linux-2.6.8.1/include/asm-i386/ioctls.h
511 //----------------------------------------------------------------------
512
513 #define VKI_TCGETS      0x5401
514 #define VKI_TCSETS      0x5402 /* Clashes with SNDCTL_TMR_START sound ioctl */
515 #define VKI_TCSETSW     0x5403
516 #define VKI_TCSETSF     0x5404
517 #define VKI_TCGETA      0x5405
518 #define VKI_TCSETA      0x5406
519 #define VKI_TCSETAW     0x5407
520 #define VKI_TCSETAF     0x5408
521 #define VKI_TCSBRK      0x5409
522 #define VKI_TCXONC      0x540A
523 #define VKI_TCFLSH      0x540B
524 #define VKI_TIOCSCTTY   0x540E
525 #define VKI_TIOCGPGRP   0x540F
526 #define VKI_TIOCSPGRP   0x5410
527 #define VKI_TIOCOUTQ    0x5411
528 #define VKI_TIOCGWINSZ  0x5413
529 #define VKI_TIOCSWINSZ  0x5414
530 #define VKI_TIOCMGET    0x5415
531 #define VKI_TIOCMBIS    0x5416
532 #define VKI_TIOCMBIC    0x5417
533 #define VKI_TIOCMSET    0x5418
534 #define VKI_FIONREAD    0x541B
535 #define VKI_TIOCLINUX   0x541C
536 #define VKI_FIONBIO     0x5421
537 #define VKI_TCSBRKP     0x5425  /* Needed for POSIX tcsendbreak() */
538 #define VKI_TIOCGPTN    _VKI_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
539 #define VKI_TIOCSPTLCK  _VKI_IOW('T',0x31, int)  /* Lock/unlock Pty */
540
541 #define VKI_FIOASYNC    0x5452
542 #define VKI_TIOCSERGETLSR   0x5459 /* Get line status register */
543
544 #define VKI_TIOCGICOUNT 0x545D  /* read serial port inline interrupt counts */
545
546 //----------------------------------------------------------------------
547 // From linux-2.6.8.1/include/asm-i386/poll.h
548 //----------------------------------------------------------------------
549
550 /* These are specified by iBCS2 */
551 #define VKI_POLLIN              0x0001
552
553 struct vki_pollfd {
554         int fd;
555         short events;
556         short revents;
557 };
558
559 //----------------------------------------------------------------------
560 // From linux-2.6.8.1/include/asm-i386/user.h
561 //----------------------------------------------------------------------
562
563 struct vki_user_i387_struct {
564         long    cwd;
565         long    swd;
566         long    twd;
567         long    fip;
568         long    fcs;
569         long    foo;
570         long    fos;
571         long    st_space[20];   /* 8*10 bytes for each FP-reg = 80 bytes */
572 };
573
574 struct vki_user_fxsr_struct {
575         unsigned short  cwd;
576         unsigned short  swd;
577         unsigned short  twd;
578         unsigned short  fop;
579         long    fip;
580         long    fcs;
581         long    foo;
582         long    fos;
583         long    mxcsr;
584         long    reserved;
585         long    st_space[32];   /* 8*16 bytes for each FP-reg = 128 bytes */
586         long    xmm_space[32];  /* 8*16 bytes for each XMM-reg = 128 bytes */
587         long    padding[56];
588 };
589
590 /*
591  * This is the old layout of "struct pt_regs", and
592  * is still the layout used by user mode (the new
593  * pt_regs doesn't have all registers as the kernel
594  * doesn't use the extra segment registers)
595  */
596 struct vki_user_regs_struct {
597         long ebx, ecx, edx, esi, edi, ebp, eax;
598         unsigned short ds, __ds, es, __es;
599         unsigned short fs, __fs, gs, __gs;
600         long orig_eax, eip;
601         unsigned short cs, __cs;
602         long eflags, esp;
603         unsigned short ss, __ss;
604 };
605
606 //----------------------------------------------------------------------
607 // From linux-2.6.8.1/include/asm-i386/elf.h
608 //----------------------------------------------------------------------
609
610 typedef unsigned long vki_elf_greg_t;
611
612 #define VKI_ELF_NGREG (sizeof (struct vki_user_regs_struct) / sizeof(vki_elf_greg_t))
613 typedef vki_elf_greg_t vki_elf_gregset_t[VKI_ELF_NGREG];
614
615 typedef struct vki_user_i387_struct vki_elf_fpregset_t;
616 typedef struct vki_user_fxsr_struct vki_elf_fpxregset_t;
617
618 #define VKI_AT_SYSINFO          32
619
620 //----------------------------------------------------------------------
621 // From linux-2.6.8.1/include/asm-i386/ucontext.h
622 //----------------------------------------------------------------------
623
624 struct vki_ucontext {
625         unsigned long           uc_flags;
626         struct vki_ucontext    *uc_link;
627         vki_stack_t             uc_stack;
628         struct vki_sigcontext   uc_mcontext;
629         vki_sigset_t            uc_sigmask;     /* mask last for extensibility */
630 };
631
632 //----------------------------------------------------------------------
633 // From linux-2.6.8.1/include/asm-i386/segment.h
634 //----------------------------------------------------------------------
635
636 #define VKI_GDT_ENTRY_TLS_ENTRIES       3
637 #define VKI_GDT_ENTRY_TLS_MIN   6
638 #define VKI_GDT_ENTRY_TLS_MAX   (VKI_GDT_ENTRY_TLS_MIN + VKI_GDT_ENTRY_TLS_ENTRIES - 1)
639
640 //----------------------------------------------------------------------
641 // From linux-2.6.8.1/include/asm-i386/ldt.h
642 //----------------------------------------------------------------------
643
644 /* [[Nb: This is the structure passed to the modify_ldt syscall.  Just so as
645    to confuse and annoy everyone, this is _not_ the same as an
646    VgLdtEntry and has to be translated into such.  The logic for doing
647    so, in vg_ldt.c, is copied from the kernel sources.]] */
648 struct vki_user_desc {
649         unsigned int  entry_number;
650         unsigned long base_addr;
651         unsigned int  limit;
652         unsigned int  seg_32bit:1;
653         unsigned int  contents:2;
654         unsigned int  read_exec_only:1;
655         unsigned int  limit_in_pages:1;
656         unsigned int  seg_not_present:1;
657         unsigned int  useable:1;
658         // [[Nb: this field is not in the kernel sources, but it has always
659         // been in the Valgrind sources so I will keep it there in case it's
660         // important... this is an x86-defined data structure so who
661         // knows;  maybe it's important to set this field to zero at some
662         // point.  --njn]]
663         unsigned int  reserved:25;
664 };
665
666 // [[Nb: for our convenience within Valgrind, use a more specific name]]
667 typedef struct vki_user_desc vki_modify_ldt_t;
668
669 //----------------------------------------------------------------------
670 // From linux-2.6.8.1/include/asm-i386/ipcbuf.h
671 //----------------------------------------------------------------------
672
673 struct vki_ipc64_perm
674 {
675         __vki_kernel_key_t      key;
676         __vki_kernel_uid32_t    uid;
677         __vki_kernel_gid32_t    gid;
678         __vki_kernel_uid32_t    cuid;
679         __vki_kernel_gid32_t    cgid;
680         __vki_kernel_mode_t     mode;
681         unsigned short          __pad1;
682         unsigned short          seq;
683         unsigned short          __pad2;
684         unsigned long           __unused1;
685         unsigned long           __unused2;
686 };
687
688 //----------------------------------------------------------------------
689 // From linux-2.6.8.1/include/asm-i386/sembuf.h
690 //----------------------------------------------------------------------
691
692 struct vki_semid64_ds {
693         struct vki_ipc64_perm sem_perm;         /* permissions .. see ipc.h */
694         __vki_kernel_time_t     sem_otime;              /* last semop time */
695         unsigned long   __unused1;
696         __vki_kernel_time_t     sem_ctime;              /* last change time */
697         unsigned long   __unused2;
698         unsigned long   sem_nsems;              /* no. of semaphores in array */
699         unsigned long   __unused3;
700         unsigned long   __unused4;
701 };
702
703 //----------------------------------------------------------------------
704 // From linux-2.6.8.1/include/asm-i386/msgbuf.h
705 //----------------------------------------------------------------------
706
707 struct vki_msqid64_ds {
708         struct vki_ipc64_perm msg_perm;
709         __vki_kernel_time_t msg_stime;  /* last msgsnd time */
710         unsigned long   __unused1;
711         __vki_kernel_time_t msg_rtime;  /* last msgrcv time */
712         unsigned long   __unused2;
713         __vki_kernel_time_t msg_ctime;  /* last change time */
714         unsigned long   __unused3;
715         unsigned long  msg_cbytes;      /* current number of bytes on queue */
716         unsigned long  msg_qnum;        /* number of messages in queue */
717         unsigned long  msg_qbytes;      /* max number of bytes on queue */
718         __vki_kernel_pid_t msg_lspid;   /* pid of last msgsnd */
719         __vki_kernel_pid_t msg_lrpid;   /* last receive pid */
720         unsigned long  __unused4;
721         unsigned long  __unused5;
722 };
723
724 //----------------------------------------------------------------------
725 // From linux-2.6.8.1/include/asm-i386/ipc.h
726 //----------------------------------------------------------------------
727
728 struct vki_ipc_kludge {
729         struct vki_msgbuf __user *msgp;
730         long msgtyp;
731 };
732
733 #define VKI_SEMOP                1
734 #define VKI_SEMGET               2
735 #define VKI_SEMCTL               3
736 #define VKI_SEMTIMEDOP           4
737 #define VKI_MSGSND              11
738 #define VKI_MSGRCV              12
739 #define VKI_MSGGET              13
740 #define VKI_MSGCTL              14
741 #define VKI_SHMAT               21
742 #define VKI_SHMDT               22
743 #define VKI_SHMGET              23
744 #define VKI_SHMCTL              24
745
746
747 //----------------------------------------------------------------------
748 // From linux-2.6.8.1/include/asm-i386/shmbuf.h
749 //----------------------------------------------------------------------
750
751 struct vki_shmid64_ds {
752         struct vki_ipc64_perm   shm_perm;       /* operation perms */
753         vki_size_t              shm_segsz;      /* size of segment (bytes) */
754         __vki_kernel_time_t     shm_atime;      /* last attach time */
755         unsigned long           __unused1;
756         __vki_kernel_time_t     shm_dtime;      /* last detach time */
757         unsigned long           __unused2;
758         __vki_kernel_time_t     shm_ctime;      /* last change time */
759         unsigned long           __unused3;
760         __vki_kernel_pid_t      shm_cpid;       /* pid of creator */
761         __vki_kernel_pid_t      shm_lpid;       /* pid of last operator */
762         unsigned long           shm_nattch;     /* no. of current attaches */
763         unsigned long           __unused4;
764         unsigned long           __unused5;
765 };
766
767 struct vki_shminfo64 {
768         unsigned long   shmmax;
769         unsigned long   shmmin;
770         unsigned long   shmmni;
771         unsigned long   shmseg;
772         unsigned long   shmall;
773         unsigned long   __unused1;
774         unsigned long   __unused2;
775         unsigned long   __unused3;
776         unsigned long   __unused4;
777 };
778
779 //----------------------------------------------------------------------
780 // DRM ioctls
781 //----------------------------------------------------------------------
782
783 // jrs 20050207: where did all this stuff come from?  Is it really
784 // i386 specific, or should it go into the linux-generic category?
785 //struct vki_drm_buf_pub {
786 //      Int               idx;         /**< Index into the master buffer list */
787 //      Int               total;       /**< Buffer size */
788 //      Int               used;        /**< Amount of buffer in use (for DMA) */
789 //      void      __user *address;     /**< Address of buffer */
790 //};
791 //
792 //struct vki_drm_buf_map {
793 //      Int           count;            /**< Length of the buffer list */
794 //      void          __user *virtual;  /**< Mmap'd area in user-virtual */
795 //      struct vki_drm_buf_pub __user *list;    /**< Buffer information */
796 //};
797 //
798 ///* We need to pay attention to this, because it mmaps memory */
799 //#define VKI_DRM_IOCTL_MAP_BUFS                _VKI_IOWR('d', 0x19, struct vki_drm_buf_map)
800
801 //----------------------------------------------------------------------
802 // From linux-2.6.9/include/asm-i386/ptrace.h
803 //----------------------------------------------------------------------
804
805 #define VKI_PTRACE_GETREGS            12
806 #define VKI_PTRACE_SETREGS            13
807 #define VKI_PTRACE_GETFPREGS          14
808 #define VKI_PTRACE_SETFPREGS          15
809 #define VKI_PTRACE_GETFPXREGS         18
810 #define VKI_PTRACE_SETFPXREGS         19
811
812 //----------------------------------------------------------------------
813 // From linux-2.6.15.4/include/asm-i386/vm86.h
814 //----------------------------------------------------------------------
815
816 #define VKI_VM86_PLUS_INSTALL_CHECK     0
817 #define VKI_VM86_ENTER                  1
818 #define VKI_VM86_ENTER_NO_BYPASS        2
819 #define VKI_VM86_REQUEST_IRQ            3
820 #define VKI_VM86_FREE_IRQ               4
821 #define VKI_VM86_GET_IRQ_BITS           5
822 #define VKI_VM86_GET_AND_RESET_IRQ      6
823
824 struct vki_vm86_regs {
825 /*
826  * normal regs, with special meaning for the segment descriptors..
827  */
828         long ebx;
829         long ecx;
830         long edx;
831         long esi;
832         long edi;
833         long ebp;
834         long eax;
835         long __null_ds;
836         long __null_es;
837         long __null_fs;
838         long __null_gs;
839         long orig_eax;
840         long eip;
841         unsigned short cs, __csh;
842         long eflags;
843         long esp;
844         unsigned short ss, __ssh;
845 /*
846  * these are specific to v86 mode:
847  */
848         unsigned short es, __esh;
849         unsigned short ds, __dsh;
850         unsigned short fs, __fsh;
851         unsigned short gs, __gsh;
852 };
853
854 struct vki_revectored_struct {
855         unsigned long __map[8];                 /* 256 bits */
856 };
857
858 struct vki_vm86_struct {
859         struct vki_vm86_regs regs;
860         unsigned long flags;
861         unsigned long screen_bitmap;
862         unsigned long cpu_type;
863         struct vki_revectored_struct int_revectored;
864         struct vki_revectored_struct int21_revectored;
865 };
866
867 struct vki_vm86plus_info_struct {
868         unsigned long force_return_for_pic:1;
869         unsigned long vm86dbg_active:1;       /* for debugger */
870         unsigned long vm86dbg_TFpendig:1;     /* for debugger */
871         unsigned long unused:28;
872         unsigned long is_vm86pus:1;           /* for vm86 internal use */
873         unsigned char vm86dbg_intxxtab[32];   /* for debugger */
874 };
875
876 struct vki_vm86plus_struct {
877         struct vki_vm86_regs regs;
878         unsigned long flags;
879         unsigned long screen_bitmap;
880         unsigned long cpu_type;
881         struct vki_revectored_struct int_revectored;
882         struct vki_revectored_struct int21_revectored;
883         struct vki_vm86plus_info_struct vm86plus;
884 };
885
886 //----------------------------------------------------------------------
887 // And that's it!
888 //----------------------------------------------------------------------
889
890 #endif // __VKI_X86_LINUX_H
891
892 /*--------------------------------------------------------------------*/
893 /*--- end                                                          ---*/
894 /*--------------------------------------------------------------------*/