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