Add framework for ppc64 support.  Apologies in advance for the
inevitable breakage to other platforms.



git-svn-id: svn://svn.valgrind.org/valgrind/trunk@5250 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/include/vki-ppc64-linux.h b/include/vki-ppc64-linux.h
new file mode 100644
index 0000000..1e8c1b0
--- /dev/null
+++ b/include/vki-ppc64-linux.h
@@ -0,0 +1,750 @@
+
+/*--------------------------------------------------------------------*/
+/*--- PPC64/Linux-specific kernel interface.                       ---*/
+/*---                                ppc64-linux/vki-ppc64-linux.h ---*/
+/*--------------------------------------------------------------------*/
+
+/*
+   This file is part of Valgrind, a dynamic binary instrumentation
+   framework.
+
+   Copyright (C) 2005 Julian Seward
+      jseward@acm.org
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307, USA.
+
+   The GNU General Public License is contained in the file COPYING.
+*/
+
+#ifndef __PPC64_LINUX_VKI_ARCH_H
+#define __PPC64_LINUX_VKI_ARCH_H
+
+// ppc64 is big-endian.
+#define VKI_BIG_ENDIAN  1
+
+//----------------------------------------------------------------------
+// From linux-2.6.13/include/asm-ppc64/types.h
+//----------------------------------------------------------------------
+
+typedef __signed__ char __vki_s8;
+typedef unsigned char __vki_u8;
+
+typedef __signed__ short __vki_s16;
+typedef unsigned short __vki_u16;
+
+typedef __signed__ int __vki_s32;
+typedef unsigned int __vki_u32;
+
+typedef __signed__ long __vki_s64;
+typedef unsigned long __vki_u64;
+
+typedef struct {
+  __vki_u32 u[4];
+} __attribute((aligned(16))) __vki_vector128;
+
+typedef unsigned short vki_u16;
+
+typedef unsigned int vki_u32;
+
+//----------------------------------------------------------------------
+// From linux-2.6.13/include/asm-ppc64/page.h
+//----------------------------------------------------------------------
+
+/* PAGE_SHIFT determines the page size */
+#define VKI_PAGE_SHIFT  12
+#define VKI_PAGE_SIZE   (1UL << VKI_PAGE_SHIFT)
+
+//----------------------------------------------------------------------
+// From linux-2.6.13/include/asm-ppc64/signal.h
+//----------------------------------------------------------------------
+
+#define VKI_MINSIGSTKSZ     2048
+
+/* Next 9 non-blank lines asm-generic/signal.h */
+#define VKI_SIG_BLOCK          0 /* for blocking signals */
+#define VKI_SIG_UNBLOCK        1 /* for unblocking signals */
+#define VKI_SIG_SETMASK        2 /* for setting the signal mask */
+
+typedef void __vki_signalfn_t(int);
+typedef __vki_signalfn_t __user *__vki_sighandler_t;
+
+typedef void __vki_restorefn_t(void);
+typedef __vki_restorefn_t __user *__vki_sigrestore_t;
+
+#define VKI_SIG_DFL ((__vki_sighandler_t)0)     /* default signal handling */
+#define VKI_SIG_IGN ((__vki_sighandler_t)1)     /* ignore signal */
+
+/* Back in asm-ppc64/signal.h */
+#define _VKI_NSIG           64
+#define _VKI_NSIG_BPW       64
+#define _VKI_NSIG_WORDS     (_VKI_NSIG / _VKI_NSIG_BPW)
+
+typedef unsigned long vki_old_sigset_t;             /* at least 32 bits */
+
+typedef struct {
+  unsigned long sig[_VKI_NSIG_WORDS];
+} vki_sigset_t;
+
+#define VKI_SIGHUP           1
+#define VKI_SIGINT           2
+#define VKI_SIGQUIT          3
+#define VKI_SIGILL           4
+#define VKI_SIGTRAP          5
+#define VKI_SIGABRT          6
+#define VKI_SIGIOT           6
+#define VKI_SIGBUS           7
+#define VKI_SIGFPE           8
+#define VKI_SIGKILL          9
+#define VKI_SIGUSR1         10
+#define VKI_SIGSEGV         11
+#define VKI_SIGUSR2         12
+#define VKI_SIGPIPE         13
+#define VKI_SIGALRM         14
+#define VKI_SIGTERM         15
+#define VKI_SIGSTKFLT       16
+#define VKI_SIGCHLD         17
+#define VKI_SIGCONT         18
+#define VKI_SIGSTOP         19
+#define VKI_SIGTSTP         20
+#define VKI_SIGTTIN         21
+#define VKI_SIGTTOU         22
+#define VKI_SIGURG          23
+#define VKI_SIGXCPU         24
+#define VKI_SIGXFSZ         25
+#define VKI_SIGVTALRM       26
+#define VKI_SIGPROF         27
+#define VKI_SIGWINCH        28
+#define VKI_SIGIO           29
+#define VKI_SIGPOLL         VKI_SIGIO
+#define VKI_SIGPWR          30
+#define VKI_SIGSYS          31
+#define VKI_SIGUNUSED       31
+
+/* These should not be considered constants from userland.  */
+#define VKI_SIGRTMIN        32
+#define VKI_SIGRTMAX        _VKI_NSIG
+
+#define VKI_SA_NOCLDSTOP    0x00000001u
+#define VKI_SA_NOCLDWAIT    0x00000002u
+#define VKI_SA_SIGINFO      0x00000004u
+#define VKI_SA_ONSTACK      0x08000000u
+#define VKI_SA_RESTART      0x10000000u
+#define VKI_SA_NODEFER      0x40000000u
+#define VKI_SA_RESETHAND    0x80000000u
+
+#define VKI_SA_NOMASK       VKI_SA_NODEFER
+#define VKI_SA_ONESHOT      VKI_SA_RESETHAND
+//#define VKI_SA_INTERRUPT    0x20000000u /* dummy -- ignored */
+
+#define VKI_SA_RESTORER     0x04000000u
+
+#define VKI_SS_ONSTACK      1
+#define VKI_SS_DISABLE      2
+
+// See comments on corresponding decls in vki-x86-linux.h re ksa_handler
+struct vki_old_sigaction {
+  __vki_sighandler_t ksa_handler;
+  vki_old_sigset_t sa_mask;
+  unsigned long sa_flags;
+  __vki_sigrestore_t sa_restorer;
+};
+
+struct vki_sigaction {
+  __vki_sighandler_t ksa_handler;
+  unsigned long sa_flags;
+  __vki_sigrestore_t sa_restorer;
+  vki_sigset_t sa_mask;               /* mask last for extensibility */
+};
+
+typedef struct vki_sigaltstack {
+  void __user *ss_sp;
+  int ss_flags;
+  vki_size_t ss_size;
+} vki_stack_t;
+
+//----------------------------------------------------------------------
+// From linux-2.6.13/include/asm-ppc64/ptrace.h
+//----------------------------------------------------------------------
+
+#define VKI_PPC_REG unsigned long
+struct vki_pt_regs {
+  VKI_PPC_REG gpr[32];
+  VKI_PPC_REG nip;
+  VKI_PPC_REG msr;
+  VKI_PPC_REG orig_gpr3;      /* Used for restarting system calls */
+  VKI_PPC_REG ctr;
+  VKI_PPC_REG link;
+  VKI_PPC_REG xer;
+  VKI_PPC_REG ccr;
+  VKI_PPC_REG softe;          /* Soft enabled/disabled */
+  VKI_PPC_REG trap;           /* Reason for being here */
+  VKI_PPC_REG dar;            /* Fault registers */
+  VKI_PPC_REG dsisr;
+  VKI_PPC_REG result;         /* Result of a system call */
+};
+
+/* Kludge?  I don't know where this came from or if it is right. */
+#define vki_user_regs_struct vki_pt_regs
+
+#define VKI_PT_R0   0
+#define VKI_PT_R1   1
+#define VKI_PT_R2   2
+#define VKI_PT_R3   3
+#define VKI_PT_R4   4
+#define VKI_PT_R5   5
+#define VKI_PT_R6   6
+#define VKI_PT_R7   7
+#define VKI_PT_R8   8
+#define VKI_PT_R9   9
+#define VKI_PT_R10  10
+#define VKI_PT_R11  11
+#define VKI_PT_R12  12
+#define VKI_PT_R13  13
+#define VKI_PT_R14  14
+#define VKI_PT_R15  15
+#define VKI_PT_R16  16
+#define VKI_PT_R17  17
+#define VKI_PT_R18  18
+#define VKI_PT_R19  19
+#define VKI_PT_R20  20
+#define VKI_PT_R21  21
+#define VKI_PT_R22  22
+#define VKI_PT_R23  23
+#define VKI_PT_R24  24
+#define VKI_PT_R25  25
+#define VKI_PT_R26  26
+#define VKI_PT_R27  27
+#define VKI_PT_R28  28
+#define VKI_PT_R29  29
+#define VKI_PT_R30  30
+#define VKI_PT_R31  31
+#define VKI_PT_NIP  32
+#define VKI_PT_MSR  33
+#define VKI_PT_ORIG_R3 34
+#define VKI_PT_CTR  35
+#define VKI_PT_LNK  36
+#define VKI_PT_XER  37
+#define VKI_PT_CCR  38
+#define VKI_PT_SOFTE 39
+#define VKI_PT_RESULT 43
+
+//----------------------------------------------------------------------
+// From linux-2.6.13/include/asm-ppc64/elf.h
+//----------------------------------------------------------------------
+
+#define VKI_ELF_NGREG       48      /* includes nip, msr, lr, etc. */
+#define VKI_ELF_NFPREG      33      /* includes fpscr */
+#define VKI_ELF_NVRREG      34      /* includes vscr & vrsave in split vectors */
+
+typedef unsigned long vki_elf_greg_t64;
+typedef vki_elf_greg_t64 vki_elf_gregset_t64[VKI_ELF_NGREG];
+
+typedef vki_elf_gregset_t64 vki_elf_gregset_t;
+
+typedef double vki_elf_fpreg_t;
+typedef vki_elf_fpreg_t vki_elf_fpregset_t[VKI_ELF_NFPREG];
+
+/* Altivec registers */
+/*
+ * The entries with indexes 0-31 contain the corresponding vector registers.
+ * The entry with index 32 contains the vscr as the last word (offset 12)
+ * within the quadword.  This allows the vscr to be stored as either a
+ * quadword (since it must be copied via a vector register to/from storage)
+ * or as a word.  The entry with index 33 contains the vrsave as the first
+ * word (offset 0) within the quadword.
+ *
+ * This definition of the VMX state is compatible with the current PPC32
+ * ptrace interface.  This allows signal handling and ptrace to use the same
+ * structures.  This also simplifies the implementation of a bi-arch
+ * (combined (32- and 64-bit) gdb.
+ *
+ * Note that it's _not_ compatible with 32 bits ucontext which stuffs the
+ * vrsave along with vscr and so only uses 33 vectors for the register set
+ */
+typedef __vki_vector128 vki_elf_vrreg_t;
+typedef vki_elf_vrreg_t vki_elf_vrregset_t[VKI_ELF_NVRREG];
+
+//----------------------------------------------------------------------
+// From linux-2.6.13/include/asm-ppc64/sigcontext.h
+//----------------------------------------------------------------------
+
+struct vki_sigcontext {
+  unsigned long       _unused[4];
+  int                 signal;
+  int                 _pad0;
+  unsigned long       handler;
+  unsigned long       oldmask;
+  struct vki_pt_regs  __user *regs;
+  vki_elf_gregset_t   gp_regs;
+  vki_elf_fpregset_t  fp_regs;
+  /*
+   * To maintain compatibility with current implementations the sigcontext is
+   * extended by appending a pointer (v_regs) to a quadword type (elf_vrreg_t)
+   * followed by an unstructured (vmx_reserve) field of 69 doublewords.  This
+   * allows the array of vector registers to be quadword aligned independent of
+   * the alignment of the containing sigcontext or ucontext. It is the
+   * responsibility of the code setting the sigcontext to set this pointer to
+   * either NULL (if this processor does not support the VMX feature) or the
+   * address of the first quadword within the allocated (vmx_reserve) area.
+   *
+   * The pointer (v_regs) of vector type (elf_vrreg_t) is type compatible with
+   * an array of 34 quadword entries (elf_vrregset_t).  The entries with
+   * indexes 0-31 contain the corresponding vector registers.  The entry with
+   * index 32 contains the vscr as the last word (offset 12) within the
+   * quadword.  This allows the vscr to be stored as either a quadword (since
+   * it must be copied via a vector register to/from storage) or as a word.
+   * The entry with index 33 contains the vrsave as the first word (offset 0)
+   * within the quadword.
+   */
+  vki_elf_vrreg_t  __user *v_regs;
+  long             vmx_reserve[VKI_ELF_NVRREG+VKI_ELF_NVRREG+1];
+};
+
+//----------------------------------------------------------------------
+// From linux-2.6.13/include/asm-ppc64/mman.h
+//----------------------------------------------------------------------
+
+#define VKI_PROT_NONE       0x0             /* page can not be accessed */
+#define VKI_PROT_READ       0x1             /* page can be read */
+#define VKI_PROT_WRITE      0x2             /* page can be written */
+#define VKI_PROT_EXEC       0x4             /* page can be executed */
+#define VKI_PROT_GROWSDOWN  0x01000000      /* mprotect flag: extend
+					       change to start of
+					       growsdown vma */
+#define VKI_PROT_GROWSUP    0x02000000      /* mprotect flag: extend
+					       change to end of
+					       growsup vma */
+
+#define VKI_MAP_SHARED      0x01            /* Share changes */
+#define VKI_MAP_PRIVATE     0x02            /* Changes are private */
+#define VKI_MAP_FIXED       0x10            /* Interpret addr exactly */
+#define VKI_MAP_ANONYMOUS   0x20            /* don't use a file */
+#define VKI_MAP_NORESERVE   0x40            /* don't reserve swap pages */
+
+//----------------------------------------------------------------------
+// From linux-2.6.13/include/asm-ppc64/fcntl.h
+//----------------------------------------------------------------------
+
+#define VKI_O_RDONLY             00
+#define VKI_O_WRONLY             01
+#define VKI_O_RDWR               02
+#define VKI_O_CREAT            0100 /* not fcntl */
+#define VKI_O_EXCL             0200 /* not fcntl */
+#define VKI_O_TRUNC           01000 /* not fcntl */
+#define VKI_O_APPEND          02000
+#define VKI_O_NONBLOCK        04000
+
+#define VKI_F_DUPFD         0       /* dup */
+#define VKI_F_GETFD         1       /* get close_on_exec */
+#define VKI_F_SETFD         2       /* set/clear close_on_exec */
+#define VKI_F_GETFL         3       /* get file->f_flags */
+#define VKI_F_SETFL         4       /* set file->f_flags */
+#define VKI_F_GETLK         5
+#define VKI_F_SETLK         6
+#define VKI_F_SETLKW        7
+
+#define VKI_F_SETOWN        8       /*  for sockets. */
+#define VKI_F_GETOWN        9       /*  for sockets. */
+#define VKI_F_SETSIG        10      /*  for sockets. */
+#define VKI_F_GETSIG        11      /*  for sockets. */
+
+/* for F_[GET|SET]FL */
+#define VKI_FD_CLOEXEC  1  /* actually anything with low bit set goes */
+
+#define VKI_F_LINUX_SPECIFIC_BASE   1024
+
+//----------------------------------------------------------------------
+// From linux-2.6.13/include/asm-ppc64/resource.h
+//----------------------------------------------------------------------
+
+// which just does #include <asm-generic/resource.h>
+
+#define VKI_RLIMIT_DATA             2       /* max data size */
+#define VKI_RLIMIT_STACK            3       /* max stack size */
+#define VKI_RLIMIT_CORE             4       /* max core file size */
+#define VKI_RLIMIT_NOFILE           7       /* max number of open files */
+
+//----------------------------------------------------------------------
+// From linux-2.6.13/include/asm-ppc64/socket.h
+//----------------------------------------------------------------------
+
+#define VKI_SOL_SOCKET      1
+
+#define VKI_SO_TYPE         3
+
+//----------------------------------------------------------------------
+// From linux-2.6.13/include/asm-ppc64/sockios.h
+//----------------------------------------------------------------------
+
+#define VKI_SIOCSPGRP       0x8902
+#define VKI_SIOCGPGRP       0x8904
+#define VKI_SIOCGSTAMP      0x8906          /* Get stamp */
+
+//----------------------------------------------------------------------
+// From linux-2.6.13/include/asm-ppc64/stat.h
+//----------------------------------------------------------------------
+
+struct vki_stat {
+  unsigned long   st_dev;
+  unsigned long   st_ino;
+  unsigned short  st_nlink;
+  unsigned short  st_mode;
+  unsigned short  st_uid;
+  unsigned short  st_gid;
+  unsigned long   st_rdev;
+  long            st_size;
+  unsigned long   st_blksize;
+  unsigned long   st_blocks;
+  unsigned long   st_atime;
+  unsigned long   st_atime_nsec;
+  unsigned long   st_mtime;
+  unsigned long   st_mtime_nsec;
+  unsigned long   st_ctime;
+  unsigned long   st_ctime_nsec;
+  unsigned long   __unused4;
+  unsigned long   __unused5;
+  unsigned long   __unused6;
+};
+
+#define VKI_STAT_HAVE_NSEC 1
+
+/* This matches struct stat64 in glibc2.1. Only used for 32 bit. */
+struct vki_stat64 {
+  unsigned long st_dev;           /* Device.  */
+  unsigned long st_ino;           /* File serial number.  */
+  unsigned int st_mode;           /* File mode.  */
+  unsigned int st_nlink;          /* Link count.  */
+  unsigned int st_uid;            /* User ID of the file's owner.  */
+  unsigned int st_gid;            /* Group ID of the file's group. */
+  unsigned long st_rdev;          /* Device number, if device.  */
+  unsigned short __pad2;
+  long st_size;                   /* Size of file, in bytes.  */
+  int  st_blksize;                /* Optimal block size for I/O.  */
+
+  long st_blocks;                 /* Number 512-byte blocks allocated. */
+  int   st_atime;                 /* Time of last access.  */
+  int   st_atime_nsec;
+  int   st_mtime;                 /* Time of last modification.  */
+  int   st_mtime_nsec;
+  int   st_ctime;                 /* Time of last status change.  */
+  int   st_ctime_nsec;
+  unsigned int   __unused4;
+  unsigned int   __unused5;
+};
+
+//----------------------------------------------------------------------
+// From linux-2.6.13/include/asm-ppc64/statfs.h
+//----------------------------------------------------------------------
+
+struct vki_statfs {
+  long f_type;
+  long f_bsize;
+  long f_blocks;
+  long f_bfree;
+  long f_bavail;
+  long f_files;
+  long f_ffree;
+  __vki_kernel_fsid_t f_fsid;
+  long f_namelen;
+  long f_frsize;
+  long f_spare[5];
+};
+
+//----------------------------------------------------------------------
+// From linux-2.6.13/include/asm-ppc64/termios.h
+//----------------------------------------------------------------------
+
+struct vki_winsize {
+  unsigned short ws_row;
+  unsigned short ws_col;
+  unsigned short ws_xpixel;
+  unsigned short ws_ypixel;
+};
+
+#define VKI_NCC 10
+struct vki_termio {
+  unsigned short c_iflag;         /* input mode flags */
+  unsigned short c_oflag;         /* output mode flags */
+  unsigned short c_cflag;         /* control mode flags */
+  unsigned short c_lflag;         /* local mode flags */
+  unsigned char c_line;           /* line discipline */
+  unsigned char c_cc[VKI_NCC];    /* control characters */
+};
+
+//----------------------------------------------------------------------
+// From linux-2.6.13/include/asm-ppc64/termbits.h
+//----------------------------------------------------------------------
+
+typedef unsigned char   vki_cc_t;
+typedef unsigned int    vki_speed_t;
+typedef unsigned int    vki_tcflag_t;
+
+#define VKI_NCCS 19
+struct vki_termios {
+  vki_tcflag_t c_iflag;               /* input mode flags */
+  vki_tcflag_t c_oflag;               /* output mode flags */
+  vki_tcflag_t c_cflag;               /* control mode flags */
+  vki_tcflag_t c_lflag;               /* local mode flags */
+  vki_cc_t c_cc[VKI_NCCS];            /* control characters */
+  vki_cc_t c_line;                    /* line discipline (== c_cc[19]) */
+  vki_speed_t c_ispeed;               /* input speed */
+  vki_speed_t c_ospeed;               /* output speed */
+};
+
+//----------------------------------------------------------------------
+// From linux-2.6.13/include/asm-ppc64/ioctl.h
+//----------------------------------------------------------------------
+
+#define _VKI_IOC_NRBITS     8
+#define _VKI_IOC_TYPEBITS   8
+#define _VKI_IOC_SIZEBITS   13
+#define _VKI_IOC_DIRBITS    3
+
+#define _VKI_IOC_NRMASK     ((1 << _VKI_IOC_NRBITS)-1)
+#define _VKI_IOC_TYPEMASK   ((1 << _VKI_IOC_TYPEBITS)-1)
+#define _VKI_IOC_SIZEMASK   ((1 << _VKI_IOC_SIZEBITS)-1)
+#define _VKI_IOC_DIRMASK    ((1 << _VKI_IOC_DIRBITS)-1)
+
+#define _VKI_IOC_NRSHIFT    0
+#define _VKI_IOC_TYPESHIFT  (_VKI_IOC_NRSHIFT+_VKI_IOC_NRBITS)
+#define _VKI_IOC_SIZESHIFT  (_VKI_IOC_TYPESHIFT+_VKI_IOC_TYPEBITS)
+#define _VKI_IOC_DIRSHIFT   (_VKI_IOC_SIZESHIFT+_VKI_IOC_SIZEBITS)
+
+/*
+ * Direction bits _IOC_NONE could be 0, but OSF/1 gives it a bit.
+ * And this turns out useful to catch old ioctl numbers in header
+ * files for us.
+ */
+#define _VKI_IOC_NONE       1U
+#define _VKI_IOC_READ       2U
+#define _VKI_IOC_WRITE      4U
+
+#define _VKI_IOC(dir,type,nr,size) \
+        (((dir)  << _VKI_IOC_DIRSHIFT) | \
+         ((type) << _VKI_IOC_TYPESHIFT) | \
+         ((nr)   << _VKI_IOC_NRSHIFT) | \
+         ((size) << _VKI_IOC_SIZESHIFT))
+
+/* provoke compile error for invalid uses of size argument */
+extern unsigned int __invalid_size_argument_for_IOC;
+#define _VKI_IOC_TYPECHECK(t) \
+       ((sizeof(t) == sizeof(t[1]) && \
+         sizeof(t) < (1 << _VKI_IOC_SIZEBITS)) ? \
+         sizeof(t) : __invalid_size_argument_for_IOC)
+
+/* used to create numbers */
+#define _VKI_IO(type,nr)            _VKI_IOC(_VKI_IOC_NONE,(type),(nr),0)
+#define _VKI_IOR(type,nr,size)      _VKI_IOC(_VKI_IOC_READ,(type),(nr), \
+                                       (_VKI_IOC_TYPECHECK(size)))
+#define _VKI_IOW(type,nr,size)      _VKI_IOC(_VKI_IOC_WRITE,(type),(nr), \
+                                       (_VKI_IOC_TYPECHECK(size)))
+#define _VKI_IOWR(type,nr,size)     _VKI_IOC(_VKI_IOC_READ|_VKI_IOC_WRITE, \
+                                       (type),(nr),(_VKI_IOC_TYPECHECK(size)))
+#define _VKI_IOR_BAD(type,nr,size)  _VKI_IOC(_VKI_IOC_READ,(type),(nr), \
+                                       sizeof(size))
+#define _VKI_IOW_BAD(type,nr,size)  _VKI_IOC(_VKI_IOC_WRITE,(type),(nr), \
+                                       sizeof(size))
+#define _VKI_IOWR_BAD(type,nr,size) _VKI_IOC(_VKI_IOC_READ|_VKI_IOC_WRITE, \
+                                       (type),(nr),sizeof(size))
+
+/* used to decode them.. */
+#define _VKI_IOC_DIR(nr)        (((nr) >> _VKI_IOC_DIRSHIFT) & _VKI_IOC_DIRMASK)
+#define _VKI_IOC_TYPE(nr)       (((nr) >> _VKI_IOC_TYPESHIFT) & _VKI_IOC_TYPEMASK)
+#define _VKI_IOC_NR(nr)         (((nr) >> _VKI_IOC_NRSHIFT) & _VKI_IOC_NRMASK)
+#define _VKI_IOC_SIZE(nr)       (((nr) >> _VKI_IOC_SIZESHIFT) & _VKI_IOC_SIZEMASK)
+
+//----------------------------------------------------------------------
+// From linux-2.6.13/include/asm-ppc64/ioctls.h
+//----------------------------------------------------------------------
+
+#define VKI_TCGETS          _VKI_IOR('t', 19, struct vki_termios)
+#define VKI_TCSETS          _VKI_IOW('t', 20, struct vki_termios)
+#define VKI_TCSETSW         _VKI_IOW('t', 21, struct vki_termios)
+#define VKI_TCSETSF         _VKI_IOW('t', 22, struct vki_termios)
+#define VKI_TCGETA          _VKI_IOR('t', 23, struct vki_termio)
+#define VKI_TCSETA          _VKI_IOW('t', 24, struct vki_termio)
+#define VKI_TCSETAW         _VKI_IOW('t', 25, struct vki_termio)
+#define VKI_TCSETAF         _VKI_IOW('t', 28, struct vki_termio)
+#define VKI_TCSBRK          _VKI_IO('t', 29)
+#define VKI_TCXONC          _VKI_IO('t', 30)
+#define VKI_TCFLSH          _VKI_IO('t', 31)
+#define VKI_TIOCSCTTY       0x540E
+#define VKI_TIOCGPGRP       _VKI_IOR('t', 119, int)
+#define VKI_TIOCSPGRP       _VKI_IOW('t', 118, int)
+#define VKI_TIOCOUTQ        _VKI_IOR('t', 115, int)     /* output queue size */
+#define VKI_TIOCGWINSZ      _VKI_IOR('t', 104, struct vki_winsize)
+#define VKI_TIOCSWINSZ      _VKI_IOW('t', 103, struct vki_winsize)
+#define VKI_TIOCMGET        0x5415
+#define VKI_TIOCMBIS        0x5416
+#define VKI_TIOCMBIC        0x5417
+#define VKI_TIOCMSET        0x5418
+#define VKI_FIONREAD        _VKI_IOR('f', 127, int)
+#define VKI_TIOCLINUX       0x541C
+#define VKI_FIONBIO         _VKI_IOW('f', 126, int)
+#define VKI_TCSBRKP         0x5425  /* Needed for POSIX tcsendbreak() */
+#define VKI_TIOCGPTN        _VKI_IOR('T',0x30, unsigned int) 
+                            /* Get Pty Number (of pty-mux device) */
+#define VKI_TIOCSPTLCK      _VKI_IOW('T',0x31, int)  /* Lock/unlock Pty */
+#define VKI_FIOASYNC        _VKI_IOW('f', 125, int)
+
+//----------------------------------------------------------------------
+// From linux-2.6.13/include/asm-ppc64/poll.h
+//----------------------------------------------------------------------
+
+#define VKI_POLLIN          0x0001
+
+struct vki_pollfd {
+  int fd;
+  short events;
+  short revents;
+};
+
+//----------------------------------------------------------------------
+// From linux-2.6.13/include/asm-ppc64/user.h
+//----------------------------------------------------------------------
+
+// Not sure what's needed from here
+
+//----------------------------------------------------------------------
+// From linux-2.6.13/include/asm-ppc64/elf.h
+//----------------------------------------------------------------------
+
+// Not sure what's needed from here
+
+//----------------------------------------------------------------------
+// From linux-2.6.13/include/asm-ppc64/ucontext.h
+//----------------------------------------------------------------------
+
+struct vki_ucontext {
+  unsigned long         uc_flags;
+  struct vki_ucontext  *uc_link;
+  vki_stack_t           uc_stack;
+  vki_sigset_t          uc_sigmask;
+  vki_sigset_t          __unused[15]; /* Allow for uc_sigmask growth */
+  struct vki_sigcontext uc_mcontext;  /* last for extensibility */
+};
+
+//----------------------------------------------------------------------
+// From linux-2.6.13/include/asm-ppc64/ipcbuf.h
+//----------------------------------------------------------------------
+
+struct vki_ipc64_perm
+{
+  __vki_kernel_key_t  key;
+  __vki_kernel_uid_t  uid;
+  __vki_kernel_gid_t  gid;
+  __vki_kernel_uid_t  cuid;
+  __vki_kernel_gid_t  cgid;
+  __vki_kernel_mode_t mode;
+  unsigned int        seq;
+  unsigned int        __pad1;
+  unsigned long       __unused1;
+  unsigned long       __unused2;
+};
+
+//----------------------------------------------------------------------
+// From linux-2.6.13/include/asm-ppc64/sembuf.h
+//----------------------------------------------------------------------
+
+struct vki_semid64_ds {
+  struct vki_ipc64_perm sem_perm;     /* permissions .. see ipc.h */
+  __vki_kernel_time_t   sem_otime;      /* last semop time */
+  __vki_kernel_time_t   sem_ctime;      /* last change time */
+  unsigned long         sem_nsems;      /* no. of semaphores in array */
+  unsigned long         __unused1;
+  unsigned long         __unused2;
+};
+
+//----------------------------------------------------------------------
+// From linux-2.6.13/include/asm-ppc64/msgbuf.h
+//----------------------------------------------------------------------
+
+struct vki_msqid64_ds {
+  struct vki_ipc64_perm msg_perm;
+  __vki_kernel_time_t   msg_stime;      /* last msgsnd time */
+  __vki_kernel_time_t   msg_rtime;      /* last msgrcv time */
+  __vki_kernel_time_t   msg_ctime;      /* last change time */
+  unsigned long         msg_cbytes;      /* current number of bytes on queue */
+  unsigned long         msg_qnum;        /* number of messages in queue */
+  unsigned long         msg_qbytes;      /* max number of bytes on queue */
+  __vki_kernel_pid_t    msg_lspid;       /* pid of last msgsnd */
+  __vki_kernel_pid_t    msg_lrpid;       /* last receive pid */
+  unsigned long         __unused1;
+  unsigned long         __unused2;
+};
+
+//----------------------------------------------------------------------
+// From linux-2.6.13/include/asm-ppc64/ipc.h
+//----------------------------------------------------------------------
+
+// this just does #include <asm-generic/ipc.h>
+
+struct vki_ipc_kludge {
+  struct vki_msgbuf __user *msgp;
+  long msgtyp;
+};
+
+#define VKI_SEMOP            1
+#define VKI_SEMGET           2
+#define VKI_SEMCTL           3
+#define VKI_SEMTIMEDOP       4
+#define VKI_MSGSND          11
+#define VKI_MSGRCV          12
+#define VKI_MSGGET          13
+#define VKI_MSGCTL          14
+#define VKI_SHMAT           21
+#define VKI_SHMDT           22
+#define VKI_SHMGET          23
+#define VKI_SHMCTL          24
+
+//----------------------------------------------------------------------
+// From linux-2.6.13/include/asm-ppc64/shmbuf.h
+//----------------------------------------------------------------------
+
+struct vki_shmid64_ds {
+  struct vki_ipc64_perm       shm_perm;       /* operation perms */
+  __vki_kernel_time_t         shm_atime;      /* last attach time */
+  __vki_kernel_time_t         shm_dtime;      /* last detach time */
+  __vki_kernel_time_t         shm_ctime;      /* last change time */
+  vki_size_t                  shm_segsz;      /* size of segment (bytes) */
+  __vki_kernel_pid_t          shm_cpid;       /* pid of creator */
+  __vki_kernel_pid_t          shm_lpid;       /* pid of last operator */
+  unsigned long               shm_nattch;     /* no. of current attaches */
+  unsigned long               __unused1;
+  unsigned long               __unused2;
+};
+
+struct vki_shminfo64 {
+  unsigned long   shmmax;
+  unsigned long   shmmin;
+  unsigned long   shmmni;
+  unsigned long   shmseg;
+  unsigned long   shmall;
+  unsigned long   __unused1;
+  unsigned long   __unused2;
+  unsigned long   __unused3;
+  unsigned long   __unused4;
+};
+
+//----------------------------------------------------------------------
+// end
+//----------------------------------------------------------------------
+
+#endif // __PPC64_LINUX_VKI_ARCH_H
+
+/*--------------------------------------------------------------------*/
+/*--- end                                                          ---*/
+/*--------------------------------------------------------------------*/