Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-09-14 09:09:18

0001 
0002 /*--------------------------------------------------------------------*/
0003 /*--- x86/Linux-specific kernel interface.         vki-x86-linux.h ---*/
0004 /*--------------------------------------------------------------------*/
0005 
0006 /*
0007    This file is part of Valgrind, a dynamic binary instrumentation
0008    framework.
0009 
0010    Copyright (C) 2000-2017 Julian Seward 
0011       jseward@acm.org
0012 
0013    This program is free software; you can redistribute it and/or
0014    modify it under the terms of the GNU General Public License as
0015    published by the Free Software Foundation; either version 2 of the
0016    License, or (at your option) any later version.
0017 
0018    This program is distributed in the hope that it will be useful, but
0019    WITHOUT ANY WARRANTY; without even the implied warranty of
0020    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0021    General Public License for more details.
0022 
0023    You should have received a copy of the GNU General Public License
0024    along with this program; if not, see <http://www.gnu.org/licenses/>.
0025 
0026    The GNU General Public License is contained in the file COPYING.
0027 */
0028 
0029 #ifndef __VKI_X86_LINUX_H
0030 #define __VKI_X86_LINUX_H
0031 
0032 // x86 is little-endian.
0033 #define VKI_LITTLE_ENDIAN  1
0034 
0035 //----------------------------------------------------------------------
0036 // From linux-2.6.8.1/include/asm-i386/types.h
0037 //----------------------------------------------------------------------
0038 
0039 typedef unsigned char __vki_u8;
0040 
0041 typedef __signed__ short __vki_s16;
0042 typedef unsigned short __vki_u16;
0043 
0044 typedef __signed__ int __vki_s32;
0045 typedef unsigned int __vki_u32;
0046 
0047 typedef __signed__ long long __vki_s64;
0048 typedef unsigned long long __vki_u64;
0049 
0050 typedef unsigned short vki_u16;
0051 
0052 typedef unsigned int vki_u32;
0053 
0054 //----------------------------------------------------------------------
0055 // From linux-2.6.8.1/include/asm-i386/page.h
0056 //----------------------------------------------------------------------
0057 
0058 /* PAGE_SHIFT determines the page size */
0059 #define VKI_PAGE_SHIFT  12
0060 #define VKI_PAGE_SIZE   (1UL << VKI_PAGE_SHIFT)
0061 #define VKI_MAX_PAGE_SHIFT  VKI_PAGE_SHIFT
0062 #define VKI_MAX_PAGE_SIZE   VKI_PAGE_SIZE
0063 
0064 //----------------------------------------------------------------------
0065 // From linux-2.6.35.4/arch/x86/include/asm/shmparam.h
0066 //----------------------------------------------------------------------
0067 
0068 #define VKI_SHMLBA  VKI_PAGE_SIZE
0069 
0070 //----------------------------------------------------------------------
0071 // From linux-2.6.8.1/include/asm-i386/signal.h
0072 //----------------------------------------------------------------------
0073 
0074 #define VKI_MINSIGSTKSZ 2048
0075 
0076 #define VKI_SIG_BLOCK          0    /* for blocking signals */
0077 #define VKI_SIG_UNBLOCK        1    /* for unblocking signals */
0078 #define VKI_SIG_SETMASK        2    /* for setting the signal mask */
0079 
0080 /* Type of a signal handler.  */
0081 typedef void __vki_signalfn_t(int);
0082 typedef __vki_signalfn_t __user *__vki_sighandler_t;
0083 
0084 typedef void __vki_restorefn_t(void);
0085 typedef __vki_restorefn_t __user *__vki_sigrestore_t;
0086 
0087 #define VKI_SIG_DFL ((__vki_sighandler_t)0) /* default signal handling */
0088 #define VKI_SIG_IGN ((__vki_sighandler_t)1) /* ignore signal */
0089 
0090 #define _VKI_NSIG   64
0091 #define _VKI_NSIG_BPW   32
0092 #define _VKI_NSIG_WORDS (_VKI_NSIG / _VKI_NSIG_BPW)
0093 
0094 typedef unsigned long vki_old_sigset_t;     /* at least 32 bits */
0095 
0096 typedef struct {
0097     unsigned long sig[_VKI_NSIG_WORDS];
0098 } vki_sigset_t;
0099 
0100 #define VKI_SIGHUP       1
0101 #define VKI_SIGINT       2
0102 #define VKI_SIGQUIT      3
0103 #define VKI_SIGILL       4
0104 #define VKI_SIGTRAP      5
0105 #define VKI_SIGABRT      6
0106 //#define VKI_SIGIOT         6
0107 #define VKI_SIGBUS       7
0108 #define VKI_SIGFPE       8
0109 #define VKI_SIGKILL      9
0110 #define VKI_SIGUSR1     10
0111 #define VKI_SIGSEGV     11
0112 #define VKI_SIGUSR2     12
0113 #define VKI_SIGPIPE     13
0114 #define VKI_SIGALRM     14
0115 #define VKI_SIGTERM     15
0116 #define VKI_SIGSTKFLT       16
0117 #define VKI_SIGCHLD     17
0118 #define VKI_SIGCONT     18
0119 #define VKI_SIGSTOP     19
0120 #define VKI_SIGTSTP     20
0121 #define VKI_SIGTTIN     21
0122 #define VKI_SIGTTOU     22
0123 #define VKI_SIGURG      23
0124 #define VKI_SIGXCPU     24
0125 #define VKI_SIGXFSZ     25
0126 #define VKI_SIGVTALRM       26
0127 #define VKI_SIGPROF     27
0128 #define VKI_SIGWINCH        28
0129 #define VKI_SIGIO       29
0130 #define VKI_SIGPWR      30
0131 #define VKI_SIGSYS      31
0132 #define VKI_SIGUNUSED       31
0133 
0134 /* These should not be considered constants from userland.  */
0135 #define VKI_SIGRTMIN    32
0136 // [[This was (_NSIG-1) in 2.4.X... not sure if it matters.]]
0137 #define VKI_SIGRTMAX    _VKI_NSIG
0138 
0139 #define VKI_SA_NOCLDSTOP    0x00000001u
0140 #define VKI_SA_NOCLDWAIT    0x00000002u
0141 #define VKI_SA_SIGINFO      0x00000004u
0142 #define VKI_SA_ONSTACK      0x08000000u
0143 #define VKI_SA_RESTART      0x10000000u
0144 #define VKI_SA_NODEFER      0x40000000u
0145 #define VKI_SA_RESETHAND    0x80000000u
0146 
0147 #define VKI_SA_NOMASK       VKI_SA_NODEFER
0148 #define VKI_SA_ONESHOT      VKI_SA_RESETHAND
0149 //#define VKI_SA_INTERRUPT  0x20000000 /* dummy -- ignored */
0150 
0151 #define VKI_SA_RESTORER     0x04000000
0152 
0153 #define VKI_SS_ONSTACK  1
0154 #define VKI_SS_DISABLE  2
0155 
0156 /* These are 'legacy' sigactions in which the size of sa_mask is fixed
0157    (cannot be expanded at any future point) because it is sandwiched
0158    between two other fields.
0159    (there is identical kludgery in vki-ppc32-linux.h) */
0160 struct vki_old_sigaction {
0161         // [[Nb: a 'k' prefix is added to "sa_handler" because
0162         // bits/sigaction.h (which gets dragged in somehow via signal.h)
0163         // #defines it as something else.  Since that is done for glibc's
0164         // purposes, which we don't care about here, we use our own name.]]
0165         __vki_sighandler_t ksa_handler;
0166         vki_old_sigset_t sa_mask;
0167         unsigned long sa_flags;
0168         __vki_sigrestore_t sa_restorer;
0169 };
0170 
0171 struct vki_sigaction_base {
0172         // [[See comment about extra 'k' above]]
0173     __vki_sighandler_t ksa_handler;
0174     unsigned long sa_flags;
0175     __vki_sigrestore_t sa_restorer;
0176     vki_sigset_t sa_mask;       /* mask last for extensibility */
0177 };
0178 
0179 /* On Linux we use the same type for passing sigactions to
0180    and from the kernel.  Hence: */
0181 typedef  struct vki_sigaction_base  vki_sigaction_toK_t;
0182 typedef  struct vki_sigaction_base  vki_sigaction_fromK_t;
0183 
0184 
0185 typedef struct vki_sigaltstack {
0186     void __user *ss_sp;
0187     int ss_flags;
0188     vki_size_t ss_size;
0189 } vki_stack_t;
0190 
0191 //----------------------------------------------------------------------
0192 // From linux-2.6.8.1/include/asm-i386/sigcontext.h
0193 //----------------------------------------------------------------------
0194 
0195 struct _vki_fpreg {
0196     unsigned short significand[4];
0197     unsigned short exponent;
0198 };
0199 
0200 struct _vki_fpxreg {
0201     unsigned short significand[4];
0202     unsigned short exponent;
0203     unsigned short padding[3];
0204 };
0205 
0206 struct _vki_xmmreg {
0207     unsigned long element[4];
0208 };
0209 
0210 struct _vki_fpstate {
0211     /* Regular FPU environment */
0212     unsigned long   cw;
0213     unsigned long   sw;
0214     unsigned long   tag;
0215     unsigned long   ipoff;
0216     unsigned long   cssel;
0217     unsigned long   dataoff;
0218     unsigned long   datasel;
0219     struct _vki_fpreg   _st[8];
0220     unsigned short  status;
0221     unsigned short  magic;      /* 0xffff = regular FPU data only */
0222 
0223     /* FXSR FPU environment */
0224     unsigned long   _fxsr_env[6];   /* FXSR FPU env is ignored */
0225     unsigned long   mxcsr;
0226     unsigned long   reserved;
0227     struct _vki_fpxreg  _fxsr_st[8];    /* FXSR FPU reg data is ignored */
0228     struct _vki_xmmreg  _xmm[8];
0229     unsigned long   padding[56];
0230 };
0231 
0232 struct vki_sigcontext {
0233     unsigned short gs, __gsh;
0234     unsigned short fs, __fsh;
0235     unsigned short es, __esh;
0236     unsigned short ds, __dsh;
0237     unsigned long edi;
0238     unsigned long esi;
0239     unsigned long ebp;
0240     unsigned long esp;
0241     unsigned long ebx;
0242     unsigned long edx;
0243     unsigned long ecx;
0244     unsigned long eax;
0245     unsigned long trapno;
0246     unsigned long err;
0247     unsigned long eip;
0248     unsigned short cs, __csh;
0249     unsigned long eflags;
0250     unsigned long esp_at_signal;
0251     unsigned short ss, __ssh;
0252     struct _vki_fpstate __user * fpstate;
0253     unsigned long oldmask;
0254     unsigned long cr2;
0255 };
0256 
0257 //----------------------------------------------------------------------
0258 // From linux-2.6.8.1/include/asm-i386/mman.h
0259 //----------------------------------------------------------------------
0260 
0261 #define VKI_PROT_NONE   0x0     /* No page permissions */
0262 #define VKI_PROT_READ   0x1     /* page can be read */
0263 #define VKI_PROT_WRITE  0x2     /* page can be written */
0264 #define VKI_PROT_EXEC   0x4     /* page can be executed */
0265 #define VKI_PROT_GROWSDOWN  0x01000000  /* mprotect flag: extend change to start of growsdown vma */
0266 #define VKI_PROT_GROWSUP    0x02000000  /* mprotect flag: extend change to end of growsup vma */
0267 
0268 #define VKI_MAP_SHARED  0x01        /* Share changes */
0269 #define VKI_MAP_PRIVATE 0x02        /* Changes are private */
0270 //#define VKI_MAP_TYPE  0x0f        /* Mask for type of mapping */
0271 #define VKI_MAP_FIXED   0x10        /* Interpret addr exactly */
0272 #define VKI_MAP_ANONYMOUS   0x20    /* don't use a file */
0273 #define VKI_MAP_NORESERVE   0x4000      /* don't check for reservations */
0274 
0275 //----------------------------------------------------------------------
0276 // From linux-2.6.8.1/include/asm-i386/fcntl.h
0277 //----------------------------------------------------------------------
0278 
0279 #define VKI_O_ACCMODE        03
0280 #define VKI_O_RDONLY         00
0281 #define VKI_O_WRONLY         01
0282 #define VKI_O_RDWR       02
0283 #define VKI_O_CREAT    0100 /* not fcntl */
0284 #define VKI_O_EXCL     0200 /* not fcntl */
0285 #define VKI_O_TRUNC   01000 /* not fcntl */
0286 #define VKI_O_APPEND      02000
0287 #define VKI_O_NONBLOCK    04000
0288 #define VKI_O_DIRECT     040000
0289 #define VKI_O_LARGEFILE 0100000
0290 
0291 #define VKI_AT_FDCWD            -100
0292 
0293 #define VKI_F_DUPFD     0   /* dup */
0294 #define VKI_F_GETFD     1   /* get close_on_exec */
0295 #define VKI_F_SETFD     2   /* set/clear close_on_exec */
0296 #define VKI_F_GETFL     3   /* get file->f_flags */
0297 #define VKI_F_SETFL     4   /* set file->f_flags */
0298 #define VKI_F_GETLK     5
0299 #define VKI_F_SETLK     6
0300 #define VKI_F_SETLKW        7
0301 
0302 #define VKI_F_SETOWN        8   /*  for sockets. */
0303 #define VKI_F_GETOWN        9   /*  for sockets. */
0304 #define VKI_F_SETSIG        10  /*  for sockets. */
0305 #define VKI_F_GETSIG        11  /*  for sockets. */
0306 
0307 #define VKI_F_GETLK64       12  /*  using 'struct flock64' */
0308 #define VKI_F_SETLK64       13
0309 #define VKI_F_SETLKW64      14
0310 
0311 #define VKI_F_SETOWN_EX     15
0312 #define VKI_F_GETOWN_EX     16
0313 
0314 #define VKI_F_OFD_GETLK     36
0315 #define VKI_F_OFD_SETLK     37
0316 #define VKI_F_OFD_SETLKW    38
0317 
0318 #define VKI_F_OWNER_TID     0
0319 #define VKI_F_OWNER_PID     1
0320 #define VKI_F_OWNER_PGRP    2
0321 
0322 struct vki_f_owner_ex {
0323     int type;
0324     __vki_kernel_pid_t  pid;
0325 };
0326 
0327 /* for F_[GET|SET]FL */
0328 #define VKI_FD_CLOEXEC  1   /* actually anything with low bit set goes */
0329 
0330 #define VKI_F_LINUX_SPECIFIC_BASE   1024
0331 
0332 //----------------------------------------------------------------------
0333 // From linux-2.6.8.1/include/asm-i386/resource.h
0334 //----------------------------------------------------------------------
0335 
0336 #define VKI_RLIMIT_DATA     2   /* max data size */
0337 #define VKI_RLIMIT_STACK    3   /* max stack size */
0338 #define VKI_RLIMIT_CORE     4   /* max core file size */
0339 #define VKI_RLIMIT_NOFILE   7   /* max number of open files */
0340 
0341 //----------------------------------------------------------------------
0342 // From linux-2.6.8.1/include/asm-i386/socket.h
0343 //----------------------------------------------------------------------
0344 
0345 #define VKI_SOL_SOCKET  1
0346 
0347 #define VKI_SO_TYPE 3
0348 
0349 #define VKI_SO_ATTACH_FILTER    26
0350 
0351 //----------------------------------------------------------------------
0352 // From linux-2.6.8.1/include/asm-i386/sockios.h
0353 //----------------------------------------------------------------------
0354 
0355 #define VKI_SIOCSPGRP       0x8902
0356 #define VKI_SIOCGPGRP       0x8904
0357 #define VKI_SIOCATMARK      0x8905
0358 #define VKI_SIOCGSTAMP      0x8906      /* Get stamp (timeval) */
0359 #define VKI_SIOCGSTAMPNS    0x8907      /* Get stamp (timespec) */
0360 
0361 //----------------------------------------------------------------------
0362 // From linux-2.6.8.1/include/asm-i386/stat.h
0363 //----------------------------------------------------------------------
0364 
0365 struct vki_stat {
0366     unsigned long  st_dev;
0367     unsigned long  st_ino;
0368     unsigned short st_mode;
0369     unsigned short st_nlink;
0370     unsigned short st_uid;
0371     unsigned short st_gid;
0372     unsigned long  st_rdev;
0373     unsigned long  st_size;
0374     unsigned long  st_blksize;
0375     unsigned long  st_blocks;
0376     unsigned long  st_atime;
0377     unsigned long  st_atime_nsec;
0378     unsigned long  st_mtime;
0379     unsigned long  st_mtime_nsec;
0380     unsigned long  st_ctime;
0381     unsigned long  st_ctime_nsec;
0382     unsigned long  __unused4;
0383     unsigned long  __unused5;
0384 };
0385 
0386 struct vki_stat64 {
0387     unsigned long long  st_dev;
0388     unsigned char   __pad0[4];
0389 
0390 #define STAT64_HAS_BROKEN_ST_INO    1
0391     unsigned long   __st_ino;
0392 
0393     unsigned int    st_mode;
0394     unsigned int    st_nlink;
0395 
0396     unsigned long   st_uid;
0397     unsigned long   st_gid;
0398 
0399     unsigned long long  st_rdev;
0400     unsigned char   __pad3[4];
0401 
0402     long long   st_size;
0403     unsigned long   st_blksize;
0404 
0405     unsigned long   st_blocks;  /* Number 512-byte blocks allocated. */
0406     unsigned long   __pad4;     /* future possible st_blocks high bits */
0407 
0408     unsigned long   st_atime;
0409     unsigned long   st_atime_nsec;
0410 
0411     unsigned long   st_mtime;
0412     unsigned int    st_mtime_nsec;
0413 
0414     unsigned long   st_ctime;
0415     unsigned long   st_ctime_nsec;
0416 
0417     unsigned long long  st_ino;
0418 };
0419 
0420 //----------------------------------------------------------------------
0421 // From linux-2.6.8.1/include/asm-i386/statfs.h
0422 //----------------------------------------------------------------------
0423 
0424 // [[Nb: asm-i386/statfs.h just #include asm-generic/statfs.h directly]]
0425 struct vki_statfs {
0426     __vki_u32 f_type;
0427     __vki_u32 f_bsize;
0428     __vki_u32 f_blocks;
0429     __vki_u32 f_bfree;
0430     __vki_u32 f_bavail;
0431     __vki_u32 f_files;
0432     __vki_u32 f_ffree;
0433     __vki_kernel_fsid_t f_fsid;
0434     __vki_u32 f_namelen;
0435     __vki_u32 f_frsize;
0436     __vki_u32 f_spare[5];
0437 };
0438 
0439 //----------------------------------------------------------------------
0440 // From linux-2.6.8.1/include/asm-i386/termios.h
0441 //----------------------------------------------------------------------
0442 
0443 struct vki_winsize {
0444     unsigned short ws_row;
0445     unsigned short ws_col;
0446     unsigned short ws_xpixel;
0447     unsigned short ws_ypixel;
0448 };
0449 
0450 #define VKI_NCC 8
0451 struct vki_termio {
0452     unsigned short c_iflag;     /* input mode flags */
0453     unsigned short c_oflag;     /* output mode flags */
0454     unsigned short c_cflag;     /* control mode flags */
0455     unsigned short c_lflag;     /* local mode flags */
0456     unsigned char c_line;       /* line discipline */
0457     unsigned char c_cc[VKI_NCC];    /* control characters */
0458 };
0459 
0460 
0461 //----------------------------------------------------------------------
0462 // From linux-2.6.8.1/include/asm-i386/termbits.h
0463 //----------------------------------------------------------------------
0464 
0465 typedef unsigned char   vki_cc_t;
0466 typedef unsigned int    vki_tcflag_t;
0467 
0468 #define VKI_NCCS 19
0469 struct vki_termios {
0470     vki_tcflag_t c_iflag;       /* input mode flags */
0471     vki_tcflag_t c_oflag;       /* output mode flags */
0472     vki_tcflag_t c_cflag;       /* control mode flags */
0473     vki_tcflag_t c_lflag;       /* local mode flags */
0474     vki_cc_t c_line;        /* line discipline */
0475     vki_cc_t c_cc[VKI_NCCS];    /* control characters */
0476 };
0477 
0478 //----------------------------------------------------------------------
0479 // From linux-2.6.8.1/include/asm-i386/ioctl.h
0480 //----------------------------------------------------------------------
0481 
0482 #define _VKI_IOC_NRBITS     8
0483 #define _VKI_IOC_TYPEBITS   8
0484 #define _VKI_IOC_SIZEBITS   14
0485 #define _VKI_IOC_DIRBITS    2
0486 
0487 #define _VKI_IOC_NRMASK     ((1 << _VKI_IOC_NRBITS)-1)
0488 #define _VKI_IOC_TYPEMASK   ((1 << _VKI_IOC_TYPEBITS)-1)
0489 #define _VKI_IOC_SIZEMASK   ((1 << _VKI_IOC_SIZEBITS)-1)
0490 #define _VKI_IOC_DIRMASK    ((1 << _VKI_IOC_DIRBITS)-1)
0491 
0492 #define _VKI_IOC_NRSHIFT    0
0493 #define _VKI_IOC_TYPESHIFT  (_VKI_IOC_NRSHIFT+_VKI_IOC_NRBITS)
0494 #define _VKI_IOC_SIZESHIFT  (_VKI_IOC_TYPESHIFT+_VKI_IOC_TYPEBITS)
0495 #define _VKI_IOC_DIRSHIFT   (_VKI_IOC_SIZESHIFT+_VKI_IOC_SIZEBITS)
0496 
0497 #define _VKI_IOC_NONE   0U
0498 #define _VKI_IOC_WRITE  1U
0499 #define _VKI_IOC_READ   2U
0500 
0501 #define _VKI_IOC(dir,type,nr,size) \
0502     (((dir)  << _VKI_IOC_DIRSHIFT) | \
0503      ((type) << _VKI_IOC_TYPESHIFT) | \
0504      ((nr)   << _VKI_IOC_NRSHIFT) | \
0505      ((size) << _VKI_IOC_SIZESHIFT))
0506 
0507 /* used to create numbers */
0508 #define _VKI_IO(type,nr)    _VKI_IOC(_VKI_IOC_NONE,(type),(nr),0)
0509 #define _VKI_IOR(type,nr,size)  _VKI_IOC(_VKI_IOC_READ,(type),(nr),(_VKI_IOC_TYPECHECK(size)))
0510 #define _VKI_IOW(type,nr,size)  _VKI_IOC(_VKI_IOC_WRITE,(type),(nr),(_VKI_IOC_TYPECHECK(size)))
0511 #define _VKI_IOWR(type,nr,size) _VKI_IOC(_VKI_IOC_READ|_VKI_IOC_WRITE,(type),(nr),(_VKI_IOC_TYPECHECK(size)))
0512 
0513 /* used to decode ioctl numbers.. */
0514 #define _VKI_IOC_DIR(nr)    (((nr) >> _VKI_IOC_DIRSHIFT) & _VKI_IOC_DIRMASK)
0515 #define _VKI_IOC_TYPE(nr)   (((nr) >> _VKI_IOC_TYPESHIFT) & _VKI_IOC_TYPEMASK)
0516 #define _VKI_IOC_NR(nr)     (((nr) >> _VKI_IOC_NRSHIFT) & _VKI_IOC_NRMASK)
0517 #define _VKI_IOC_SIZE(nr)   (((nr) >> _VKI_IOC_SIZESHIFT) & _VKI_IOC_SIZEMASK)
0518 
0519 //----------------------------------------------------------------------
0520 // From linux-2.6.8.1/include/asm-i386/ioctls.h
0521 //----------------------------------------------------------------------
0522 
0523 #define VKI_TCGETS  0x5401
0524 #define VKI_TCSETS  0x5402 /* Clashes with SNDCTL_TMR_START sound ioctl */
0525 #define VKI_TCSETSW 0x5403
0526 #define VKI_TCSETSF 0x5404
0527 #define VKI_TCGETA  0x5405
0528 #define VKI_TCSETA  0x5406
0529 #define VKI_TCSETAW 0x5407
0530 #define VKI_TCSETAF 0x5408
0531 #define VKI_TCSBRK  0x5409
0532 #define VKI_TCXONC  0x540A
0533 #define VKI_TCFLSH  0x540B
0534 #define VKI_TIOCSCTTY   0x540E
0535 #define VKI_TIOCGPGRP   0x540F
0536 #define VKI_TIOCSPGRP   0x5410
0537 #define VKI_TIOCOUTQ    0x5411
0538 #define VKI_TIOCGWINSZ  0x5413
0539 #define VKI_TIOCSWINSZ  0x5414
0540 #define VKI_TIOCMGET    0x5415
0541 #define VKI_TIOCMBIS    0x5416
0542 #define VKI_TIOCMBIC    0x5417
0543 #define VKI_TIOCMSET    0x5418
0544 #define VKI_FIONREAD    0x541B
0545 #define VKI_TIOCLINUX   0x541C
0546 #define VKI_FIONBIO 0x5421
0547 #define VKI_TIOCNOTTY   0x5422
0548 #define VKI_TCSBRKP 0x5425  /* Needed for POSIX tcsendbreak() */
0549 #define VKI_TIOCGPTN    _VKI_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
0550 #define VKI_TIOCSPTLCK  _VKI_IOW('T',0x31, int)  /* Lock/unlock Pty */
0551 
0552 #define VKI_FIONCLEX    0x5450
0553 #define VKI_FIOCLEX     0x5451
0554 #define VKI_FIOASYNC    0x5452
0555 #define VKI_TIOCSERGETLSR   0x5459 /* Get line status register */
0556 
0557 #define VKI_TIOCGICOUNT 0x545D  /* read serial port inline interrupt counts */
0558 
0559 //----------------------------------------------------------------------
0560 // From linux-2.6.8.1/include/asm-i386/poll.h
0561 //----------------------------------------------------------------------
0562 
0563 /* These are specified by iBCS2 */
0564 #define VKI_POLLIN      0x0001
0565 
0566 struct vki_pollfd {
0567     int fd;
0568     short events;
0569     short revents;
0570 };
0571 
0572 //----------------------------------------------------------------------
0573 // From linux-2.6.8.1/include/asm-i386/user.h
0574 //----------------------------------------------------------------------
0575 
0576 struct vki_user_i387_struct {
0577     long    cwd;
0578     long    swd;
0579     long    twd;
0580     long    fip;
0581     long    fcs;
0582     long    foo;
0583     long    fos;
0584     long    st_space[20];   /* 8*10 bytes for each FP-reg = 80 bytes */
0585 };
0586 
0587 struct vki_user_fxsr_struct {
0588     unsigned short  cwd;
0589     unsigned short  swd;
0590     unsigned short  twd;
0591     unsigned short  fop;
0592     long    fip;
0593     long    fcs;
0594     long    foo;
0595     long    fos;
0596     long    mxcsr;
0597     long    reserved;
0598     long    st_space[32];   /* 8*16 bytes for each FP-reg = 128 bytes */
0599     long    xmm_space[32];  /* 8*16 bytes for each XMM-reg = 128 bytes */
0600     long    padding[56];
0601 };
0602 
0603 /*
0604  * This is the old layout of "struct pt_regs", and
0605  * is still the layout used by user mode (the new
0606  * pt_regs doesn't have all registers as the kernel
0607  * doesn't use the extra segment registers)
0608  */
0609 struct vki_user_regs_struct {
0610     long ebx, ecx, edx, esi, edi, ebp, eax;
0611     unsigned short ds, __ds, es, __es;
0612     unsigned short fs, __fs, gs, __gs;
0613     long orig_eax, eip;
0614     unsigned short cs, __cs;
0615     long eflags, esp;
0616     unsigned short ss, __ss;
0617 };
0618 
0619 //----------------------------------------------------------------------
0620 // From linux-2.6.8.1/include/asm-i386/elf.h
0621 //----------------------------------------------------------------------
0622 
0623 typedef unsigned long vki_elf_greg_t;
0624 
0625 #define VKI_ELF_NGREG (sizeof (struct vki_user_regs_struct) / sizeof(vki_elf_greg_t))
0626 typedef vki_elf_greg_t vki_elf_gregset_t[VKI_ELF_NGREG];
0627 
0628 typedef struct vki_user_i387_struct vki_elf_fpregset_t;
0629 typedef struct vki_user_fxsr_struct vki_elf_fpxregset_t;
0630 
0631 #define VKI_AT_SYSINFO      32
0632 
0633 //----------------------------------------------------------------------
0634 // From linux-2.6.8.1/include/asm-i386/ucontext.h
0635 //----------------------------------------------------------------------
0636 
0637 struct vki_ucontext {
0638     unsigned long       uc_flags;
0639     struct vki_ucontext    *uc_link;
0640     vki_stack_t     uc_stack;
0641     struct vki_sigcontext   uc_mcontext;
0642     vki_sigset_t        uc_sigmask; /* mask last for extensibility */
0643 };
0644 
0645 //----------------------------------------------------------------------
0646 // From linux-2.6.8.1/include/asm-i386/segment.h
0647 //----------------------------------------------------------------------
0648 
0649 #define VKI_GDT_ENTRY_TLS_ENTRIES   3
0650 #define VKI_GDT_ENTRY_TLS_MIN   6
0651 #define VKI_GDT_ENTRY_TLS_MAX   (VKI_GDT_ENTRY_TLS_MIN + VKI_GDT_ENTRY_TLS_ENTRIES - 1)
0652 
0653 //----------------------------------------------------------------------
0654 // From linux-2.6.8.1/include/asm-i386/ldt.h
0655 //----------------------------------------------------------------------
0656 
0657 /* [[Nb: This is the structure passed to the modify_ldt syscall.  Just so as
0658    to confuse and annoy everyone, this is _not_ the same as an
0659    VgLdtEntry and has to be translated into such.  The logic for doing
0660    so, in vg_ldt.c, is copied from the kernel sources.]] */
0661 struct vki_user_desc {
0662     unsigned int  entry_number;
0663     unsigned long base_addr;
0664     unsigned int  limit;
0665     unsigned int  seg_32bit:1;
0666     unsigned int  contents:2;
0667     unsigned int  read_exec_only:1;
0668     unsigned int  limit_in_pages:1;
0669     unsigned int  seg_not_present:1;
0670     unsigned int  useable:1;
0671         // [[Nb: this field is not in the kernel sources, but it has always
0672         // been in the Valgrind sources so I will keep it there in case it's
0673         // important... this is an x86-defined data structure so who
0674         // knows;  maybe it's important to set this field to zero at some
0675         // point.  --njn]]
0676     unsigned int  reserved:25;
0677 };
0678 
0679 // [[Nb: for our convenience within Valgrind, use a more specific name]]
0680 typedef struct vki_user_desc vki_modify_ldt_t;
0681 
0682 //----------------------------------------------------------------------
0683 // From linux-2.6.8.1/include/asm-i386/ipcbuf.h
0684 //----------------------------------------------------------------------
0685 
0686 struct vki_ipc64_perm
0687 {
0688     __vki_kernel_key_t  key;
0689     __vki_kernel_uid32_t    uid;
0690     __vki_kernel_gid32_t    gid;
0691     __vki_kernel_uid32_t    cuid;
0692     __vki_kernel_gid32_t    cgid;
0693     __vki_kernel_mode_t mode;
0694     unsigned short      __pad1;
0695     unsigned short      seq;
0696     unsigned short      __pad2;
0697     unsigned long       __unused1;
0698     unsigned long       __unused2;
0699 };
0700 
0701 //----------------------------------------------------------------------
0702 // From linux-2.6.8.1/include/asm-i386/sembuf.h
0703 //----------------------------------------------------------------------
0704 
0705 struct vki_semid64_ds {
0706     struct vki_ipc64_perm sem_perm;     /* permissions .. see ipc.h */
0707     __vki_kernel_time_t sem_otime;      /* last semop time */
0708     unsigned long   __unused1;
0709     __vki_kernel_time_t sem_ctime;      /* last change time */
0710     unsigned long   __unused2;
0711     unsigned long   sem_nsems;      /* no. of semaphores in array */
0712     unsigned long   __unused3;
0713     unsigned long   __unused4;
0714 };
0715 
0716 //----------------------------------------------------------------------
0717 // From linux-2.6.8.1/include/asm-i386/msgbuf.h
0718 //----------------------------------------------------------------------
0719 
0720 struct vki_msqid64_ds {
0721     struct vki_ipc64_perm msg_perm;
0722     __vki_kernel_time_t msg_stime;  /* last msgsnd time */
0723     unsigned long   __unused1;
0724     __vki_kernel_time_t msg_rtime;  /* last msgrcv time */
0725     unsigned long   __unused2;
0726     __vki_kernel_time_t msg_ctime;  /* last change time */
0727     unsigned long   __unused3;
0728     unsigned long  msg_cbytes;  /* current number of bytes on queue */
0729     unsigned long  msg_qnum;    /* number of messages in queue */
0730     unsigned long  msg_qbytes;  /* max number of bytes on queue */
0731     __vki_kernel_pid_t msg_lspid;   /* pid of last msgsnd */
0732     __vki_kernel_pid_t msg_lrpid;   /* last receive pid */
0733     unsigned long  __unused4;
0734     unsigned long  __unused5;
0735 };
0736 
0737 //----------------------------------------------------------------------
0738 // From linux-2.6.8.1/include/asm-i386/ipc.h
0739 //----------------------------------------------------------------------
0740 
0741 struct vki_ipc_kludge {
0742     struct vki_msgbuf __user *msgp;
0743     long msgtyp;
0744 };
0745 
0746 #define VKI_SEMOP        1
0747 #define VKI_SEMGET       2
0748 #define VKI_SEMCTL       3
0749 #define VKI_SEMTIMEDOP       4
0750 #define VKI_MSGSND      11
0751 #define VKI_MSGRCV      12
0752 #define VKI_MSGGET      13
0753 #define VKI_MSGCTL      14
0754 #define VKI_SHMAT       21
0755 #define VKI_SHMDT       22
0756 #define VKI_SHMGET      23
0757 #define VKI_SHMCTL      24
0758 
0759 
0760 //----------------------------------------------------------------------
0761 // From linux-2.6.8.1/include/asm-i386/shmbuf.h
0762 //----------------------------------------------------------------------
0763 
0764 struct vki_shmid64_ds {
0765     struct vki_ipc64_perm   shm_perm;   /* operation perms */
0766     vki_size_t      shm_segsz;  /* size of segment (bytes) */
0767     __vki_kernel_time_t shm_atime;  /* last attach time */
0768     unsigned long       __unused1;
0769     __vki_kernel_time_t shm_dtime;  /* last detach time */
0770     unsigned long       __unused2;
0771     __vki_kernel_time_t shm_ctime;  /* last change time */
0772     unsigned long       __unused3;
0773     __vki_kernel_pid_t  shm_cpid;   /* pid of creator */
0774     __vki_kernel_pid_t  shm_lpid;   /* pid of last operator */
0775     unsigned long       shm_nattch; /* no. of current attaches */
0776     unsigned long       __unused4;
0777     unsigned long       __unused5;
0778 };
0779 
0780 struct vki_shminfo64 {
0781     unsigned long   shmmax;
0782     unsigned long   shmmin;
0783     unsigned long   shmmni;
0784     unsigned long   shmseg;
0785     unsigned long   shmall;
0786     unsigned long   __unused1;
0787     unsigned long   __unused2;
0788     unsigned long   __unused3;
0789     unsigned long   __unused4;
0790 };
0791 
0792 //----------------------------------------------------------------------
0793 // DRM ioctls
0794 //----------------------------------------------------------------------
0795 
0796 // jrs 20050207: where did all this stuff come from?  Is it really
0797 // i386 specific, or should it go into the linux-generic category?
0798 //struct vki_drm_buf_pub {
0799 //  Int       idx;         /**< Index into the master buffer list */
0800 //  Int       total;       /**< Buffer size */
0801 //  Int       used;        /**< Amount of buffer in use (for DMA) */
0802 //  void      __user *address;     /**< Address of buffer */
0803 //};
0804 //
0805 //struct vki_drm_buf_map {
0806 //  Int       count;        /**< Length of the buffer list */
0807 //  void          __user *virtual;  /**< Mmap'd area in user-virtual */
0808 //  struct vki_drm_buf_pub __user *list;    /**< Buffer information */
0809 //};
0810 //
0811 ///* We need to pay attention to this, because it mmaps memory */
0812 //#define VKI_DRM_IOCTL_MAP_BUFS        _VKI_IOWR('d', 0x19, struct vki_drm_buf_map)
0813 
0814 //----------------------------------------------------------------------
0815 // From linux-2.6.9/include/asm-i386/ptrace.h
0816 //----------------------------------------------------------------------
0817 
0818 #define VKI_PTRACE_GETREGS            12
0819 #define VKI_PTRACE_SETREGS            13
0820 #define VKI_PTRACE_GETFPREGS          14
0821 #define VKI_PTRACE_SETFPREGS          15
0822 #define VKI_PTRACE_GETFPXREGS         18
0823 #define VKI_PTRACE_SETFPXREGS         19
0824 #define VKI_PTRACE_GET_THREAD_AREA    25
0825 #define VKI_PTRACE_SET_THREAD_AREA    26
0826 
0827 //----------------------------------------------------------------------
0828 // From linux-2.6.15.4/include/asm-i386/vm86.h
0829 //----------------------------------------------------------------------
0830 
0831 #define VKI_VM86_PLUS_INSTALL_CHECK 0
0832 #define VKI_VM86_ENTER          1
0833 #define VKI_VM86_ENTER_NO_BYPASS    2
0834 #define VKI_VM86_REQUEST_IRQ        3
0835 #define VKI_VM86_FREE_IRQ       4
0836 #define VKI_VM86_GET_IRQ_BITS       5
0837 #define VKI_VM86_GET_AND_RESET_IRQ  6
0838 
0839 struct vki_vm86_regs {
0840 /*
0841  * normal regs, with special meaning for the segment descriptors..
0842  */
0843     long ebx;
0844     long ecx;
0845     long edx;
0846     long esi;
0847     long edi;
0848     long ebp;
0849     long eax;
0850     long __null_ds;
0851     long __null_es;
0852     long __null_fs;
0853     long __null_gs;
0854     long orig_eax;
0855     long eip;
0856     unsigned short cs, __csh;
0857     long eflags;
0858     long esp;
0859     unsigned short ss, __ssh;
0860 /*
0861  * these are specific to v86 mode:
0862  */
0863     unsigned short es, __esh;
0864     unsigned short ds, __dsh;
0865     unsigned short fs, __fsh;
0866     unsigned short gs, __gsh;
0867 };
0868 
0869 struct vki_revectored_struct {
0870     unsigned long __map[8];         /* 256 bits */
0871 };
0872 
0873 struct vki_vm86_struct {
0874     struct vki_vm86_regs regs;
0875     unsigned long flags;
0876     unsigned long screen_bitmap;
0877     unsigned long cpu_type;
0878     struct vki_revectored_struct int_revectored;
0879     struct vki_revectored_struct int21_revectored;
0880 };
0881 
0882 struct vki_vm86plus_info_struct {
0883     unsigned long force_return_for_pic:1;
0884     unsigned long vm86dbg_active:1;       /* for debugger */
0885     unsigned long vm86dbg_TFpendig:1;     /* for debugger */
0886     unsigned long unused:28;
0887     unsigned long is_vm86pus:1;       /* for vm86 internal use */
0888     unsigned char vm86dbg_intxxtab[32];   /* for debugger */
0889 };
0890 
0891 struct vki_vm86plus_struct {
0892     struct vki_vm86_regs regs;
0893     unsigned long flags;
0894     unsigned long screen_bitmap;
0895     unsigned long cpu_type;
0896     struct vki_revectored_struct int_revectored;
0897     struct vki_revectored_struct int21_revectored;
0898     struct vki_vm86plus_info_struct vm86plus;
0899 };
0900 
0901 //----------------------------------------------------------------------
0902 // From linux-2.6.8.1/include/asm-generic/errno.h
0903 //----------------------------------------------------------------------
0904 
0905 #define VKI_ENOSYS       38  /* Function not implemented */
0906 #define VKI_EOVERFLOW    75  /* Value too large for defined data type */
0907 
0908 //----------------------------------------------------------------------
0909 // From linux-3.19.0/include/uapi/asm-generic/ioctls.h
0910 //----------------------------------------------------------------------
0911 
0912 #define VKI_TIOCGSERIAL     0x541E
0913 #define VKI_TIOCSSERIAL     0x541F
0914 
0915 //----------------------------------------------------------------------
0916 // And that's it!
0917 //----------------------------------------------------------------------
0918 
0919 #endif // __VKI_X86_LINUX_H
0920 
0921 /*--------------------------------------------------------------------*/
0922 /*--- end                                                          ---*/
0923 /*--------------------------------------------------------------------*/