Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-03-13 09:28:37

0001 
0002 /*--------------------------------------------------------------------*/
0003 /*--- PPC32/Linux-specific kernel interface.     vki-ppc32-linux.h ---*/
0004 /*--------------------------------------------------------------------*/
0005 
0006 /*
0007    This file is part of Valgrind, a dynamic binary instrumentation
0008    framework.
0009 
0010    Copyright (C) 2005-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_PPC32_LINUX_H
0030 #define __VKI_PPC32_LINUX_H
0031 
0032 // ppc32 is big-endian.
0033 #define VKI_BIG_ENDIAN  1
0034 
0035 //----------------------------------------------------------------------
0036 // From linux-2.6.9/include/asm-ppc/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 typedef struct {
0055         __vki_u32 u[4];
0056 } __vki_vector128;
0057 
0058 //----------------------------------------------------------------------
0059 // From linux-2.6.9/include/asm-ppc/page.h
0060 //----------------------------------------------------------------------
0061 
0062 /* PAGE_SHIFT determines the page size, unfortunately
0063    page size might vary between 32-bit and 64-bit ppc kernels */
0064 extern UWord VKI_PAGE_SHIFT;
0065 extern UWord VKI_PAGE_SIZE;
0066 #define VKI_MAX_PAGE_SHIFT  16
0067 #define VKI_MAX_PAGE_SIZE   (1UL << VKI_MAX_PAGE_SHIFT)
0068 
0069 //----------------------------------------------------------------------
0070 // From linux-2.6.35.4/arch/powerpc/include/asm/shmparam.h
0071 //----------------------------------------------------------------------
0072 
0073 #define VKI_SHMLBA  VKI_PAGE_SIZE
0074 
0075 //----------------------------------------------------------------------
0076 // From linux-2.6.9/include/asm-ppc/signal.h
0077 //----------------------------------------------------------------------
0078 
0079 #define VKI_MINSIGSTKSZ 2048
0080 
0081 #define VKI_SIG_BLOCK         0    /* for blocking signals */
0082 #define VKI_SIG_UNBLOCK       1    /* for unblocking signals */
0083 #define VKI_SIG_SETMASK       2    /* for setting the signal mask */
0084 
0085 /* Type of a signal handler.  */
0086 typedef void __vki_signalfn_t(int);
0087 typedef __vki_signalfn_t __user *__vki_sighandler_t;
0088 
0089 typedef void __vki_restorefn_t(void);
0090 typedef __vki_restorefn_t __user *__vki_sigrestore_t;
0091 
0092 #define VKI_SIG_DFL     ((__vki_sighandler_t)0)     /* default signal handling */
0093 #define VKI_SIG_IGN     ((__vki_sighandler_t)1)     /* ignore signal */
0094 
0095 #define _VKI_NSIG       64
0096 #define _VKI_NSIG_BPW   32
0097 #define _VKI_NSIG_WORDS (_VKI_NSIG / _VKI_NSIG_BPW)
0098 
0099 typedef unsigned long vki_old_sigset_t;     /* at least 32 bits */
0100 
0101 typedef struct {
0102         unsigned long sig[_VKI_NSIG_WORDS];
0103 } vki_sigset_t;
0104 
0105 #define VKI_SIGHUP       1
0106 #define VKI_SIGINT       2
0107 #define VKI_SIGQUIT      3
0108 #define VKI_SIGILL       4
0109 #define VKI_SIGTRAP      5
0110 #define VKI_SIGABRT      6
0111 //#define VKI_SIGIOT         6
0112 #define VKI_SIGBUS       7
0113 #define VKI_SIGFPE       8
0114 #define VKI_SIGKILL      9
0115 #define VKI_SIGUSR1     10
0116 #define VKI_SIGSEGV     11
0117 #define VKI_SIGUSR2     12
0118 #define VKI_SIGPIPE     13
0119 #define VKI_SIGALRM     14
0120 #define VKI_SIGTERM     15
0121 #define VKI_SIGSTKFLT       16
0122 #define VKI_SIGCHLD     17
0123 #define VKI_SIGCONT     18
0124 #define VKI_SIGSTOP     19
0125 #define VKI_SIGTSTP     20
0126 #define VKI_SIGTTIN     21
0127 #define VKI_SIGTTOU     22
0128 #define VKI_SIGURG      23
0129 #define VKI_SIGXCPU     24
0130 #define VKI_SIGXFSZ     25
0131 #define VKI_SIGVTALRM       26
0132 #define VKI_SIGPROF     27
0133 #define VKI_SIGWINCH        28
0134 #define VKI_SIGIO       29
0135 #define VKI_SIGPWR      30
0136 #define VKI_SIGSYS      31
0137 #define VKI_SIGUNUSED       31
0138 
0139 /* These should not be considered constants from userland.  */
0140 #define VKI_SIGRTMIN    32
0141 // [[This was (_NSIG-1) in 2.4.X... not sure if it matters.]]
0142 #define VKI_SIGRTMAX    _VKI_NSIG
0143 
0144 #define VKI_SA_NOCLDSTOP    0x00000001
0145 #define VKI_SA_NOCLDWAIT    0x00000002
0146 #define VKI_SA_SIGINFO      0x00000004
0147 #define VKI_SA_ONSTACK      0x08000000
0148 #define VKI_SA_RESTART      0x10000000
0149 #define VKI_SA_NODEFER      0x40000000
0150 #define VKI_SA_RESETHAND    0x80000000
0151 
0152 #define VKI_SA_NOMASK       VKI_SA_NODEFER
0153 #define VKI_SA_ONESHOT      VKI_SA_RESETHAND
0154 //#define VKI_SA_INTERRUPT  0x20000000 /* dummy -- ignored */
0155 
0156 #define VKI_SA_RESTORER     0x04000000
0157 
0158 #define VKI_SS_ONSTACK      1
0159 #define VKI_SS_DISABLE      2
0160 
0161 /* These are 'legacy' sigactions in which the size of sa_mask is fixed
0162    (cannot be expanded at any future point) because it is sandwiched
0163    between two other fields.
0164    (there is identical kludgery in vki-x86-linux.h) */
0165 struct vki_old_sigaction {
0166         // [[Nb: a 'k' prefix is added to "sa_handler" because
0167         // bits/sigaction.h (which gets dragged in somehow via signal.h)
0168         // #defines it as something else.  Since that is done for glibc's
0169         // purposes, which we don't care about here, we use our own name.]]
0170         __vki_sighandler_t ksa_handler;
0171         vki_old_sigset_t sa_mask;
0172         unsigned long sa_flags;
0173         __vki_sigrestore_t sa_restorer;
0174 };
0175 
0176 struct vki_sigaction_base {
0177         // [[See comment about extra 'k' above]]
0178     __vki_sighandler_t ksa_handler;
0179     unsigned long sa_flags;
0180     __vki_sigrestore_t sa_restorer;
0181     vki_sigset_t sa_mask;       /* mask last for extensibility */
0182 };
0183 
0184 /* On Linux we use the same type for passing sigactions to
0185    and from the kernel.  Hence: */
0186 typedef  struct vki_sigaction_base  vki_sigaction_toK_t;
0187 typedef  struct vki_sigaction_base  vki_sigaction_fromK_t;
0188 
0189 
0190 typedef struct vki_sigaltstack {
0191     void __user *ss_sp;
0192     int ss_flags;
0193     vki_size_t ss_size;
0194 } vki_stack_t;
0195 
0196 
0197 //----------------------------------------------------------------------
0198 // From linux-2.6.9/include/asm-ppc/ptrace.h
0199 //----------------------------------------------------------------------
0200 
0201 struct vki_pt_regs {
0202         unsigned long gpr[32];
0203         unsigned long nip;
0204         unsigned long msr;
0205         unsigned long orig_gpr3;        /* Used for restarting system calls */
0206         unsigned long ctr;
0207         unsigned long link;
0208         unsigned long xer;
0209         unsigned long ccr;
0210         unsigned long mq;               /* 601 only (not used at present) */
0211                                         /* Used on APUS to hold IPL value. */
0212         unsigned long trap;             /* Reason for being here */
0213         /* N.B. for critical exceptions on 4xx, the dar and dsisr
0214            fields are overloaded to hold srr0 and srr1. */
0215         unsigned long dar;              /* Fault registers */
0216         unsigned long dsisr;            /* on 4xx/Book-E used for ESR */
0217         unsigned long result;           /* Result of a system call */
0218 
0219         /* Not in kernel's definition, but apparently needed to stop
0220            assertion at coredump-elf.c:267 firing.  These padding
0221            words make the struct have the same size as a
0222            'vki_elf_greg_t'.  See message from Ghassan Hammouri on
0223            valgrind-developers on 6 April 06. */
0224         unsigned long pad[4];
0225 };
0226 
0227 #define vki_user_regs_struct vki_pt_regs
0228 
0229 #define VKI_PT_R0       0
0230 #define VKI_PT_R1       1
0231 #define VKI_PT_R2       2
0232 #define VKI_PT_R3       3
0233 #define VKI_PT_R4       4
0234 #define VKI_PT_R5       5
0235 #define VKI_PT_R6       6
0236 #define VKI_PT_R7       7
0237 #define VKI_PT_R8       8
0238 #define VKI_PT_R9       9
0239 #define VKI_PT_R10      10
0240 #define VKI_PT_R11      11
0241 #define VKI_PT_R12      12
0242 #define VKI_PT_R13      13
0243 #define VKI_PT_R14      14
0244 #define VKI_PT_R15      15
0245 #define VKI_PT_R16      16
0246 #define VKI_PT_R17      17
0247 #define VKI_PT_R18      18
0248 #define VKI_PT_R19      19
0249 #define VKI_PT_R20      20
0250 #define VKI_PT_R21      21
0251 #define VKI_PT_R22      22
0252 #define VKI_PT_R23      23
0253 #define VKI_PT_R24      24
0254 #define VKI_PT_R25      25
0255 #define VKI_PT_R26      26
0256 #define VKI_PT_R27      27
0257 #define VKI_PT_R28      28
0258 #define VKI_PT_R29      29
0259 #define VKI_PT_R30      30
0260 #define VKI_PT_R31      31
0261 #define VKI_PT_NIP      32
0262 #define VKI_PT_MSR      33
0263 #define VKI_PT_ORIG_R3      34
0264 #define VKI_PT_CTR      35
0265 #define VKI_PT_LNK      36
0266 #define VKI_PT_XER      37
0267 #define VKI_PT_CCR      38
0268 #define VKI_PT_MQ       39
0269 #define VKI_PT_TRAP     40
0270 #define VKI_PT_DAR      41
0271 #define VKI_PT_DSISR        42
0272 #define VKI_PT_RESULT       43
0273 
0274 //----------------------------------------------------------------------
0275 // From linux-2.6.9/include/asm-ppc/sigcontext.h
0276 //----------------------------------------------------------------------
0277 
0278 struct vki_sigcontext {
0279         unsigned long      _unused[4];
0280         int                signal;
0281         unsigned long      handler;
0282         unsigned long      oldmask;
0283         struct vki_pt_regs *regs;
0284 };
0285 
0286 //----------------------------------------------------------------------
0287 // From linux-2.6.9/include/asm-ppc/mman.h
0288 //----------------------------------------------------------------------
0289 
0290 #define VKI_PROT_NONE       0x0      /* No page permissions */
0291 #define VKI_PROT_READ       0x1      /* page can be read */
0292 #define VKI_PROT_WRITE      0x2      /* page can be written */
0293 #define VKI_PROT_EXEC       0x4      /* page can be executed */
0294 #define VKI_PROT_GROWSDOWN  0x01000000  /* mprotect flag: extend change to start of growsdown vma */
0295 #define VKI_PROT_GROWSUP    0x02000000  /* mprotect flag: extend change to end of growsup vma */
0296 
0297 #define VKI_MAP_SHARED      0x01     /* Share changes */
0298 #define VKI_MAP_PRIVATE     0x02     /* Changes are private */
0299 //#define VKI_MAP_TYPE      0x0f     /* Mask for type of mapping */
0300 #define VKI_MAP_FIXED       0x10     /* Interpret addr exactly */
0301 #define VKI_MAP_ANONYMOUS   0x20     /* don't use a file */
0302 #define VKI_MAP_NORESERVE   0x40     /* don't reserve swap pages */
0303 
0304 //----------------------------------------------------------------------
0305 // From linux-2.6.9/include/asm-ppc/fcntl.h
0306 //----------------------------------------------------------------------
0307 
0308 #define VKI_O_ACCMODE          03
0309 #define VKI_O_RDONLY           00
0310 #define VKI_O_WRONLY           01
0311 #define VKI_O_RDWR         02
0312 #define VKI_O_CREAT      0100       /* not fcntl */
0313 #define VKI_O_EXCL       0200       /* not fcntl */
0314 #define VKI_O_TRUNC     01000       /* not fcntl */
0315 #define VKI_O_APPEND        02000
0316 #define VKI_O_NONBLOCK      04000
0317 #define VKI_O_LARGEFILE     0200000
0318 
0319 #define VKI_AT_FDCWD            -100
0320 
0321 #define VKI_F_DUPFD      0          /* dup */
0322 #define VKI_F_GETFD      1          /* get close_on_exec */
0323 #define VKI_F_SETFD      2          /* set/clear close_on_exec */
0324 #define VKI_F_GETFL      3          /* get file->f_flags */
0325 #define VKI_F_SETFL      4          /* set file->f_flags */
0326 #define VKI_F_GETLK      5
0327 #define VKI_F_SETLK      6
0328 #define VKI_F_SETLKW         7
0329 
0330 #define VKI_F_SETOWN         8          /*  for sockets. */
0331 #define VKI_F_GETOWN         9          /*  for sockets. */
0332 #define VKI_F_SETSIG        10          /*  for sockets. */
0333 #define VKI_F_GETSIG        11          /*  for sockets. */
0334 
0335 #define VKI_F_GETLK64       12          /*  using 'struct flock64' */
0336 #define VKI_F_SETLK64       13
0337 #define VKI_F_SETLKW64      14
0338 
0339 #define VKI_F_SETOWN_EX     15
0340 #define VKI_F_GETOWN_EX     16
0341 
0342 #define VKI_F_OFD_GETLK     36
0343 #define VKI_F_OFD_SETLK     37
0344 #define VKI_F_OFD_SETLKW    38
0345 
0346 #define VKI_F_OWNER_TID     0
0347 #define VKI_F_OWNER_PID     1
0348 #define VKI_F_OWNER_PGRP    2
0349 
0350 struct vki_f_owner_ex {
0351     int type;
0352     __vki_kernel_pid_t  pid;
0353 };
0354 
0355 /* for F_[GET|SET]FL */
0356 #define VKI_FD_CLOEXEC   1      /* actually anything with low bit set goes */
0357 
0358 #define VKI_F_LINUX_SPECIFIC_BASE   1024
0359 
0360 //----------------------------------------------------------------------
0361 // From linux-2.6.9/include/asm-ppc/resource.h
0362 //----------------------------------------------------------------------
0363 
0364 #define VKI_RLIMIT_DATA     2   /* max data size */
0365 #define VKI_RLIMIT_STACK    3   /* max stack size */
0366 #define VKI_RLIMIT_CORE     4   /* max core file size */
0367 #define VKI_RLIMIT_NOFILE   7   /* max number of open files */
0368 
0369 //----------------------------------------------------------------------
0370 // From linux-2.6.9/include/asm-ppc/socket.h
0371 //----------------------------------------------------------------------
0372 
0373 #define VKI_SOL_SOCKET  1
0374 
0375 #define VKI_SO_TYPE 3
0376 
0377 #define VKI_SO_ATTACH_FILTER    26
0378 
0379 //----------------------------------------------------------------------
0380 // From linux-2.6.8.1/include/asm-ppc/sockios.h
0381 //----------------------------------------------------------------------
0382 
0383 #define VKI_SIOCSPGRP       0x8902
0384 #define VKI_SIOCGPGRP       0x8904
0385 #define VKI_SIOCATMARK      0x8905
0386 #define VKI_SIOCGSTAMP      0x8906          /* Get stamp (timeval) */
0387 #define VKI_SIOCGSTAMPNS    0x8907          /* Get stamp (timespec) */
0388 
0389 //----------------------------------------------------------------------
0390 // From linux-2.6.10/include/asm-ppc/stat.h
0391 //----------------------------------------------------------------------
0392 
0393 //.. #define VKI_S_IFMT     00170000
0394 //.. #define VKI_S_IFSOCK    0140000
0395 //.. #define VKI_S_IFLNK     0120000
0396 //.. #define VKI_S_IFREG     0100000
0397 //.. #define VKI_S_IFBLK     0060000
0398 //.. #define VKI_S_IFDIR     0040000
0399 //.. #define VKI_S_IFCHR     0020000
0400 //.. #define VKI_S_IFIFO     0010000
0401 //.. #define VKI_S_ISUID     0004000
0402 //.. #define VKI_S_ISGID     0002000
0403 //.. #define VKI_S_ISVTX     0001000
0404 //.. 
0405 //.. #define VKI_S_ISLNK(m) (((m) & VKI_S_IFMT) == VKI_S_IFLNK)
0406 //.. #define VKI_S_ISREG(m) (((m) & VKI_S_IFMT) == VKI_S_IFREG)
0407 //.. #define VKI_S_ISDIR(m) (((m) & VKI_S_IFMT) == VKI_S_IFDIR)
0408 //.. #define VKI_S_ISCHR(m) (((m) & VKI_S_IFMT) == VKI_S_IFCHR)
0409 //.. #define VKI_S_ISBLK(m) (((m) & VKI_S_IFMT) == VKI_S_IFBLK)
0410 //.. #define VKI_S_ISFIFO(m)    (((m) & VKI_S_IFMT) == VKI_S_IFIFO)
0411 //.. #define VKI_S_ISSOCK(m)    (((m) & VKI_S_IFMT) == VKI_S_IFSOCK)
0412 
0413 struct vki_stat {
0414    unsigned     st_dev;
0415    unsigned long    st_ino;
0416    unsigned int     st_mode;
0417    unsigned short   st_nlink;
0418    unsigned int     st_uid;
0419    unsigned int     st_gid;
0420    unsigned     st_rdev;
0421    long         st_size;
0422    unsigned long    st_blksize;
0423    unsigned long    st_blocks;
0424    unsigned long    st_atime;
0425    unsigned long    st_atime_nsec;
0426    unsigned long    st_mtime;
0427    unsigned long    st_mtime_nsec;
0428    unsigned long    st_ctime;
0429    unsigned long    st_ctime_nsec;
0430    unsigned long    __unused4;
0431    unsigned long    __unused5;
0432 };
0433 
0434 struct vki_stat64 {
0435    unsigned long long   st_dev;
0436    unsigned long long   st_ino;
0437    unsigned int         st_mode;
0438    unsigned int         st_nlink;
0439    unsigned int         st_uid;
0440    unsigned int         st_gid;
0441    unsigned long long   st_rdev;
0442    unsigned short int   __pad2;
0443    long long            st_size;
0444    long                 st_blksize;
0445 
0446    long long            st_blocks;
0447    long                 st_atime;
0448    unsigned long        st_atime_nsec;
0449    long                 st_mtime;
0450    unsigned long int    st_mtime_nsec;
0451    long                 st_ctime;
0452    unsigned long int    st_ctime_nsec;
0453    unsigned long int    __unused4;
0454    unsigned long int    __unused5;
0455 };
0456 
0457 
0458 //----------------------------------------------------------------------
0459 // From linux-2.6.9/include/asm-ppc/statfs.h
0460 //----------------------------------------------------------------------
0461 
0462 // [[Nb: asm-ppc/statfs.h just #include asm-generic/statfs.h directly]]
0463 struct vki_statfs {
0464    __vki_u32 f_type;
0465    __vki_u32 f_bsize;
0466    __vki_u32 f_blocks;
0467    __vki_u32 f_bfree;
0468    __vki_u32 f_bavail;
0469    __vki_u32 f_files;
0470    __vki_u32 f_ffree;
0471    __vki_kernel_fsid_t f_fsid;
0472    __vki_u32 f_namelen;
0473    __vki_u32 f_frsize;
0474    __vki_u32 f_spare[5];
0475 };
0476 
0477 //----------------------------------------------------------------------
0478 // From linux-2.6.9/include/asm-ppc/termios.h
0479 //----------------------------------------------------------------------
0480 
0481 struct vki_winsize {
0482    unsigned short ws_row;
0483    unsigned short ws_col;
0484    unsigned short ws_xpixel;
0485    unsigned short ws_ypixel;
0486 };
0487 
0488 #define NCC 10
0489 struct vki_termio {
0490    unsigned short   c_iflag;        /* input mode flags */
0491    unsigned short   c_oflag;        /* output mode flags */
0492    unsigned short   c_cflag;        /* control mode flags */
0493    unsigned short   c_lflag;        /* local mode flags */
0494    unsigned char    c_line;         /* line discipline */
0495    unsigned char    c_cc[NCC];      /* control characters */
0496 };
0497 
0498 //----------------------------------------------------------------------
0499 // From linux-2.6.9/include/asm-ppc/termbits.h
0500 //----------------------------------------------------------------------
0501 
0502 typedef unsigned char   vki_cc_t;
0503 typedef unsigned int    vki_speed_t;
0504 typedef unsigned int    vki_tcflag_t;
0505 
0506 #define NCCS 19
0507 struct vki_termios {
0508         vki_tcflag_t    c_iflag;        /* input mode flags */
0509         vki_tcflag_t    c_oflag;        /* output mode flags */
0510         vki_tcflag_t    c_cflag;        /* control mode flags */
0511         vki_tcflag_t    c_lflag;        /* local mode flags */
0512         vki_cc_t    c_cc[NCCS];     /* control characters */
0513         vki_cc_t    c_line;         /* line discipline (== c_cc[19]) */
0514         vki_speed_t c_ispeed;       /* input speed */
0515         vki_speed_t c_ospeed;       /* output speed */
0516 };
0517 
0518 //----------------------------------------------------------------------
0519 // From linux-2.6.9/include/asm-ppc/ioctl.h
0520 //----------------------------------------------------------------------
0521 
0522 #define _VKI_IOC_NRBITS      8
0523 #define _VKI_IOC_TYPEBITS    8
0524 #define _VKI_IOC_SIZEBITS   13
0525 #define _VKI_IOC_DIRBITS     3
0526 
0527 #define _VKI_IOC_NRMASK     ((1 << _VKI_IOC_NRBITS)-1)
0528 #define _VKI_IOC_TYPEMASK   ((1 << _VKI_IOC_TYPEBITS)-1)
0529 #define _VKI_IOC_SIZEMASK   ((1 << _VKI_IOC_SIZEBITS)-1)
0530 #define _VKI_IOC_DIRMASK    ((1 << _VKI_IOC_DIRBITS)-1)
0531 
0532 #define _VKI_IOC_NRSHIFT    0
0533 #define _VKI_IOC_TYPESHIFT  (_VKI_IOC_NRSHIFT+_VKI_IOC_NRBITS)
0534 #define _VKI_IOC_SIZESHIFT  (_VKI_IOC_TYPESHIFT+_VKI_IOC_TYPEBITS)
0535 #define _VKI_IOC_DIRSHIFT   (_VKI_IOC_SIZESHIFT+_VKI_IOC_SIZEBITS)
0536 
0537 #define _VKI_IOC_NONE   1U
0538 #define _VKI_IOC_READ   2U
0539 #define _VKI_IOC_WRITE  4U
0540 
0541 #define _VKI_IOC(dir,type,nr,size) \
0542         (((dir)  << _VKI_IOC_DIRSHIFT) | \
0543          ((type) << _VKI_IOC_TYPESHIFT) | \
0544          ((nr)   << _VKI_IOC_NRSHIFT) | \
0545          ((size) << _VKI_IOC_SIZESHIFT))
0546 
0547 /* used to create numbers */
0548 #define _VKI_IO(type,nr)            _VKI_IOC(_VKI_IOC_NONE,(type),(nr),0)
0549 #define _VKI_IOR(type,nr,size)  _VKI_IOC(_VKI_IOC_READ,(type),(nr),(_VKI_IOC_TYPECHECK(size)))
0550 #define _VKI_IOW(type,nr,size)  _VKI_IOC(_VKI_IOC_WRITE,(type),(nr),(_VKI_IOC_TYPECHECK(size)))
0551 #define _VKI_IOWR(type,nr,size) _VKI_IOC(_VKI_IOC_READ|_VKI_IOC_WRITE,(type),(nr),(_VKI_IOC_TYPECHECK(size)))
0552 
0553 /* used to decode them.. */
0554 #define _VKI_IOC_DIR(nr)        (((nr) >> _VKI_IOC_DIRSHIFT)  & _VKI_IOC_DIRMASK)
0555 //.. #define _VKI_IOC_TYPE(nr)      (((nr) >> _VKI_IOC_TYPESHIFT) & _VKI_IOC_TYPEMASK)
0556 //.. #define _VKI_IOC_NR(nr)        (((nr) >> _VKI_IOC_NRSHIFT)   & _VKI_IOC_NRMASK)
0557 #define _VKI_IOC_SIZE(nr)       (((nr) >> _VKI_IOC_SIZESHIFT) & _VKI_IOC_SIZEMASK)
0558 
0559 //----------------------------------------------------------------------
0560 // From linux-2.6.9/include/asm-ppc/ioctls.h
0561 //----------------------------------------------------------------------
0562 
0563 #define VKI_FIOCLEX     _VKI_IO('f', 1)
0564 #define VKI_FIONCLEX        _VKI_IO('f', 2)
0565 #define VKI_FIOASYNC        _VKI_IOW('f', 125, int)
0566 #define VKI_FIONBIO     _VKI_IOW('f', 126, int)
0567 #define VKI_FIONREAD        _VKI_IOR('f', 127, int)
0568 //#define VKI_TIOCINQ       VKI_FIONREAD
0569 #define VKI_FIOQSIZE        _VKI_IOR('f', 128, vki_loff_t)
0570 
0571 //#define VKI_TIOCGETP      _VKI_IOR('t', 8, struct vki_sgttyb)
0572 //#define VKI_TIOCSETP      _VKI_IOW('t', 9, struct vki_sgttyb)
0573 //#define VKI_TIOCSETN      _VKI_IOW('t', 10, struct vki_sgttyb)    /* TIOCSETP wo flush */
0574 
0575 //#define VKI_TIOCSETC      _VKI_IOW('t', 17, struct vki_tchars)
0576 //#define VKI_TIOCGETC      _VKI_IOR('t', 18, struct vki_tchars)
0577 #define VKI_TCGETS      _VKI_IOR('t', 19, struct vki_termios)
0578 #define VKI_TCSETS      _VKI_IOW('t', 20, struct vki_termios)
0579 #define VKI_TCSETSW     _VKI_IOW('t', 21, struct vki_termios)
0580 #define VKI_TCSETSF     _VKI_IOW('t', 22, struct vki_termios)
0581 
0582 #define VKI_TCGETA      _VKI_IOR('t', 23, struct vki_termio)
0583 #define VKI_TCSETA      _VKI_IOW('t', 24, struct vki_termio)
0584 #define VKI_TCSETAW     _VKI_IOW('t', 25, struct vki_termio)
0585 #define VKI_TCSETAF     _VKI_IOW('t', 28, struct vki_termio)
0586 
0587 #define VKI_TCSBRK      _VKI_IO('t', 29)
0588 #define VKI_TCXONC      _VKI_IO('t', 30)
0589 #define VKI_TCFLSH      _VKI_IO('t', 31)
0590 
0591 #define VKI_TIOCSWINSZ      _VKI_IOW('t', 103, struct vki_winsize)
0592 #define VKI_TIOCGWINSZ      _VKI_IOR('t', 104, struct vki_winsize)
0593 //#define VKI_TIOCSTART     _VKI_IO('t', 110)      /* start output, like ^Q */
0594 //#define VKI_TIOCSTOP      _VKI_IO('t', 111)      /* stop output, like ^S */
0595 #define VKI_TIOCOUTQ        _VKI_IOR('t', 115, int)    /* output queue size */
0596 
0597 //#define VKI_TIOCGLTC      _VKI_IOR('t', 116, struct vki_ltchars)
0598 //#define VKI_TIOCSLTC      _VKI_IOW('t', 117, struct vki_ltchars)
0599 #define VKI_TIOCSPGRP       _VKI_IOW('t', 118, int)
0600 #define VKI_TIOCGPGRP       _VKI_IOR('t', 119, int)
0601 
0602 //#define VKI_TIOCEXCL      0x540C
0603 //#define VKI_TIOCNXCL      0x540D
0604 #define VKI_TIOCSCTTY       0x540E
0605 
0606 //#define VKI_TIOCSTI       0x5412
0607 #define VKI_TIOCMGET        0x5415
0608 #define VKI_TIOCMBIS        0x5416
0609 #define VKI_TIOCMBIC        0x5417
0610 #define VKI_TIOCMSET        0x5418
0611 //# define VKI_TIOCM_LE     0x001
0612 //# define VKI_TIOCM_DTR    0x002
0613 //# define VKI_TIOCM_RTS    0x004
0614 //# define VKI_TIOCM_ST     0x008
0615 //# define VKI_TIOCM_SR     0x010
0616 //# define VKI_TIOCM_CTS    0x020
0617 //# define VKI_TIOCM_CAR    0x040
0618 //# define VKI_TIOCM_RNG    0x080
0619 //# define VKI_TIOCM_DSR    0x100
0620 //# define VKI_TIOCM_CD     VKI_TIOCM_CAR
0621 //# define VKI_TIOCM_RI     VKI_TIOCM_RNG
0622 
0623 //#define VKI_TIOCGSOFTCAR  0x5419
0624 //#define VKI_TIOCSSOFTCAR  0x541A
0625 #define VKI_TIOCLINUX       0x541C
0626 //#define VKI_TIOCCONS      0x541D
0627 #define VKI_TIOCGSERIAL 0x541E
0628 #define VKI_TIOCSSERIAL 0x541F
0629 //#define VKI_TIOCPKT       0x5420
0630 //# define VKI_TIOCPKT_DATA      0
0631 //# define VKI_TIOCPKT_FLUSHREAD     1
0632 //# define VKI_TIOCPKT_FLUSHWRITE    2
0633 //# define VKI_TIOCPKT_STOP      4
0634 //# define VKI_TIOCPKT_START         8
0635 //# define VKI_TIOCPKT_NOSTOP       16
0636 //# define VKI_TIOCPKT_DOSTOP       32
0637 
0638 #define VKI_TIOCNOTTY       0x5422
0639 //#define VKI_TIOCSETD      0x5423
0640 //#define VKI_TIOCGETD      0x5424
0641 #define VKI_TCSBRKP     0x5425  /* Needed for POSIX tcsendbreak() */
0642 //#define VKI_TIOCSBRK      0x5427  /* BSD compatibility */
0643 //#define VKI_TIOCCBRK      0x5428  /* BSD compatibility */
0644 //#define VKI_TIOCGSID      0x5429  /* Return the session ID of FD */
0645 #define VKI_TIOCGPTN        _VKI_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
0646 #define VKI_TIOCSPTLCK      _VKI_IOW('T',0x31, int)  /* Lock/unlock Pty */
0647 
0648 //#define VKI_TIOCSERCONFIG 0x5453
0649 //#define VKI_TIOCSERGWILD  0x5454
0650 //#define VKI_TIOCSERSWILD      0x5455
0651 //#define VKI_TIOCGLCKTRMIOS    0x5456
0652 //#define VKI_TIOCSLCKTRMIOS    0x5457
0653 //#define VKI_TIOCSERGSTRUCT    0x5458 /* For debugging only */
0654 #define VKI_TIOCSERGETLSR   0x5459 /* Get line status register */
0655   /* ioctl (fd, VKI_TIOCSERGETLSR, &result) where result may be as below */
0656 //# define VKI_TIOCSER_TEMT 0x01   /* Transmitter physically empty */
0657 //#define VKI_TIOCSERGETMULTI   0x545A /* Get multiport config  */
0658 //#define VKI_TIOCSERSETMULTI   0x545B /* Set multiport config */
0659 
0660 //#define VKI_TIOCMIWAIT    0x545C  /* wait for a change on serial input line(s) */
0661 #define VKI_TIOCGICOUNT     0x545D  /* read serial port inline interrupt counts */
0662 
0663 //----------------------------------------------------------------------
0664 // From linux-2.6.9/include/asm-ppc/poll.h
0665 //----------------------------------------------------------------------
0666 
0667 //.. /* These are specified by iBCS2 */
0668 //.. #define VKI_POLLIN     0x0001
0669 
0670 struct vki_pollfd {
0671     int fd;
0672     short events;
0673     short revents;
0674 };
0675 
0676 //.. //----------------------------------------------------------------------
0677 //.. // From linux-2.6.8.1/include/asm-i386/user.h
0678 //.. //----------------------------------------------------------------------
0679 //.. 
0680 //.. struct vki_user_i387_struct {
0681 //..    long    cwd;
0682 //..    long    swd;
0683 //..    long    twd;
0684 //..    long    fip;
0685 //..    long    fcs;
0686 //..    long    foo;
0687 //..    long    fos;
0688 //..    long    st_space[20];   /* 8*10 bytes for each FP-reg = 80 bytes */
0689 //.. };
0690 //.. 
0691 //.. struct vki_user_fxsr_struct {
0692 //..    unsigned short  cwd;
0693 //..    unsigned short  swd;
0694 //..    unsigned short  twd;
0695 //..    unsigned short  fop;
0696 //..    long    fip;
0697 //..    long    fcs;
0698 //..    long    foo;
0699 //..    long    fos;
0700 //..    long    mxcsr;
0701 //..    long    reserved;
0702 //..    long    st_space[32];   /* 8*16 bytes for each FP-reg = 128 bytes */
0703 //..    long    xmm_space[32];  /* 8*16 bytes for each XMM-reg = 128 bytes */
0704 //..    long    padding[56];
0705 //.. };
0706 //.. 
0707 //.. /*
0708 //..  * This is the old layout of "struct pt_regs", and
0709 //..  * is still the layout used by user mode (the new
0710 //..  * pt_regs doesn't have all registers as the kernel
0711 //..  * doesn't use the extra segment registers)
0712 //..  */
0713 //.. struct vki_user_regs_struct {
0714 //..    long ebx, ecx, edx, esi, edi, ebp, eax;
0715 //..    unsigned short ds, __ds, es, __es;
0716 //..    unsigned short fs, __fs, gs, __gs;
0717 //..    long orig_eax, eip;
0718 //..    unsigned short cs, __cs;
0719 //..    long eflags, esp;
0720 //..    unsigned short ss, __ss;
0721 //.. };
0722 
0723 //----------------------------------------------------------------------
0724 // From linux-2.6.9/include/asm-ppc/elf.h
0725 //----------------------------------------------------------------------
0726 
0727 #define VKI_ELF_NGREG           48  /* includes nip, msr, lr, etc. */
0728 #define VKI_ELF_NFPREG          33  /* includes fpscr */
0729 #define VKI_ELF_NVRREG          33  /* includes vscr */
0730 
0731 /* General registers */
0732 typedef unsigned long vki_elf_greg_t;
0733 typedef vki_elf_greg_t vki_elf_gregset_t[VKI_ELF_NGREG];
0734 
0735 /* Floating point registers */
0736 typedef double vki_elf_fpreg_t;
0737 typedef vki_elf_fpreg_t vki_elf_fpregset_t[VKI_ELF_NFPREG];
0738 
0739 /* Altivec registers */
0740 typedef __vki_vector128 vki_elf_vrreg_t;
0741 typedef vki_elf_vrreg_t vki_elf_vrregset_t[VKI_ELF_NVRREG];
0742 
0743 #define VKI_AT_DCACHEBSIZE      19
0744 #define VKI_AT_ICACHEBSIZE      20
0745 #define VKI_AT_UCACHEBSIZE      21
0746 /* A special ignored type value for PPC, for glibc compatibility.  */
0747 #define VKI_AT_IGNOREPPC        22
0748 
0749 /* CAB: Do we want these? */
0750 //#define VKI_AT_SYSINFO        32
0751 //#define VKI_AT_SYSINFO_EHDR       33
0752 
0753 //----------------------------------------------------------------------
0754 // From linux-2.6.9/include/asm-ppc/ucontext.h
0755 //----------------------------------------------------------------------
0756 
0757 struct vki_mcontext {
0758         vki_elf_gregset_t   mc_gregs;
0759         vki_elf_fpregset_t  mc_fregs;
0760         unsigned long       mc_pad[2];
0761         vki_elf_vrregset_t  mc_vregs __attribute__((__aligned__(16)));
0762 };
0763 
0764 struct vki_ucontext {
0765         unsigned long       uc_flags;
0766         struct vki_ucontext __user *uc_link;
0767         vki_stack_t     uc_stack;
0768         int         uc_pad[7];
0769         struct vki_mcontext __user *uc_regs;        /* points to uc_mcontext field */
0770         vki_sigset_t        uc_sigmask;
0771         /* glibc has 1024-bit signal masks, ours are 64-bit */
0772         int         uc_maskext[30];
0773         int         uc_pad2[3];
0774         struct vki_mcontext uc_mcontext;
0775 };
0776 
0777 //.. //----------------------------------------------------------------------
0778 //.. // From linux-2.6.8.1/include/asm-i386/segment.h
0779 //.. //----------------------------------------------------------------------
0780 //.. 
0781 //.. #define VKI_GDT_ENTRY_TLS_ENTRIES  3
0782 //.. #define VKI_GDT_ENTRY_TLS_MIN  6
0783 //.. #define VKI_GDT_ENTRY_TLS_MAX  (VKI_GDT_ENTRY_TLS_MIN + VKI_GDT_ENTRY_TLS_ENTRIES - 1)
0784 
0785 //----------------------------------------------------------------------
0786 // From linux-2.6.9/include/asm-ppc/ldt.h
0787 //----------------------------------------------------------------------
0788 
0789 //.. /* [[Nb: This is the structure passed to the modify_ldt syscall.  Just so as
0790 //..    to confuse and annoy everyone, this is _not_ the same as an
0791 //..    VgLdtEntry and has to be translated into such.  The logic for doing
0792 //..    so, in vg_ldt.c, is copied from the kernel sources.]] */
0793 //.. struct vki_user_desc {
0794 //..    unsigned int    entry_number;
0795 //..    unsigned long   base_addr;
0796 //..    unsigned int    limit;
0797 //..    unsigned int    seg_32bit:1;
0798 //..    unsigned int    contents:2;
0799 //..    unsigned int    read_exec_only:1;
0800 //..    unsigned int    limit_in_pages:1;
0801 //..    unsigned int    seg_not_present:1;
0802 //..    unsigned int    useable:1;
0803 //..         // [[Nb: this field is not in the kernel sources, but it has always
0804 //..         // been in the Valgrind sources so I will keep it there in case it's
0805 //..         // important... this is an x86-defined data structure so who
0806 //..         // knows;  maybe it's important to set this field to zero at some
0807 //..         // point.  --njn]]
0808 //..    unsigned int    reserved:25;
0809 //.. };
0810 //.. 
0811 //.. // [[Nb: for our convenience within Valgrind, use a more specific name]]
0812 
0813 // CAB: TODO
0814 typedef char vki_modify_ldt_t;
0815 
0816 
0817 //----------------------------------------------------------------------
0818 // From linux-2.6.9/include/asm-ppc/ipcbuf.h
0819 //----------------------------------------------------------------------
0820 
0821 struct vki_ipc64_perm
0822 {
0823    __vki_kernel_key_t   key;
0824    __vki_kernel_uid_t   uid;
0825    __vki_kernel_gid_t   gid;
0826    __vki_kernel_uid_t   cuid;
0827    __vki_kernel_gid_t   cgid;
0828    __vki_kernel_mode_t  mode;
0829    unsigned long    seq;
0830    unsigned int     __pad2;
0831    unsigned long long   __unused1;
0832    unsigned long long   __unused2;
0833 };
0834 
0835 //----------------------------------------------------------------------
0836 // From linux-2.6.9/include/asm-ppc/sembuf.h
0837 //----------------------------------------------------------------------
0838 
0839 struct vki_semid64_ds {
0840    struct vki_ipc64_perm    sem_perm;       /* permissions .. see ipc.h */
0841    unsigned int         __unused1;
0842    __vki_kernel_time_t      sem_otime;      /* last semop time */
0843    unsigned int         __unused2;
0844    __vki_kernel_time_t      sem_ctime;      /* last change time */
0845    unsigned long        sem_nsems;      /* no. of semaphores in array */
0846    unsigned long        __unused3;
0847    unsigned long        __unused4;
0848 };
0849 
0850 //----------------------------------------------------------------------
0851 // From linux-2.6.9/include/asm-ppc/msgbuf.h
0852 //----------------------------------------------------------------------
0853 
0854 struct vki_msqid64_ds {
0855    struct vki_ipc64_perm    msg_perm;
0856    unsigned int         __unused1;
0857    __vki_kernel_time_t      msg_stime;      /* last msgsnd time */
0858    unsigned int         __unused2;
0859    __vki_kernel_time_t      msg_rtime;      /* last msgrcv time */
0860    unsigned int         __unused3;
0861    __vki_kernel_time_t      msg_ctime;      /* last change time */
0862    unsigned long        msg_cbytes;     /* current number of bytes on queue */
0863    unsigned long        msg_qnum;       /* number of messages in queue */
0864    unsigned long        msg_qbytes;     /* max number of bytes on queue */
0865    __vki_kernel_pid_t       msg_lspid;      /* pid of last msgsnd */
0866    __vki_kernel_pid_t       msg_lrpid;      /* last receive pid */
0867    unsigned long        __unused4;
0868    unsigned long        __unused5;
0869 };
0870 
0871 //----------------------------------------------------------------------
0872 // From linux-2.6.8.1/include/asm-ppc/ipc.h
0873 //----------------------------------------------------------------------
0874 
0875 struct vki_ipc_kludge {
0876         struct vki_msgbuf __user *msgp;
0877         long msgtyp;
0878 };
0879 
0880 #define VKI_SEMOP            1
0881 #define VKI_SEMGET           2
0882 #define VKI_SEMCTL           3
0883 #define VKI_SEMTIMEDOP       4
0884 #define VKI_MSGSND          11
0885 #define VKI_MSGRCV          12
0886 #define VKI_MSGGET          13
0887 #define VKI_MSGCTL          14
0888 #define VKI_SHMAT           21
0889 #define VKI_SHMDT           22
0890 #define VKI_SHMGET          23
0891 #define VKI_SHMCTL          24
0892 
0893 //----------------------------------------------------------------------
0894 // From linux-2.6.9/include/asm-ppc/shmbuf.h
0895 //----------------------------------------------------------------------
0896 
0897 struct vki_shmid64_ds {
0898    struct vki_ipc64_perm    shm_perm;       /* operation perms */
0899    unsigned int         __unused1;
0900    __vki_kernel_time_t      shm_atime;      /* last attach time */
0901    unsigned int         __unused2;
0902    __vki_kernel_time_t      shm_dtime;      /* last detach time */
0903    unsigned int         __unused3;
0904    __vki_kernel_time_t      shm_ctime;      /* last change time */
0905    unsigned int         __unused4;
0906    vki_size_t           shm_segsz;      /* size of segment (bytes) */
0907    __vki_kernel_pid_t       shm_cpid;       /* pid of creator */
0908    __vki_kernel_pid_t       shm_lpid;       /* pid of last operator */
0909    unsigned long        shm_nattch;     /* no. of current attaches */
0910    unsigned long        __unused5;
0911    unsigned long        __unused6;
0912 };
0913 
0914 struct vki_shminfo64 {
0915    unsigned long    shmmax;
0916    unsigned long    shmmin;
0917    unsigned long    shmmni;
0918    unsigned long    shmseg;
0919    unsigned long    shmall;
0920    unsigned long    __unused1;
0921    unsigned long    __unused2;
0922    unsigned long    __unused3;
0923    unsigned long    __unused4;
0924 };
0925 
0926 //----------------------------------------------------------------------
0927 // From linux-2.6.8.1/include/asm-generic/errno.h
0928 //----------------------------------------------------------------------
0929 
0930 #define VKI_ENOSYS       38  /* Function not implemented */
0931 #define VKI_EOVERFLOW    75  /* Value too large for defined data type */
0932 
0933 //.. //----------------------------------------------------------------------
0934 //.. // DRM ioctls
0935 //.. //----------------------------------------------------------------------
0936 //.. 
0937 //.. // jrs 20050207: where did all this stuff come from?  Is it really
0938 //.. // i386 specific, or should it go into the linux-generic category?
0939 //.. //struct vki_drm_buf_pub {
0940 //.. // Int       idx;         /**< Index into the master buffer list */
0941 //.. // Int       total;       /**< Buffer size */
0942 //.. // Int       used;        /**< Amount of buffer in use (for DMA) */
0943 //.. // void      __user *address;     /**< Address of buffer */
0944 //.. //};
0945 //.. //
0946 //.. //struct vki_drm_buf_map {
0947 //.. // Int       count;        /**< Length of the buffer list */
0948 //.. // void          __user *virtual;  /**< Mmap'd area in user-virtual */
0949 //.. // struct vki_drm_buf_pub __user *list;    /**< Buffer information */
0950 //.. //};
0951 //.. //
0952 //.. ///* We need to pay attention to this, because it mmaps memory */
0953 //.. //#define VKI_DRM_IOCTL_MAP_BUFS       _VKI_IOWR('d', 0x19, struct vki_drm_buf_map)
0954 
0955 //----------------------------------------------------------------------
0956 // And that's it!
0957 //----------------------------------------------------------------------
0958 
0959 #endif // __VKI_PPC32_LINUX_H
0960 
0961 /*--------------------------------------------------------------------*/
0962 /*--- end                                                          ---*/
0963 /*--------------------------------------------------------------------*/