Bug 345248 - add support for Solaris OS in valgrind

Authors of this port:
    Petr Pavlu         setup@dagobah.cz
    Ivo Raisr          ivosh@ivosh.net
    Theo Schlossnagle  theo@omniti.com
            


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15426 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/include/Makefile.am b/include/Makefile.am
index 9e5d2b4..e7c3e25 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -46,6 +46,8 @@
 	valgrind.h			\
 	vki/vki-linux.h			\
 	vki/vki-darwin.h		\
+	vki/vki-solaris.h		\
+	vki/vki-solaris-repcache.h	\
 	vki/vki-posixtypes-amd64-linux.h \
 	vki/vki-posixtypes-arm64-linux.h \
 	vki/vki-posixtypes-ppc32-linux.h \
@@ -74,6 +76,7 @@
 	vki/vki-scnums-mips32-linux.h	\
 	vki/vki-scnums-mips64-linux.h	\
 	vki/vki-scnums-darwin.h         \
+	vki/vki-scnums-solaris.h	\
 	vki/vki-xen.h                   \
 	vki/vki-xen-domctl.h		\
 	vki/vki-xen-evtchn.h		\
diff --git a/include/pub_tool_basics.h b/include/pub_tool_basics.h
index 82d1390..763f685 100644
--- a/include/pub_tool_basics.h
+++ b/include/pub_tool_basics.h
@@ -102,7 +102,7 @@
 // used in those cases.
 // Nb: on Linux, off_t is a signed word-sized int.  On Darwin it's
 // always a signed 64-bit int.  So we defined our own Off64T as well.
-#if defined(VGO_linux)
+#if defined(VGO_linux) || defined(VGO_solaris)
 typedef Word                   OffT;      // 32             64
 #elif defined(VGO_darwin)
 typedef Long                   OffT;      // 64             64
@@ -157,6 +157,12 @@
          userspace, but we have to record it, so that we can correctly
          update both {R,E}DX and {R,E}AX (in guest state) given a SysRes,
          if we're required to.
+
+   Solaris:
+      When _isError == False,
+         _val and _val2 hold the return value.
+      When _isError == True,
+         _val holds the error code.
 */
 #if defined(VGP_mips32_linux) || defined(VGP_mips64_linux)
 typedef
@@ -193,6 +199,15 @@
    }
    SysRes;
 
+#elif defined(VGO_solaris)
+typedef
+   struct {
+      UWord _val;
+      UWord _val2;
+      Bool  _isError;
+   }
+   SysRes;
+
 #else
 #  error "Unknown OS"
 #endif
@@ -316,6 +331,27 @@
           && sr1._wLO == sr2._wLO && sr1._wHI == sr2._wHI;
 }
 
+#elif defined(VGO_solaris)
+
+static inline Bool sr_isError ( SysRes sr ) {
+   return sr._isError;
+}
+static inline UWord sr_Res ( SysRes sr ) {
+   return sr._isError ? 0 : sr._val;
+}
+static inline UWord sr_ResHI ( SysRes sr ) {
+   return sr._isError ? 0 : sr._val2;
+}
+static inline UWord sr_Err ( SysRes sr ) {
+   return sr._isError ? sr._val : 0;
+}
+static inline Bool sr_EQ ( UInt sysno, SysRes sr1, SysRes sr2 ) {
+   /* sysno is ignored for Solaris */
+   return sr1._val == sr2._val
+       && sr1._val2 == sr2._val2
+       && sr1._isError == sr2._isError;
+}
+
 #else
 #  error "Unknown OS"
 #endif
diff --git a/include/pub_tool_basics_asm.h b/include/pub_tool_basics_asm.h
index 0173e68..2d63c47 100644
--- a/include/pub_tool_basics_asm.h
+++ b/include/pub_tool_basics_asm.h
@@ -48,7 +48,7 @@
 
 #define VGAPPEND(str1,str2) str1##str2
  
-#if defined(VGO_linux)
+#if defined(VGO_linux) || defined(VGO_solaris)
 #  define VG_(str)    VGAPPEND( vgPlain_,          str)
 #  define ML_(str)    VGAPPEND( vgModuleLocal_,    str)
 #elif defined(VGO_darwin)
diff --git a/include/pub_tool_libcfile.h b/include/pub_tool_libcfile.h
index 3df5be5..7ebdaf6 100644
--- a/include/pub_tool_libcfile.h
+++ b/include/pub_tool_libcfile.h
@@ -93,7 +93,7 @@
 
 extern SSizeT VG_(readlink)( const HChar* path, HChar* buf, SizeT bufsiz);
 
-#if defined(VGO_linux)
+#if defined(VGO_linux) || defined(VGO_solaris)
 extern Int    VG_(getdents64)( Int fd, struct vki_dirent64 *dirp, UInt count );
 #endif
 
diff --git a/include/pub_tool_libcproc.h b/include/pub_tool_libcproc.h
index 0e2afdc..f11cc74 100644
--- a/include/pub_tool_libcproc.h
+++ b/include/pub_tool_libcproc.h
@@ -51,14 +51,27 @@
 // platforms.
 extern const HChar* VG_(LD_PRELOAD_var_name);
 
+/* Resolves filename of VG_(cl_exec_fd) and copies it to the buffer. 
+   Buffer must not be NULL and buf_size must be at least 1.
+   If buffer is not large enough it is terminated with '\0' only
+   when 'terminate_with_NUL == True'. */
+extern void VG_(client_fname)(HChar *buffer, SizeT buf_size,
+                              Bool terminate_with_NUL);
+
+/* Concatenates client exename and command line arguments into
+   the buffer. Buffer must not be NULL and buf_size must be
+   at least 1. Buffer is always terminated with '\0'. */
+extern void VG_(client_cmd_and_args)(HChar *buffer, SizeT buf_size);
+
 /* ---------------------------------------------------------------------
    Important syscalls
    ------------------------------------------------------------------ */
 
 extern Int  VG_(waitpid)( Int pid, Int *status, Int options );
 extern Int  VG_(system) ( const HChar* cmd );
+extern Int  VG_(spawn)  ( const HChar *filename, const HChar **argv );
 extern Int  VG_(fork)   ( void);
-extern void VG_(execv)  ( const HChar* filename, HChar** argv );
+extern void VG_(execv)  ( const HChar* filename, const HChar** argv );
 extern Int  VG_(sysctl) ( Int *name, UInt namelen, void *oldp, SizeT *oldlenp, void *newp, SizeT newlen );
 
 /* ---------------------------------------------------------------------
diff --git a/include/pub_tool_machine.h b/include/pub_tool_machine.h
index 1e31179..899b3e9 100644
--- a/include/pub_tool_machine.h
+++ b/include/pub_tool_machine.h
@@ -34,14 +34,14 @@
 #include "pub_tool_basics.h"           // ThreadID
 #include "libvex.h"                    // VexArchInfo
 
-#if defined(VGP_x86_linux)
+#if defined(VGP_x86_linux) || defined(VGP_x86_solaris)
 #  define VG_MIN_INSTR_SZB          1  // min length of native instruction
 #  define VG_MAX_INSTR_SZB         16  // max length of native instruction
 #  define VG_CLREQ_SZB             14  // length of a client request, may
                                        //   be larger than VG_MAX_INSTR_SZB
 #  define VG_STACK_REDZONE_SZB      0  // number of addressable bytes below %RSP
 
-#elif defined(VGP_amd64_linux)
+#elif defined(VGP_amd64_linux) || defined(VGP_amd64_solaris)
 #  define VG_MIN_INSTR_SZB          1
 #  define VG_MAX_INSTR_SZB         16
 #  define VG_CLREQ_SZB             19
diff --git a/include/pub_tool_redir.h b/include/pub_tool_redir.h
index f99ffb7..2afca47 100644
--- a/include/pub_tool_redir.h
+++ b/include/pub_tool_redir.h
@@ -186,6 +186,7 @@
      (         -->  ZL    (left)
      )         -->  ZR    (right)
      Z         -->  ZZ    (Z)
+     /         -->  ZS    (slash)
 
    Everything else is left unchanged.
 */
@@ -240,7 +241,7 @@
 
 /* --- Soname of the standard C library. --- */
 
-#if defined(VGO_linux)
+#if defined(VGO_linux) || defined(VGO_solaris)
 #  define  VG_Z_LIBC_SONAME  libcZdsoZa              // libc.so*
 
 #elif defined(VGO_darwin) && (DARWIN_VERS <= DARWIN_10_6)
@@ -276,6 +277,8 @@
 #  define  VG_Z_LIBPTHREAD_SONAME  libpthreadZdsoZd0     // libpthread.so.0
 #elif defined(VGO_darwin)
 #  define  VG_Z_LIBPTHREAD_SONAME  libSystemZdZaZddylib  // libSystem.*.dylib
+#elif defined(VGO_solaris)
+#  define  VG_Z_LIBPTHREAD_SONAME  libpthreadZdsoZd1     // libpthread.so.1
 #else
 #  error "Unknown platform"
 #endif
@@ -315,6 +318,27 @@
 
 #endif
 
+/* --- Soname for Solaris run-time linker. --- */
+// Note: run-time linker contains absolute pathname in the SONAME.
+
+#if defined(VGO_solaris)
+
+#if defined(VGP_x86_solaris)
+#  define  VG_Z_LD_SO_1           ZSlibZSldZdsoZd1         // /lib/ld.so.1
+#  define  VG_U_LD_SO_1           "/lib/ld.so.1"
+#elif defined(VGP_amd64_solaris)
+#  define  VG_Z_LD_SO_1           ZSlibZSamd64ZSldZdsoZd1  // /lib/amd64/ld.so.1
+#  define  VG_U_LD_SO_1           "/lib/amd64/ld.so.1"
+#else
+#  error "Unknown platform"
+#endif
+
+/* --- Soname for Solaris libumem allocation interposition. --- */
+
+#define  VG_Z_LIBUMEM_SO_1          libumemZdsoZd1             // libumem.so.1
+#define  VG_U_LIBUMEM_SO_1          "libumem.so.1"
+
+#endif
 
 // Prefix for synonym soname synonym handling
 #define VG_SO_SYN(name)       VgSoSyn##name
diff --git a/include/pub_tool_tooliface.h b/include/pub_tool_tooliface.h
index 3952f29..c9419c4 100644
--- a/include/pub_tool_tooliface.h
+++ b/include/pub_tool_tooliface.h
@@ -631,6 +631,16 @@
 void VG_(track_post_reg_write_clientcall_return)(
       void(*f)(ThreadId tid, PtrdiffT guest_state_offset, SizeT size, Addr f));
 
+/* Mem-to-reg or reg-to-mem copy functions, these ones occur around syscalls
+   and signal handling when the VCPU state is saved to (or restored from) the
+   client memory. */
+void VG_(track_copy_mem_to_reg)(void(*f)(CorePart part, ThreadId tid,
+                                         Addr a, PtrdiffT guest_state_offset,
+                                         SizeT size));
+void VG_(track_copy_reg_to_mem)(void(*f)(CorePart part, ThreadId tid,
+                                         PtrdiffT guest_state_offset,
+                                         Addr a, SizeT size));
+
 
 /* Scheduler events (not exhaustive) */
 
diff --git a/include/pub_tool_vki.h b/include/pub_tool_vki.h
index 2966ce3..9c30954 100644
--- a/include/pub_tool_vki.h
+++ b/include/pub_tool_vki.h
@@ -50,6 +50,8 @@
 #  include "vki/vki-linux-drm.h"
 #elif defined(VGO_darwin)
 #  include "vki/vki-darwin.h"
+#elif defined(VGO_solaris)
+#  include "vki/vki-solaris.h"
 #else
 #  error Unknown Plat/OS
 #endif
diff --git a/include/pub_tool_vkiscnums_asm.h b/include/pub_tool_vkiscnums_asm.h
index 860e8d0..d7bf49b 100644
--- a/include/pub_tool_vkiscnums_asm.h
+++ b/include/pub_tool_vkiscnums_asm.h
@@ -66,6 +66,9 @@
 #elif defined(VGP_tilegx_linux)
 #  include "vki/vki-scnums-tilegx-linux.h"
 
+#elif defined(VGP_x86_solaris) || (VGP_amd64_solaris)
+#  include "vki/vki-scnums-solaris.h"
+
 #else
 #  error Unknown platform
 #endif
diff --git a/include/valgrind.h b/include/valgrind.h
index 4baf855..c4e347d 100644
--- a/include/valgrind.h
+++ b/include/valgrind.h
@@ -123,6 +123,8 @@
 #undef PLAT_mips32_linux
 #undef PLAT_mips64_linux
 #undef PLAT_tilegx_linux
+#undef PLAT_x86_solaris
+#undef PLAT_amd64_solaris
 
 
 #if defined(__APPLE__) && defined(__i386__)
@@ -160,6 +162,10 @@
 #  define PLAT_mips32_linux 1
 #elif defined(__linux__) && defined(__tilegx__)
 #  define PLAT_tilegx_linux 1
+#elif defined(__sun) && defined(__i386__)
+#  define PLAT_x86_solaris 1
+#elif defined(__sun) && defined(__x86_64__)
+#  define PLAT_amd64_solaris 1
 #else
 /* If we're not compiling for our target platform, don't generate
    any inline asms.  */
@@ -247,10 +253,11 @@
    inline asm stuff to be useful.
 */
 
-/* ------------------------- x86-{linux,darwin} ---------------- */
+/* ----------------- x86-{linux,darwin,solaris} ---------------- */
 
 #if defined(PLAT_x86_linux)  ||  defined(PLAT_x86_darwin)  \
-    ||  (defined(PLAT_x86_win32) && defined(__GNUC__))
+    ||  (defined(PLAT_x86_win32) && defined(__GNUC__)) \
+    ||  defined(PLAT_x86_solaris)
 
 typedef
    struct { 
@@ -310,7 +317,8 @@
                     );                                           \
  } while (0)
 
-#endif /* PLAT_x86_linux || PLAT_x86_darwin || (PLAT_x86_win32 && __GNUC__) */
+#endif /* PLAT_x86_linux || PLAT_x86_darwin || (PLAT_x86_win32 && __GNUC__)
+          || PLAT_x86_solaris */
 
 /* ------------------------- x86-Win32 ------------------------- */
 
@@ -385,9 +393,10 @@
 
 #endif /* PLAT_x86_win32 */
 
-/* ------------------------ amd64-{linux,darwin} --------------- */
+/* ----------------- amd64-{linux,darwin,solaris} --------------- */
 
 #if defined(PLAT_amd64_linux)  ||  defined(PLAT_amd64_darwin) \
+    ||  defined(PLAT_amd64_solaris) \
     ||  (defined(PLAT_amd64_win64) && defined(__GNUC__))
 
 typedef
@@ -448,7 +457,7 @@
                     );                                           \
  } while (0)
 
-#endif /* PLAT_amd64_linux || PLAT_amd64_darwin */
+#endif /* PLAT_amd64_linux || PLAT_amd64_darwin || PLAT_amd64_solaris */
 
 /* ------------------------- amd64-Win64 ------------------------- */
 
@@ -1202,9 +1211,10 @@
    do { volatile unsigned long _junk;                             \
         CALL_FN_W_7W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6,arg7); } while (0)
 
-/* ------------------------- x86-{linux,darwin} ---------------- */
+/* ----------------- x86-{linux,darwin,solaris} ---------------- */
 
-#if defined(PLAT_x86_linux)  ||  defined(PLAT_x86_darwin)
+#if defined(PLAT_x86_linux)  ||  defined(PLAT_x86_darwin) \
+    ||  defined(PLAT_x86_solaris)
 
 /* These regs are trashed by the hidden call.  No need to mention eax
    as gcc can already see that, plus causes gcc to bomb. */
@@ -1631,11 +1641,12 @@
       lval = (__typeof__(lval)) _res;                             \
    } while (0)
 
-#endif /* PLAT_x86_linux || PLAT_x86_darwin */
+#endif /* PLAT_x86_linux || PLAT_x86_darwin || PLAT_x86_solaris */
 
-/* ------------------------ amd64-{linux,darwin} --------------- */
+/* ---------------- amd64-{linux,darwin,solaris} --------------- */
 
-#if defined(PLAT_amd64_linux)  ||  defined(PLAT_amd64_darwin)
+#if defined(PLAT_amd64_linux)  ||  defined(PLAT_amd64_darwin) \
+    ||  defined(PLAT_amd64_solaris)
 
 /* ARGREGS: rdi rsi rdx rcx r8 r9 (the rest on stack in R-to-L order) */
 
@@ -2184,7 +2195,7 @@
       lval = (__typeof__(lval)) _res;                                  \
    } while (0)
 
-#endif /* PLAT_amd64_linux || PLAT_amd64_darwin */
+#endif /* PLAT_amd64_linux || PLAT_amd64_darwin || PLAT_amd64_solaris */
 
 /* ------------------------ ppc32-linux ------------------------ */
 
@@ -7108,5 +7119,7 @@
 #undef PLAT_mips32_linux
 #undef PLAT_mips64_linux
 #undef PLAT_tilegx_linux
+#undef PLAT_x86_solaris
+#undef PLAT_amd64_solaris
 
 #endif   /* __VALGRIND_H */
diff --git a/include/vki/vki-scnums-solaris.h b/include/vki/vki-scnums-solaris.h
new file mode 100644
index 0000000..e1f5b9c
--- /dev/null
+++ b/include/vki/vki-scnums-solaris.h
@@ -0,0 +1,368 @@
+
+/*--------------------------------------------------------------------*/
+/*--- System call numbers for Solaris.        vki-scnums-solaris.h ---*/
+/*--------------------------------------------------------------------*/
+
+/*
+   This file is part of Valgrind, a dynamic binary instrumentation
+   framework.
+
+   Copyright (C) 2011-2015 Petr Pavlu
+      setup@dagobah.cz
+
+   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.
+*/
+
+/* Copyright 2013-2014, Ivo Raisr <ivosh@ivosh.net>. */
+
+/* Copyright 2013, OmniTI Computer Consulting, Inc. All rights reserved. */
+
+#ifndef __VKI_SCNUMS_SOLARIS_H
+#define __VKI_SCNUMS_SOLARIS_H
+
+/* Note: Basic information about Solaris syscalls can be found in the kernel
+   source file uts/common/os/sysent.c.
+ */
+
+/* Include sys/syscall.h to get SYS_* constants (and sys/trap.h to get T_*) to
+   avoid any copyright issues connected with their potential copying out of
+   the header file.
+ */
+#include <sys/syscall.h>
+#include <sys/trap.h>
+
+/* normal syscall (int $0x91) */
+#define VG_SOLARIS_SYSCALL_CLASS_CLASSIC        0
+/* fasttrap syscall (int $0xD2) */
+#define VG_SOLARIS_SYSCALL_CLASS_FASTTRAP       1
+
+#define VG_SOLARIS_SYSCALL_CLASS_SHIFT 24
+#define VG_SOLARIS_SYSCALL_NUMBER_MASK 0x00FFFFFF
+
+#define VG_SOLARIS_SYSCALL_CONSTRUCT_FASTTRAP(sysno) \
+   ((VG_SOLARIS_SYSCALL_CLASS_FASTTRAP << VG_SOLARIS_SYSCALL_CLASS_SHIFT) \
+    | (sysno))
+#define VG_SOLARIS_SYSNO_CLASS(sysno) \
+   ((sysno) >> VG_SOLARIS_SYSCALL_CLASS_SHIFT)
+#define VG_SOLARIS_SYSNO_INDEX(sysno) \
+   ((sysno) & VG_SOLARIS_SYSCALL_NUMBER_MASK)
+
+#define __NR_exit                       SYS_exit
+#if defined(SOLARIS_SPAWN_SYSCALL)
+#define __NR_spawn                      SYS_spawn
+#endif /* SOLARIS_SPAWN_SYSCALL */
+#define __NR_read                       SYS_read
+#define __NR_write                      SYS_write
+#define __NR_close                      SYS_close
+#define __NR_linkat                     SYS_linkat
+#define __NR_symlinkat                  SYS_symlinkat
+#define __NR_chdir                      SYS_chdir
+#define __NR_time                       SYS_time
+#define __NR_brk                        SYS_brk
+#define __NR_lseek                      SYS_lseek
+#define __NR_getpid                     SYS_getpid
+#define __NR_mount                      SYS_mount
+#define __NR_readlinkat                 SYS_readlinkat
+#define __NR_setuid                     SYS_setuid
+#define __NR_getuid                     SYS_getuid
+#define __NR_stime                      SYS_stime
+//#define __NR_pcsample                   SYS_pcsample
+#define __NR_alarm                      SYS_alarm
+#define __NR_pause                      SYS_pause
+#if defined(SOLARIS_FREALPATHAT_SYSCALL)
+#define __NR_frealpathat                SYS_frealpathat
+#endif /* SOLARIS_FREALPATHAT_SYSCALL */
+#define __NR_stty                       SYS_stty
+#define __NR_gtty                       SYS_gtty
+//#define __NR_nice                       SYS_nice
+//#define __NR_statfs                     SYS_statfs
+//#define __NR_sync                       SYS_sync
+#define __NR_kill                       SYS_kill
+//#define __NR_fstatfs                    SYS_fstatfs
+#define __NR_pgrpsys                    SYS_pgrpsys
+//#define __NR_uucopystr                  SYS_uucopystr
+#define __NR_pipe                       SYS_pipe
+#define __NR_times                      SYS_times
+//#define __NR_profil                     SYS_profil
+#define __NR_faccessat                  SYS_faccessat
+#define __NR_setgid                     SYS_setgid
+#define __NR_getgid                     SYS_getgid
+#define __NR_mknodat                    SYS_mknodat
+//#define __NR_msgsys                     SYS_msgsys
+#define __NR_sysi86                     SYS_sysi86
+//#define __NR_acct                       SYS_acct
+#define __NR_shmsys                     SYS_shmsys
+#define __NR_semsys                     SYS_semsys
+#define __NR_ioctl                      SYS_ioctl
+//#define __NR_uadmin                     SYS_uadmin
+#define __NR_fchownat                   SYS_fchownat
+//#define __NR_utssys                     SYS_utssys
+#define __NR_fdsync                     SYS_fdsync
+#define __NR_execve                     SYS_execve
+#define __NR_umask                      SYS_umask
+#define __NR_chroot                     SYS_chroot
+#define __NR_fcntl                      SYS_fcntl
+//#define __NR_ulimit                     SYS_ulimit
+#define __NR_renameat                   SYS_renameat
+#define __NR_unlinkat                   SYS_unlinkat
+#define __NR_fstatat                    SYS_fstatat
+#define __NR_fstatat64                  SYS_fstatat64
+#define __NR_openat                     SYS_openat
+#define __NR_openat64                   SYS_openat64
+#define __NR_tasksys                    SYS_tasksys
+//#define __NR_acctctl                    SYS_acctctl
+//#define __NR_exacctsys                  SYS_exacctsys
+#define __NR_getpagesizes               SYS_getpagesizes
+//#define __NR_rctlsys                    SYS_rctlsys
+//#define __NR_sidsys                     SYS_sidsys
+#define __NR_lwp_park                   SYS_lwp_park
+#define __NR_sendfilev                  SYS_sendfilev
+#if defined(SOLARIS_LWP_NAME_SYSCALL)
+#define __NR_lwp_name                   SYS_lwp_name
+#endif /* SOLARIS_LWP_NAME_SYSCALL */
+#define __NR_getdents                   SYS_getdents
+#define __NR_privsys                    SYS_privsys
+#define __NR_ucredsys                   SYS_ucredsys
+//#define __NR_sysfs                      SYS_sysfs
+#define __NR_getmsg                     SYS_getmsg
+#define __NR_putmsg                     SYS_putmsg
+#define __NR_setgroups                  SYS_setgroups
+#define __NR_getgroups                  SYS_getgroups
+#define __NR_sigprocmask                SYS_sigprocmask
+//#define __NR_sigsuspend                 SYS_sigsuspend
+#define __NR_sigaltstack                SYS_sigaltstack
+#define __NR_sigaction                  SYS_sigaction
+#define __NR_sigpending                 SYS_sigpending
+#define __NR_context                    SYS_context
+#define __NR_fchmodat                   SYS_fchmodat
+#define __NR_mkdirat                    SYS_mkdirat
+#define __NR_statvfs                    SYS_statvfs
+#define __NR_fstatvfs                   SYS_fstatvfs
+//#define __NR_getloadavg                 SYS_getloadavg
+#define __NR_nfssys                     SYS_nfssys
+#define __NR_waitid                     SYS_waitid
+#define __NR_waitsys                    SYS_waitsys /* = SYS_waitid (historical) */
+//#define __NR_sigsendsys                 SYS_sigsendsys
+//#define __NR_hrtsys                     SYS_hrtsys
+#if defined(SOLARIS_UTIMESYS_SYSCALL)
+#define __NR_utimesys                   SYS_utimesys
+#endif /* SOLARIS_UTIMESYS_SYSCALL */
+#if defined(SOLARIS_UTIMENSAT_SYSCALL)
+#define __NR_utimensat                  SYS_utimensat
+#endif /* SOLARIS_UTIMENSAT_SYSCALL */
+#define __NR_sigresend                  SYS_sigresend
+#define __NR_priocntlsys                SYS_priocntlsys
+#define __NR_pathconf                   SYS_pathconf
+//#define __NR_mincore                    SYS_mincore
+#define __NR_mmap                       SYS_mmap
+#define __NR_mprotect                   SYS_mprotect
+#define __NR_munmap                     SYS_munmap
+//#define __NR_fpathconf                  SYS_fpathconf
+//#define __NR_vfork                      SYS_vfork
+//#define __NR_fchdir                     SYS_fchdir
+#define __NR_readv                      SYS_readv
+#define __NR_writev                     SYS_writev
+#if defined(SOLARIS_UUIDSYS_SYSCALL)
+#define __NR_uuidsys                    SYS_uuidsys
+#endif /* SOLARIS_UUIDSYS_SYSCALL */
+#define __NR_mmapobj                    SYS_mmapobj
+#define __NR_setrlimit                  SYS_setrlimit
+#define __NR_getrlimit                  SYS_getrlimit
+#define __NR_memcntl                    SYS_memcntl
+#define __NR_getpmsg                    SYS_getpmsg
+#define __NR_putpmsg                    SYS_putpmsg
+#define __NR_uname                      SYS_uname
+#define __NR_setegid                    SYS_setegid
+#define __NR_sysconfig                  SYS_sysconfig
+//#define __NR_adjtime                    SYS_adjtime
+#define __NR_systeminfo                 SYS_systeminfo
+//#define __NR_sharefs                    SYS_sharefs
+#define __NR_seteuid                    SYS_seteuid
+#define __NR_forksys                    SYS_forksys
+#define __NR_sigtimedwait               SYS_sigtimedwait
+//#define __NR_lwp_info                   SYS_lwp_info
+#define __NR_yield                      SYS_yield
+#define __NR_lwp_sema_post              SYS_lwp_sema_post
+#define __NR_lwp_sema_trywait           SYS_lwp_sema_trywait
+#define __NR_lwp_detach                 SYS_lwp_detach
+//#define __NR_corectl                    SYS_corectl
+//#define __NR_modctl                     SYS_modctl
+#define __NR_fchroot                    SYS_fchroot
+//#define __NR_vhangup                    SYS_vhangup
+#define __NR_gettimeofday               SYS_gettimeofday
+#define __NR_getitimer                  SYS_getitimer
+#define __NR_setitimer                  SYS_setitimer
+#define __NR_lwp_create                 SYS_lwp_create
+#define __NR_lwp_exit                   SYS_lwp_exit
+#define __NR_lwp_suspend                SYS_lwp_suspend
+#define __NR_lwp_continue               SYS_lwp_continue
+#if defined(SOLARIS_LWP_SIGQUEUE_SYSCALL)
+#define __NR_lwp_sigqueue               SYS_lwp_sigqueue
+#else
+#define __NR_lwp_kill                   SYS_lwp_kill
+#endif /* SOLARIS_LWP_SIGQUEUE_SYSCALL */
+#define __NR_lwp_self                   SYS_lwp_self
+#define __NR_lwp_sigmask                SYS_lwp_sigmask
+#define __NR_lwp_private                SYS_lwp_private
+#define __NR_lwp_wait                   SYS_lwp_wait
+#define __NR_lwp_mutex_wakeup           SYS_lwp_mutex_wakeup
+//#define __NR_lwp_cond_wait              SYS_lwp_cond_wait
+//#define __NR_lwp_cond_signal            SYS_lwp_cond_signal
+#define __NR_lwp_cond_broadcast         SYS_lwp_cond_broadcast
+#define __NR_pread                      SYS_pread
+#define __NR_pwrite                     SYS_pwrite
+#define __NR_llseek                     SYS_llseek
+//#define __NR_inst_sync                  SYS_inst_sync
+//#define __NR_brand                      SYS_brand
+//#define __NR_kaio                       SYS_kaio
+//#define __NR_cpc                        SYS_cpc
+//#define __NR_lgrpsys                    SYS_lgrpsys
+//#define __NR_meminfosys                 SYS_meminfosys /* = SYS_lgrpsys */
+#define __NR_rusagesys                  SYS_rusagesys
+#define __NR_port                       SYS_port
+#define __NR_pollsys                    SYS_pollsys
+#define __NR_labelsys                   SYS_labelsys
+#define __NR_acl                        SYS_acl
+#define __NR_auditsys                   SYS_auditsys
+//#define __NR_processor_bind             SYS_processor_bind
+//#define __NR_processor_info             SYS_processor_info
+#define __NR_p_online                   SYS_p_online
+#define __NR_sigqueue                   SYS_sigqueue
+#define __NR_clock_gettime              SYS_clock_gettime
+#define __NR_clock_settime              SYS_clock_settime
+#define __NR_clock_getres               SYS_clock_getres
+#define __NR_timer_create               SYS_timer_create
+#define __NR_timer_delete               SYS_timer_delete
+#define __NR_timer_settime              SYS_timer_settime
+#define __NR_timer_gettime              SYS_timer_gettime
+#define __NR_timer_getoverrun           SYS_timer_getoverrun
+#define __NR_nanosleep                  SYS_nanosleep
+#define __NR_facl                       SYS_facl
+#define __NR_door                       SYS_door
+#define __NR_setreuid                   SYS_setreuid
+#define __NR_setregid                   SYS_setregid
+//#define __NR_install_utrap              SYS_install_utrap
+//#define __NR_signotify                  SYS_signotify
+#define __NR_schedctl                   SYS_schedctl
+//#define __NR_pset                       SYS_pset
+//#define SYS_sparc_utrap_install
+#define __NR_resolvepath                SYS_resolvepath
+#define __NR_lwp_mutex_timedlock        SYS_lwp_mutex_timedlock
+#define __NR_lwp_sema_timedwait         SYS_lwp_sema_timedwait
+#define __NR_lwp_rwlock_sys             SYS_lwp_rwlock_sys
+#define __NR_getdents64                 SYS_getdents64
+#define __NR_mmap64                     SYS_mmap64
+#define __NR_statvfs64                  SYS_statvfs64
+#define __NR_fstatvfs64                 SYS_fstatvfs64
+#define __NR_setrlimit64                SYS_setrlimit64
+#define __NR_getrlimit64                SYS_getrlimit64
+#define __NR_pread64                    SYS_pread64
+#define __NR_pwrite64                   SYS_pwrite64
+//#define __NR_rpcsys                     SYS_rpcsys
+#define __NR_zone                       SYS_zone
+//#define __NR_autofssys                  SYS_autofssys
+#define __NR_getcwd                     SYS_getcwd
+#define __NR_so_socket                  SYS_so_socket
+#define __NR_so_socketpair              SYS_so_socketpair
+#define __NR_bind                       SYS_bind
+#define __NR_listen                     SYS_listen
+#define __NR_accept                     SYS_accept
+#define __NR_connect                    SYS_connect
+#define __NR_shutdown                   SYS_shutdown
+#define __NR_recv                       SYS_recv
+#define __NR_recvfrom                   SYS_recvfrom
+#define __NR_recvmsg                    SYS_recvmsg
+#define __NR_send                       SYS_send
+#define __NR_sendmsg                    SYS_sendmsg
+#define __NR_sendto                     SYS_sendto
+#define __NR_getpeername                SYS_getpeername
+#define __NR_getsockname                SYS_getsockname
+#define __NR_getsockopt                 SYS_getsockopt
+#define __NR_setsockopt                 SYS_setsockopt
+//#define __NR_sockconfig                 SYS_sockconfig
+//#define __NR_ntp_gettime                SYS_ntp_gettime
+//#define __NR_ntp_adjtime                SYS_ntp_adjtime
+//#define __NR_lwp_mutex_unlock           SYS_lwp_mutex_unlock
+//#define __NR_lwp_mutex_trylock          SYS_lwp_mutex_trylock
+#define __NR_lwp_mutex_register         SYS_lwp_mutex_register
+//#define __NR_cladm                      SYS_cladm
+#define __NR_uucopy                     SYS_uucopy
+#define __NR_umount2                    SYS_umount2
+
+/* The following syscalls were removed in Solaris 11 (see
+   https://wikis.oracle.com/display/DTrace/syscall+Provider). Valgrind's core
+   cannot use these syscalls but wrappers have to be provided for them because
+   they are still in use on illumos.
+*/
+#if defined(SOLARIS_OLD_SYSCALLS)
+#define __NR_open                       SYS_open
+#define __NR_link                       SYS_link
+#define __NR_unlink                     SYS_unlink
+#define __NR_mknod                      SYS_mknod
+#define __NR_chmod                      SYS_chmod
+#define __NR_chown                      SYS_chown
+#define __NR_stat                       SYS_stat
+#define __NR_fstat                      SYS_fstat
+#define __NR_access                     SYS_access
+#define __NR_rmdir                      SYS_rmdir
+#define __NR_mkdir                      SYS_mkdir
+#define __NR_lstat                      SYS_lstat
+#define __NR_symlink                    SYS_symlink
+#define __NR_readlink                   SYS_readlink
+#define __NR_fchmod                     SYS_fchmod
+#define __NR_fchown                     SYS_fchown
+#define __NR_lchown                     SYS_lchown
+#define __NR_rename                     SYS_rename
+#define __NR_stat64                     SYS_stat64
+#define __NR_lstat64                    SYS_lstat64
+#define __NR_fstat64                    SYS_fstat64
+#define __NR_open64                     SYS_open64
+#endif /* SOLARIS_OLD_SYSCALLS */
+
+/*
+#define __NR_null \
+   VG_SOLARIS_SYSCALL_CONSTRUCT_FASTTRAP(T_FNULL)
+#define __NR_fgetfp \
+   VG_SOLARIS_SYSCALL_CONSTRUCT_FASTTRAP(T_FGETFP)
+#define __NR_fsetfp \
+   VG_SOLARIS_SYSCALL_CONSTRUCT_FASTTRAP(T_FSETFP)
+*/
+#define __NR_gethrtime \
+   VG_SOLARIS_SYSCALL_CONSTRUCT_FASTTRAP(T_GETHRTIME)
+#define __NR_gethrvtime \
+   VG_SOLARIS_SYSCALL_CONSTRUCT_FASTTRAP(T_GETHRVTIME)
+#define __NR_gethrestime \
+   VG_SOLARIS_SYSCALL_CONSTRUCT_FASTTRAP(T_GETHRESTIME)
+/*
+#define __NR_getlgrp \
+   VG_SOLARIS_SYSCALL_CONSTRUCT_FASTTRAP(T_GETLGRP)
+*/
+#if defined(SOLARIS_GETHRT_FASTTRAP)
+#define __NR_gethrt \
+   VG_SOLARIS_SYSCALL_CONSTRUCT_FASTTRAP(T_GETHRT)
+#endif /* SOLARIS_GETHRT_FASTTRAP */
+#if defined(SOLARIS_GETZONEOFFSET_FASTTRAP)
+#define __NR_getzoneoffset \
+   VG_SOLARIS_SYSCALL_CONSTRUCT_FASTTRAP(T_GETZONEOFFSET)
+#endif /* SOLARIS_GETZONEOFFSET_FASTTRAP */
+
+#endif /* __VKI_SCNUMS_SOLARIS_H */
+
+/*--------------------------------------------------------------------*/
+/*--- end                                                          ---*/
+/*--------------------------------------------------------------------*/
diff --git a/include/vki/vki-solaris-repcache.h b/include/vki/vki-solaris-repcache.h
new file mode 100644
index 0000000..3d47095
--- /dev/null
+++ b/include/vki/vki-solaris-repcache.h
@@ -0,0 +1,272 @@
+/*--------------------------------------------------------------------*/
+/*--- Solaris-specific kernel interface for the repository cache   ---*/
+/*--- protocol.                             vki-solaris-repcache.h ---*/
+/*--------------------------------------------------------------------*/
+
+/*
+   This file is part of Valgrind, a dynamic binary instrumentation
+   framework.
+
+   Copyright (C) 2015-2015 Ivo Raisr
+      ivosh@ivosh.net
+
+   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 __VKI_SOLARIS_REPCACHE_H
+#define __VKI_SOLARIS_REPCACHE_H
+
+/* From <repcache_protocol.h> which is consolidation private. */
+#define VKI_REPOSITORY_DOOR_BASEVER (('R' << 24) | ('e' << 16) | ('p' << 8))
+
+#if (SOLARIS_REPCACHE_PROTOCOL_VERSION == 21)
+#define VKI_REPOSITORY_DOOR_VERSION (21 + VKI_REPOSITORY_DOOR_BASEVER)
+enum vki_rep_protocol_requestid {
+   VKI_REP_PROTOCOL_CLOSE = ('C' << 8),
+   VKI_REP_PROTOCOL_ENTITY_SETUP,
+   VKI_REP_PROTOCOL_ENTITY_NAME,
+   VKI_REP_PROTOCOL_ENTITY_PARENT_TYPE,
+   VKI_REP_PROTOCOL_ENTITY_GET_CHILD,
+   VKI_REP_PROTOCOL_ENTITY_GET_PARENT,
+   VKI_REP_PROTOCOL_ENTITY_GET,
+   VKI_REP_PROTOCOL_ENTITY_UPDATE,
+   VKI_REP_PROTOCOL_ENTITY_CREATE_CHILD,
+   VKI_REP_PROTOCOL_ENTITY_CREATE_PG,
+   VKI_REP_PROTOCOL_ENTITY_DELETE,
+   VKI_REP_PROTOCOL_ENTITY_RESET,
+   VKI_REP_PROTOCOL_ENTITY_TEARDOWN,
+   VKI_REP_PROTOCOL_ITER_SETUP,
+   VKI_REP_PROTOCOL_ITER_START,
+   VKI_REP_PROTOCOL_ITER_READ,
+   VKI_REP_PROTOCOL_ITER_READ_VALUE,
+   VKI_REP_PROTOCOL_ITER_RESET,
+   VKI_REP_PROTOCOL_ITER_TEARDOWN,
+   VKI_REP_PROTOCOL_NEXT_SNAPLEVEL,
+   VKI_REP_PROTOCOL_SNAPSHOT_TAKE,
+   VKI_REP_PROTOCOL_SNAPSHOT_TAKE_NAMED,
+   VKI_REP_PROTOCOL_SNAPSHOT_ATTACH,
+   VKI_REP_PROTOCOL_PROPERTY_GET_TYPE,
+   VKI_REP_PROTOCOL_PROPERTY_GET_VALUE,
+   VKI_REP_PROTOCOL_PROPERTYGRP_SETUP_WAIT,
+   VKI_REP_PROTOCOL_PROPERTYGRP_TX_START,
+   VKI_REP_PROTOCOL_PROPERTYGRP_TX_COMMIT,
+   VKI_REP_PROTOCOL_CLIENT_ADD_NOTIFY,
+   VKI_REP_PROTOCOL_CLIENT_WAIT,
+   VKI_REP_PROTOCOL_BACKUP,
+   VKI_REP_PROTOCOL_SET_AUDIT_ANNOTATION,
+   VKI_REP_PROTOCOL_SWITCH,
+};
+#elif (SOLARIS_REPCACHE_PROTOCOL_VERSION == 23)
+#define VKI_REPOSITORY_DOOR_VERSION (23 + VKI_REPOSITORY_DOOR_BASEVER)
+enum vki_rep_protocol_requestid {
+   VKI_REP_PROTOCOL_CLOSE = ('C' << 8),
+   VKI_REP_PROTOCOL_ENTITY_SETUP,
+   VKI_REP_PROTOCOL_ENTITY_NAME,
+   VKI_REP_PROTOCOL_ENTITY_PARENT_TYPE,
+   VKI_REP_PROTOCOL_ENTITY_GET_CHILD,
+   VKI_REP_PROTOCOL_ENTITY_GET_PARENT,
+   VKI_REP_PROTOCOL_ENTITY_GET,
+   VKI_REP_PROTOCOL_ENTITY_UPDATE,
+   VKI_REP_PROTOCOL_ENTITY_CREATE_CHILD,
+   VKI_REP_PROTOCOL_ENTITY_CREATE_PG,
+   VKI_REP_PROTOCOL_ENTITY_DELETE,
+   VKI_REP_PROTOCOL_ENTITY_UNDELETE,
+   VKI_REP_PROTOCOL_ENTITY_REMOVE,
+   VKI_REP_PROTOCOL_ENTITY_DELCUST,
+   VKI_REP_PROTOCOL_BUNDLE_REMOVE,
+   VKI_REP_PROTOCOL_ENTITY_RESET,
+   VKI_REP_PROTOCOL_ENTITY_TEARDOWN,
+   VKI_REP_PROTOCOL_ITER_SETUP,
+   VKI_REP_PROTOCOL_ITER_START,
+   VKI_REP_PROTOCOL_ITER_READ,
+   VKI_REP_PROTOCOL_ITER_READ_VALUE,
+   VKI_REP_PROTOCOL_ITER_RESET,
+   VKI_REP_PROTOCOL_ITER_TEARDOWN,
+   VKI_REP_PROTOCOL_NEXT_SNAPLEVEL,
+   VKI_REP_PROTOCOL_SNAPSHOT_TAKE,
+   VKI_REP_PROTOCOL_SNAPSHOT_TAKE_NAMED,
+   VKI_REP_PROTOCOL_SNAPSHOT_ATTACH,
+   VKI_REP_PROTOCOL_PROPERTY_GET_TYPE,
+   VKI_REP_PROTOCOL_PROPERTY_GET_VALUE,
+   VKI_REP_PROTOCOL_PG_SETUP_WAIT,
+   VKI_REP_PROTOCOL_PG_TX_START,
+   VKI_REP_PROTOCOL_PG_TX_COMMIT,
+   VKI_REP_PROTOCOL_PROP_BUNDLE_REMOVE,
+   VKI_REP_PROTOCOL_CLIENT_ADD_NOTIFY,
+   VKI_REP_PROTOCOL_CLIENT_WAIT,
+   VKI_REP_PROTOCOL_BACKUP,
+   VKI_REP_PROTOCOL_SET_AUDIT_ANNOTATION,
+   VKI_REP_PROTOCOL_UNSET_AUDIT_ANNOTATION,
+   VKI_REP_PROTOCOL_SET_TX_DECORATION,
+   VKI_REP_PROTOCOL_SWITCH,
+   VKI_REP_PROTOCOL_DECORATION_GET_LAYER,
+   VKI_REP_PROTOCOL_DECORATION_GET_TYPE,
+   VKI_REP_PROTOCOL_DECORATION_GET_VALUE,
+   VKI_REP_PROTOCOL_DECORATION_GET_BUNDLE,
+   VKI_REP_PROTOCOL_ENTITY_INCONFLICT,
+   VKI_REP_PROTOCOL_ENTITY_IS_MASKED,
+   VKI_REP_PROTOCOL_CLIENT_REMOVE_NOTIFY,
+};
+#elif (SOLARIS_REPCACHE_PROTOCOL_VERSION == 25)
+#define VKI_REPOSITORY_DOOR_VERSION (25 + VKI_REPOSITORY_DOOR_BASEVER)
+enum vki_rep_protocol_requestid {
+   VKI_REP_PROTOCOL_CLOSE = ('C' << 8),
+   VKI_REP_PROTOCOL_ENTITY_SETUP,
+   VKI_REP_PROTOCOL_ENTITY_NAME,
+   VKI_REP_PROTOCOL_ENTITY_FMRI,
+   VKI_REP_PROTOCOL_ENTITY_PARENT_TYPE,
+   VKI_REP_PROTOCOL_ENTITY_GET_CHILD,
+   VKI_REP_PROTOCOL_ENTITY_GET_PARENT,
+   VKI_REP_PROTOCOL_ENTITY_GET_ROOT,
+   VKI_REP_PROTOCOL_ENTITY_GET,
+   VKI_REP_PROTOCOL_ENTITY_UPDATE,
+   VKI_REP_PROTOCOL_ENTITY_CREATE_CHILD,
+   VKI_REP_PROTOCOL_ENTITY_CREATE_PG,
+   VKI_REP_PROTOCOL_ENTITY_DELETE,
+   VKI_REP_PROTOCOL_ENTITY_UNDELETE,
+   VKI_REP_PROTOCOL_ENTITY_REMOVE,
+   VKI_REP_PROTOCOL_ENTITY_DELCUST,
+   VKI_REP_PROTOCOL_BUNDLE_REMOVE,
+   VKI_REP_PROTOCOL_ENTITY_RESET,
+   VKI_REP_PROTOCOL_ENTITY_TEARDOWN,
+   VKI_REP_PROTOCOL_ITER_SETUP,
+   VKI_REP_PROTOCOL_ITER_START,
+   VKI_REP_PROTOCOL_ITER_READ,
+   VKI_REP_PROTOCOL_ITER_READ_VALUE,
+   VKI_REP_PROTOCOL_ITER_RESET,
+   VKI_REP_PROTOCOL_ITER_TEARDOWN,
+   VKI_REP_PROTOCOL_NEXT_SNAPLEVEL,
+   VKI_REP_PROTOCOL_SNAPSHOT_TAKE,
+   VKI_REP_PROTOCOL_SNAPSHOT_TAKE_NAMED,
+   VKI_REP_PROTOCOL_SNAPSHOT_ATTACH,
+   VKI_REP_PROTOCOL_PROPERTY_GET_TYPE,
+   VKI_REP_PROTOCOL_PROPERTY_GET_VALUE,
+   VKI_REP_PROTOCOL_PG_SETUP_WAIT,
+   VKI_REP_PROTOCOL_PG_TX_START,
+   VKI_REP_PROTOCOL_PG_TX_COMMIT,
+   VKI_REP_PROTOCOL_PROP_BUNDLE_REMOVE,
+   VKI_REP_PROTOCOL_CLIENT_ADD_NOTIFY,
+   VKI_REP_PROTOCOL_CLIENT_WAIT,
+   VKI_REP_PROTOCOL_BACKUP,
+   VKI_REP_PROTOCOL_SET_AUDIT_ANNOTATION,
+   VKI_REP_PROTOCOL_UNSET_AUDIT_ANNOTATION,
+   VKI_REP_PROTOCOL_SET_TX_DECORATION,
+   VKI_REP_PROTOCOL_SWITCH,
+   VKI_REP_PROTOCOL_DECORATION_GET_LAYER,
+   VKI_REP_PROTOCOL_DECORATION_GET_TYPE,
+   VKI_REP_PROTOCOL_DECORATION_GET_VALUE,
+   VKI_REP_PROTOCOL_DECORATION_GET_BUNDLE,
+   VKI_REP_PROTOCOL_ENTITY_INCONFLICT,
+   VKI_REP_PROTOCOL_ENTITY_IS_MASKED,
+   VKI_REP_PROTOCOL_CLIENT_REMOVE_NOTIFY,
+};
+#else
+#error Unsupported repcache protocol version
+#endif
+
+#define VKI_REPOSITORY_DOOR_NAME "/system/volatile/repository_door"
+#define VKI_REP_PROTOCOL_NAME_LEN 120
+enum vki_repository_door_requestid {
+   VKI_REPOSITORY_DOOR_REQUEST_CONNECT = (('M' << 8) | 1)
+};
+enum vki_repository_door_statusid {
+   VKI_REPOSITORY_DOOR_SUCCESS                = 0,
+   VKI_REPOSITORY_DOOR_FAIL_BAD_REQUEST       = 1,
+   VKI_REPOSITORY_DOOR_FAIL_VERSION_MISMATCH  = 2,
+   VKI_REPOSITORY_DOOR_FAIL_BAD_FLAG          = 3,
+   VKI_REPOSITORY_DOOR_FAIL_NO_RESOURCES      = 4,
+   VKI_REPOSITORY_DOOR_FAIL_PERMISSION_DENIED = 5
+};
+typedef struct vki_repository_door_request {
+   vki_uint32_t rdr_version;
+   enum vki_repository_door_requestid rdr_request;
+   vki_uint32_t rdr_flags;
+   vki_uint32_t rdr_debug;
+} vki_repository_door_request_t;
+typedef struct vki_repository_door_response {
+   enum vki_repository_door_statusid rdr_status;
+} vki_repository_door_response_t;
+typedef struct vki_rep_protocol_request {
+   enum vki_rep_protocol_requestid rpr_request;
+} vki_rep_protocol_request_t;
+struct vki_rep_protocol_entity_setup {
+   enum vki_rep_protocol_requestid rpr_request;
+   vki_uint32_t rpr_entityid;
+   vki_uint32_t rpr_entitytype;
+};
+struct vki_rep_protocol_entity_name {
+   enum vki_rep_protocol_requestid rpr_request;
+   vki_uint32_t rpr_entityid;
+   vki_uint32_t rpr_answertype;
+};
+struct vki_rep_protocol_entity_get {
+   enum vki_rep_protocol_requestid rpr_request;
+   vki_uint32_t rpr_entityid;
+   vki_uint32_t rpr_object;
+};
+struct vki_rep_protocol_entity_get_child {
+   enum vki_rep_protocol_requestid rpr_request;
+   vki_uint32_t rpr_entityid;
+   vki_uint32_t rpr_childid;
+   char rpr_name[VKI_REP_PROTOCOL_NAME_LEN];
+};
+struct vki_rep_protocol_entity_parent {
+   enum vki_rep_protocol_requestid rpr_request;
+   vki_uint32_t rpr_entityid;
+   vki_uint32_t rpr_outid;
+};
+struct vki_rep_protocol_entity_reset {
+   enum vki_rep_protocol_requestid rpr_request;
+   vki_uint32_t rpr_entityid;
+};
+struct vki_rep_protocol_entity_teardown {
+   enum vki_rep_protocol_requestid rpr_request;
+   vki_uint32_t rpr_entityid;
+};
+struct vki_rep_protocol_iter_read {
+   enum vki_rep_protocol_requestid rpr_request;
+   vki_uint32_t rpr_iterid;
+   vki_uint32_t rpr_sequence;
+   vki_uint32_t rpr_entityid;
+};
+struct vki_rep_protocol_iter_read_value {
+   enum vki_rep_protocol_requestid rpr_request;
+   vki_uint32_t rpr_iterid;
+   vki_uint32_t rpr_sequence;
+};
+struct vki_rep_protocol_iter_request {
+   enum vki_rep_protocol_requestid rpr_request;
+   vki_uint32_t rpr_iterid;
+};
+struct vki_rep_protocol_iter_start {
+   enum vki_rep_protocol_requestid rpr_request;
+   vki_uint32_t rpr_iterid;
+   vki_uint32_t rpr_entity;
+   vki_uint32_t rpr_itertype;
+   vki_uint32_t rpr_flags;
+   char rpr_pattern[VKI_REP_PROTOCOL_NAME_LEN];
+};
+struct vki_rep_protocol_property_request {
+   enum vki_rep_protocol_requestid rpr_request;
+   vki_uint32_t rpr_entityid;
+};
+
+
+
+
+#endif /* __VKI_SOLARIS_REPCACHE_21_H */
diff --git a/include/vki/vki-solaris.h b/include/vki/vki-solaris.h
new file mode 100644
index 0000000..ba2631e
--- /dev/null
+++ b/include/vki/vki-solaris.h
@@ -0,0 +1,1610 @@
+
+/*--------------------------------------------------------------------*/
+/*--- Solaris-specific kernel interface.             vki-solaris.h ---*/
+/*--------------------------------------------------------------------*/
+
+/*
+   This file is part of Valgrind, a dynamic binary instrumentation
+   framework.
+
+   Copyright (C) 2011-2015 Petr Pavlu
+      setup@dagobah.cz
+
+   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.
+*/
+
+/* Copyright 2013-2015, Ivo Raisr <ivosh@ivosh.net> */
+
+/* Copyright 2013, OmniTI Computer Consulting, Inc. All rights reserved. */
+
+/* The purpose of this file is described in vki-linux.h.
+
+   To avoid any copyright issues, vki-solaris.h follows the same approach as
+   vki-darwin.h (not copying anything from kernel header files but instead
+   just including them).
+ */
+
+#ifndef __VKI_SOLARIS_H
+#define __VKI_SOLARIS_H
+
+#include "../../config.h"
+
+/* _XOPEN_SOURCE equal to at least '500' is required so that various system
+   structures have all necessary attributes (for example struct msghdr). */
+#if !defined(_XOPEN_SOURCE)
+/* Compiler versions c99 and higher require _XOPEN_SOURCE at least '600'. */
+#   if (__STDC_VERSION__ - 0 >= 199901L)
+#      define _XOPEN_SOURCE 600
+#   else
+#      define _XOPEN_SOURCE 500
+#   endif
+#elif (_XOPEN_SOURCE - 0 != 500) && (_XOPEN_SOURCE - 0 != 600) && (_XOPEN_SOURCE - 0 != 700)
+#   error "Compiler or options invalid for including this header file."
+#endif /* _XOPEN_SOURCE */
+
+#define __EXTENSIONS__ 1
+/* assert _FILE_OFFSET_BITS == 32 */
+
+/* XXX These two PTRACE defines are currently used only in m_debugger.c for
+   legacy 'attach debugger' functionality. This is going to be removed
+   in future Valgrind version and so can these two as well. */
+#define VKI_PTRACE_TRACEME 0
+#define VKI_PTRACE_DETACH -1
+
+#define VKI_PAGE_SHIFT 12
+#define VKI_PAGE_SIZE (1UL << VKI_PAGE_SHIFT)
+#define VKI_PAGEMASK (~VKI_PAGEOFFSET)
+#define VKI_PAGEOFFSET (VKI_PAGE_SIZE - 1)
+#define VKI_MAX_PAGE_SHIFT VKI_PAGE_SHIFT
+#define VKI_MAX_PAGE_SIZE VKI_PAGE_SIZE
+
+
+#include <sys/types.h>
+#define VKI_UINT_MAX UINT_MAX
+#define vki_boolean_t boolean_t
+#define vki_datalink_id_t datalink_id_t
+#define vki_uint_t uint_t
+#define vki_uint32_t uint32_t
+#define vki_uint64_t uint64_t
+#define vki_ulong_t ulong_t
+#define vki_caddr_t caddr_t
+#define vki_dev_t dev_t
+#define vki_off_t off_t
+#define vki_id_t id_t
+#define vki_key_t key_t
+#define vki_mode_t mode_t
+#define vki_o_dev_t o_dev_t
+#define vki_projid_t projid_t
+#define vki_uid_t uid_t
+#define vki_gid_t gid_t
+#define vki_pid_t pid_t
+#define vki_size_t size_t
+#define vki_time_t time_t
+#define vki_timer_t timer_t
+#define vki_uchar_t uchar_t
+
+typedef uint32_t vki_u32;
+
+
+#include <sys/types32.h>
+#define vki_size32_t size32_t
+
+
+#include <fcntl.h>
+#define VKI_SEEK_SET SEEK_SET
+
+
+#include <limits.h>
+#define VKI_NGROUPS_MAX NGROUPS_MAX
+#define VKI_PATH_MAX PATH_MAX
+/* Used in launcher-linux.c which we share with Linux port. */
+#define VKI_BINPRM_BUF_SIZE VKI_PATH_MAX
+
+
+#include <ucred.h>
+#define vki_ucred_t ucred_t
+
+
+#include <unistd.h>
+#define VKI_R_OK R_OK
+#define VKI_W_OK W_OK
+#define VKI_X_OK X_OK
+
+
+#include <bsm/audit.h>
+#define VKI_A_GETAMASK A_GETAMASK
+#define VKI_A_GETCAR A_GETCAR
+#define VKI_A_GETCLASS A_GETCLASS
+#define VKI_A_GETCOND A_GETCOND
+#define VKI_A_GETCWD A_GETCWD
+#define VKI_A_GETKAUDIT A_GETKAUDIT
+#define VKI_A_GETKMASK A_GETKMASK
+#define VKI_A_GETPINFO A_GETPINFO
+#define VKI_A_GETPINFO_ADDR A_GETPINFO_ADDR
+#define VKI_A_GETPOLICY A_GETPOLICY
+#define VKI_A_GETQCTRL A_GETQCTRL
+#define VKI_A_GETSTAT A_GETSTAT
+#define VKI_A_SETAMASK A_SETAMASK
+#define VKI_A_SETCLASS A_SETCLASS
+#define VKI_A_SETCOND A_SETCOND
+#define VKI_A_SETKAUDIT A_SETKAUDIT
+#define VKI_A_SETKMASK A_SETKMASK
+#define VKI_A_SETPMASK A_SETPMASK
+#define VKI_A_SETPOLICY A_SETPOLICY
+#define VKI_A_SETQCTRL A_SETQCTRL
+#define VKI_A_SETSMASK A_SETSMASK
+#define VKI_A_SETSTAT A_SETSTAT
+#define VKI_A_SETUMASK A_SETUMASK
+#define VKI_BSM_AUDIT BSM_AUDIT
+#define VKI_BSM_AUDITCTL BSM_AUDITCTL
+#define VKI_BSM_AUDITDOOR BSM_AUDITDOOR
+#define VKI_BSM_GETAUDIT BSM_GETAUDIT
+#define VKI_BSM_GETAUDIT_ADDR BSM_GETAUDIT_ADDR
+#define VKI_BSM_GETAUID BSM_GETAUID
+#define VKI_BSM_SETAUDIT BSM_SETAUDIT
+#define VKI_BSM_SETAUDIT_ADDR BSM_SETAUDIT_ADDR
+#define VKI_BSM_SETAUID BSM_SETAUID
+#define vki_au_evclass_map_t au_evclass_map_t
+#define vki_au_id_t au_id_t
+#define vki_au_mask_t au_mask_t
+#define vki_au_qctrl au_qctrl
+#define vki_au_stat_t au_stat_t
+#define vki_auditinfo_t auditinfo_t
+#define vki_auditinfo_addr_t auditinfo_addr_t
+#define vki_auditpinfo auditpinfo
+#define vki_auditpinfo_addr auditpinfo_addr
+
+
+#include <sys/psw.h>
+#define VKI_PSL_USER PSL_USER
+
+
+#include <ia32/sys/trap.h>
+#define VKI_T_BPTFLT T_BPTFLT
+
+
+/* From <libc/inc/libc_int.h> which is consolidation private. */
+#define VKI_CI_BIND_GUARD 4
+#define VKI_CI_BIND_CLEAR 5
+#define VKI_THR_FLG_RTLD 0x01
+
+typedef struct {
+   int ci_tag;
+   union {
+      int (*ci_func)(int);
+      long ci_val;
+      char *ci_ptr;
+   } vki_ci_un;
+} vki_Lc_interface;
+
+
+/* From <libc/port/gen/getxby_door.h> which is consolidation private. */
+#if defined(SOLARIS_NSCD_DOOR_SYSTEM_VOLATILE)
+#define VKI_NAME_SERVICE_DOOR "/system/volatile/name_service_door"
+#else
+#define VKI_NAME_SERVICE_DOOR "/var/run/name_service_door"
+#endif /* SOLARIS_NSCD_DOOR_SYSTEM_VOLATILE */
+
+
+#include <nfs/nfs.h>
+#include <nfs/nfssys.h>
+#define VKI_NFS_REVAUTH NFS_REVAUTH
+#define vki_nfs_revauth_args nfs_revauth_args
+
+
+#include <net/if.h>
+#define vki_lifnum lifnum
+
+
+#include <netinet/in.h>
+#define VKI_IPPROTO_TCP IPPROTO_TCP
+#define vki_in_addr in_addr
+#define vki_sockaddr_in sockaddr_in
+#define vki_sockaddr_in6 sockaddr_in6
+
+#include <netinet/tcp.h>
+#define VKI_TCP_NODELAY TCP_NODELAY
+
+
+/* Do not include nss_dbdefs.h if a C++ compiler is used to build a file
+   which includes vki-solaris.h. This cannot be done because the nss_dbdefs.h
+   header file uses 'delete' keyword as a method name. */
+#if !defined(__cplusplus)
+#include <nss_dbdefs.h>
+#define VKI_NSCD_CALLCAT_APP NSCD_CALLCAT_APP
+#define VKI_NSCDV2CATMASK NSCDV2CATMASK
+#define vki_nss_dbd_t nss_dbd_t
+#define vki_nss_pheader_t nss_pheader_t
+#endif /* !__cplusplus */
+
+
+/* From <repcache_protocol.h> which is consolidation private. */
+#include "vki-solaris-repcache.h"
+
+#include <sys/acl.h>
+#define vki_aclent_t aclent_t
+#define vki_ace_t ace_t
+#define VKI_GETACL GETACL
+#define VKI_SETACL SETACL
+#define VKI_GETACLCNT GETACLCNT
+#define VKI_ACE_GETACL ACE_GETACL
+#define VKI_ACE_SETACL ACE_SETACL
+#define VKI_ACE_GETACLCNT ACE_GETACLCNT
+
+
+#include <sys/auxv.h>
+#define vki_auxv_t auxv_t
+#define VKI_AT_NULL AT_NULL
+#define VKI_AT_PHDR AT_PHDR
+#define VKI_AT_PAGESZ AT_PAGESZ
+#define VKI_AT_BASE AT_BASE
+#define VKI_AT_FLAGS AT_FLAGS
+#define VKI_AT_SUN_PLATFORM AT_SUN_PLATFORM
+#define VKI_AT_SUN_HWCAP AT_SUN_HWCAP
+#define VKI_AT_SUN_EXECNAME AT_SUN_EXECNAME
+#define VKI_AT_SUN_AUXFLAGS AT_SUN_AUXFLAGS
+
+#define VKI_AF_SUN_HWCAPVERIFY AF_SUN_HWCAPVERIFY
+
+
+#include <sys/auxv_386.h>
+#define VKI_AV_386_FPU AV_386_FPU
+#define VKI_AV_386_TSC AV_386_TSC
+#define VKI_AV_386_CX8 AV_386_CX8
+#define VKI_AV_386_SEP AV_386_SEP
+#define VKI_AV_386_AMD_SYSC AV_386_AMD_SYSC
+#define VKI_AV_386_CMOV AV_386_CMOV
+#define VKI_AV_386_MMX AV_386_MMX
+#define VKI_AV_386_FXSR AV_386_FXSR
+#define VKI_AV_386_SSE AV_386_SSE
+#define VKI_AV_386_SSE2 AV_386_SSE2
+#define VKI_AV_386_SSE3 AV_386_SSE3
+#define VKI_AV_386_CX16 AV_386_CX16
+#define VKI_AV_386_AHF AV_386_AHF
+#define VKI_AV_386_TSCP AV_386_TSCP
+#define VKI_AV_386_POPCNT AV_386_POPCNT
+#define VKI_AV_386_AMD_LZCNT AV_386_AMD_LZCNT
+#define VKI_AV_386_SSSE3 AV_386_SSSE3
+#define VKI_AV_386_SSE4_1 AV_386_SSE4_1
+#define VKI_AV_386_SSE4_2 AV_386_SSE4_2
+#define VKI_AV_386_AES AV_386_AES
+#define VKI_AV_386_PCLMULQDQ AV_386_PCLMULQDQ
+#define VKI_AV_386_XSAVE AV_386_XSAVE
+
+
+#include <sys/corectl.h>
+#define VKI_CC_CONTENT_ANON CC_CONTENT_ANON
+#define VKI_CC_CONTENT_DATA CC_CONTENT_DATA
+#define VKI_CC_CONTENT_DISM CC_CONTENT_DISM
+#define VKI_CC_CONTENT_HEAP CC_CONTENT_HEAP
+#define VKI_CC_CONTENT_ISM CC_CONTENT_ISM
+#define VKI_CC_CONTENT_RODATA CC_CONTENT_RODATA
+#define VKI_CC_CONTENT_SHANON CC_CONTENT_SHANON
+#define VKI_CC_CONTENT_SHM CC_CONTENT_SHM
+#define VKI_CC_CONTENT_STACK CC_CONTENT_STACK
+#define VKI_CC_CONTENT_TEXT CC_CONTENT_TEXT
+#define vki_core_content_t core_content_t
+
+
+/* From <sys/crypto/elfsign.h> which is consolidation private. */
+#define VKI__PATH_KCFD_DOOR "/system/volatile/kcfd_door"
+typedef enum vki_ELFsign_status_e {
+   VKI_ELFSIGN_UNKNOWN,
+   VKI_ELFSIGN_SUCCESS,
+   VKI_ELFSIGN_FAILED,
+   VKI_ELFSIGN_NOTSIGNED,
+   VKI_ELFSIGN_INVALID_CERTPATH,
+   VKI_ELFSIGN_INVALID_ELFOBJ,
+   VKI_ELFSIGN_UNAVAILABLE
+} vki_ELFsign_status_t;
+typedef struct vki_kcf_door_arg_s {
+   short         da_version;
+   vki_boolean_t da_iskernel;
+   union {
+      char filename[MAXPATHLEN];	/* For request */
+
+      struct vki_kcf_door_result_s {	/* For response */
+         vki_ELFsign_status_t status;
+         vki_uint32_t         siglen;
+         vki_uchar_t          signature[1];
+      } result;
+   } vki_da_u;
+} vki_kcf_door_arg_t;
+
+
+#include <sys/crypto/ioctl.h>
+#define VKI_CRYPTO_SUCCESS CRYPTO_SUCCESS
+#define VKI_CRYPTO_GET_PROVIDER_LIST CRYPTO_GET_PROVIDER_LIST
+#define vki_crypto_provider_id_t crypto_provider_id_t
+#define vki_crypto_provider_entry_t crypto_provider_entry_t
+#define vki_crypto_get_provider_list_t crypto_get_provider_list_t
+
+
+#include <sys/dirent.h>
+#define VKI_MAXGETDENTS_SIZE MAXGETDENTS_SIZE
+#define vki_dirent dirent
+#define vki_dirent64 dirent64
+
+
+#include <sys/door.h>
+#define vki_door_desc_t door_desc_t
+#define vki_door_info_t door_info_t
+#define vki_door_arg_t door_arg_t
+#define vki_door_results door_results
+#define vki_door_return_desc_t door_return_desc_t
+
+#define VKI_DOOR_CREATE DOOR_CREATE
+#define VKI_DOOR_REVOKE DOOR_REVOKE
+#define VKI_DOOR_INFO DOOR_INFO
+#define VKI_DOOR_CALL DOOR_CALL
+#define VKI_DOOR_BIND DOOR_BIND
+#define VKI_DOOR_UNBIND DOOR_UNBIND
+#define VKI_DOOR_UNREFSYS DOOR_UNREFSYS
+#define VKI_DOOR_UCRED DOOR_UCRED
+#define VKI_DOOR_RETURN DOOR_RETURN
+#define VKI_DOOR_GETPARAM DOOR_GETPARAM
+#define VKI_DOOR_SETPARAM DOOR_SETPARAM
+
+
+#include <sys/dtrace.h>
+#define VKI_DTRACEHIOC_REMOVE DTRACEHIOC_REMOVE
+#define VKI_DTRACEHIOC_ADDDOF DTRACEHIOC_ADDDOF
+#define vki_dof_helper_t dof_helper_t
+
+
+#include <sys/elf.h>
+#define VKI_EI_CLASS EI_CLASS
+#define VKI_EI_DATA EI_DATA
+#define VKI_EI_MAG0 EI_MAG0
+#define VKI_EI_MAG1 EI_MAG1
+#define VKI_EI_MAG2 EI_MAG2
+#define VKI_EI_MAG3 EI_MAG3
+#define VKI_EI_VERSION EI_VERSION
+#define VKI_ELFMAG ELFMAG
+#define VKI_ELFMAG ELFMAG
+#define VKI_ELFMAG0 ELFMAG0
+#define VKI_ELFMAG1 ELFMAG1
+#define VKI_ELFMAG2 ELFMAG2
+#define VKI_ELFMAG3 ELFMAG3
+#define VKI_ET_CORE ET_CORE
+#define VKI_ET_DYN ET_DYN
+#define VKI_ET_EXEC ET_EXEC
+#define VKI_EV_CURRENT EV_CURRENT
+#define VKI_NT_AUXV NT_AUXV
+#define VKI_NT_CONTENT NT_CONTENT
+#define VKI_NT_LWPSINFO NT_LWPSINFO
+#define VKI_NT_LWPSTATUS NT_LWPSTATUS
+#define VKI_NT_PLATFORM NT_PLATFORM
+#define VKI_NT_PRCRED NT_PRCRED
+#define VKI_NT_PRFPREG NT_PRFPREG
+#define VKI_NT_PRPRIV NT_PRPRIV
+#define VKI_NT_PRPRIVINFO NT_PRPRIVINFO
+#define VKI_NT_PRPSINFO NT_PRPSINFO
+#define VKI_NT_PRSTATUS NT_PRSTATUS
+#define VKI_NT_PRXREG NT_PRXREG
+#define VKI_NT_PSINFO NT_PSINFO
+#define VKI_NT_PSTATUS NT_PSTATUS
+#define VKI_NT_UTSNAME NT_UTSNAME
+#define VKI_NT_ZONENAME NT_ZONENAME
+#define VKI_PF_R PF_R
+#define VKI_PF_W PF_W
+#define VKI_PF_X PF_X
+#define VKI_PN_XNUM PN_XNUM
+#define VKI_PT_LOAD PT_LOAD
+#define VKI_PT_SUNWBSS PT_SUNWBSS
+#define VKI_SELFMAG SELFMAG
+
+#if	VG_WORDSIZE == 8
+#define VKI_ESZ(x) Elf64_##x
+#elif	VG_WORDSIZE == 4
+#define VKI_ESZ(x) Elf32_##x
+#else
+#error VG_WORDSIZE needs to ==4 or ==8
+#endif
+
+
+#include <sys/errno.h>
+#define VKI_EPERM EPERM
+#define VKI_ENOENT ENOENT
+#define VKI_ESRCH ESRCH
+#define VKI_EINTR EINTR
+#define VKI_EIO EIO
+#define VKI_ENXIO ENXIO
+#define VKI_E2BIG E2BIG
+#define VKI_EBADF EBADF
+#define VKI_ECHILD ECHILD
+#define VKI_ENOEXEC ENOEXEC
+#define VKI_EAGAIN EAGAIN
+#define VKI_ENOMEM ENOMEM
+#define VKI_EACCES EACCES
+#define VKI_EFAULT EFAULT
+#define VKI_ENOTBLK ENOTBLK
+#define VKI_EBUSY EBUSY
+#define VKI_EEXIST EEXIST
+#define VKI_EXDEV EXDEV
+#define VKI_ENODEV ENODEV
+#define VKI_ENOTDIR ENOTDIR
+#define VKI_EISDIR EISDIR
+#define VKI_EINVAL EINVAL
+#define VKI_ENFILE ENFILE
+#define VKI_EMFILE EMFILE
+#define VKI_ENOTTY ENOTTY
+#define VKI_ETXTBSY ETXTBSY
+#define VKI_EFBIG EFBIG
+#define VKI_ENOSPC ENOSPC
+#define VKI_ESPIPE ESPIPE
+#define VKI_EROFS EROFS
+#define VKI_EMLINK EMLINK
+#define VKI_EPIPE EPIPE
+#define VKI_EDOM EDOM
+#define VKI_ERANGE ERANGE
+#define VKI_ENOTSUP ENOTSUP
+#define VKI_ENODATA ENODATA
+#define VKI_EOVERFLOW EOVERFLOW
+#define VKI_ENOSYS ENOSYS
+#define VKI_ERESTART ERESTART
+
+
+#if defined(SOLARIS_EXECVE_SYSCALL_TAKES_FLAGS)
+#include <sys/execx.h>
+#define VKI_EXEC_DESCRIPTOR EXEC_DESCRIPTOR
+#endif /* SOLARIS_EXECVE_SYSCALL_TAKES_FLAGS */
+
+
+#include <sys/fcntl.h>
+#define VKI_O_RDONLY O_RDONLY
+#define VKI_O_WRONLY O_WRONLY
+#define VKI_O_RDWR O_RDWR
+#define VKI_O_APPEND O_APPEND
+#define VKI_O_NONBLOCK O_NONBLOCK
+
+#define VKI_O_CREAT O_CREAT
+#define VKI_O_TRUNC O_TRUNC
+#define VKI_O_EXCL O_EXCL
+#define VKI_O_LARGEFILE O_LARGEFILE
+
+#define VKI_F_DUPFD F_DUPFD
+#define VKI_F_GETFD F_GETFD
+#define VKI_F_SETFD F_SETFD
+#define VKI_F_GETFL F_GETFL
+#define VKI_F_GETXFL F_GETXFL
+#define VKI_F_SETFL F_SETFL
+
+/* SVR3 rfs compability const, declared only if _KERNEL or _KMEMUSER is
+   defined. */
+#if 0
+#define VKI_F_O_GETLK F_O_GETLK
+#endif // 0
+
+#define VKI_F_DUP2FD F_DUP2FD
+
+/* Mostly unused and kernel-unimplemented commands. In case of F_GETOWN and
+   F_GETOWN, they are translated by libc in __fcntl() into other syscalls,
+   that means these two values are never passed to the fcntl handler in the
+   kernel. F_HASREMOTELOCKS is also special, the fcntl kernel handler doesn't
+   know about it but it's used inside the kernel. */
+#if 0
+#define VKI_F_ISSTREAM F_ISSTREAM
+#define VKI_F_PRIV F_PRIV
+#define VKI_F_NPRIV F_NPRIV
+#define VKI_F_QUATACTL F_QUOTACTL
+#define VKI_F_BLOCKS F_BLOCKS
+#define VKI_F_BLKSIZE F_BLKSIZE
+#define VKI_F_GETOWN F_GETOWN
+#define VKI_F_SETOWN F_SETOWN
+#define VKI_F_REVOKE F_REVOKE
+#define VKI_F_HASREMOTELOCKS F_HASREMOTELOCKS
+#endif // 0
+
+#define VKI_F_SETLK F_SETLK
+#define VKI_F_SETLKW F_SETLKW
+#define VKI_F_ALLOCSP F_ALLOCSP
+#define VKI_F_FREESP F_FREESP
+#define VKI_F_GETLK F_GETLK
+#define VKI_F_SETLK_NBMAND F_SETLK_NBMAND
+#if defined(VGP_x86_solaris)
+#define VKI_F_SETLK64 F_SETLK64
+#define VKI_F_SETLKW64 F_SETLKW64
+#define VKI_F_ALLOCSP64 F_ALLOCSP64
+#define VKI_F_FREESP64 F_FREESP64
+#define VKI_F_GETLK64 F_GETLK64
+#define VKI_F_SETLK64_NBMAND F_SETLK64_NBMAND
+#endif // defined(VGP_x86_solaris)
+
+#define VKI_F_SHARE F_SHARE
+#define VKI_F_UNSHARE F_UNSHARE
+#define VKI_F_SHARE_NBMAND F_SHARE_NBMAND
+
+#define VKI_F_BADFD F_BADFD
+
+#define vki_flock flock
+#if defined(VGP_x86_solaris)
+#define vki_flock64 flock64
+#endif // defined(VGP_x86_solaris)
+
+#define VKI_FD_CLOEXEC FD_CLOEXEC
+
+#define vki_fshare fshare
+
+#define VKI_AT_FDCWD AT_FDCWD
+
+
+#include <sys/filio.h>
+#define VKI_FIOSETOWN FIOSETOWN
+#define VKI_FIOGETOWN FIOGETOWN
+
+
+#include <sys/fs/namenode.h>
+#define vki_namefd namefd
+
+
+#include <sys/ioccom.h>
+#define _VKI_IOC_DIR(x) ((x) & (IOC_VOID | IOC_OUT | IOC_IN))
+#define _VKI_IOC_SIZE(x) (((x) >> 16) & IOCPARM_MASK)
+#define _VKI_IOC_NONE 0
+#define _VKI_IOC_READ IOC_OUT
+#define _VKI_IOC_WRITE IOC_IN
+
+
+#include <sys/ipc.h>
+#include <sys/ipc_impl.h>
+#define VKI_IPC_RMID IPC_RMID
+#define VKI_IPC_SET IPC_SET
+#define VKI_IPC_SET64 IPC_SET64
+#define VKI_IPC_STAT IPC_STAT
+#define VKI_IPC_STAT64 IPC_STAT64
+#if defined(SOLARIS_SHM_NEW)
+#define VKI_IPC_XSTAT64 IPC_XSTAT64
+#endif /* SOLARIS_SHM_NEW */
+
+#define vki_semid64_ds semid_ds64
+
+
+#include <sys/lwp.h>
+#define VKI_LWP_DAEMON LWP_DAEMON
+#define VKI_LWP_FSBASE _LWP_FSBASE
+#define VKI_LWP_GSBASE _LWP_GSBASE
+#define VKI_LWP_SETPRIVATE _LWP_SETPRIVATE
+#define VKI_LWP_GETPRIVATE _LWP_GETPRIVATE
+
+
+#include <sys/mman.h>
+#define VKI_PROT_READ PROT_READ
+#define VKI_PROT_WRITE PROT_WRITE
+#define VKI_PROT_EXEC PROT_EXEC
+#define VKI_PROT_NONE PROT_NONE
+
+#define VKI_MAP_SHARED MAP_SHARED
+#define VKI_MAP_PRIVATE MAP_PRIVATE
+#define VKI_MAP_FIXED MAP_FIXED
+#define VKI_MAP_ANONYMOUS MAP_ANONYMOUS
+#define VKI_MAP_ALIGN MAP_ALIGN
+#define VKI_MAP_TEXT MAP_TEXT
+#define VKI_MAP_INITDATA MAP_INITDATA
+
+#define VKI_MMOBJ_ALL_FLAGS MMOBJ_ALL_FLAGS
+#define VKI_MMOBJ_INTERPRET MMOBJ_INTERPRET
+#define VKI_MMOBJ_PADDING MMOBJ_PADDING
+#define VKI_MR_PADDING MR_PADDING
+#define VKI_MR_HDR_ELF MR_HDR_ELF
+#define VKI_MR_GET_TYPE(val) MR_GET_TYPE(val)
+#define vki_mmapobj_result_t mmapobj_result_t
+
+#define vki_memcntl_mha memcntl_mha
+#define VKI_MC_LOCKAS MC_LOCKAS
+#define VKI_MC_UNLOCKAS MC_UNLOCKAS
+#define VKI_MC_HAT_ADVISE MC_HAT_ADVISE
+
+
+#include <sys/mntio.h>
+#define VKI_MNTIOC_GETMNTANY MNTIOC_GETMNTANY
+
+
+#include <sys/mnttab.h>
+#define vki_mntentbuf mntentbuf
+#define vki_mnttab mnttab
+
+
+#include <sys/mount.h>
+#define	VKI_MS_DATA MS_DATA
+#define	VKI_MS_OPTIONSTR MS_OPTIONSTR
+
+
+#include <sys/poll.h>
+#define vki_pollfd pollfd
+#define vki_pollfd_t pollfd_t
+#define vki_nfds_t nfds_t
+
+
+#include <sys/pool_impl.h>
+#define VKI_POOL_STATUSQ POOL_STATUSQ
+#define vki_pool_status_t pool_status_t
+
+
+#include <sys/port.h>
+#include <sys/port_impl.h>
+#define VKI_PORT_SOURCE_FD PORT_SOURCE_FD
+#define VKI_PORT_SOURCE_FILE PORT_SOURCE_FILE
+
+#define vki_port_event_t port_event_t
+#define vki_port_notify_t port_notify_t
+#define vki_file_obj file_obj
+
+#define VKI_PORT_CREATE PORT_CREATE
+#define VKI_PORT_ASSOCIATE PORT_ASSOCIATE
+#define VKI_PORT_DISSOCIATE PORT_DISSOCIATE
+#define VKI_PORT_SEND PORT_SEND
+#define VKI_PORT_SENDN PORT_SENDN
+#define VKI_PORT_GET PORT_GET
+#define VKI_PORT_GETN PORT_GETN
+#define VKI_PORT_ALERT PORT_ALERT
+#define VKI_PORT_DISPATCH PORT_DISPATCH
+
+#define VKI_PORT_SYS_NOPORT PORT_SYS_NOPORT
+#define VKI_PORT_CODE_MASK PORT_CODE_MASK
+
+
+#include <sys/priocntl.h>
+#include <sys/rtpriocntl.h>
+#include <sys/tspriocntl.h>
+#include <sys/iapriocntl.h>
+#include <sys/fsspriocntl.h>
+#include <sys/fxpriocntl.h>
+#define VKI_PC_GETCID PC_GETCID
+#define VKI_PC_GETCLINFO PC_GETCLINFO
+#define VKI_PC_SETPARMS PC_SETPARMS
+#define VKI_PC_GETPARMS PC_GETPARMS
+#define VKI_PC_ADMIN PC_ADMIN
+#define VKI_PC_GETPRIRANGE PC_GETPRIRANGE
+#define VKI_PC_DONICE PC_DONICE
+#define VKI_PC_SETXPARMS PC_SETXPARMS
+#define VKI_PC_GETXPARMS PC_GETXPARMS
+#define VKI_PC_SETDFLCL PC_SETDFLCL
+#define VKI_PC_GETDFLCL PC_GETDFLCL
+#define VKI_PC_DOPRIO PC_DOPRIO
+
+#define VKI_PC_CLNMSZ PC_CLNMSZ
+
+#define VKI_PC_GETNICE PC_GETNICE
+#define VKI_PC_SETNICE PC_SETNICE
+
+#define VKI_PC_GETPRIO PC_GETPRIO
+#define VKI_PC_SETPRIO PC_SETPRIO
+
+#define vki_pcinfo_t pcinfo_t
+#define vki_rtinfo_t rtinfo_t
+#define vki_tsinfo_t tsinfo_t
+#define vki_iainfo_t iainfo_t
+#define vki_fssinfo_t fssinfo_t
+#define vki_fxinfo_t fxinfo_t
+
+#define vki_pcparms_t pcparms_t
+#define vki_pcnice_t pcnice_t
+#define vki_pcprio_t pcprio_t
+#define vki_pc_vaparm_t pc_vaparm_t
+#define vki_pc_vaparms_t pc_vaparms_t
+#define vki_pcpri_t pcpri_t
+
+#define VKI_PC_KY_CLNAME PC_KY_CLNAME
+#define VKI_RT_KY_PRI RT_KY_PRI
+#define VKI_RT_KY_TQSECS RT_KY_TQSECS
+#define VKI_RT_KY_TQNSECS RT_KY_TQNSECS
+#define VKI_RT_KY_TQSIG RT_KY_TQSIG
+#define VKI_TS_KY_UPRILIM TS_KY_UPRILIM
+#define VKI_TS_KY_UPRI TS_KY_UPRI
+#define VKI_IA_KY_UPRILIM IA_KY_UPRILIM
+#define VKI_IA_KY_UPRI IA_KY_UPRI
+#define VKI_IA_KY_MODE IA_KY_MODE
+#define VKI_FSS_KY_UPRILIM FSS_KY_UPRILIM
+#define VKI_FSS_KY_UPRI FSS_KY_UPRI
+#define VKI_FX_KY_UPRILIM FX_KY_UPRILIM
+#define VKI_FX_KY_UPRI FX_KY_UPRI
+#define VKI_FX_KY_TQSECS FX_KY_TQSECS
+#define VKI_FX_KY_TQNSECS FX_KY_TQNSECS
+
+
+#include <sys/priv.h>
+#define vki_priv_impl_info_t priv_impl_info_t
+
+
+#include <sys/proc.h>
+#define VKI_SRUN SRUN
+#define VKI_SSLEEP SSLEEP
+#define VKI_SZOMB SZOMB
+
+
+#include <sys/processor.h>
+#define vki_processorid_t processorid_t
+
+
+/* We want the new /proc definitions. */
+#define _STRUCTURED_PROC 1
+#include <sys/procfs.h>
+#define VKI_MA_READ MA_READ
+#define VKI_MA_WRITE MA_WRITE
+#define VKI_MA_EXEC MA_EXEC
+#define VKI_PRNODEV PRNODEV
+#define VKI_PR_PCINVAL PR_PCINVAL
+#define vki_lwpsinfo_t lwpsinfo_t
+#define vki_lwpstatus_t lwpstatus_t
+#define vki_prcred_t prcred_t
+#define vki_prmap_t prmap_t
+#define vki_prpriv_t prpriv_t
+#define vki_prxmap_t prxmap_t
+#define vki_pstatus_t pstatus_t
+#define vki_psinfo_t psinfo_t
+
+
+#include <sys/procfs_isa.h>
+#if defined(SOLARIS_PRXREGSET_T)
+#define vki_prxregset_t prxregset_t
+#endif /* SOLARIS_PRXREGSET_T */
+
+
+#include <sys/procset.h>
+#define vki_idtype_t idtype_t
+#define VKI_P_PID P_PID
+#define VKI_P_PGID P_PGID
+#define VKI_P_ALL P_ALL
+#define vki_procset_t procset_t
+
+
+#include <sys/regset.h>
+#define vki_prgregset_t prgregset_t
+
+
+#include <sys/resource.h>
+#define VKI_RLIMIT_DATA RLIMIT_DATA
+#define VKI_RLIMIT_STACK RLIMIT_STACK
+#define VKI_RLIMIT_CORE RLIMIT_CORE
+#define VKI_RLIMIT_NOFILE RLIMIT_NOFILE
+#define VKI__RUSAGESYS_GETRUSAGE _RUSAGESYS_GETRUSAGE
+#define VKI__RUSAGESYS_GETRUSAGE_CHLD _RUSAGESYS_GETRUSAGE_CHLD
+#define VKI__RUSAGESYS_GETRUSAGE_LWP _RUSAGESYS_GETRUSAGE_LWP
+#define VKI__RUSAGESYS_GETVMUSAGE _RUSAGESYS_GETVMUSAGE
+#define vki_rlimit rlimit
+#define vki_rlimit64 rlimit64
+#define vki_rusage rusage
+
+
+#include <sys/schedctl.h>
+#define vki_sc_shared sc_shared
+
+
+#include <sys/segments.h>
+#define VKI_GDT_LWPGS GDT_LWPGS
+#if defined(VGP_amd64_solaris)
+/* Values VKI_UCS_SEL/VKI_UDS_SEL can be used only on amd64. On x86, correct
+   %cs/%ds values for a client need to be obtained from the host registers
+   because they are different depending on the running kernel (x86 or amd64).
+ */
+#define VKI_UCS_SEL UCS_SEL
+#define VKI_UDS_SEL UDS_SEL
+#endif
+#define VKI_LWPGS_SEL LWPGS_SEL
+
+
+#include <sys/select.h>
+#define vki_fd_set fd_set
+
+
+#include <sys/priv.h>
+/* Define _KMEMUSER so priv_set is pulled in. */
+#define _KMEMUSER
+#include <sys/priv_impl.h>
+#undef _KMEMUSER
+#define vki_priv_set_t priv_set_t
+#define vki_priv_ptype_t priv_ptype_t
+#define vki_priv_op_t priv_op_t
+
+#define VKI_PRIVSYS_SETPPRIV PRIVSYS_SETPPRIV
+#define VKI_PRIVSYS_GETPPRIV PRIVSYS_GETPPRIV
+#define VKI_PRIVSYS_GETIMPLINFO PRIVSYS_GETIMPLINFO
+#define VKI_PRIVSYS_SETPFLAGS PRIVSYS_SETPFLAGS
+#define VKI_PRIVSYS_GETPFLAGS PRIVSYS_GETPFLAGS
+#define VKI_PRIVSYS_ISSETUGID PRIVSYS_ISSETUGID
+#define VKI_PRIVSYS_PFEXEC_REG PRIVSYS_PFEXEC_REG
+#define VKI_PRIVSYS_PFEXEC_UNREG PRIVSYS_PFEXEC_UNREG
+
+#define vki_priv_impl_info_t priv_impl_info_t
+
+
+#include <sys/sem.h>
+#include <sys/sem_impl.h>
+#define VKI_GETALL GETALL
+#define VKI_GETPID GETPID
+#define VKI_GETNCNT GETNCNT
+#define VKI_GETZCNT GETZCNT
+#define VKI_GETVAL GETVAL
+#define VKI_SEMCTL SEMCTL
+#define VKI_SEMGET SEMGET
+#define VKI_SEMIDS SEMIDS
+#define VKI_SEMOP SEMOP
+#define VKI_SEMTIMEDOP SEMTIMEDOP
+#define VKI_SETALL SETALL
+#define VKI_SETVAL SETVAL
+
+#define vki_semid_ds semid_ds
+#define vki_sembuf sembuf
+
+/* The semun union has to be explicitly declared by the application program
+   (see semctl(2)). */
+union vki_semun {
+   int val;
+   struct semid_ds *buf;
+   ushort_t *array;
+};
+
+
+#include <sys/sendfile.h>
+#define VKI_SENDFILEV SENDFILEV
+#define VKI_SENDFILEV64 SENDFILEV64
+#define VKI_SFV_FD_SELF SFV_FD_SELF
+#define vki_sendfilevec sendfilevec
+#define vki_sendfilevec64 sendfilevec64
+
+
+#include <sys/shm.h>
+#include <sys/shm_impl.h>
+#define VKI_SHMAT SHMAT
+#define VKI_SHMCTL SHMCTL
+#define VKI_SHMDT SHMDT
+#define VKI_SHMGET SHMGET
+#define VKI_SHMIDS SHMIDS
+#if defined(SOLARIS_SHM_NEW)
+#define VKI_SHMADV SHMADV
+#define VKI_SHMGET_OSM SHMGET_OSM
+#define VKI_SHM_ADV_GET SHM_ADV_GET
+#define VKI_SHM_ADV_SET SHM_ADV_SET
+#endif /* SOLARIS_SHM_NEW */
+#define VKI_SHM_LOCK SHM_LOCK
+#define VKI_SHM_RDONLY SHM_RDONLY
+#define VKI_SHM_UNLOCK SHM_UNLOCK
+/* Should be correct, but not really neat. */
+#define VKI_SHMLBA VKI_PAGE_SIZE
+
+#define vki_shmid_ds shmid_ds
+#define vki_shmid_ds64 shmid_ds64
+#define vki_shmid_xds64 shmid_xds64
+
+
+#include <sys/siginfo.h>
+/* This section also contains items defined in sys/machsig.h, this file
+   is directly included in sys/siginfo.h. */
+#define vki_sigevent sigevent
+#define vki_siginfo_t siginfo_t
+
+#define VKI_SI_LWP SI_LWP
+#define VKI_SI_USER SI_USER
+#define VKI_SIGEV_PORT SIGEV_PORT
+#define VKI_SIGEV_THREAD SIGEV_THREAD
+
+/* SIGTRAP signal codes */
+#define VKI_TRAP_BRKPT TRAP_BRKPT
+
+/* SIGCLD signal codes */
+#define VKI_CLD_EXITED CLD_EXITED
+#define VKI_CLD_KILLED CLD_KILLED
+#define VKI_CLD_DUMPED CLD_DUMPED
+#define VKI_CLD_TRAPPED CLD_TRAPPED
+#define VKI_CLD_STOPPED CLD_STOPPED
+#define VKI_CLD_CONTINUED CLD_CONTINUED
+
+/* SIGILL signal codes */
+#define VKI_ILL_ILLOPC ILL_ILLOPC
+#define VKI_ILL_ILLOPN ILL_ILLOPN
+#define VKI_ILL_ILLADR ILL_ILLADR
+#define VKI_ILL_ILLTRP ILL_ILLTRP
+#define VKI_ILL_PRVOPC ILL_PRVOPC
+#define VKI_ILL_PRVREG ILL_PRVREG
+#define VKI_ILL_COPROC ILL_COPROC
+#define VKI_ILL_BADSTK ILL_BADSTK
+
+/* SIGFPE signal codes */
+#define VKI_FPE_INTDIV FPE_INTDIV
+#define VKI_FPE_INTOVF FPE_INTOVF
+#define VKI_FPE_FLTDIV FPE_FLTDIV
+#define VKI_FPE_FLTOVF FPE_FLTOVF
+#define VKI_FPE_FLTUND FPE_FLTUND
+#define VKI_FPE_FLTRES FPE_FLTRES
+#define VKI_FPE_FLTINV FPE_FLTINV
+#define VKI_FPE_FLTSUB FPE_FLTSUB
+#define VKI_FPE_FLTDEN FPE_FLTDEN
+
+/* SIGSEV signal codes */
+#define VKI_SEGV_MAPERR SEGV_MAPERR
+#define VKI_SEGV_ACCERR SEGV_ACCERR
+
+/* SIGBUS signal codes */
+#define VKI_BUS_ADRALN BUS_ADRALN
+#define VKI_BUS_ADRERR BUS_ADRERR
+#define VKI_BUS_OBJERR BUS_OBJERR
+
+
+#include <sys/signal.h>
+/* This section also contains items defined in sys/iso/signal_iso.h, this file
+   is directly included in sys/signal.h. */
+
+/* Next three constants describe the internal representation of sigset_t,
+   there are checks in coregrind/m_vki.c to make sure they are correct. */
+#define _VKI_NSIG 128
+#define _VKI_MAXSIG MAXSIG
+#define _VKI_NSIG_BPW 32
+#define _VKI_NSIG_WORDS (_VKI_NSIG / _VKI_NSIG_BPW)
+#define vki_sigset_t sigset_t
+#define vki_sigaltstack sigaltstack
+/* sigset_t accessor */
+#define sig __sigbits
+
+/* On Solaris we use the same type for passing sigactions to
+   and from the kernel. Hence: */
+typedef struct sigaction vki_sigaction_toK_t;
+typedef struct sigaction vki_sigaction_fromK_t;
+/* sigaction_t accessor */
+#define ksa_handler sa_handler
+
+#define VKI_SA_ONSTACK SA_ONSTACK
+#define VKI_SA_ONESHOT SA_RESETHAND
+#define VKI_SA_NOMASK SA_NODEFER
+
+#define VKI_MINSIGSTKSZ MINSIGSTKSZ
+
+#define VKI_SS_ONSTACK SS_ONSTACK
+#define VKI_SS_DISABLE SS_DISABLE
+
+#define vki_stack_t stack_t
+
+#define VKI_SA_NOCLDSTOP SA_NOCLDSTOP
+#define VKI_SA_RESTART SA_RESTART
+#define VKI_SA_SIGINFO SA_SIGINFO
+#define VKI_SA_NOCLDWAIT SA_NOCLDWAIT
+#define VKI_SA_RESTORER 0 /* Solaris doesn't have this */
+
+#define VKI_SIGHUP SIGHUP               /*  1 */
+#define VKI_SIGINT SIGINT               /*  2 */
+#define VKI_SIGQUIT SIGQUIT             /*  3 */
+#define VKI_SIGILL SIGILL               /*  4 */
+#define VKI_SIGTRAP SIGTRAP             /*  5 */
+#define VKI_SIGABRT SIGABRT             /*  6 */
+#define VKI_SIGEMT SIGEMT               /*  7 */
+#define VKI_SIGFPE SIGFPE               /*  8 */
+#define VKI_SIGKILL SIGKILL             /*  9 */
+#define VKI_SIGBUS SIGBUS               /* 10 */
+#define VKI_SIGSEGV SIGSEGV             /* 11 */
+#define VKI_SIGSYS SIGSYS               /* 12 */
+#define VKI_SIGPIPE SIGPIPE             /* 13 */
+#define VKI_SIGALRM SIGALRM             /* 14 */
+#define VKI_SIGTERM SIGTERM             /* 15 */
+#define VKI_SIGUSR1 SIGUSR1             /* 16 */
+#define VKI_SIGUSR2 SIGUSR2             /* 17 */
+#define VKI_SIGCHLD SIGCHLD             /* 18 */
+#define VKI_SIGPWR SIGPWR               /* 19 */
+#define VKI_SIGWINCH SIGWINCH           /* 20 */
+#define VKI_SIGURG SIGURG               /* 21 */
+#define VKI_SIGIO SIGIO                 /* 22 */
+#define VKI_SIGSTOP SIGSTOP             /* 23 */
+#define VKI_SIGTSTP SIGTSTP             /* 24 */
+#define VKI_SIGCONT SIGCONT             /* 25 */
+#define VKI_SIGTTIN SIGTTIN             /* 26 */
+#define VKI_SIGTTOU SIGTTOU             /* 27 */
+#define VKI_SIGVTALRM SIGVTALRM         /* 28 */
+#define VKI_SIGPROF SIGPROF             /* 29 */
+#define VKI_SIGXCPU SIGXCPU             /* 30 */
+#define VKI_SIGXFSZ SIGXFSZ             /* 31 */
+#define VKI_SIGWAITING SIGWAITING       /* 32 */
+#define VKI_SIGLWP SIGLWP               /* 33 */
+#define VKI_SIGFREEZE SIGFREEZE         /* 34 */
+#define VKI_SIGTHAW SIGTHAW             /* 35 */
+#define VKI_SIGCANCEL SIGCANCEL         /* 36 */
+#define VKI_SIGLOST SIGLOST             /* 37 */
+#define VKI_SIGXRES SIGXRES             /* 38 */
+#define VKI_SIGJVM1 SIGJVM1             /* 39 */
+#define VKI_SIGJVM2 SIGJVM2             /* 40 */
+/* Note that SIGRTMIN and SIGRTMAX are actually macros calling into
+   libc's sysconf() which in turn calls into kernel. And it returns
+   these _SIGRTM* values. So we are safe until someone rebuilds Solaris
+   kernel with different values... */
+#define VKI_SIGRTMIN _SIGRTMIN          /* 41 */
+#define VKI_SIGRTMAX _SIGRTMAX          /* 72 */
+
+#define VKI_SIG_DFL SIG_DFL
+#define VKI_SIG_IGN SIG_IGN
+
+#define VKI_SIG_BLOCK SIG_BLOCK
+#define VKI_SIG_UNBLOCK SIG_UNBLOCK
+#define VKI_SIG_SETMASK SIG_SETMASK
+
+
+#include <sys/socket.h>
+#define vki_sa_family_t sa_family_t
+#define vki_sockaddr sockaddr
+
+#define vki_socklen_t socklen_t
+
+#define VKI_SOCK_STREAM SOCK_STREAM
+
+#define VKI_SO_TYPE SO_TYPE
+#define VKI_SCM_RIGHTS SCM_RIGHTS
+#define VKI_SOL_SOCKET SOL_SOCKET
+
+#define VKI_AF_UNIX AF_UNIX
+#define VKI_AF_INET AF_INET
+#define VKI_AF_INET6 AF_INET6
+
+#define vki_msghdr msghdr
+#define vki_cmsghdr cmsghdr
+
+#define VKI_CMSG_ALIGN(a) _CMSG_DATA_ALIGN(a)
+#define VKI_CMSG_DATA(cmsg) CMSG_DATA(cmsg)
+#define VKI_CMSG_FIRSTHDR(mhdr) CMSG_FIRSTHDR(mhdr)
+#define VKI_CMSG_NXTHDR(mhdr, cmsg) CMSG_NXTHDR(mhdr, cmsg)
+
+
+#include <sys/socketvar.h>
+#define VKI_SOV_DEFAULT SOV_DEFAULT
+
+
+#include <sys/sockio.h>
+#define VKI_SIOCGLIFNUM SIOCGLIFNUM
+
+
+#if defined(SOLARIS_SPAWN_SYSCALL)
+#include <sys/spawn_impl.h>
+#define VKI_FA_CHDIR FA_CHDIR
+#define VKI_FA_CLOSE FA_CLOSE
+#define VKI_FA_CLOSEFROM FA_CLOSEFROM
+#define VKI_FA_DUP2 FA_DUP2
+#define VKI_FA_OPEN FA_OPEN
+#define VKI_POSIX_SPAWN_NOEXECERR_NP POSIX_SPAWN_NOEXECERR_NP
+#define VKI_POSIX_SPAWN_NOSIGCHLD_NP POSIX_SPAWN_NOSIGCHLD_NP
+#define VKI_POSIX_SPAWN_RESETIDS POSIX_SPAWN_RESETIDS
+#define VKI_POSIX_SPAWN_SETPGROUP POSIX_SPAWN_SETPGROUP
+#define VKI_POSIX_SPAWN_SETSCHEDPARAM POSIX_SPAWN_SETSCHEDPARAM
+#define VKI_POSIX_SPAWN_SETSCHEDULER POSIX_SPAWN_SETSCHEDULER
+#define VKI_POSIX_SPAWN_SETSID_NP POSIX_SPAWN_SETSID_NP
+#define VKI_POSIX_SPAWN_SETSIGDEF POSIX_SPAWN_SETSIGDEF
+#define VKI_POSIX_SPAWN_SETSIGIGN_NP POSIX_SPAWN_SETSIGIGN_NP
+#define VKI_POSIX_SPAWN_SETSIGMASK POSIX_SPAWN_SETSIGMASK
+#define VKI_POSIX_SPAWN_SETVAMASK_NP POSIX_SPAWN_SETVAMASK_NP
+#define VKI_POSIX_SPAWN_WAITPID_NP POSIX_SPAWN_WAITPID_NP
+#define VKI_SPAWN_VERSION SPAWN_VERSION
+#define vki_kfile_attr_t kfile_attr_t
+#define vki_kspawn_attr_t kspawn_attr_t
+#define vki_spawn_attr_t spawn_attr_t
+#endif /* SOLARIS_SPAWN_SYSCALL */
+
+
+#include <sys/stat.h>
+#define vki_stat stat
+#define vki_stat64 stat64
+
+#define st_atime_nsec st_atim.tv_nsec
+#define st_mtime_nsec st_mtim.tv_nsec
+#define st_ctime_nsec st_ctim.tv_nsec
+
+#define VKI_S_IFIFO S_IFIFO
+#define VKI_S_ISUID S_ISUID
+#define VKI_S_ISGID S_ISGID
+
+#define VKI_S_IRUSR S_IRUSR
+#define VKI_S_IWUSR S_IWUSR
+#define VKI_S_IXUSR S_IXUSR
+#define VKI_S_IRGRP S_IRGRP
+#define VKI_S_IWGRP S_IWGRP
+#define VKI_S_IXGRP S_IXGRP
+#define VKI_S_IROTH S_IROTH
+#define VKI_S_IWOTH S_IWOTH
+#define VKI_S_IXOTH S_IXOTH
+
+#define VKI_S_ISCHR S_ISCHR
+#define VKI_S_ISDIR S_ISDIR
+#define VKI_S_ISBLK S_ISBLK
+#define VKI_S_ISREG S_ISREG
+#define VKI_S_ISLNK S_ISLNK
+
+
+#include <sys/statfs.h>
+#define vki_statfs statfs
+
+
+#include <sys/statvfs.h>
+#define vki_statvfs statvfs
+#define vki_statvfs64 statvfs64
+
+
+#include <sys/stropts.h>
+#define VKI_I_CANPUT I_CANPUT
+#define VKI_I_PEEK I_PEEK
+#define VKI_I_PUSH I_PUSH
+#define VKI_I_STR I_STR
+#define vki_strbuf strbuf
+#define vki_strioctl strioctl
+#define vki_strpeek strpeek
+
+
+#include <sys/synch.h>
+#define vki_lwp_mutex_t lwp_mutex_t
+#define vki_lwp_cond_t lwp_cond_t
+#define vki_lwp_sema_t lwp_sema_t
+#define vki_lwp_rwlock_t lwp_rwlock_t
+
+/* Defines from the private sys/synch32.h header. */
+#define vki_mutex_flag flags.flag1
+#define vki_mutex_type flags.mbcp_type_un.mtype_rcount.count_type1
+#define vki_mutex_rcount flags.mbcp_type_un.mtype_rcount.count_type2
+#define vki_mutex_owner data
+#define vki_mutex_lockw lock.lock64.pad[7]
+#define vki_mutex_waiters lock.lock64.pad[6]
+#define vki_mutex_ownerpid lock.lock32.ownerpid
+
+#define vki_cond_type flags.type
+#define vki_cond_waiters_kernel flags.flag[3]
+
+#define vki_sema_count count
+#define vki_sema_type type
+#define vki_sema_waiters flags[7]
+
+#define vki_rwlock_readers readers
+#define vki_rwlock_type type
+#define vki_rwlock_owner readercv.data
+#define vki_rwlock_ownerpid writercv.data
+
+
+#include <sys/sysconfig.h>
+#define VKI_CONFIG_OPEN_FILES _CONFIG_OPEN_FILES
+
+
+#include <sys/sysi86.h>
+#define VKI_SI86FPSTART SI86FPSTART
+
+
+#include <sys/systeminfo.h>
+#define VKI_SI_SYSNAME SI_SYSNAME
+#define VKI_SI_HOSTNAME SI_HOSTNAME
+#define VKI_SI_RELEASE SI_RELEASE
+#define VKI_SI_VERSION SI_VERSION
+#define VKI_SI_MACHINE SI_MACHINE
+#define VKI_SI_ARCHITECTURE SI_ARCHITECTURE
+#define VKI_SI_HW_SERIAL SI_HW_SERIAL
+#define VKI_SI_HW_PROVIDER SI_HW_PROVIDER
+#define VKI_SI_SRPC_DOMAIN SI_SRPC_DOMAIN
+
+#define VKI_SI_SET_HOSTNAME SI_SET_HOSTNAME
+#define VKI_SI_SET_SRCP_DOMAIN SI_SET_SRPC_DOMAIN
+
+#define VKI_SI_PLATFORM SI_PLATFORM
+#define VKI_SI_ISALIST SI_ISALIST
+#define VKI_SI_DHCP_CACHE SI_DHCP_CACHE
+#define VKI_SI_ARCHITECTURE_32 SI_ARCHITECTURE_32
+#define VKI_SI_ARCHITECTURE_64 SI_ARCHITECTURE_64
+#define VKI_SI_ARCHITECTURE_K SI_ARCHITECTURE_K
+#define VKI_SI_ARCHITECTURE_NATIVE SI_ARCHITECTURE_NATIVE
+
+
+#include <sys/termio.h>
+#define vki_termio termio
+
+
+#include <sys/termios.h>
+#define vki_termios termios
+#define VKI_TCGETA TCGETA
+#define VKI_TCGETS TCGETS
+#define VKI_TCSETS TCSETS
+#define VKI_TCSETSF TCSETSF
+#define VKI_TCSETSW TCSETSW
+#define VKI_TIOCGPGRP TIOCGPGRP
+#define VKI_TIOCGSID TIOCGSID
+#define VKI_TIOCGWINSZ TIOCGWINSZ
+#define VKI_TIOCNOTTY TIOCNOTTY
+#define VKI_TIOCSCTTY TIOCSCTTY
+#define VKI_TIOCSPGRP TIOCSPGRP
+#define VKI_TIOCSWINSZ TIOCSWINSZ
+#define vki_winsize winsize
+
+
+#include <sys/time.h>
+#define VKI_CLOCK_MONOTONIC CLOCK_MONOTONIC
+
+#define vki_clockid_t clockid_t
+#define vki_timespec timespec
+#define vki_timespec_t timespec_t
+#define vki_timeval timeval
+#define vki_timezone timezone
+#define vki_itimerspec itimerspec
+#define vki_itimerval itimerval
+
+
+#include <sys/times.h>
+#define vki_tms tms
+
+
+#include <sys/tsol/label_macro.h>
+#define vki_bslabel_t bslabel_t
+
+
+/* Do not include sys/tsol/tndb.h if a C++ compiler is used to build a file
+   which includes vki-solaris.h.  This cannot be done because the tndb.h
+   header file uses the template keyword as a member name (on illumos). */
+#if !defined(__cplusplus)
+#include <sys/tsol/tndb.h>
+#define VKI_TNDB_DELETE TNDB_DELETE
+#define VKI_TNDB_FLUSH TNDB_FLUSH
+#define VKI_TNDB_GET TNDB_GET
+#if defined(SOLARIS_TNDB_GET_TNIP)
+#define VKI_TNDB_GET_TNIP TNDB_GET_TNIP
+#endif /* SOLARIS_TNDB_GET_TNIP */
+#define VKI_TNDB_LOAD TNDB_LOAD
+#define vki_tsol_mlpent_t tsol_mlpent_t
+#define vki_tsol_rhent_t tsol_rhent_t
+#define vki_tsol_tpent_t tsol_tpent_t
+#endif /* !__cplusplus */
+
+
+#include <sys/tsol/tsyscall.h>
+#define VKI_TSOL_FGETLABEL TSOL_FGETLABEL
+#define VKI_TSOL_GETLABEL TSOL_GETLABEL
+#define VKI_TSOL_TNMLP TSOL_TNMLP
+#define VKI_TSOL_TNRH TSOL_TNRH
+#define VKI_TSOL_TNRHTP TSOL_TNRHTP
+#define VKI_TSOL_SYSLABELING TSOL_SYSLABELING
+#if defined(SOLARIS_TSOL_CLEARANCE)
+#define VKI_TSOL_GETCLEARANCE TSOL_GETCLEARANCE
+#define VKI_TSOL_SETCLEARANCE TSOL_SETCLEARANCE
+#endif /* SOLARIS_TSOL_CLEARANCE */
+
+
+#include <sys/ttold.h>
+#define vki_sgttyb sgttyb
+
+
+#include <sys/ucontext.h>
+/* This section also contains items defined in sys/regset.h, this file
+   is directly included in sys/ucontext.h. */
+#if defined(VGP_x86_solaris)
+#define VKI_SS SS
+#define VKI_UESP UESP
+#define VKI_EFL EFL
+#define VKI_CS CS
+#define VKI_EIP EIP
+#define VKI_ERR 13 /* ERR */
+#define VKI_TRAPNO TRAPNO
+#define VKI_EAX EAX
+#define VKI_ECX ECX
+#define VKI_EDX EDX
+#define VKI_EBX EBX
+#define VKI_ESP ESP
+#define VKI_EBP EBP
+#define VKI_ESI ESI
+#define VKI_EDI EDI
+#define VKI_DS DS
+#define VKI_ES ES
+#define VKI_FS FS
+#define VKI_GS GS
+
+/* Definitions for compatibility with amd64-solaris. */
+#define VKI_REG_ERR VKI_ERR
+#define VKI_REG_TRAPNO VKI_TRAPNO
+
+#define VKI_EFLAGS_ID_BIT (1 << 21)
+
+#elif defined(VGP_amd64_solaris)
+#define VKI_REG_GSBASE REG_GSBASE
+#define VKI_REG_FSBASE REG_FSBASE
+#define VKI_REG_DS REG_DS
+#define VKI_REG_ES REG_ES
+#define VKI_REG_GS REG_GS
+#define VKI_REG_FS REG_FS
+#define VKI_REG_SS REG_SS
+#define VKI_REG_RSP REG_RSP
+#define VKI_REG_RFL REG_RFL
+#define VKI_REG_CS REG_CS
+#define VKI_REG_RIP REG_RIP
+#define VKI_REG_ERR REG_ERR
+#define VKI_REG_TRAPNO REG_TRAPNO
+#define VKI_REG_RAX REG_RAX
+#define VKI_REG_RCX REG_RCX
+#define VKI_REG_RDX REG_RDX
+#define VKI_REG_RBX REG_RBX
+#define VKI_REG_RBP REG_RBP
+#define VKI_REG_RSI REG_RSI
+#define VKI_REG_RDI REG_RDI
+#define VKI_REG_R8 REG_R8
+#define VKI_REG_R9 REG_R9
+#define VKI_REG_R10 REG_R10
+#define VKI_REG_R11 REG_R11
+#define VKI_REG_R12 REG_R12
+#define VKI_REG_R13 REG_R13
+#define VKI_REG_R14 REG_R14
+#define VKI_REG_R15 REG_R15
+
+#define VKI_RFLAGS_ID_BIT (1 << 21)
+
+#else
+#error "Unknown platform"
+#endif
+
+#define vki_fpregset_t fpregset_t
+
+/* Don't polute global namespace so much. */
+#undef r_r0
+#undef r_r1
+#undef r_fp
+#undef r_sp
+#undef r_pc
+#undef r_ps
+#undef ERR
+
+#if defined(VGP_x86_solaris)
+/* The ucontext structure as defined in the SYSV ABI for Intel386. Illumos
+   contains exactly this definition. Solaris 11 utilizes two uc_filler values
+   -> "xrs_t uc_xrs; long uc_filler[3];". The xrs_t structure is used for the
+   AVX support. We define our own ucontext structure because all five
+   uc_filler values need to be available in VG_(save_context). Note that
+   Valgrind doesn't support AVX on the x86 platform. */
+typedef struct sysv_ucontext sysv_ucontext_t;
+struct sysv_ucontext {
+   unsigned long uc_flags;
+   sysv_ucontext_t *uc_link;
+   sigset_t uc_sigmask;
+   stack_t uc_stack;
+   mcontext_t uc_mcontext;
+   long uc_filler[5];
+};
+#define VKI_UC_GUEST_CC_OP(uc) (*(UWord*)&(uc)->uc_filler[0])
+#define VKI_UC_GUEST_CC_NDEP(uc) (*(UWord*)&(uc)->uc_filler[1])
+#define VKI_UC_GUEST_CC_DEP1(uc) (*(UWord*)&(uc)->uc_filler[2])
+#define VKI_UC_GUEST_CC_DEP2(uc) (*(UWord*)&(uc)->uc_filler[3])
+#define VKI_UC_GUEST_EFLAGS_NEG(uc) \
+   (*(UWord*)&(uc)->uc_mcontext.fpregs.fp_reg_set.fpchip_state.__pad[0])
+#define VKI_UC_GUEST_EFLAGS_CHECKSUM(uc) \
+   (*(UWord*)&(uc)->uc_mcontext.fpregs.fp_reg_set.fpchip_state.__pad[1])
+#define VKI_UC_SIGNO(uc) (*(UWord*)&(uc)->uc_filler[4])
+#define VKI_UC_SIGNO_CONST(uc) (*(const UWord*)&(uc)->uc_filler[4])
+
+#define vki_ucontext_t sysv_ucontext_t
+#define vki_ucontext sysv_ucontext
+
+#elif defined(VGP_amd64_solaris)
+/* The ucontext structure on Solaris has only 3 elements available in uc_filler
+   which is not enough to store all required information. Therefore padding
+   area in mcontext's FPU regset is used. */
+#define vki_ucontext ucontext
+#define vki_ucontext_t ucontext_t
+#define VKI_UC_MC_FP_FX_IGN2(uc) \
+    (uc)->uc_mcontext.fpregs.fp_reg_set.fpchip_state.__fx_ign2
+#define VKI_UC_GUEST_CC_OP(uc) (*(UWord *) &VKI_UC_MC_FP_FX_IGN2(uc)[0])
+#define VKI_UC_GUEST_CC_NDEP(uc) (*(UWord *) &VKI_UC_MC_FP_FX_IGN2(uc)[1])
+#define VKI_UC_GUEST_CC_DEP1(uc) (*(UWord *) &VKI_UC_MC_FP_FX_IGN2(uc)[2])
+#define VKI_UC_GUEST_CC_DEP2(uc) (*(UWord *) &VKI_UC_MC_FP_FX_IGN2(uc)[3])
+#define VKI_UC_GUEST_RFLAGS_NEG(uc) (*(UWord *) &VKI_UC_MC_FP_FX_IGN2(uc)[4])
+#define VKI_UC_GUEST_RFLAGS_CHECKSUM(uc) \
+   (*(UWord *) &VKI_UC_MC_FP_FX_IGN2(uc)[5])
+#define VKI_UC_SIGNO(uc) (*(UWord *) &VKI_UC_MC_FP_FX_IGN2(uc)[6])
+#define VKI_UC_SIGNO_CONST(uc) (*(const UWord *) &VKI_UC_MC_FP_FX_IGN2(uc)[6])
+
+#else
+#error "Unknown platform"
+#endif
+
+#define vki_fpchip_state fpchip_state
+
+#define VKI_GETCONTEXT GETCONTEXT
+#define VKI_SETCONTEXT SETCONTEXT
+#define VKI_GETUSTACK GETUSTACK
+#define VKI_SETUSTACK SETUSTACK
+
+#define VKI_UC_SIGMASK UC_SIGMASK
+#define VKI_UC_STACK UC_STACK
+#define VKI_UC_CPU UC_CPU
+#define VKI_UC_FPU UC_FPU
+#define VKI_UC_ALL UC_ALL
+
+#include <sys/uio.h>
+#define vki_iovec iovec
+
+
+#include <sys/un.h>
+#define vki_sockaddr_un sockaddr_un
+
+
+#if defined(SOLARIS_UUIDSYS_SYSCALL)
+#include <sys/uuid.h>
+#define vki_uuid uuid
+#endif /* SOLARIS_UUIDSYS_SYSCALL */
+
+
+#include <sys/utsname.h>
+#define vki_utsname utsname
+/* Add another alias for utsname, used in syswrap-generic.c. */
+#define vki_new_utsname utsname
+
+
+#include <sys/vm_usage.h>
+#define vki_vmusage_t vmusage_t
+
+
+#include <sys/wait.h>
+#define VKI_WEXITED WEXITED
+#define VKI_WTRAPPED WTRAPPED
+
+#define VKI_WSTOPFLG WSTOPFLG
+#define VKI_WCONTFLG WCONTFLG
+#define VKI_WCOREFLG WCOREFLG
+
+
+#include <sys/zone.h>
+#define VKI_ZONE_ADD_DATALINK ZONE_ADD_DATALINK
+#define VKI_ZONE_ATTR_NAME ZONE_ATTR_NAME
+#define VKI_ZONE_BOOT ZONE_BOOT
+#define VKI_ZONE_CHECK_DATALINK ZONE_CHECK_DATALINK
+#define VKI_ZONE_CREATE ZONE_CREATE
+#define VKI_ZONE_DEL_DATALINK ZONE_DEL_DATALINK
+#define VKI_ZONE_DESTROY ZONE_DESTROY
+#define VKI_ZONE_ENTER ZONE_ENTER
+#define VKI_ZONE_GETATTR ZONE_GETATTR
+#define VKI_ZONE_LIST ZONE_LIST
+#define VKI_ZONE_LIST_DATALINK ZONE_LIST_DATALINK
+#define VKI_ZONE_LOOKUP ZONE_LOOKUP
+#define VKI_ZONE_SETATTR ZONE_SETATTR
+#define VKI_ZONE_SHUTDOWN ZONE_SHUTDOWN
+#if defined(SOLARIS_ZONE_DEFUNCT)
+#define VKI_ZONE_GETATTR_DEFUNCT ZONE_GETATTR_DEFUNCT
+#define VKI_ZONE_LIST_DEFUNCT ZONE_LIST_DEFUNCT
+#endif /* SOLARIS_ZONE_DEFUNCT */
+#define VKI_ZONENAME_MAX ZONENAME_MAX
+#define vki_zone_def zone_def
+#define vki_zoneid_t zoneid_t
+
+
+/* from <sys/ucred.h> which is consolidation private */
+#define VKI_UCREDSYS_UCREDGET 0
+#define VKI_UCREDSYS_GETPEERUCRED 1
+struct ucred_s {
+   vki_uint32_t uc_size;     /* Size of the full structure */
+   vki_uint32_t uc_credoff;  /* Credential offset */
+   vki_uint32_t uc_privoff;  /* Privilege offset */
+   vki_pid_t    uc_pid;      /* Process id */
+   vki_uint32_t uc_audoff;   /* Audit info offset */
+   vki_zoneid_t uc_zoneid;   /* Zone id */
+   vki_projid_t uc_projid;   /* Project id */
+   vki_uint32_t uc_labeloff; /* label offset */
+};
+
+
+/* from sys/old_procfs.h which clashes with sys/procfs.h */
+
+#define VKI_ELF_OLD_PR_PCINVAL 0x0080
+
+typedef struct vki_elf_prpsinfo {
+   char		pr_state;	/* numeric process state (see pr_sname) */
+   char		pr_sname;	/* printable character representing pr_state */
+   char		pr_zomb;	/* !=0: process terminated but not waited for */
+   char		pr_nice;	/* nice for cpu usage */
+   vki_uint_t	pr_flag;	/* process flags */
+   vki_uid_t	pr_uid;		/* real user id */
+   vki_gid_t	pr_gid;		/* real group id */
+   vki_pid_t	pr_pid;		/* unique process id */
+   vki_pid_t	pr_ppid;	/* process id of parent */
+   vki_pid_t	pr_pgrp;	/* pid of process group leader */
+   vki_pid_t	pr_sid;		/* session id */
+   vki_caddr_t	pr_addr;	/* physical address of process */
+   vki_size_t	pr_size;	/* size of process image in pages */
+   vki_size_t	pr_rssize;	/* resident set size in pages */
+   vki_caddr_t	pr_wchan;	/* wait addr for sleeping process */
+   vki_timespec_t pr_start;	/* process start time, sec+nsec since epoch */
+   vki_timespec_t pr_time;	/* usr+sys cpu time for this process */
+   int		pr_pri;		/* priority, high value is high priority */
+   char		pr_oldpri;	/* pre-SVR4, low value is high priority */
+   char		pr_cpu;		/* pre-SVR4, cpu usage for scheduling */
+   vki_o_dev_t	pr_ottydev;	/* short tty device number */
+   vki_dev_t	pr_lttydev;	/* controlling tty device (PRNODEV if none) */
+   char		pr_clname[8];	/* scheduling class name */
+   char		pr_fname[16];	/* last component of execed pathname */
+   char		pr_psargs[80];	/* initial characters of arg list */
+   short	pr_syscall;	/* system call number (if in syscall) */
+   short	pr_fill;
+   vki_timespec_t pr_ctime;	/* usr+sys cpu time for reaped children */
+   vki_size_t	pr_bysize;	/* size of process image in bytes */
+   vki_size_t	pr_byrssize;	/* resident set size in bytes */
+   int		pr_argc;	/* initial argument count */
+   char		**pr_argv;	/* initial argument vector */
+   char		**pr_envp;	/* initial environment vector */
+   int		pr_wstat;	/* if zombie, the wait() status */
+                	        /* The following percent numbers are 16-bit binary */
+                	        /* fractions [0 .. 1] with the binary point to the */
+                	        /* right of the high-order bit (one == 0x8000) */
+   ushort_t 	pr_pctcpu;	/* % of recent cpu time, one or all lwps */
+   ushort_t 	pr_pctmem;	/* % of of system memory used by the process */
+   vki_uid_t	pr_euid;	/* effective user id */
+   vki_gid_t	pr_egid;	/* effective group id */
+   vki_id_t	pr_aslwpid;	/* historical; now always zero */
+   char		pr_dmodel;	/* data model of the process */
+   char		pr_pad[3];
+   int		pr_filler[6];	/* for future expansion */
+} vki_elf_prpsinfo_t;
+
+typedef struct vki_elf_prstatus {
+   int		pr_flags;	/* Flags (see below) */
+   short	pr_why;		/* Reason for process stop (if stopped) */
+   short	pr_what;	/* More detailed reason */
+   vki_siginfo_t pr_info;	/* Info associated with signal or fault */
+   short	pr_cursig;	/* Current signal */
+   ushort_t 	pr_nlwp;	/* Number of lwps in the process */
+   vki_sigset_t pr_sigpend;	/* Set of signals pending to the process */
+   vki_sigset_t pr_sighold;	/* Set of signals held (blocked) by the lwp */
+   struct vki_sigaltstack pr_altstack; /* Alternate signal stack info */
+   struct sigaction pr_action;	/* Signal action for current signal */
+   vki_pid_t	pr_pid;		/* Process id */
+   vki_pid_t	pr_ppid;	/* Parent process id */
+   vki_pid_t	pr_pgrp;	/* Process group id */
+   vki_pid_t	pr_sid;		/* Session id */
+   vki_timespec_t pr_utime;	/* Process user cpu time */
+   vki_timespec_t pr_stime;	/* Process system cpu time */
+   vki_timespec_t pr_cutime;	/* Sum of children's user times */
+   vki_timespec_t pr_cstime;	/* Sum of children's system times */
+   char	pr_clname[PRCLSZ]; 	/* Scheduling class name */
+   short	pr_syscall;	/* System call number (if in syscall) */
+   short	pr_nsysarg;	/* Number of arguments to this syscall */
+   long	pr_sysarg[PRSYSARGS];	/* Arguments to this syscall */
+   vki_id_t	pr_who;		/* Specific lwp identifier */
+   vki_sigset_t pr_lwppend;	/* Set of signals pending to the lwp */
+   struct vki_ucontext *pr_oldcontext; /* Address of previous ucontext */
+   vki_caddr_t	pr_brkbase;	/* Address of the process heap */
+   vki_size_t	pr_brksize;	/* Size of the process heap, in bytes */
+   vki_caddr_t	pr_stkbase;	/* Address of the process stack */
+   vki_size_t	pr_stksize;	/* Size of the process stack, in bytes */
+   short	pr_processor;	/* processor which last ran this LWP */
+   short	pr_bind;	/* processor LWP bound to or PBIND_NONE */
+   long		pr_instr;	/* Current instruction */
+   vki_prgregset_t pr_reg;	/* General registers */
+} vki_elf_prstatus_t;
+
+
+/* Signal frames. */
+#if defined(VGP_x86_solaris)
+struct vki_sigframe {
+   /* First four words look like a call to a 3-arg x86 function. */
+   void *return_addr;
+   int a1_signo;
+   vki_siginfo_t *a2_siginfo;
+   vki_ucontext_t *a3_ucontext;
+   /* Saved ucontext and siginfo. */
+   vki_ucontext_t ucontext;
+   vki_siginfo_t siginfo;
+};
+
+#elif defined(VGP_amd64_solaris)
+struct vki_sigframe {
+   void *return_addr;
+   long a1_signo;
+   vki_siginfo_t *a2_siginfo;
+   /* Saved ucontext and siginfo. */
+   vki_ucontext_t ucontext;
+   vki_siginfo_t siginfo;
+};
+
+#else
+#error "Unknown platform"
+#endif
+typedef struct vki_sigframe vki_sigframe_t;
+
+#endif // __VKI_SOLARIS_H
+
+/*--------------------------------------------------------------------*/
+/*--- end                                                          ---*/
+/*--------------------------------------------------------------------*/