]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Clean up after m_syscalls changes: reinstate enough syscalls that
authorJulian Seward <jseward@acm.org>
Fri, 10 Jun 2005 10:27:55 +0000 (10:27 +0000)
committerJulian Seward <jseward@acm.org>
Fri, 10 Jun 2005 10:27:55 +0000 (10:27 +0000)
memcheck/tests/x86/scalar works again.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@3867

coregrind/m_syscalls/priv_types_n_macros.h
coregrind/m_syscalls/syscalls-generic.c
coregrind/m_syscalls/syscalls-linux.c
coregrind/m_syscalls/syscalls-x86-linux.c

index 711f061644235003607113e1935d33cecc61df1c..17df5bb73af28e0a757d54cc90dfcfd93c15360a 100644 (file)
@@ -83,11 +83,10 @@ typedef
    SyscallArgLayout;
 
 /* Flags describing syscall wrappers */
-#define SfMayBlock   (1 << 1)    /* may block                              */
-#define SfPostOnFail (1 << 2)    /* call POST() function on failure        */
-/* #define SfPadAddr (1 << 3) */ /* pad+unpad address space around syscall */
-#define SfPollAfter  (1 << 4)    /* poll for signals on completion         */
-#define SfYieldAfter (1 << 5)    /* yield on completion                    */
+#define SfMayBlock   (1 << 1)    /* may block                       */
+#define SfPostOnFail (1 << 2)    /* call POST() function on failure */
+#define SfPollAfter  (1 << 3)    /* poll for signals on completion  */
+#define SfYieldAfter (1 << 4)    /* yield on completion             */
 
 
 /* ---------------------------------------------------------------------
@@ -143,13 +142,18 @@ extern const UInt VGP_(syscall_table_size);
 
    You should create corresponding global declarations using
    DECL_TEMPLATE (indirectly) below.  
+
+   Note.  The silly name "arrghs" is used rather than just "args"
+   because a few wrappers declare the name "args" themselves, and
+   renaming those decls can change the name that comes out in error
+   messages (on scalar arg checks).  Hence rename this instead.
 */
 
 #define DEFN_PRE_TEMPLATE(auxstr, name)                          \
    void vgSysWrap_##auxstr##_##name##_before                     \
                                  ( ThreadId tid,                 \
                                    SyscallArgLayout* layout,     \
-                                   /*MOD*/SyscallArgs* args,     \
+                                   /*MOD*/SyscallArgs* arrghs,   \
                                    /*OUT*/SyscallStatus* status, \
                                    /*OUT*/UWord* flags           \
                                  )
@@ -157,7 +161,7 @@ extern const UInt VGP_(syscall_table_size);
 #define DEFN_POST_TEMPLATE(auxstr, name)                         \
    void vgSysWrap_##auxstr##_##name##_after                      \
                                  ( ThreadId tid,                 \
-                                   SyscallArgs* args,            \
+                                   SyscallArgs* arrghs,          \
                                    SyscallStatus* status         \
                                  )
 
@@ -171,14 +175,14 @@ extern const UInt VGP_(syscall_table_size);
    void vgSysWrap_##auxstr##_##name##_before                     \
                                  ( ThreadId tid,                 \
                                    SyscallArgLayout* layout,     \
-                                   /*MOD*/SyscallArgs* args,     \
+                                   /*MOD*/SyscallArgs* arrghs,   \
                                    /*OUT*/SyscallStatus* status, \
                                    /*OUT*/UWord* flags           \
                                  );                              \
    extern                                                        \
    void vgSysWrap_##auxstr##_##name##_after                      \
                                  ( ThreadId tid,                 \
-                                   SyscallArgs* args,            \
+                                   SyscallArgs* arrghs,          \
                                    SyscallStatus* status         \
                                  );
 
@@ -213,13 +217,13 @@ extern const UInt VGP_(syscall_table_size);
 
 /* Reference to the syscall's arguments -- the ones which the
    pre-wrapper may have modified, not the original copy. */
-#define SYSNO  (args->sysno)
-#define ARG1   (args->arg1)
-#define ARG2   (args->arg2)
-#define ARG3   (args->arg3)
-#define ARG4   (args->arg4)
-#define ARG5   (args->arg5)
-#define ARG6   (args->arg6)
+#define SYSNO  (arrghs->sysno)
+#define ARG1   (arrghs->arg1)
+#define ARG2   (arrghs->arg2)
+#define ARG3   (arrghs->arg3)
+#define ARG4   (arrghs->arg4)
+#define ARG5   (arrghs->arg5)
+#define ARG6   (arrghs->arg6)
 
 /* Reference to the syscall's current result status/value.  Note that
    
index 17b430d0d2bc9225dc6b35aa1e7a4f21737f109f..245181684105c5735213cb7d284dbe8b41a173b9 100644 (file)
@@ -1690,40 +1690,43 @@ PRE(sys_iopl)
    PRE_REG_READ1(long, "iopl", unsigned long, level);
 }
 
-//zz PRE(sys_setxattr, SfMayBlock)
-//zz {
-//zz    PRINT("sys_setxattr ( %p, %p, %p, %llu, %d )",
-//zz          ARG1, ARG2, ARG3, (ULong)ARG4, ARG5);
-//zz    PRE_REG_READ5(long, "setxattr",
-//zz                  char *, path, char *, name,
-//zz                  void *, value, vki_size_t, size, int, flags);
-//zz    PRE_MEM_RASCIIZ( "setxattr(path)", ARG1 );
-//zz    PRE_MEM_RASCIIZ( "setxattr(name)", ARG2 );
-//zz    PRE_MEM_READ( "setxattr(value)", ARG3, ARG4 );
-//zz }
-//zz 
-//zz PRE(sys_lsetxattr, SfMayBlock)
-//zz {
-//zz    PRINT("sys_lsetxattr ( %p, %p, %p, %llu, %d )",
-//zz          ARG1, ARG2, ARG3, (ULong)ARG4, ARG5);
-//zz    PRE_REG_READ5(long, "lsetxattr",
-//zz                  char *, path, char *, name,
-//zz                  void *, value, vki_size_t, size, int, flags);
-//zz    PRE_MEM_RASCIIZ( "lsetxattr(path)", ARG1 );
-//zz    PRE_MEM_RASCIIZ( "lsetxattr(name)", ARG2 );
-//zz    PRE_MEM_READ( "lsetxattr(value)", ARG3, ARG4 );
-//zz }
-//zz 
-//zz PRE(sys_fsetxattr, SfMayBlock)
-//zz {
-//zz    PRINT("sys_fsetxattr ( %d, %p, %p, %llu, %d )",
-//zz          ARG1, ARG2, ARG3, (ULong)ARG4, ARG5);
-//zz    PRE_REG_READ5(long, "fsetxattr",
-//zz                  int, fd, char *, name, void *, value,
-//zz                  vki_size_t, size, int, flags);
-//zz    PRE_MEM_RASCIIZ( "fsetxattr(name)", ARG2 );
-//zz    PRE_MEM_READ( "fsetxattr(value)", ARG3, ARG4 );
-//zz }
+PRE(sys_setxattr)
+{
+   *flags |= SfMayBlock;
+   PRINT("sys_setxattr ( %p, %p, %p, %llu, %d )",
+         ARG1, ARG2, ARG3, (ULong)ARG4, ARG5);
+   PRE_REG_READ5(long, "setxattr",
+                 char *, path, char *, name,
+                 void *, value, vki_size_t, size, int, flags);
+   PRE_MEM_RASCIIZ( "setxattr(path)", ARG1 );
+   PRE_MEM_RASCIIZ( "setxattr(name)", ARG2 );
+   PRE_MEM_READ( "setxattr(value)", ARG3, ARG4 );
+}
+
+PRE(sys_lsetxattr)
+{
+   *flags |= SfMayBlock;
+   PRINT("sys_lsetxattr ( %p, %p, %p, %llu, %d )",
+         ARG1, ARG2, ARG3, (ULong)ARG4, ARG5);
+   PRE_REG_READ5(long, "lsetxattr",
+                 char *, path, char *, name,
+                 void *, value, vki_size_t, size, int, flags);
+   PRE_MEM_RASCIIZ( "lsetxattr(path)", ARG1 );
+   PRE_MEM_RASCIIZ( "lsetxattr(name)", ARG2 );
+   PRE_MEM_READ( "lsetxattr(value)", ARG3, ARG4 );
+}
+
+PRE(sys_fsetxattr)
+{
+   *flags |= SfMayBlock;
+   PRINT("sys_fsetxattr ( %d, %p, %p, %llu, %d )",
+         ARG1, ARG2, ARG3, (ULong)ARG4, ARG5);
+   PRE_REG_READ5(long, "fsetxattr",
+                 int, fd, char *, name, void *, value,
+                 vki_size_t, size, int, flags);
+   PRE_MEM_RASCIIZ( "fsetxattr(name)", ARG2 );
+   PRE_MEM_READ( "fsetxattr(value)", ARG3, ARG4 );
+}
 
 PRE(sys_getxattr)
 {
@@ -1735,7 +1738,6 @@ PRE(sys_getxattr)
    PRE_MEM_RASCIIZ( "getxattr(name)", ARG2 );
    PRE_MEM_WRITE( "getxattr(value)", ARG3, ARG4 );
 }
-
 POST(sys_getxattr)
 {
    vg_assert(SUCCESS);
@@ -1744,104 +1746,108 @@ POST(sys_getxattr)
    }
 }
 
-//zz PRE(sys_lgetxattr, SfMayBlock)
-//zz {
-//zz    PRINT("sys_lgetxattr ( %p, %p, %p, %llu )", ARG1,ARG2,ARG3, (ULong)ARG4);
-//zz    PRE_REG_READ4(ssize_t, "lgetxattr",
-//zz                  char *, path, char *, name, void *, value, vki_size_t, size);
-//zz    PRE_MEM_RASCIIZ( "lgetxattr(path)", ARG1 );
-//zz    PRE_MEM_RASCIIZ( "lgetxattr(name)", ARG2 );
-//zz    PRE_MEM_WRITE( "lgetxattr(value)", ARG3, ARG4 );
-//zz }
-//zz 
-//zz POST(sys_lgetxattr)
-//zz {
-//zz    if (RES > 0 && ARG3 != (Addr)NULL) {
-//zz       POST_MEM_WRITE( ARG3, RES );
-//zz    }
-//zz }
-//zz 
-//zz PRE(sys_fgetxattr, SfMayBlock)
-//zz {
-//zz    PRINT("sys_fgetxattr ( %d, %p, %p, %llu )", ARG1, ARG2, ARG3, (ULong)ARG4);
-//zz    PRE_REG_READ4(ssize_t, "fgetxattr",
-//zz                  int, fd, char *, name, void *, value, vki_size_t, size);
-//zz    PRE_MEM_RASCIIZ( "fgetxattr(name)", ARG2 );
-//zz    PRE_MEM_WRITE( "fgetxattr(value)", ARG3, ARG4 );
-//zz }
-//zz 
-//zz POST(sys_fgetxattr)
-//zz {
-//zz    if (RES > 0 && ARG3 != (Addr)NULL)
-//zz       POST_MEM_WRITE( ARG3, RES );
-//zz }
-//zz 
-//zz PRE(sys_listxattr, SfMayBlock)
-//zz {
-//zz    PRINT("sys_listxattr ( %p, %p, %llu )", ARG1, ARG2, (ULong)ARG3);
-//zz    PRE_REG_READ3(ssize_t, "listxattr",
-//zz                  char *, path, char *, list, vki_size_t, size);
-//zz    PRE_MEM_RASCIIZ( "listxattr(path)", ARG1 );
-//zz    PRE_MEM_WRITE( "listxattr(list)", ARG2, ARG3 );
-//zz }
-//zz 
-//zz POST(sys_listxattr)
-//zz {
-//zz    if (RES > 0 && ARG2 != (Addr)NULL)
-//zz       POST_MEM_WRITE( ARG2, RES );
-//zz }
-//zz 
-//zz PRE(sys_llistxattr, SfMayBlock)
-//zz {
-//zz    PRINT("sys_llistxattr ( %p, %p, %llu )", ARG1, ARG2, (ULong)ARG3);
-//zz    PRE_REG_READ3(ssize_t, "llistxattr",
-//zz                  char *, path, char *, list, vki_size_t, size);
-//zz    PRE_MEM_RASCIIZ( "llistxattr(path)", ARG1 );
-//zz    PRE_MEM_WRITE( "llistxattr(list)", ARG2, ARG3 );
-//zz }
-//zz 
-//zz POST(sys_llistxattr)
-//zz {
-//zz    if (RES > 0 && ARG2 != (Addr)NULL)
-//zz       POST_MEM_WRITE( ARG2, RES );
-//zz }
-//zz 
-//zz PRE(sys_flistxattr, SfMayBlock)
-//zz {
-//zz    PRINT("sys_flistxattr ( %d, %p, %llu )", ARG1, ARG2, (ULong)ARG3);
-//zz    PRE_REG_READ3(ssize_t, "flistxattr",
-//zz                  int, fd, char *, list, vki_size_t, size);
-//zz    PRE_MEM_WRITE( "flistxattr(list)", ARG2, ARG3 );
-//zz }
-//zz 
-//zz POST(sys_flistxattr)
-//zz {
-//zz    if (RES > 0 && ARG2 != (Addr)NULL)
-//zz       POST_MEM_WRITE( ARG2, RES );
-//zz }
-//zz 
-//zz PRE(sys_removexattr, SfMayBlock)
-//zz {
-//zz    PRINT("sys_removexattr ( %p, %p )", ARG1, ARG2);
-//zz    PRE_REG_READ2(long, "removexattr", char *, path, char *, name);
-//zz    PRE_MEM_RASCIIZ( "removexattr(path)", ARG1 );
-//zz    PRE_MEM_RASCIIZ( "removexattr(name)", ARG2 );
-//zz }
-//zz 
-//zz PRE(sys_lremovexattr, SfMayBlock)
-//zz {
-//zz    PRINT("sys_lremovexattr ( %p, %p )", ARG1, ARG2);
-//zz    PRE_REG_READ2(long, "lremovexattr", char *, path, char *, name);
-//zz    PRE_MEM_RASCIIZ( "lremovexattr(path)", ARG1 );
-//zz    PRE_MEM_RASCIIZ( "lremovexattr(name)", ARG2 );
-//zz }
-//zz 
-//zz PRE(sys_fremovexattr, SfMayBlock)
-//zz {
-//zz    PRINT("sys_fremovexattr ( %d, %p )", ARG1, ARG2);
-//zz    PRE_REG_READ2(long, "fremovexattr", int, fd, char *, name);
-//zz    PRE_MEM_RASCIIZ( "fremovexattr(name)", ARG2 );
-//zz }
+PRE(sys_lgetxattr)
+{
+   *flags |= SfMayBlock;
+   PRINT("sys_lgetxattr ( %p, %p, %p, %llu )", ARG1,ARG2,ARG3, (ULong)ARG4);
+   PRE_REG_READ4(ssize_t, "lgetxattr",
+                 char *, path, char *, name, void *, value, vki_size_t, size);
+   PRE_MEM_RASCIIZ( "lgetxattr(path)", ARG1 );
+   PRE_MEM_RASCIIZ( "lgetxattr(name)", ARG2 );
+   PRE_MEM_WRITE( "lgetxattr(value)", ARG3, ARG4 );
+}
+POST(sys_lgetxattr)
+{
+   vg_assert(SUCCESS);
+   if (RES > 0 && ARG3 != (Addr)NULL) {
+      POST_MEM_WRITE( ARG3, RES );
+   }
+}
+
+PRE(sys_fgetxattr)
+{
+   *flags |= SfMayBlock;
+   PRINT("sys_fgetxattr ( %d, %p, %p, %llu )", ARG1, ARG2, ARG3, (ULong)ARG4);
+   PRE_REG_READ4(ssize_t, "fgetxattr",
+                 int, fd, char *, name, void *, value, vki_size_t, size);
+   PRE_MEM_RASCIIZ( "fgetxattr(name)", ARG2 );
+   PRE_MEM_WRITE( "fgetxattr(value)", ARG3, ARG4 );
+}
+POST(sys_fgetxattr)
+{
+   if (RES > 0 && ARG3 != (Addr)NULL)
+      POST_MEM_WRITE( ARG3, RES );
+}
+
+PRE(sys_listxattr)
+{
+   *flags |= SfMayBlock;
+   PRINT("sys_listxattr ( %p, %p, %llu )", ARG1, ARG2, (ULong)ARG3);
+   PRE_REG_READ3(ssize_t, "listxattr",
+                 char *, path, char *, list, vki_size_t, size);
+   PRE_MEM_RASCIIZ( "listxattr(path)", ARG1 );
+   PRE_MEM_WRITE( "listxattr(list)", ARG2, ARG3 );
+}
+POST(sys_listxattr)
+{
+   if (RES > 0 && ARG2 != (Addr)NULL)
+      POST_MEM_WRITE( ARG2, RES );
+}
+
+PRE(sys_llistxattr)
+{
+   *flags |= SfMayBlock;
+   PRINT("sys_llistxattr ( %p, %p, %llu )", ARG1, ARG2, (ULong)ARG3);
+   PRE_REG_READ3(ssize_t, "llistxattr",
+                 char *, path, char *, list, vki_size_t, size);
+   PRE_MEM_RASCIIZ( "llistxattr(path)", ARG1 );
+   PRE_MEM_WRITE( "llistxattr(list)", ARG2, ARG3 );
+}
+POST(sys_llistxattr)
+{
+   if (RES > 0 && ARG2 != (Addr)NULL)
+      POST_MEM_WRITE( ARG2, RES );
+}
+
+PRE(sys_flistxattr)
+{
+   *flags |= SfMayBlock;
+   PRINT("sys_flistxattr ( %d, %p, %llu )", ARG1, ARG2, (ULong)ARG3);
+   PRE_REG_READ3(ssize_t, "flistxattr",
+                 int, fd, char *, list, vki_size_t, size);
+   PRE_MEM_WRITE( "flistxattr(list)", ARG2, ARG3 );
+}
+POST(sys_flistxattr)
+{
+   if (RES > 0 && ARG2 != (Addr)NULL)
+      POST_MEM_WRITE( ARG2, RES );
+}
+
+PRE(sys_removexattr)
+{
+   *flags |= SfMayBlock;
+   PRINT("sys_removexattr ( %p, %p )", ARG1, ARG2);
+   PRE_REG_READ2(long, "removexattr", char *, path, char *, name);
+   PRE_MEM_RASCIIZ( "removexattr(path)", ARG1 );
+   PRE_MEM_RASCIIZ( "removexattr(name)", ARG2 );
+}
+
+PRE(sys_lremovexattr)
+{
+   *flags |= SfMayBlock;
+   PRINT("sys_lremovexattr ( %p, %p )", ARG1, ARG2);
+   PRE_REG_READ2(long, "lremovexattr", char *, path, char *, name);
+   PRE_MEM_RASCIIZ( "lremovexattr(path)", ARG1 );
+   PRE_MEM_RASCIIZ( "lremovexattr(name)", ARG2 );
+}
+
+PRE(sys_fremovexattr)
+{
+   *flags |= SfMayBlock;
+   PRINT("sys_fremovexattr ( %d, %p )", ARG1, ARG2);
+   PRE_REG_READ2(long, "fremovexattr", int, fd, char *, name);
+   PRE_MEM_RASCIIZ( "fremovexattr(name)", ARG2 );
+}
 
 PRE(sys_quotactl)
 {
@@ -1852,21 +1858,23 @@ PRE(sys_quotactl)
    PRE_MEM_RASCIIZ( "quotactl(special)", ARG2 );
 }
 
-//zz // XXX: this wrapper is only suitable for 32-bit platforms
-//zz PRE(sys_lookup_dcookie, 0)
-//zz {
-//zz    PRINT("sys_lookup_dcookie (0x%llx, %p, %d)", LOHI64(ARG1,ARG2), ARG3, ARG4);
-//zz    PRE_REG_READ4(long, "lookup_dcookie",
-//zz                  vki_u32, cookie_low32, vki_u32, cookie_high32,
-//zz                  char *, buf, vki_size_t, len);
-//zz    PRE_MEM_WRITE( "lookup_dcookie(buf)", ARG3, ARG4);
-//zz }
-//zz 
-//zz POST(sys_lookup_dcookie)
-//zz {
-//zz    if (ARG3 != (Addr)NULL)
-//zz       POST_MEM_WRITE( ARG3, RES);
-//zz }
+// XXX: this wrapper is only suitable for 32-bit platforms
+#if defined(VGP_x86_linux)
+PRE(sys_lookup_dcookie)
+{
+   PRINT("sys_lookup_dcookie (0x%llx, %p, %d)", LOHI64(ARG1,ARG2), ARG3, ARG4);
+   PRE_REG_READ4(long, "lookup_dcookie",
+                 vki_u32, cookie_low32, vki_u32, cookie_high32,
+                 char *, buf, vki_size_t, len);
+   PRE_MEM_WRITE( "lookup_dcookie(buf)", ARG3, ARG4);
+}
+POST(sys_lookup_dcookie)
+{
+   vg_assert(SUCCESS);
+   if (ARG3 != (Addr)NULL)
+      POST_MEM_WRITE( ARG3, RES);
+}
+#endif
 
 PRE(sys_fsync)
 {
@@ -1891,68 +1899,68 @@ PRE(sys_msync)
    PRE_MEM_READ( "msync(start)", ARG1, ARG2 );
 }
 
-//zz // Nb: getpmsg() and putpmsg() are special additional syscalls used in early
-//zz // versions of LiS (Linux Streams).  They are not part of the kernel.
-//zz // Therefore, we have to provide this type ourself, rather than getting it
-//zz // from the kernel sources.
-//zz struct vki_pmsg_strbuf {
-//zz    int     maxlen;         /* no. of bytes in buffer */
-//zz    int     len;            /* no. of bytes returned */
-//zz    vki_caddr_t buf;        /* pointer to data */
-//zz };
-//zz 
-//zz PRE(sys_getpmsg, SfMayBlock)
-//zz {
-//zz    /* LiS getpmsg from http://www.gcom.com/home/linux/lis/ */
-//zz    struct vki_pmsg_strbuf *ctrl;
-//zz    struct vki_pmsg_strbuf *data;
-//zz    PRINT("sys_getpmsg ( %d, %p, %p, %p, %p )", ARG1,ARG2,ARG3,ARG4,ARG5);
-//zz    PRE_REG_READ5(int, "getpmsg",
-//zz                  int, fd, struct strbuf *, ctrl, struct strbuf *, data, 
-//zz                  int *, bandp, int *, flagsp);
-//zz    ctrl = (struct vki_pmsg_strbuf *)ARG2;
-//zz    data = (struct vki_pmsg_strbuf *)ARG3;
-//zz    if (ctrl && ctrl->maxlen > 0)
-//zz       PRE_MEM_WRITE( "getpmsg(ctrl)", (Addr)ctrl->buf, ctrl->maxlen);
-//zz    if (data && data->maxlen > 0)
-//zz       PRE_MEM_WRITE( "getpmsg(data)", (Addr)data->buf, data->maxlen);
-//zz    if (ARG4)
-//zz       PRE_MEM_WRITE( "getpmsg(bandp)", (Addr)ARG4, sizeof(int));
-//zz    if (ARG5)
-//zz       PRE_MEM_WRITE( "getpmsg(flagsp)", (Addr)ARG5, sizeof(int));
-//zz }
-//zz 
-//zz POST(sys_getpmsg)
-//zz {
-//zz    struct vki_pmsg_strbuf *ctrl;
-//zz    struct vki_pmsg_strbuf *data;
-//zz 
-//zz    ctrl = (struct vki_pmsg_strbuf *)ARG2;
-//zz    data = (struct vki_pmsg_strbuf *)ARG3;
-//zz    if (RES == 0 && ctrl && ctrl->len > 0) {
-//zz       POST_MEM_WRITE( (Addr)ctrl->buf, ctrl->len);
-//zz    }
-//zz    if (RES == 0 && data && data->len > 0) {
-//zz       POST_MEM_WRITE( (Addr)data->buf, data->len);
-//zz    }
-//zz }
-//zz 
-//zz PRE(sys_putpmsg, SfMayBlock)
-//zz {
-//zz    /* LiS putpmsg from http://www.gcom.com/home/linux/lis/ */
-//zz    struct vki_pmsg_strbuf *ctrl;
-//zz    struct vki_pmsg_strbuf *data;
-//zz    PRINT("sys_putpmsg ( %d, %p, %p, %d, %d )", ARG1,ARG2,ARG3,ARG4,ARG5);
-//zz    PRE_REG_READ5(int, "putpmsg",
-//zz                  int, fd, struct strbuf *, ctrl, struct strbuf *, data, 
-//zz                  int, band, int, flags);
-//zz    ctrl = (struct vki_pmsg_strbuf *)ARG2;
-//zz    data = (struct vki_pmsg_strbuf *)ARG3;
-//zz    if (ctrl && ctrl->len > 0)
-//zz       PRE_MEM_READ( "putpmsg(ctrl)", (Addr)ctrl->buf, ctrl->len);
-//zz    if (data && data->len > 0)
-//zz       PRE_MEM_READ( "putpmsg(data)", (Addr)data->buf, data->len);
-//zz }
+// Nb: getpmsg() and putpmsg() are special additional syscalls used in early
+// versions of LiS (Linux Streams).  They are not part of the kernel.
+// Therefore, we have to provide this type ourself, rather than getting it
+// from the kernel sources.
+struct vki_pmsg_strbuf {
+   int     maxlen;         /* no. of bytes in buffer */
+   int     len;            /* no. of bytes returned */
+   vki_caddr_t buf;        /* pointer to data */
+};
+PRE(sys_getpmsg)
+{
+   /* LiS getpmsg from http://www.gcom.com/home/linux/lis/ */
+   struct vki_pmsg_strbuf *ctrl;
+   struct vki_pmsg_strbuf *data;
+   *flags |= SfMayBlock;
+   PRINT("sys_getpmsg ( %d, %p, %p, %p, %p )", ARG1,ARG2,ARG3,ARG4,ARG5);
+   PRE_REG_READ5(int, "getpmsg",
+                 int, fd, struct strbuf *, ctrl, struct strbuf *, data, 
+                 int *, bandp, int *, flagsp);
+   ctrl = (struct vki_pmsg_strbuf *)ARG2;
+   data = (struct vki_pmsg_strbuf *)ARG3;
+   if (ctrl && ctrl->maxlen > 0)
+      PRE_MEM_WRITE( "getpmsg(ctrl)", (Addr)ctrl->buf, ctrl->maxlen);
+   if (data && data->maxlen > 0)
+      PRE_MEM_WRITE( "getpmsg(data)", (Addr)data->buf, data->maxlen);
+   if (ARG4)
+      PRE_MEM_WRITE( "getpmsg(bandp)", (Addr)ARG4, sizeof(int));
+   if (ARG5)
+      PRE_MEM_WRITE( "getpmsg(flagsp)", (Addr)ARG5, sizeof(int));
+}
+POST(sys_getpmsg)
+{
+   struct vki_pmsg_strbuf *ctrl;
+   struct vki_pmsg_strbuf *data;
+   vg_assert(SUCCESS);
+   ctrl = (struct vki_pmsg_strbuf *)ARG2;
+   data = (struct vki_pmsg_strbuf *)ARG3;
+   if (RES == 0 && ctrl && ctrl->len > 0) {
+      POST_MEM_WRITE( (Addr)ctrl->buf, ctrl->len);
+   }
+   if (RES == 0 && data && data->len > 0) {
+      POST_MEM_WRITE( (Addr)data->buf, data->len);
+   }
+}
+
+PRE(sys_putpmsg)
+{
+   /* LiS putpmsg from http://www.gcom.com/home/linux/lis/ */
+   struct vki_pmsg_strbuf *ctrl;
+   struct vki_pmsg_strbuf *data;
+   *flags |= SfMayBlock;
+   PRINT("sys_putpmsg ( %d, %p, %p, %d, %d )", ARG1,ARG2,ARG3,ARG4,ARG5);
+   PRE_REG_READ5(int, "putpmsg",
+                 int, fd, struct strbuf *, ctrl, struct strbuf *, data, 
+                 int, band, int, flags);
+   ctrl = (struct vki_pmsg_strbuf *)ARG2;
+   data = (struct vki_pmsg_strbuf *)ARG3;
+   if (ctrl && ctrl->len > 0)
+      PRE_MEM_READ( "putpmsg(ctrl)", (Addr)ctrl->buf, ctrl->len);
+   if (data && data->len > 0)
+      PRE_MEM_READ( "putpmsg(data)", (Addr)data->buf, data->len);
+}
 
 PRE(sys_getitimer)
 {
@@ -1960,7 +1968,6 @@ PRE(sys_getitimer)
    PRE_REG_READ2(long, "getitimer", int, which, struct itimerval *, value);
    PRE_MEM_WRITE( "getitimer(value)", ARG2, sizeof(struct vki_itimerval) );
 }
-
 POST(sys_getitimer)
 {
    if (ARG2 != (Addr)NULL) {
@@ -2097,16 +2104,19 @@ PRE(sys_setregid16)
    PRE_REG_READ2(long, "setregid16", vki_old_gid_t, rgid, vki_old_gid_t, egid);
 }
 
-//zz // XXX: only for 32-bit archs
-//zz PRE(sys_pwrite64, SfMayBlock)
-//zz {
-//zz    PRINT("sys_pwrite64 ( %d, %p, %llu, %lld )",
-//zz          ARG1, ARG2, (ULong)ARG3, LOHI64(ARG4,ARG5));
-//zz    PRE_REG_READ5(ssize_t, "pwrite64",
-//zz                  unsigned int, fd, const char *, buf, vki_size_t, count,
-//zz                  vki_u32, offset_low32, vki_u32, offset_high32);
-//zz    PRE_MEM_READ( "pwrite64(buf)", ARG2, ARG3 );
-//zz }
+// XXX: only for 32-bit archs
+#if defined(VGP_x86_linux)
+PRE(sys_pwrite64)
+{
+   *flags |= SfMayBlock;
+   PRINT("sys_pwrite64 ( %d, %p, %llu, %lld )",
+         ARG1, ARG2, (ULong)ARG3, LOHI64(ARG4,ARG5));
+   PRE_REG_READ5(ssize_t, "pwrite64",
+                 unsigned int, fd, const char *, buf, vki_size_t, count,
+                 vki_u32, offset_low32, vki_u32, offset_high32);
+   PRE_MEM_READ( "pwrite64(buf)", ARG2, ARG3 );
+}
+#endif
 
 PRE(sys_sync)
 {
@@ -2128,18 +2138,17 @@ POST(sys_fstatfs)
    POST_MEM_WRITE( ARG2, sizeof(struct vki_statfs) );
 }
 
-//zz PRE(sys_fstatfs64, 0)
-//zz {
-//zz    PRINT("sys_fstatfs64 ( %d, %llu, %p )",ARG1,(ULong)ARG2,ARG3);
-//zz    PRE_REG_READ3(long, "fstatfs64",
-//zz                  unsigned int, fd, vki_size_t, size, struct statfs64 *, buf);
-//zz    PRE_MEM_WRITE( "fstatfs64(buf)", ARG3, ARG2 );
-//zz }
-//zz 
-//zz POST(sys_fstatfs64)
-//zz {
-//zz    POST_MEM_WRITE( ARG3, ARG2 );
-//zz }
+PRE(sys_fstatfs64)
+{
+   PRINT("sys_fstatfs64 ( %d, %llu, %p )",ARG1,(ULong)ARG2,ARG3);
+   PRE_REG_READ3(long, "fstatfs64",
+                 unsigned int, fd, vki_size_t, size, struct statfs64 *, buf);
+   PRE_MEM_WRITE( "fstatfs64(buf)", ARG3, ARG2 );
+}
+POST(sys_fstatfs64)
+{
+   POST_MEM_WRITE( ARG3, ARG2 );
+}
 
 PRE(sys_getsid)
 {
@@ -2194,34 +2203,33 @@ PRE(sys_init_module)
    PRE_MEM_RASCIIZ( "init_module(uargs)", ARG3 );
 }
 
-//zz PRE(sys_capget, 0)
-//zz {
-//zz    PRINT("sys_capget ( %p, %p )", ARG1, ARG2 );
-//zz    PRE_REG_READ2(long, "capget", 
-//zz                  vki_cap_user_header_t, header, vki_cap_user_data_t, data);
-//zz    PRE_MEM_READ( "capget(header)", ARG1, 
-//zz                   sizeof(struct __vki_user_cap_header_struct) );
-//zz    PRE_MEM_WRITE( "capget(data)", ARG2, 
-//zz                   sizeof(struct __vki_user_cap_data_struct) );
-//zz }
-//zz 
-//zz POST(sys_capget)
-//zz {
-//zz    if (ARG2 != (Addr)NULL)
-//zz       POST_MEM_WRITE( ARG2, sizeof(struct __vki_user_cap_data_struct) );
-//zz }
-//zz 
-//zz PRE(sys_capset, 0)
-//zz {
-//zz    PRINT("sys_capset ( %p, %p )", ARG1, ARG2 );
-//zz    PRE_REG_READ2(long, "capset", 
-//zz                  vki_cap_user_header_t, header,
-//zz                  const vki_cap_user_data_t, data);
-//zz    PRE_MEM_READ( "capset(header)", 
-//zz                   ARG1, sizeof(struct __vki_user_cap_header_struct) );
-//zz    PRE_MEM_READ( "capset(data)", 
-//zz                   ARG2, sizeof(struct __vki_user_cap_data_struct) );
-//zz }
+PRE(sys_capget)
+{
+   PRINT("sys_capget ( %p, %p )", ARG1, ARG2 );
+   PRE_REG_READ2(long, "capget", 
+                 vki_cap_user_header_t, header, vki_cap_user_data_t, data);
+   PRE_MEM_READ( "capget(header)", ARG1, 
+                  sizeof(struct __vki_user_cap_header_struct) );
+   PRE_MEM_WRITE( "capget(data)", ARG2, 
+                  sizeof(struct __vki_user_cap_data_struct) );
+}
+POST(sys_capget)
+{
+   if (ARG2 != (Addr)NULL)
+      POST_MEM_WRITE( ARG2, sizeof(struct __vki_user_cap_data_struct) );
+}
+
+PRE(sys_capset)
+{
+   PRINT("sys_capset ( %p, %p )", ARG1, ARG2 );
+   PRE_REG_READ2(long, "capset", 
+                 vki_cap_user_header_t, header,
+                 const vki_cap_user_data_t, data);
+   PRE_MEM_READ( "capset(header)", 
+                  ARG1, sizeof(struct __vki_user_cap_header_struct) );
+   PRE_MEM_READ( "capset(data)", 
+                  ARG2, sizeof(struct __vki_user_cap_data_struct) );
+}
 
 // Pre_read a char** argument.
 static void pre_argv_envp(Addr a, ThreadId tid, Char* s1, Char* s2)
@@ -2452,31 +2460,31 @@ PRE(sys_chmod)
    PRE_MEM_RASCIIZ( "chmod(path)", ARG1 );
 }
 
-//zz PRE(sys_chown16, 0)
-//zz {
-//zz    PRINT("sys_chown16 ( %p, 0x%x, 0x%x )", ARG1,ARG2,ARG3);
-//zz    PRE_REG_READ3(long, "chown16",
-//zz                  const char *, path,
-//zz                  vki_old_uid_t, owner, vki_old_gid_t, group);
-//zz    PRE_MEM_RASCIIZ( "chown16(path)", ARG1 );
-//zz }
-//zz 
-//zz PRE(sys_chown, 0)
-//zz {
-//zz    /* int chown(const char *path, uid_t owner, gid_t group); */
-//zz    PRINT("sys_chown ( %p, 0x%x, 0x%x )", ARG1,ARG2,ARG3);
-//zz    PRE_REG_READ3(long, "chown",
-//zz                  const char *, path, vki_uid_t, owner, vki_gid_t, group);
-//zz    PRE_MEM_RASCIIZ( "chown(path)", ARG1 );
-//zz }
-//zz 
-//zz PRE(sys_lchown, 0)
-//zz {
-//zz    PRINT("sys_lchown ( %p, 0x%x, 0x%x )", ARG1,ARG2,ARG3);
-//zz    PRE_REG_READ3(long, "lchown",
-//zz                  const char *, path, vki_uid_t, owner, vki_gid_t, group);
-//zz    PRE_MEM_RASCIIZ( "lchown(path)", ARG1 );
-//zz }
+PRE(sys_chown16)
+{
+   PRINT("sys_chown16 ( %p, 0x%x, 0x%x )", ARG1,ARG2,ARG3);
+   PRE_REG_READ3(long, "chown16",
+                 const char *, path,
+                 vki_old_uid_t, owner, vki_old_gid_t, group);
+   PRE_MEM_RASCIIZ( "chown16(path)", ARG1 );
+}
+
+PRE(sys_chown)
+{
+   /* int chown(const char *path, uid_t owner, gid_t group); */
+   PRINT("sys_chown ( %p, 0x%x, 0x%x )", ARG1,ARG2,ARG3);
+   PRE_REG_READ3(long, "chown",
+                 const char *, path, vki_uid_t, owner, vki_gid_t, group);
+   PRE_MEM_RASCIIZ( "chown(path)", ARG1 );
+}
+
+PRE(sys_lchown)
+{
+   PRINT("sys_lchown ( %p, 0x%x, 0x%x )", ARG1,ARG2,ARG3);
+   PRE_REG_READ3(long, "lchown",
+                 const char *, path, vki_uid_t, owner, vki_gid_t, group);
+   PRE_MEM_RASCIIZ( "lchown(path)", ARG1 );
+}
 
 PRE(sys_close)
 {
@@ -2539,12 +2547,12 @@ PRE(sys_fchown16)
                  unsigned int, fd, vki_old_uid_t, owner, vki_old_gid_t, group);
 }
 
-//zz PRE(sys_fchown, 0)
-//zz {
-//zz    PRINT("sys_fchown ( %d, %d, %d )", ARG1,ARG2,ARG3);
-//zz    PRE_REG_READ3(long, "fchown",
-//zz                  unsigned int, fd, vki_uid_t, owner, vki_gid_t, group);
-//zz }
+PRE(sys_fchown)
+{
+   PRINT("sys_fchown ( %d, %d, %d )", ARG1,ARG2,ARG3);
+   PRE_REG_READ3(long, "fchown",
+                 unsigned int, fd, vki_uid_t, owner, vki_gid_t, group);
+}
 
 PRE(sys_fchmod)
 {
@@ -2745,25 +2753,30 @@ PRE(sys_truncate)
    PRE_MEM_RASCIIZ( "truncate(path)", ARG1 );
 }
 
-//zz // XXX: this wrapper is only suitable for 32-bit platforms
-//zz PRE(sys_ftruncate64, SfMayBlock)
-//zz {
-//zz    PRINT("sys_ftruncate64 ( %d, %lld )", ARG1, LOHI64(ARG2,ARG3));
-//zz    PRE_REG_READ3(long, "ftruncate64",
-//zz                  unsigned int, fd,
-//zz                  vki_u32, length_low32, vki_u32, length_high32);
-//zz }
-//zz 
-//zz // XXX: this wrapper is only suitable for 32-bit platforms
-//zz PRE(sys_truncate64, SfMayBlock)
-//zz {
-//zz    PRINT("sys_truncate64 ( %p, %lld )", ARG1, LOHI64(ARG2, ARG3));
-//zz    PRE_REG_READ3(long, "truncate64",
-//zz                  const char *, path,
-//zz                  vki_u32, length_low32, vki_u32, length_high32);
-//zz    PRE_MEM_RASCIIZ( "truncate64(path)", ARG1 );
-//zz }
-//zz 
+// XXX: this wrapper is only suitable for 32-bit platforms
+#if defined(VGP_x86_linux)
+PRE(sys_ftruncate64)
+{
+   *flags |= SfMayBlock;
+   PRINT("sys_ftruncate64 ( %d, %lld )", ARG1, LOHI64(ARG2,ARG3));
+   PRE_REG_READ3(long, "ftruncate64",
+                 unsigned int, fd,
+                 vki_u32, length_low32, vki_u32, length_high32);
+}
+#endif
+
+// XXX: this wrapper is only suitable for 32-bit platforms
+#if defined(VGP_x86_linux)
+PRE(sys_truncate64)
+{
+   *flags |= SfMayBlock;
+   PRINT("sys_truncate64 ( %p, %lld )", ARG1, LOHI64(ARG2, ARG3));
+   PRE_REG_READ3(long, "truncate64",
+                 const char *, path,
+                 vki_u32, length_low32, vki_u32, length_high32);
+   PRE_MEM_RASCIIZ( "truncate64(path)", ARG1 );
+}
+#endif
 
 PRE(sys_getdents)
 {
@@ -4495,19 +4508,18 @@ POST(sys_munmap)
    VG_TRACK( die_mem_munmap, a, len );
 }
 
-//zz PRE(sys_mincore, 0)
-//zz {
-//zz    PRINT("sys_mincore ( %p, %llu, %p )", ARG1,(ULong)ARG2,ARG3);
-//zz    PRE_REG_READ3(long, "mincore",
-//zz                  unsigned long, start, vki_size_t, length,
-//zz                  unsigned char *, vec);
-//zz    PRE_MEM_WRITE( "mincore(vec)", ARG3, (ARG2 + 4096 - 1) / 4096);
-//zz }
-//zz 
-//zz POST(sys_mincore)
-//zz {
-//zz    POST_MEM_WRITE( ARG3, (ARG2 + 4096 - 1) / 4096 );  
-//zz }
+PRE(sys_mincore)
+{
+   PRINT("sys_mincore ( %p, %llu, %p )", ARG1,(ULong)ARG2,ARG3);
+   PRE_REG_READ3(long, "mincore",
+                 unsigned long, start, vki_size_t, length,
+                 unsigned char *, vec);
+   PRE_MEM_WRITE( "mincore(vec)", ARG3, (ARG2 + 4096 - 1) / 4096);
+}
+POST(sys_mincore)
+{
+   POST_MEM_WRITE( ARG3, (ARG2 + 4096 - 1) / 4096 );  
+}
 
 PRE(sys_nanosleep)
 {
@@ -4764,18 +4776,17 @@ PRE(sys_rmdir)
    PRE_MEM_RASCIIZ( "rmdir(pathname)", ARG1 );
 }
 
-//zz PRE(sys_sched_setparam, 0)
-//zz {
-//zz    PRINT("sched_setparam ( %d, %p )", ARG1, ARG2 );
-//zz    PRE_REG_READ2(long, "sched_setparam", 
-//zz                  vki_pid_t, pid, struct sched_param *, p);
-//zz    PRE_MEM_READ( "sched_setparam(p)", ARG2, sizeof(struct vki_sched_param) );
-//zz }
-//zz 
-//zz POST(sys_sched_setparam)
-//zz {
-//zz    POST_MEM_WRITE( ARG2, sizeof(struct vki_sched_param) );
-//zz }
+PRE(sys_sched_setparam)
+{
+   PRINT("sched_setparam ( %d, %p )", ARG1, ARG2 );
+   PRE_REG_READ2(long, "sched_setparam", 
+                 vki_pid_t, pid, struct sched_param *, p);
+   PRE_MEM_READ( "sched_setparam(p)", ARG2, sizeof(struct vki_sched_param) );
+}
+POST(sys_sched_setparam)
+{
+   POST_MEM_WRITE( ARG2, sizeof(struct vki_sched_param) );
+}
 
 PRE(sys_sched_getparam)
 {
@@ -4817,11 +4828,11 @@ PRE(sys_setgid16)
    PRE_REG_READ1(long, "setgid16", vki_old_gid_t, gid);
 }
 
-//zz PRE(sys_setgid, 0)
-//zz {
-//zz    PRINT("sys_setgid ( %d )", ARG1);
-//zz    PRE_REG_READ1(long, "setgid", vki_gid_t, gid);
-//zz }
+PRE(sys_setgid)
+{
+   PRINT("sys_setgid ( %d )", ARG1);
+   PRE_REG_READ1(long, "setgid", vki_gid_t, gid);
+}
 
 PRE(sys_setsid)
 {
@@ -4837,13 +4848,13 @@ PRE(sys_setgroups16)
       PRE_MEM_READ( "setgroups16(list)", ARG2, ARG1 * sizeof(vki_old_gid_t) );
 }
 
-//zz PRE(sys_setgroups, 0)
-//zz {
-//zz    PRINT("setgroups ( %llu, %p )", (ULong)ARG1, ARG2);
-//zz    PRE_REG_READ2(long, "setgroups", int, size, vki_gid_t *, list);
-//zz    if (ARG1 > 0)
-//zz       PRE_MEM_READ( "setgroups(list)", ARG2, ARG1 * sizeof(vki_gid_t) );
-//zz }
+PRE(sys_setgroups)
+{
+   PRINT("setgroups ( %llu, %p )", (ULong)ARG1, ARG2);
+   PRE_REG_READ2(long, "setgroups", int, size, vki_gid_t *, list);
+   if (ARG1 > 0)
+      PRE_MEM_READ( "setgroups(list)", ARG2, ARG1 * sizeof(vki_gid_t) );
+}
 
 PRE(sys_setpgid)
 {
@@ -4863,11 +4874,11 @@ PRE(sys_setreuid16)
    PRE_REG_READ2(long, "setreuid16", vki_old_uid_t, ruid, vki_old_uid_t, euid);
 }
 
-//zz PRE(sys_setreuid, 0)
-//zz {
-//zz    PRINT("sys_setreuid ( 0x%x, 0x%x )", ARG1, ARG2);
-//zz    PRE_REG_READ2(long, "setreuid", vki_uid_t, ruid, vki_uid_t, euid);
-//zz }
+PRE(sys_setreuid)
+{
+   PRINT("sys_setreuid ( 0x%x, 0x%x )", ARG1, ARG2);
+   PRE_REG_READ2(long, "setreuid", vki_uid_t, ruid, vki_uid_t, euid);
+}
 
 PRE(sys_setrlimit)
 {
@@ -4915,11 +4926,11 @@ PRE(sys_setuid16)
    PRE_REG_READ1(long, "setuid16", vki_old_uid_t, uid);
 }
 
-//zz PRE(sys_setuid, 0)
-//zz {
-//zz    PRINT("sys_setuid ( %d )", ARG1);
-//zz    PRE_REG_READ1(long, "setuid", vki_uid_t, uid);
-//zz }
+PRE(sys_setuid)
+{
+   PRINT("sys_setuid ( %d )", ARG1);
+   PRE_REG_READ1(long, "setuid", vki_uid_t, uid);
+}
 
 PRE(sys_newstat)
 {
@@ -4941,25 +4952,23 @@ PRE(sys_statfs)
    PRE_MEM_RASCIIZ( "statfs(path)", ARG1 );
    PRE_MEM_WRITE( "statfs(buf)", ARG2, sizeof(struct vki_statfs) );
 }
-
 POST(sys_statfs)
 {
    POST_MEM_WRITE( ARG2, sizeof(struct vki_statfs) );
 }
 
-//zz PRE(sys_statfs64, 0)
-//zz {
-//zz    PRINT("sys_statfs64 ( %p, %llu, %p )",ARG1,(ULong)ARG2,ARG3);
-//zz    PRE_REG_READ3(long, "statfs64",
-//zz                  const char *, path, vki_size_t, size, struct statfs64 *, buf);
-//zz    PRE_MEM_RASCIIZ( "statfs64(path)", ARG1 );
-//zz    PRE_MEM_WRITE( "statfs64(buf)", ARG3, ARG2 );
-//zz }
-//zz 
-//zz POST(sys_statfs64)
-//zz {
-//zz    POST_MEM_WRITE( ARG3, ARG2 );
-//zz }
+PRE(sys_statfs64)
+{
+   PRINT("sys_statfs64 ( %p, %llu, %p )",ARG1,(ULong)ARG2,ARG3);
+   PRE_REG_READ3(long, "statfs64",
+                 const char *, path, vki_size_t, size, struct statfs64 *, buf);
+   PRE_MEM_RASCIIZ( "statfs64(path)", ARG1 );
+   PRE_MEM_WRITE( "statfs64(buf)", ARG3, ARG2 );
+}
+POST(sys_statfs64)
+{
+   POST_MEM_WRITE( ARG3, ARG2 );
+}
 
 PRE(sys_symlink)
 {
@@ -5102,35 +5111,34 @@ PRE(sys_writev)
    }
 }
 
-//zz PRE(sys_utimes, 0)
-//zz {
-//zz    PRINT("sys_utimes ( %p, %p )", ARG1,ARG2);
-//zz    PRE_REG_READ2(long, "utimes", char *, filename, struct timeval *, tvp);
-//zz    PRE_MEM_RASCIIZ( "utimes(filename)", ARG1 );
-//zz    if (ARG2 != 0)
-//zz       PRE_MEM_READ( "utimes(tvp)", ARG2, sizeof(struct vki_timeval) );
-//zz }
-//zz 
-//zz PRE(sys_sched_setaffinity, 0)
-//zz {
-//zz    PRINT("sched_setaffinity ( %d, %d, %p )", ARG1, ARG2, ARG3);
-//zz    PRE_REG_READ3(long, "sched_setaffinity", 
-//zz                  vki_pid_t, pid, unsigned int, len, unsigned long *, mask);
-//zz    PRE_MEM_READ( "sched_setaffinity(mask)", ARG3, ARG2);
-//zz }
-//zz 
-//zz PRE(sys_sched_getaffinity, 0)
-//zz {
-//zz    PRINT("sched_getaffinity ( %d, %d, %p )", ARG1, ARG2, ARG3);
-//zz    PRE_REG_READ3(long, "sched_getaffinity", 
-//zz                  vki_pid_t, pid, unsigned int, len, unsigned long *, mask);
-//zz    PRE_MEM_WRITE( "sched_getaffinity(mask)", ARG3, ARG2);
-//zz }
-//zz 
-//zz POST(sys_sched_getaffinity)
-//zz {
-//zz    POST_MEM_WRITE(ARG3, ARG2);
-//zz }
+PRE(sys_utimes)
+{
+   PRINT("sys_utimes ( %p, %p )", ARG1,ARG2);
+   PRE_REG_READ2(long, "utimes", char *, filename, struct timeval *, tvp);
+   PRE_MEM_RASCIIZ( "utimes(filename)", ARG1 );
+   if (ARG2 != 0)
+      PRE_MEM_READ( "utimes(tvp)", ARG2, sizeof(struct vki_timeval) );
+}
+
+PRE(sys_sched_setaffinity)
+{
+   PRINT("sched_setaffinity ( %d, %d, %p )", ARG1, ARG2, ARG3);
+   PRE_REG_READ3(long, "sched_setaffinity", 
+                 vki_pid_t, pid, unsigned int, len, unsigned long *, mask);
+   PRE_MEM_READ( "sched_setaffinity(mask)", ARG3, ARG2);
+}
+
+PRE(sys_sched_getaffinity)
+{
+   PRINT("sched_getaffinity ( %d, %d, %p )", ARG1, ARG2, ARG3);
+   PRE_REG_READ3(long, "sched_getaffinity", 
+                 vki_pid_t, pid, unsigned int, len, unsigned long *, mask);
+   PRE_MEM_WRITE( "sched_getaffinity(mask)", ARG3, ARG2);
+}
+POST(sys_sched_getaffinity)
+{
+   POST_MEM_WRITE(ARG3, ARG2);
+}
 
 PRE(sys_acct)
 {
@@ -5203,25 +5211,19 @@ POST(sys_rt_sigtimedwait)
       POST_MEM_WRITE( ARG2, sizeof(vki_siginfo_t) );
 }
 
-//zz PRE(sys_rt_sigqueueinfo, 0)
-//zz {
-//zz    PRINT("sys_rt_sigqueueinfo(%d, %d, %p)", ARG1, ARG2, ARG3);
-//zz    PRE_REG_READ3(long, "rt_sigqueueinfo", 
-//zz                  int, pid, int, sig, vki_siginfo_t *, uinfo);
-//zz    if (ARG2 != 0)
-//zz       PRE_MEM_READ( "rt_sigqueueinfo(uinfo)", ARG3, sizeof(vki_siginfo_t) );
-//zz }
-//zz 
-//zz POST(sys_rt_sigqueueinfo)
-//zz {
-//zz    PRINT("sys_rt_sigqueueinfo(%d, %d, %p)", ARG1, ARG2, ARG3);
-//zz    PRE_REG_READ3(long, "rt_sigqueueinfo",
-//zz                  int, pid, int, sig, vki_siginfo_t *, uinfo);
-//zz    if (ARG2 != 0)
-//zz       PRE_MEM_READ( "rt_sigqueueinfo(uinfo)", ARG3, sizeof(vki_siginfo_t) );
-//zz    if (!VG_(client_signal_OK)(ARG2))
-//zz       SET_STATUS_( -VKI_EINVAL );
-//zz }
+PRE(sys_rt_sigqueueinfo)
+{
+   PRINT("sys_rt_sigqueueinfo(%d, %d, %p)", ARG1, ARG2, ARG3);
+   PRE_REG_READ3(long, "rt_sigqueueinfo", 
+                 int, pid, int, sig, vki_siginfo_t *, uinfo);
+   if (ARG2 != 0)
+      PRE_MEM_READ( "rt_sigqueueinfo(uinfo)", ARG3, sizeof(vki_siginfo_t) );
+}
+POST(sys_rt_sigqueueinfo)
+{
+   if (!VG_(client_signal_OK)(ARG2))
+      SET_STATUS_Failure( VKI_EINVAL );
+}
 
 // XXX: x86-specific
 PRE(sys_sigaltstack)
@@ -5242,7 +5244,6 @@ PRE(sys_sigaltstack)
                               (vki_stack_t*)ARG2)
    );
 }
-
 POST(sys_sigaltstack)
 {
    vg_assert(SUCCESS);
@@ -5272,7 +5273,6 @@ PRE(sys_rt_sigaction)
                             (struct vki_sigaction *)ARG3)
    );
 }
-
 POST(sys_rt_sigaction)
 {
    vg_assert(SUCCESS);
@@ -5375,18 +5375,17 @@ POST(sys_sigpending)
    POST_MEM_WRITE( ARG1, sizeof(vki_old_sigset_t) ) ;
 }
 
-//zz PRE(sys_rt_sigpending, 0)
-//zz {
-//zz    PRINT( "sys_rt_sigpending ( %p )", ARG1 );
-//zz    PRE_REG_READ2(long, "rt_sigpending", 
-//zz                  vki_sigset_t *, set, vki_size_t, sigsetsize);
-//zz    PRE_MEM_WRITE( "rt_sigpending(set)", ARG1, sizeof(vki_sigset_t));
-//zz }
-//zz 
-//zz POST(sys_rt_sigpending)
-//zz {
-//zz    POST_MEM_WRITE( ARG1, sizeof(vki_sigset_t) ) ;
-//zz }
+PRE(sys_rt_sigpending)
+{
+   PRINT( "sys_rt_sigpending ( %p )", ARG1 );
+   PRE_REG_READ2(long, "rt_sigpending", 
+                 vki_sigset_t *, set, vki_size_t, sigsetsize);
+   PRE_MEM_WRITE( "rt_sigpending(set)", ARG1, sizeof(vki_sigset_t));
+}
+POST(sys_rt_sigpending)
+{
+   POST_MEM_WRITE( ARG1, sizeof(vki_sigset_t) ) ;
+}
 
 PRE(sys_mq_open)
 {
@@ -5509,75 +5508,72 @@ POST(sys_mq_getsetattr)
       POST_MEM_WRITE( ARG3, sizeof(struct vki_mq_attr) );
 }
 
-//zz PRE(sys_timer_create, 0)
-//zz {
-//zz    PRINT("sys_timer_create( %d, %p, %p )", ARG1,ARG2,ARG3);
-//zz    PRE_REG_READ3(long, "timer_create",
-//zz                  vki_clockid_t, clockid, struct sigevent *, evp,
-//zz                  vki_timer_t *, timerid);
-//zz    if (ARG2 != 0)
-//zz       PRE_MEM_READ( "timer_create(evp)", ARG2, sizeof(struct vki_sigevent) );
-//zz    PRE_MEM_WRITE( "timer_create(timerid)", ARG3, sizeof(vki_timer_t) );
-//zz }
-//zz 
-//zz POST(sys_timer_create)
-//zz {
-//zz    POST_MEM_WRITE( ARG3, sizeof(vki_timer_t) );
-//zz }
-//zz 
-//zz PRE(sys_timer_settime, 0)
-//zz {
-//zz    PRINT("sys_timer_settime( %lld, %d, %p, %p )", (ULong)ARG1,ARG2,ARG3,ARG4);
-//zz    PRE_REG_READ4(long, "timer_settime", 
-//zz                  vki_timer_t, timerid, int, flags,
-//zz                  const struct itimerspec *, value,
-//zz                  struct itimerspec *, ovalue);
-//zz    PRE_MEM_READ( "timer_settime(value)", ARG3,
-//zz                   sizeof(struct vki_itimerspec) );
-//zz    if (ARG4 != 0)
-//zz        PRE_MEM_WRITE( "timer_settime(ovalue)", ARG4,
-//zz                       sizeof(struct vki_itimerspec) );
-//zz }
-//zz 
-//zz POST(sys_timer_settime)
-//zz {
-//zz    if (ARG4 != 0)
-//zz       POST_MEM_WRITE( ARG4, sizeof(struct vki_itimerspec) );
-//zz }
-//zz 
-//zz PRE(sys_timer_gettime, 0)
-//zz {
-//zz    PRINT("sys_timer_gettime( %lld, %p )", (ULong)ARG1,ARG2);
-//zz    PRE_REG_READ2(long, "timer_gettime", 
-//zz                  vki_timer_t, timerid, struct itimerspec *, value);
-//zz    PRE_MEM_WRITE( "timer_gettime(value)", ARG2,
-//zz                   sizeof(struct vki_itimerspec));
-//zz }
-//zz 
-//zz POST(sys_timer_gettime)
-//zz {
-//zz    POST_MEM_WRITE( ARG2, sizeof(struct vki_itimerspec) );
-//zz }
-//zz 
-//zz PRE(sys_timer_getoverrun, 0)
-//zz {
-//zz    PRINT("sys_timer_getoverrun( %p )", ARG1);
-//zz    PRE_REG_READ1(long, "timer_getoverrun", vki_timer_t, timerid);
-//zz }
-//zz 
-//zz PRE(sys_timer_delete, 0)
-//zz {
-//zz    PRINT("sys_timer_delete( %p )", ARG1);
-//zz    PRE_REG_READ1(long, "timer_delete", vki_timer_t, timerid);
-//zz }
-//zz 
-//zz PRE(sys_clock_settime, 0)
-//zz {
-//zz    PRINT("sys_clock_settime( %d, %p )", ARG1,ARG2);
-//zz    PRE_REG_READ2(long, "clock_settime", 
-//zz                  vki_clockid_t, clk_id, const struct timespec *, tp);
-//zz    PRE_MEM_READ( "clock_settime(tp)", ARG2, sizeof(struct vki_timespec) );
-//zz }
+PRE(sys_timer_create)
+{
+   PRINT("sys_timer_create( %d, %p, %p )", ARG1,ARG2,ARG3);
+   PRE_REG_READ3(long, "timer_create",
+                 vki_clockid_t, clockid, struct sigevent *, evp,
+                 vki_timer_t *, timerid);
+   if (ARG2 != 0)
+      PRE_MEM_READ( "timer_create(evp)", ARG2, sizeof(struct vki_sigevent) );
+   PRE_MEM_WRITE( "timer_create(timerid)", ARG3, sizeof(vki_timer_t) );
+}
+POST(sys_timer_create)
+{
+   POST_MEM_WRITE( ARG3, sizeof(vki_timer_t) );
+}
+
+PRE(sys_timer_settime)
+{
+   PRINT("sys_timer_settime( %lld, %d, %p, %p )", (ULong)ARG1,ARG2,ARG3,ARG4);
+   PRE_REG_READ4(long, "timer_settime", 
+                 vki_timer_t, timerid, int, flags,
+                 const struct itimerspec *, value,
+                 struct itimerspec *, ovalue);
+   PRE_MEM_READ( "timer_settime(value)", ARG3,
+                  sizeof(struct vki_itimerspec) );
+   if (ARG4 != 0)
+       PRE_MEM_WRITE( "timer_settime(ovalue)", ARG4,
+                      sizeof(struct vki_itimerspec) );
+}
+POST(sys_timer_settime)
+{
+   if (ARG4 != 0)
+      POST_MEM_WRITE( ARG4, sizeof(struct vki_itimerspec) );
+}
+
+PRE(sys_timer_gettime)
+{
+   PRINT("sys_timer_gettime( %lld, %p )", (ULong)ARG1,ARG2);
+   PRE_REG_READ2(long, "timer_gettime", 
+                 vki_timer_t, timerid, struct itimerspec *, value);
+   PRE_MEM_WRITE( "timer_gettime(value)", ARG2,
+                  sizeof(struct vki_itimerspec));
+}
+POST(sys_timer_gettime)
+{
+   POST_MEM_WRITE( ARG2, sizeof(struct vki_itimerspec) );
+}
+
+PRE(sys_timer_getoverrun)
+{
+   PRINT("sys_timer_getoverrun( %p )", ARG1);
+   PRE_REG_READ1(long, "timer_getoverrun", vki_timer_t, timerid);
+}
+
+PRE(sys_timer_delete)
+{
+   PRINT("sys_timer_delete( %p )", ARG1);
+   PRE_REG_READ1(long, "timer_delete", vki_timer_t, timerid);
+}
+
+PRE(sys_clock_settime)
+{
+   PRINT("sys_clock_settime( %d, %p )", ARG1,ARG2);
+   PRE_REG_READ2(long, "clock_settime", 
+                 vki_clockid_t, clk_id, const struct timespec *, tp);
+   PRE_MEM_READ( "clock_settime(tp)", ARG2, sizeof(struct vki_timespec) );
+}
 
 PRE(sys_clock_gettime)
 {
@@ -5586,27 +5582,27 @@ PRE(sys_clock_gettime)
                  vki_clockid_t, clk_id, struct timespec *, tp);
    PRE_MEM_WRITE( "clock_gettime(tp)", ARG2, sizeof(struct vki_timespec) );
 }
-
 POST(sys_clock_gettime)
 {
    POST_MEM_WRITE( ARG2, sizeof(struct vki_timespec) );
 }
 
-//zz PRE(sys_clock_getres, 0)
-//zz {
-//zz    PRINT("sys_clock_getres( %d, %p )" , ARG1,ARG2);
-//zz    // Nb: we can't use "RES" as the param name because that's a macro
-//zz    // defined above!
-//zz    PRE_REG_READ2(long, "clock_getres", 
-//zz                  vki_clockid_t, clk_id, struct timespec *, res);
-//zz    PRE_MEM_WRITE( "clock_getres(res)", ARG2, sizeof(struct vki_timespec) );
-//zz }
-//zz 
-//zz POST(sys_clock_getres)
-//zz {
-//zz    POST_MEM_WRITE( ARG2, sizeof(struct vki_timespec) );
-//zz }
+PRE(sys_clock_getres)
+{
+   PRINT("sys_clock_getres( %d, %p )" , ARG1,ARG2);
+   // Nb: we can't use "RES" as the param name because that's a macro
+   // defined above!
+   PRE_REG_READ2(long, "clock_getres", 
+                 vki_clockid_t, clk_id, struct timespec *, res);
+   PRE_MEM_WRITE( "clock_getres(res)", ARG2, sizeof(struct vki_timespec) );
+}
+POST(sys_clock_getres)
+{
+   POST_MEM_WRITE( ARG2, sizeof(struct vki_timespec) );
+}
 
+#undef PRE
+#undef POST
 
 /*--------------------------------------------------------------------*/
 /*--- end                                       syscalls-generic.c ---*/
index 2b8f726b157dd47083d9a357a2d0b6c12ce6b864..713aef478ff400f4c643260da8a7d76321395978 100644 (file)
@@ -169,11 +169,11 @@ PRE(sys_setfsuid16)
    PRE_REG_READ1(long, "setfsuid16", vki_old_uid_t, uid);
 }
 
-//zz PRE(sys_setfsuid, 0)
-//zz {
-//zz    PRINT("sys_setfsuid ( %d )", ARG1);
-//zz    PRE_REG_READ1(long, "setfsuid", vki_uid_t, uid);
-//zz }
+PRE(sys_setfsuid)
+{
+   PRINT("sys_setfsuid ( %d )", ARG1);
+   PRE_REG_READ1(long, "setfsuid", vki_uid_t, uid);
+}
 
 PRE(sys_setfsgid16)
 {
@@ -181,45 +181,45 @@ PRE(sys_setfsgid16)
    PRE_REG_READ1(long, "setfsgid16", vki_old_gid_t, gid);
 }
 
-//zz PRE(sys_setfsgid, 0)
-//zz {
-//zz    PRINT("sys_setfsgid ( %d )", ARG1);
-//zz    PRE_REG_READ1(long, "setfsgid", vki_gid_t, gid);
-//zz }
-//zz 
-//zz PRE(sys_setresuid16, 0)
-//zz {
-//zz    PRINT("sys_setresuid16 ( %d, %d, %d )", ARG1, ARG2, ARG3);
-//zz    PRE_REG_READ3(long, "setresuid16",
-//zz                  vki_old_uid_t, ruid, vki_old_uid_t, euid, vki_old_uid_t, suid);
-//zz }
-//zz 
-//zz PRE(sys_setresuid, 0)
-//zz {
-//zz    PRINT("sys_setresuid ( %d, %d, %d )", ARG1, ARG2, ARG3);
-//zz    PRE_REG_READ3(long, "setresuid",
-//zz                  vki_uid_t, ruid, vki_uid_t, euid, vki_uid_t, suid);
-//zz }
-//zz 
-//zz PRE(sys_getresuid16, 0)
-//zz {
-//zz    PRINT("sys_getresuid16 ( %p, %p, %p )", ARG1,ARG2,ARG3);
-//zz    PRE_REG_READ3(long, "getresuid16",
-//zz                  vki_old_uid_t *, ruid, vki_old_uid_t *, euid,
-//zz                  vki_old_uid_t *, suid);
-//zz    PRE_MEM_WRITE( "getresuid16(ruid)", ARG1, sizeof(vki_old_uid_t) );
-//zz    PRE_MEM_WRITE( "getresuid16(euid)", ARG2, sizeof(vki_old_uid_t) );
-//zz    PRE_MEM_WRITE( "getresuid16(suid)", ARG3, sizeof(vki_old_uid_t) );
-//zz }
-//zz 
-//zz POST(sys_getresuid16)
-//zz {
-//zz    if (RES == 0) {
-//zz       POST_MEM_WRITE( ARG1, sizeof(vki_old_uid_t) );
-//zz       POST_MEM_WRITE( ARG2, sizeof(vki_old_uid_t) );
-//zz       POST_MEM_WRITE( ARG3, sizeof(vki_old_uid_t) );
-//zz    }
-//zz }
+PRE(sys_setfsgid)
+{
+   PRINT("sys_setfsgid ( %d )", ARG1);
+   PRE_REG_READ1(long, "setfsgid", vki_gid_t, gid);
+}
+
+PRE(sys_setresuid16)
+{
+   PRINT("sys_setresuid16 ( %d, %d, %d )", ARG1, ARG2, ARG3);
+   PRE_REG_READ3(long, "setresuid16",
+                 vki_old_uid_t, ruid, vki_old_uid_t, euid, vki_old_uid_t, suid);
+}
+
+PRE(sys_setresuid)
+{
+   PRINT("sys_setresuid ( %d, %d, %d )", ARG1, ARG2, ARG3);
+   PRE_REG_READ3(long, "setresuid",
+                 vki_uid_t, ruid, vki_uid_t, euid, vki_uid_t, suid);
+}
+
+PRE(sys_getresuid16)
+{
+   PRINT("sys_getresuid16 ( %p, %p, %p )", ARG1,ARG2,ARG3);
+   PRE_REG_READ3(long, "getresuid16",
+                 vki_old_uid_t *, ruid, vki_old_uid_t *, euid,
+                 vki_old_uid_t *, suid);
+   PRE_MEM_WRITE( "getresuid16(ruid)", ARG1, sizeof(vki_old_uid_t) );
+   PRE_MEM_WRITE( "getresuid16(euid)", ARG2, sizeof(vki_old_uid_t) );
+   PRE_MEM_WRITE( "getresuid16(suid)", ARG3, sizeof(vki_old_uid_t) );
+}
+POST(sys_getresuid16)
+{
+   vg_assert(SUCCESS);
+   if (RES == 0) {
+      POST_MEM_WRITE( ARG1, sizeof(vki_old_uid_t) );
+      POST_MEM_WRITE( ARG2, sizeof(vki_old_uid_t) );
+      POST_MEM_WRITE( ARG3, sizeof(vki_old_uid_t) );
+   }
+}
 
 PRE(sys_getresuid)
 {
@@ -230,7 +230,6 @@ PRE(sys_getresuid)
    PRE_MEM_WRITE( "getresuid(euid)", ARG2, sizeof(vki_uid_t) );
    PRE_MEM_WRITE( "getresuid(suid)", ARG3, sizeof(vki_uid_t) );
 }
-
 POST(sys_getresuid)
 {
    vg_assert(SUCCESS);
@@ -241,39 +240,40 @@ POST(sys_getresuid)
    }
 }
 
-//zz PRE(sys_setresgid16, 0)
-//zz {
-//zz    PRINT("sys_setresgid16 ( %d, %d, %d )", ARG1, ARG2, ARG3);
-//zz    PRE_REG_READ3(long, "setresgid16",
-//zz                  vki_old_gid_t, rgid, vki_old_gid_t, egid, vki_old_gid_t, sgid);
-//zz }
-//zz 
-//zz PRE(sys_setresgid, 0)
-//zz {
-//zz    PRINT("sys_setresgid ( %d, %d, %d )", ARG1, ARG2, ARG3);
-//zz    PRE_REG_READ3(long, "setresgid",
-//zz                  vki_gid_t, rgid, vki_gid_t, egid, vki_gid_t, sgid);
-//zz }
-//zz 
-//zz PRE(sys_getresgid16, 0)
-//zz {
-//zz    PRINT("sys_getresgid16 ( %p, %p, %p )", ARG1,ARG2,ARG3);
-//zz    PRE_REG_READ3(long, "getresgid16",
-//zz                  vki_old_gid_t *, rgid, vki_old_gid_t *, egid,
-//zz                  vki_old_gid_t *, sgid);
-//zz    PRE_MEM_WRITE( "getresgid16(rgid)", ARG1, sizeof(vki_old_gid_t) );
-//zz    PRE_MEM_WRITE( "getresgid16(egid)", ARG2, sizeof(vki_old_gid_t) );
-//zz    PRE_MEM_WRITE( "getresgid16(sgid)", ARG3, sizeof(vki_old_gid_t) );
-//zz }
-//zz 
-//zz POST(sys_getresgid16)
-//zz {
-//zz    if (RES == 0) {
-//zz       POST_MEM_WRITE( ARG1, sizeof(vki_old_gid_t) );
-//zz       POST_MEM_WRITE( ARG2, sizeof(vki_old_gid_t) );
-//zz       POST_MEM_WRITE( ARG3, sizeof(vki_old_gid_t) );
-//zz    }
-//zz }
+PRE(sys_setresgid16)
+{
+   PRINT("sys_setresgid16 ( %d, %d, %d )", ARG1, ARG2, ARG3);
+   PRE_REG_READ3(long, "setresgid16",
+                 vki_old_gid_t, rgid, 
+                 vki_old_gid_t, egid, vki_old_gid_t, sgid);
+}
+
+PRE(sys_setresgid)
+{
+   PRINT("sys_setresgid ( %d, %d, %d )", ARG1, ARG2, ARG3);
+   PRE_REG_READ3(long, "setresgid",
+                 vki_gid_t, rgid, vki_gid_t, egid, vki_gid_t, sgid);
+}
+
+PRE(sys_getresgid16)
+{
+   PRINT("sys_getresgid16 ( %p, %p, %p )", ARG1,ARG2,ARG3);
+   PRE_REG_READ3(long, "getresgid16",
+                 vki_old_gid_t *, rgid, vki_old_gid_t *, egid,
+                 vki_old_gid_t *, sgid);
+   PRE_MEM_WRITE( "getresgid16(rgid)", ARG1, sizeof(vki_old_gid_t) );
+   PRE_MEM_WRITE( "getresgid16(egid)", ARG2, sizeof(vki_old_gid_t) );
+   PRE_MEM_WRITE( "getresgid16(sgid)", ARG3, sizeof(vki_old_gid_t) );
+}
+POST(sys_getresgid16)
+{
+   vg_assert(SUCCESS);
+   if (RES == 0) {
+      POST_MEM_WRITE( ARG1, sizeof(vki_old_gid_t) );
+      POST_MEM_WRITE( ARG2, sizeof(vki_old_gid_t) );
+      POST_MEM_WRITE( ARG3, sizeof(vki_old_gid_t) );
+   }
+}
 
 PRE(sys_getresgid)
 {
@@ -355,78 +355,81 @@ PRE(sys_personality)
 
 PRE(sys_sysctl)
 {
-   struct __vki_sysctl_args *argz;
+   struct __vki_sysctl_args *args;
    PRINT("sys_sysctl ( %p )", ARG1 );
-   argz = (struct __vki_sysctl_args *)ARG1;
-   PRE_REG_READ1(long, "sysctl", struct __sysctl_args *, argz);
+   args = (struct __vki_sysctl_args *)ARG1;
+   PRE_REG_READ1(long, "sysctl", struct __sysctl_args *, args);
    PRE_MEM_WRITE( "sysctl(args)", ARG1, sizeof(struct __vki_sysctl_args) );
    if (!VG_(is_addressable)(ARG1, sizeof(struct __vki_sysctl_args), VKI_PROT_READ)) {
       SET_STATUS_Failure( VKI_EFAULT );
       return;
    }
 
-   PRE_MEM_READ("sysctl(name)", (Addr)argz->name, argz->nlen * sizeof(*argz->name));
-   if (argz->newval != NULL)
-      PRE_MEM_READ("sysctl(newval)", (Addr)argz->newval, argz->newlen);
-   if (argz->oldlenp != NULL) {
-      PRE_MEM_READ("sysctl(oldlenp)", (Addr)argz->oldlenp, sizeof(*argz->oldlenp));
-      PRE_MEM_WRITE("sysctl(oldval)", (Addr)argz->oldval, *argz->oldlenp);
+   PRE_MEM_READ("sysctl(name)", (Addr)args->name, args->nlen * sizeof(*args->name));
+   if (args->newval != NULL)
+      PRE_MEM_READ("sysctl(newval)", (Addr)args->newval, args->newlen);
+   if (args->oldlenp != NULL) {
+      PRE_MEM_READ("sysctl(oldlenp)", (Addr)args->oldlenp, sizeof(*args->oldlenp));
+      PRE_MEM_WRITE("sysctl(oldval)", (Addr)args->oldval, *args->oldlenp);
    }
 }
 
 POST(sys_sysctl)
 {
-   struct __vki_sysctl_args *argz;
-   argz = (struct __vki_sysctl_args *)ARG1;
-   if (argz->oldlenp != NULL) {
-      POST_MEM_WRITE((Addr)argz->oldlenp, sizeof(*argz->oldlenp));
-      POST_MEM_WRITE((Addr)argz->oldval, 1 + *argz->oldlenp);
+   struct __vki_sysctl_args *args;
+   args = (struct __vki_sysctl_args *)ARG1;
+   if (args->oldlenp != NULL) {
+      POST_MEM_WRITE((Addr)args->oldlenp, sizeof(*args->oldlenp));
+      POST_MEM_WRITE((Addr)args->oldval, 1 + *args->oldlenp);
    }
 }
 
-//zz PRE(sys_prctl, MayBlock)
-//zz {
-//zz    PRINT( "prctl ( %d, %d, %d, %d, %d )", ARG1, ARG2, ARG3, ARG4, ARG5 );
-//zz    // XXX: too simplistic, often not all args are used
-//zz    // Nb: can't use "ARG2".."ARG5" here because that's our own macro...
-//zz    PRE_REG_READ5(long, "prctl",
-//zz                  int, option, unsigned long, arg2, unsigned long, arg3,
-//zz                  unsigned long, arg4, unsigned long, arg5);
-//zz    // XXX: totally wrong... we need to look at the 'option' arg, and do
-//zz    // PRE_MEM_READs/PRE_MEM_WRITEs as necessary...
-//zz }
-//zz 
-//zz PRE(sys_sendfile, MayBlock)
-//zz {
-//zz    PRINT("sys_sendfile ( %d, %d, %p, %llu )", ARG1,ARG2,ARG3,(ULong)ARG4);
-//zz    PRE_REG_READ4(ssize_t, "sendfile",
-//zz                  int, out_fd, int, in_fd, vki_off_t *, offset,
-//zz                  vki_size_t, count);
-//zz    if (ARG3 != 0)
-//zz       PRE_MEM_WRITE( "sendfile(offset)", ARG3, sizeof(vki_off_t) );
-//zz }
-//zz 
-//zz POST(sys_sendfile)
-//zz {
-//zz    POST_MEM_WRITE( ARG3, sizeof( vki_off_t ) );
-//zz }
-//zz 
-//zz PRE(sys_sendfile64, MayBlock)
-//zz {
-//zz    PRINT("sendfile64 ( %d, %d, %p, %llu )",ARG1,ARG2,ARG3,(ULong)ARG4);
-//zz    PRE_REG_READ4(ssize_t, "sendfile64",
-//zz                  int, out_fd, int, in_fd, vki_loff_t *, offset,
-//zz                  vki_size_t, count);
-//zz    if (ARG3 != 0)
-//zz       PRE_MEM_WRITE( "sendfile64(offset)", ARG3, sizeof(vki_loff_t) );
-//zz }
-//zz 
-//zz POST(sys_sendfile64)
-//zz {
-//zz    if (ARG3 != 0 ) {
-//zz       POST_MEM_WRITE( ARG3, sizeof(vki_loff_t) );
-//zz    }
-//zz }
+PRE(sys_prctl)
+{
+   *flags |= SfMayBlock;
+   PRINT( "prctl ( %d, %d, %d, %d, %d )", ARG1, ARG2, ARG3, ARG4, ARG5 );
+   // XXX: too simplistic, often not all args are used
+   // Nb: can't use "ARG2".."ARG5" here because that's our own macro...
+   PRE_REG_READ5(long, "prctl",
+                 int, option, unsigned long, arg2, unsigned long, arg3,
+                 unsigned long, arg4, unsigned long, arg5);
+   // XXX: totally wrong... we need to look at the 'option' arg, and do
+   // PRE_MEM_READs/PRE_MEM_WRITEs as necessary...
+}
+
+PRE(sys_sendfile)
+{
+   *flags |= SfMayBlock;
+   PRINT("sys_sendfile ( %d, %d, %p, %llu )", ARG1,ARG2,ARG3,(ULong)ARG4);
+   PRE_REG_READ4(ssize_t, "sendfile",
+                 int, out_fd, int, in_fd, vki_off_t *, offset,
+                 vki_size_t, count);
+   if (ARG3 != 0)
+      PRE_MEM_WRITE( "sendfile(offset)", ARG3, sizeof(vki_off_t) );
+}
+POST(sys_sendfile)
+{
+   if (ARG3 != 0 ) {
+      POST_MEM_WRITE( ARG3, sizeof( vki_off_t ) );
+   }
+}
+
+PRE(sys_sendfile64)
+{
+   *flags |= SfMayBlock;
+   PRINT("sendfile64 ( %d, %d, %p, %llu )",ARG1,ARG2,ARG3,(ULong)ARG4);
+   PRE_REG_READ4(ssize_t, "sendfile64",
+                 int, out_fd, int, in_fd, vki_loff_t *, offset,
+                 vki_size_t, count);
+   if (ARG3 != 0)
+      PRE_MEM_WRITE( "sendfile64(offset)", ARG3, sizeof(vki_loff_t) );
+}
+POST(sys_sendfile64)
+{
+   if (ARG3 != 0 ) {
+      POST_MEM_WRITE( ARG3, sizeof(vki_loff_t) );
+   }
+}
 
 PRE(sys_futex)
 {
@@ -486,51 +489,52 @@ POST(sys_futex)
    }
 }
 
-//zz PRE(sys_epoll_create, 0)
-//zz {
-//zz    PRINT("sys_epoll_create ( %d )", ARG1);
-//zz    PRE_REG_READ1(long, "epoll_create", int, size);
-//zz }
-//zz 
-//zz POST(sys_epoll_create)
-//zz {
-//zz    if (!VG_(fd_allowed)(RES, "epoll_create", tid, True)) {
-//zz       VG_(close)(RES);
-//zz       SET_STATUS_( -VKI_EMFILE );
-//zz    } else {
-//zz       if (VG_(clo_track_fds))
-//zz          VG_(record_fd_open) (tid, RES, NULL);
-//zz    }
-//zz }
-//zz 
-//zz PRE(sys_epoll_ctl, 0)
-//zz {
-//zz    static const char* epoll_ctl_s[3] = {
-//zz       "EPOLL_CTL_ADD",
-//zz       "EPOLL_CTL_DEL",
-//zz       "EPOLL_CTL_MOD"
-//zz    };
-//zz    PRINT("sys_epoll_ctl ( %d, %s, %d, %p )", 
-//zz          ARG1, ( ARG2<3 ? epoll_ctl_s[ARG2] : "?" ), ARG3, ARG4);
-//zz    PRE_REG_READ4(long, "epoll_ctl",
-//zz                  int, epfd, int, op, int, fd, struct epoll_event *, event);
-//zz    PRE_MEM_READ( "epoll_ctl(event)", ARG4, sizeof(struct epoll_event) );
-//zz }
-//zz 
-//zz PRE(sys_epoll_wait, MayBlock)
-//zz {
-//zz    PRINT("sys_epoll_wait ( %d, %p, %d, %d )", ARG1, ARG2, ARG3, ARG4);
-//zz    PRE_REG_READ4(long, "epoll_wait",
-//zz                  int, epfd, struct epoll_event *, events,
-//zz                  int, maxevents, int, timeout);
-//zz    PRE_MEM_WRITE( "epoll_wait(events)", ARG2, sizeof(struct epoll_event)*ARG3);
-//zz }
-//zz 
-//zz POST(sys_epoll_wait)
-//zz {
-//zz    if (RES > 0)
-//zz       POST_MEM_WRITE( ARG2, sizeof(struct epoll_event)*RES ) ;
-//zz }
+PRE(sys_epoll_create)
+{
+   PRINT("sys_epoll_create ( %d )", ARG1);
+   PRE_REG_READ1(long, "epoll_create", int, size);
+}
+POST(sys_epoll_create)
+{
+   vg_assert(SUCCESS);
+   if (!VG_(fd_allowed)(RES, "epoll_create", tid, True)) {
+      VG_(close)(RES);
+      SET_STATUS_Failure( VKI_EMFILE );
+   } else {
+      if (VG_(clo_track_fds))
+         VG_(record_fd_open) (tid, RES, NULL);
+   }
+}
+
+PRE(sys_epoll_ctl)
+{
+   static const HChar* epoll_ctl_s[3] = {
+      "EPOLL_CTL_ADD",
+      "EPOLL_CTL_DEL",
+      "EPOLL_CTL_MOD"
+   };
+   PRINT("sys_epoll_ctl ( %d, %s, %d, %p )", 
+         ARG1, ( ARG2<3 ? epoll_ctl_s[ARG2] : "?" ), ARG3, ARG4);
+   PRE_REG_READ4(long, "epoll_ctl",
+                 int, epfd, int, op, int, fd, struct epoll_event *, event);
+   PRE_MEM_READ( "epoll_ctl(event)", ARG4, sizeof(struct epoll_event) );
+}
+
+PRE(sys_epoll_wait)
+{
+   *flags |= SfMayBlock;
+   PRINT("sys_epoll_wait ( %d, %p, %d, %d )", ARG1, ARG2, ARG3, ARG4);
+   PRE_REG_READ4(long, "epoll_wait",
+                 int, epfd, struct epoll_event *, events,
+                 int, maxevents, int, timeout);
+   PRE_MEM_WRITE( "epoll_wait(events)", ARG2, sizeof(struct epoll_event)*ARG3);
+}
+POST(sys_epoll_wait)
+{
+   vg_assert(SUCCESS);
+   if (RES > 0)
+      POST_MEM_WRITE( ARG2, sizeof(struct epoll_event)*RES ) ;
+}
 
 PRE(sys_gettid)
 {
@@ -606,171 +610,173 @@ POST(sys_tgkill)
 //zz    PRE_REG_READ4(long, "fadvise64_64",
 //zz                  int, fd, vki_loff_t, offset, vki_loff_t, len, int, advice)
 //zz }
-//zz 
-//zz // Nb: this wrapper is "Special" because we have to pad/unpad memory around
-//zz // the syscall itself, and this allows us to control exactly the code that
-//zz // gets run while the padding is in place.
-//zz PRE(sys_io_setup, Special)
-//zz {
-//zz    SizeT size;
-//zz    Addr addr;
-//zz 
-//zz    PRINT("sys_io_setup ( %u, %p )", ARG1,ARG2);
-//zz    PRE_REG_READ2(long, "io_setup",
-//zz                  unsigned, nr_events, vki_aio_context_t *, ctxp);
-//zz    PRE_MEM_WRITE( "io_setup(ctxp)", ARG2, sizeof(vki_aio_context_t) );
-//zz    
-//zz    size = VG_PGROUNDUP(sizeof(struct vki_aio_ring) +
-//zz                        ARG1*sizeof(struct vki_io_event));
-//zz    addr = VG_(find_map_space)(0, size, True);
-//zz    
-//zz    if (addr == 0) {
-//zz       SET_STATUS_( -VKI_ENOMEM );
-//zz       return;
-//zz    }
-//zz 
-//zz    VG_(map_segment)(addr, size, VKI_PROT_READ|VKI_PROT_WRITE, SF_FIXED);
-//zz    
-//zz    VG_(pad_address_space)(0);
-//zz    SET_STATUS_( VG_(do_syscall2)(SYSNO, ARG1, ARG2) );
-//zz    VG_(unpad_address_space)(0);
-//zz 
-//zz    if (RES == 0) {
-//zz       struct vki_aio_ring *r = *(struct vki_aio_ring **)ARG2;
-//zz         
-//zz       vg_assert(addr == (Addr)r);
-//zz       vg_assert(VG_(valid_client_addr)(addr, size, tid, "io_setup"));
-//zz                 
-//zz       VG_TRACK( new_mem_mmap, addr, size, True, True, False );
-//zz       POST_MEM_WRITE( ARG2, sizeof(vki_aio_context_t) );
-//zz    }
-//zz    else {
-//zz       VG_(unmap_range)(addr, size);
-//zz    }
-//zz }
-//zz 
-//zz // Nb: This wrapper is "Special" because we need 'size' to do the unmap
-//zz // after the syscall.  We must get 'size' from the aio_ring structure,
-//zz // before the syscall, while the aio_ring structure still exists.  (And we
-//zz // know that we must look at the aio_ring structure because Tom inspected the
-//zz // kernel and glibc sources to see what they do, yuk.)
-//zz //
-//zz // XXX This segment can be implicitly unmapped when aio
-//zz // file-descriptors are closed...
-//zz PRE(sys_io_destroy, Special)
-//zz {     
-//zz    Segment *s = VG_(find_segment)(ARG1);
-//zz    struct vki_aio_ring *r;
-//zz    SizeT size;
-//zz       
-//zz    PRINT("sys_io_destroy ( %llu )", (ULong)ARG1);
-//zz    PRE_REG_READ1(long, "io_destroy", vki_aio_context_t, ctx);
-//zz 
-//zz    // If we are going to seg fault (due to a bogus ARG1) do it as late as
-//zz    // possible...
-//zz    r = *(struct vki_aio_ring **)ARG1;
-//zz    size = VG_PGROUNDUP(sizeof(struct vki_aio_ring) + 
-//zz                        r->nr*sizeof(struct vki_io_event));
-//zz 
-//zz    SET_STATUS_( VG_(do_syscall1)(SYSNO, ARG1) );
-//zz 
-//zz    if (RES == 0 && s != NULL) { 
-//zz       VG_TRACK( die_mem_munmap, ARG1, size );
-//zz       VG_(unmap_range)(ARG1, size);
-//zz    }  
-//zz }  
-//zz 
-//zz PRE(sys_io_getevents, MayBlock)
-//zz {
-//zz    PRINT("sys_io_getevents ( %llu, %lld, %lld, %p, %p )",
-//zz          (ULong)ARG1,(Long)ARG2,(Long)ARG3,ARG4,ARG5);
-//zz    PRE_REG_READ5(long, "io_getevents",
-//zz                  vki_aio_context_t, ctx_id, long, min_nr, long, nr,
-//zz                  struct io_event *, events,
-//zz                  struct timespec *, timeout);
-//zz    if (ARG3 > 0)
-//zz       PRE_MEM_WRITE( "io_getevents(events)",
-//zz                      ARG4, sizeof(struct vki_io_event)*ARG3 );
-//zz    if (ARG5 != 0)
-//zz       PRE_MEM_READ( "io_getevents(timeout)",
-//zz                     ARG5, sizeof(struct vki_timespec));
-//zz }
-//zz 
-//zz POST(sys_io_getevents)
-//zz {
-//zz    int i;
-//zz 
-//zz    if (RES > 0) {
-//zz       POST_MEM_WRITE( ARG4, sizeof(struct vki_io_event)*RES );
-//zz       for (i = 0; i < RES; i++) {
-//zz          const struct vki_io_event *vev = ((struct vki_io_event *)ARG4) + i;
-//zz          const struct vki_iocb *cb = (struct vki_iocb *)(Addr)vev->obj;
-//zz 
-//zz          switch (cb->aio_lio_opcode) {
-//zz          case VKI_IOCB_CMD_PREAD:
-//zz             if (vev->result > 0)
-//zz                POST_MEM_WRITE( cb->aio_buf, vev->result );
-//zz             break;
-//zz             
-//zz          case VKI_IOCB_CMD_PWRITE:
-//zz             break;
-//zz            
-//zz          default:
-//zz             VG_(message)(Vg_DebugMsg,"Warning: unhandled io_getevents opcode: %u\n",cb->aio_lio_opcode);
-//zz             break;
-//zz          }
-//zz       }
-//zz    }
-//zz }
-//zz 
-//zz PRE(sys_io_submit, 0)
-//zz {
-//zz    int i;
-//zz 
-//zz    PRINT("sys_io_submit( %llu, %lld, %p )", (ULong)ARG1,(Long)ARG2,ARG3);
-//zz    PRE_REG_READ3(long, "io_submit",
-//zz                  vki_aio_context_t, ctx_id, long, nr,
-//zz                  struct iocb **, iocbpp);
-//zz    PRE_MEM_READ( "io_submit(iocbpp)", ARG3, ARG2*sizeof(struct vki_iocb *) );
-//zz    if (ARG3 != 0) {
-//zz       for (i = 0; i < ARG2; i++) {
-//zz          struct vki_iocb *cb = ((struct vki_iocb **)ARG3)[i];
-//zz          PRE_MEM_READ( "io_submit(iocb)", (Addr)cb, sizeof(struct vki_iocb) );
-//zz          switch (cb->aio_lio_opcode) {
-//zz          case VKI_IOCB_CMD_PREAD:
-//zz             PRE_MEM_WRITE( "io_submit(PREAD)", cb->aio_buf, cb->aio_nbytes );
-//zz             break;
-//zz 
-//zz          case VKI_IOCB_CMD_PWRITE:
-//zz             PRE_MEM_READ( "io_submit(PWRITE)", cb->aio_buf, cb->aio_nbytes );
-//zz             break;
-//zz            
-//zz          default:
-//zz             VG_(message)(Vg_DebugMsg,"Warning: unhandled io_submit opcode: %u\n",
-//zz                          cb->aio_lio_opcode);
-//zz             break;
-//zz          }
-//zz       }
-//zz    }
-//zz }
-//zz 
-//zz PRE(sys_io_cancel, 0)
-//zz {
-//zz    PRINT("sys_io_cancel( %llu, %p, %p )", (ULong)ARG1,ARG2,ARG3);
-//zz    PRE_REG_READ3(long, "io_cancel",
-//zz                  vki_aio_context_t, ctx_id, struct iocb *, iocb,
-//zz                  struct io_event *, result);
-//zz    PRE_MEM_READ( "io_cancel(iocb)", ARG2, sizeof(struct vki_iocb) );
-//zz    PRE_MEM_WRITE( "io_cancel(result)", ARG3, sizeof(struct vki_io_event) );
-//zz }
-//zz 
-//zz POST(sys_io_cancel)
-//zz {
-//zz    POST_MEM_WRITE( ARG3, sizeof(struct vki_io_event) );
-//zz }
-//zz 
-//zz #undef PRE
-//zz #undef POST
+
+// Nb: this wrapper has to pad/unpad memory around the syscall itself,
+// and this allows us to control exactly the code that gets run while
+// the padding is in place.
+PRE(sys_io_setup)
+{
+   SizeT size;
+   Addr addr;
+
+   PRINT("sys_io_setup ( %u, %p )", ARG1,ARG2);
+   PRE_REG_READ2(long, "io_setup",
+                 unsigned, nr_events, vki_aio_context_t *, ctxp);
+   PRE_MEM_WRITE( "io_setup(ctxp)", ARG2, sizeof(vki_aio_context_t) );
+   
+   size = VG_PGROUNDUP(sizeof(struct vki_aio_ring) +
+                       ARG1*sizeof(struct vki_io_event));
+   addr = VG_(find_map_space)(0, size, True);
+   
+   if (addr == 0) {
+      SET_STATUS_Failure( VKI_ENOMEM );
+      return;
+   }
+
+   VG_(map_segment)(addr, size, VKI_PROT_READ|VKI_PROT_WRITE, SF_FIXED);
+   
+   VG_(pad_address_space)(0);
+   SET_STATUS_from_SysRes( VG_(do_syscall2)(SYSNO, ARG1, ARG2) );
+   VG_(unpad_address_space)(0);
+
+   if (SUCCESS && RES == 0) {
+      struct vki_aio_ring *r = *(struct vki_aio_ring **)ARG2;
+        
+      vg_assert(addr == (Addr)r);
+      vg_assert(VG_(valid_client_addr)(addr, size, tid, "io_setup"));
+                
+      VG_TRACK( new_mem_mmap, addr, size, True, True, False );
+      POST_MEM_WRITE( ARG2, sizeof(vki_aio_context_t) );
+   }
+   else {
+      VG_(unmap_range)(addr, size);
+   }
+}
+
+// Nb: This wrapper is "Special" because we need 'size' to do the unmap
+// after the syscall.  We must get 'size' from the aio_ring structure,
+// before the syscall, while the aio_ring structure still exists.  (And we
+// know that we must look at the aio_ring structure because Tom inspected the
+// kernel and glibc sources to see what they do, yuk.)
+//
+// XXX This segment can be implicitly unmapped when aio
+// file-descriptors are closed...
+PRE(sys_io_destroy)
+{     
+   Segment *s = VG_(find_segment)(ARG1);
+   struct vki_aio_ring *r;
+   SizeT size;
+      
+   PRINT("sys_io_destroy ( %llu )", (ULong)ARG1);
+   PRE_REG_READ1(long, "io_destroy", vki_aio_context_t, ctx);
+
+   // If we are going to seg fault (due to a bogus ARG1) do it as late as
+   // possible...
+   r = *(struct vki_aio_ring **)ARG1;
+   size = VG_PGROUNDUP(sizeof(struct vki_aio_ring) + 
+                       r->nr*sizeof(struct vki_io_event));
+
+   SET_STATUS_from_SysRes( VG_(do_syscall1)(SYSNO, ARG1) );
+
+   if (SUCCESS && RES == 0 && s != NULL) { 
+      VG_TRACK( die_mem_munmap, ARG1, size );
+      VG_(unmap_range)(ARG1, size);
+   }  
+}  
+
+PRE(sys_io_getevents)
+{
+   *flags |= SfMayBlock;
+   PRINT("sys_io_getevents ( %llu, %lld, %lld, %p, %p )",
+         (ULong)ARG1,(Long)ARG2,(Long)ARG3,ARG4,ARG5);
+   PRE_REG_READ5(long, "io_getevents",
+                 vki_aio_context_t, ctx_id, long, min_nr, long, nr,
+                 struct io_event *, events,
+                 struct timespec *, timeout);
+   if (ARG3 > 0)
+      PRE_MEM_WRITE( "io_getevents(events)",
+                     ARG4, sizeof(struct vki_io_event)*ARG3 );
+   if (ARG5 != 0)
+      PRE_MEM_READ( "io_getevents(timeout)",
+                    ARG5, sizeof(struct vki_timespec));
+}
+POST(sys_io_getevents)
+{
+   Int i;
+   vg_assert(SUCCESS);
+   if (RES > 0) {
+      POST_MEM_WRITE( ARG4, sizeof(struct vki_io_event)*RES );
+      for (i = 0; i < RES; i++) {
+         const struct vki_io_event *vev = ((struct vki_io_event *)ARG4) + i;
+         const struct vki_iocb *cb = (struct vki_iocb *)(Addr)vev->obj;
+
+         switch (cb->aio_lio_opcode) {
+         case VKI_IOCB_CMD_PREAD:
+            if (vev->result > 0)
+               POST_MEM_WRITE( cb->aio_buf, vev->result );
+            break;
+            
+         case VKI_IOCB_CMD_PWRITE:
+            break;
+           
+         default:
+            VG_(message)(Vg_DebugMsg,
+                        "Warning: unhandled io_getevents opcode: %u\n",
+                        cb->aio_lio_opcode);
+            break;
+         }
+      }
+   }
+}
+
+PRE(sys_io_submit)
+{
+   Int i;
+
+   PRINT("sys_io_submit( %llu, %lld, %p )", (ULong)ARG1,(Long)ARG2,ARG3);
+   PRE_REG_READ3(long, "io_submit",
+                 vki_aio_context_t, ctx_id, long, nr,
+                 struct iocb **, iocbpp);
+   PRE_MEM_READ( "io_submit(iocbpp)", ARG3, ARG2*sizeof(struct vki_iocb *) );
+   if (ARG3 != 0) {
+      for (i = 0; i < ARG2; i++) {
+         struct vki_iocb *cb = ((struct vki_iocb **)ARG3)[i];
+         PRE_MEM_READ( "io_submit(iocb)", (Addr)cb, sizeof(struct vki_iocb) );
+         switch (cb->aio_lio_opcode) {
+         case VKI_IOCB_CMD_PREAD:
+            PRE_MEM_WRITE( "io_submit(PREAD)", cb->aio_buf, cb->aio_nbytes );
+            break;
+
+         case VKI_IOCB_CMD_PWRITE:
+            PRE_MEM_READ( "io_submit(PWRITE)", cb->aio_buf, cb->aio_nbytes );
+            break;
+           
+         default:
+            VG_(message)(Vg_DebugMsg,"Warning: unhandled io_submit opcode: %u\n",
+                         cb->aio_lio_opcode);
+            break;
+         }
+      }
+   }
+}
+
+PRE(sys_io_cancel)
+{
+   PRINT("sys_io_cancel( %llu, %p, %p )", (ULong)ARG1,ARG2,ARG3);
+   PRE_REG_READ3(long, "io_cancel",
+                 vki_aio_context_t, ctx_id, struct iocb *, iocb,
+                 struct io_event *, result);
+   PRE_MEM_READ( "io_cancel(iocb)", ARG2, sizeof(struct vki_iocb) );
+   PRE_MEM_WRITE( "io_cancel(result)", ARG3, sizeof(struct vki_io_event) );
+}
+
+POST(sys_io_cancel)
+{
+   POST_MEM_WRITE( ARG3, sizeof(struct vki_io_event) );
+}
+
+#undef PRE
+#undef POST
 
 /*--------------------------------------------------------------------*/
 /*--- end                                                          ---*/
index a8f65d39d8304fdadbdf7e8d25cf9ae0bbf647fb..e851a9e1be98b808370a9bf6be5ee733e1d93d0a 100644 (file)
@@ -847,45 +847,45 @@ static SysRes sys_set_thread_area ( ThreadId tid, vki_modify_ldt_t* info )
 }
 
 
-//zz static Int sys_get_thread_area ( ThreadId tid, vki_modify_ldt_t* info )
-//zz {
-//zz    Int idx;
-//zz    VexGuestX86SegDescr* gdt;
-//zz 
-//zz    vg_assert(sizeof(HWord) == sizeof(VexGuestX86SegDescr*));
-//zz    vg_assert(8 == sizeof(VexGuestX86SegDescr));
-//zz 
-//zz    if (info == NULL)
-//zz       return -VKI_EFAULT;
-//zz 
-//zz    idx = info->entry_number;
-//zz 
-//zz    if (idx < 0 || idx >= VEX_GUEST_X86_GDT_NENT)
-//zz       return -VKI_EINVAL;
-//zz 
-//zz    gdt = (VexGuestX86SegDescr*)VG_(threads)[tid].arch.vex.guest_GDT;
-//zz 
-//zz    /* If the thread doesn't have a GDT, allocate it now. */
-//zz    if (!gdt) {
-//zz       gdt = alloc_zeroed_x86_GDT();
-//zz       VG_(threads)[tid].arch.vex.guest_GDT = (HWord)gdt;
-//zz    }
-//zz 
-//zz    info->base_addr = ( gdt[idx].LdtEnt.Bits.BaseHi << 24 ) |
-//zz                      ( gdt[idx].LdtEnt.Bits.BaseMid << 16 ) |
-//zz                      gdt[idx].LdtEnt.Bits.BaseLow;
-//zz    info->limit = ( gdt[idx].LdtEnt.Bits.LimitHi << 16 ) |
-//zz                    gdt[idx].LdtEnt.Bits.LimitLow;
-//zz    info->seg_32bit = gdt[idx].LdtEnt.Bits.Default_Big;
-//zz    info->contents = ( gdt[idx].LdtEnt.Bits.Type >> 2 ) & 0x3;
-//zz    info->read_exec_only = ( gdt[idx].LdtEnt.Bits.Type & 0x1 ) ^ 0x1;
-//zz    info->limit_in_pages = gdt[idx].LdtEnt.Bits.Granularity;
-//zz    info->seg_not_present = gdt[idx].LdtEnt.Bits.Pres ^ 0x1;
-//zz    info->useable = gdt[idx].LdtEnt.Bits.Sys;
-//zz    info->reserved = 0;
-//zz 
-//zz    return 0;
-//zz }
+static SysRes sys_get_thread_area ( ThreadId tid, vki_modify_ldt_t* info )
+{
+   Int idx;
+   VexGuestX86SegDescr* gdt;
+
+   vg_assert(sizeof(HWord) == sizeof(VexGuestX86SegDescr*));
+   vg_assert(8 == sizeof(VexGuestX86SegDescr));
+
+   if (info == NULL)
+      return VG_(mk_SysRes_Error)( VKI_EFAULT );
+
+   idx = info->entry_number;
+
+   if (idx < 0 || idx >= VEX_GUEST_X86_GDT_NENT)
+      return VG_(mk_SysRes_Error)( VKI_EINVAL );
+
+   gdt = (VexGuestX86SegDescr*)VG_(threads)[tid].arch.vex.guest_GDT;
+
+   /* If the thread doesn't have a GDT, allocate it now. */
+   if (!gdt) {
+      gdt = alloc_zeroed_x86_GDT();
+      VG_(threads)[tid].arch.vex.guest_GDT = (HWord)gdt;
+   }
+
+   info->base_addr = ( gdt[idx].LdtEnt.Bits.BaseHi << 24 ) |
+                     ( gdt[idx].LdtEnt.Bits.BaseMid << 16 ) |
+                     gdt[idx].LdtEnt.Bits.BaseLow;
+   info->limit = ( gdt[idx].LdtEnt.Bits.LimitHi << 16 ) |
+                   gdt[idx].LdtEnt.Bits.LimitLow;
+   info->seg_32bit = gdt[idx].LdtEnt.Bits.Default_Big;
+   info->contents = ( gdt[idx].LdtEnt.Bits.Type >> 2 ) & 0x3;
+   info->read_exec_only = ( gdt[idx].LdtEnt.Bits.Type & 0x1 ) ^ 0x1;
+   info->limit_in_pages = gdt[idx].LdtEnt.Bits.Granularity;
+   info->seg_not_present = gdt[idx].LdtEnt.Bits.Pres ^ 0x1;
+   info->useable = gdt[idx].LdtEnt.Bits.Sys;
+   info->reserved = 0;
+
+   return VG_(mk_SysRes_Error)( 0 );
+}
 
 /* ---------------------------------------------------------------------
    More thread stuff
@@ -954,6 +954,7 @@ DECL_TEMPLATE(x86_linux, sys_ipc);
 DECL_TEMPLATE(x86_linux, sys_rt_sigreturn);
 DECL_TEMPLATE(x86_linux, sys_modify_ldt);
 DECL_TEMPLATE(x86_linux, sys_set_thread_area);
+DECL_TEMPLATE(x86_linux, sys_get_thread_area);
 DECL_TEMPLATE(x86_linux, sys_ptrace);
 DECL_TEMPLATE(x86_linux, sys_sigaction);
 DECL_TEMPLATE(x86_linux, old_select);
@@ -1210,19 +1211,19 @@ PRE(sys_set_thread_area)
    SET_STATUS_from_SysRes( sys_set_thread_area( tid, (void *)ARG1 ) );
 }
 
-//zz PRE(sys_get_thread_area, Special)
-//zz {
-//zz    PRINT("sys_get_thread_area ( %p )", ARG1);
-//zz    PRE_REG_READ1(int, "get_thread_area", struct user_desc *, u_info)
-//zz    PRE_MEM_WRITE( "get_thread_area(u_info)", ARG1, sizeof(vki_modify_ldt_t) );
-//zz 
-//zz    /* "do" the syscall ourselves; the kernel never sees it */
-//zz    SET_STATUS_( sys_get_thread_area( tid, (void *)ARG1 ) );
-//zz 
-//zz    if (!VG_(is_kerror)(RES)) {
-//zz       POST_MEM_WRITE( ARG1, sizeof(vki_modify_ldt_t) );
-//zz    }
-//zz }
+PRE(sys_get_thread_area)
+{
+   PRINT("sys_get_thread_area ( %p )", ARG1);
+   PRE_REG_READ1(int, "get_thread_area", struct user_desc *, u_info)
+   PRE_MEM_WRITE( "get_thread_area(u_info)", ARG1, sizeof(vki_modify_ldt_t) );
+
+   /* "do" the syscall ourselves; the kernel never sees it */
+   SET_STATUS_from_SysRes( sys_get_thread_area( tid, (void *)ARG1 ) );
+
+   if (SUCCESS) {
+      POST_MEM_WRITE( ARG1, sizeof(vki_modify_ldt_t) );
+   }
+}
 
 // Parts of this are x86-specific, but the *PEEK* cases are generic.
 // XXX: Why is the memory pointed to by ARG3 never checked?
@@ -1458,16 +1459,16 @@ PRE(old_mmap)
    }; */
    UWord a1, a2, a3, a4, a5, a6;
 
-   UWord* arg_block = (UWord*)ARG1;
-   PRE_REG_READ1(long, "old_mmap", struct mmap_arg_struct *, ARG1);
-   PRE_MEM_READ( "old_mmap(args)", (Addr)arg_block, 6*sizeof(UWord) );
+   UWord* args = (UWord*)ARG1;
+   PRE_REG_READ1(long, "old_mmap", struct mmap_arg_struct *, args);
+   PRE_MEM_READ( "old_mmap(args)", (Addr)args, 6*sizeof(UWord) );
 
-   a1 = arg_block[0];
-   a2 = arg_block[1];
-   a3 = arg_block[2];
-   a4 = arg_block[3];
-   a5 = arg_block[4];
-   a6 = arg_block[5];
+   a1 = args[0];
+   a2 = args[1];
+   a3 = args[2];
+   a4 = args[3];
+   a5 = args[4];
+   a6 = args[5];
 
    PRINT("old_mmap ( %p, %llu, %d, %d, %d, %d )",
          a1, (ULong)a2, a3, a4, a5, a6 );
@@ -1515,13 +1516,13 @@ PRE(old_mmap)
 
    if (0)
    VG_(printf)("old_mmap( %p, fixed %d ) -> %s(%p)\n", 
-               arg_block[0], 
-               arg_block[3]&VKI_MAP_FIXED, 
+               args[0], 
+               args[3]&VKI_MAP_FIXED, 
                FAILURE ? "Fail" : "Success", RES_unchecked);
 
    /* Stay sane */
-   if (SUCCESS && (arg_block[3] & VKI_MAP_FIXED))
-      vg_assert(RES == arg_block[0]);
+   if (SUCCESS && (args[3] & VKI_MAP_FIXED))
+      vg_assert(RES == args[0]);
 }
 
 // XXX: lstat64/fstat64/stat64 are generic, but not necessarily
@@ -2094,8 +2095,8 @@ const SyscallTableEntry VGP_(syscall_table)[] = {
    GENX_(__NR_munlock,           sys_munlock),        // 151
    GENX_(__NR_mlockall,          sys_mlockall),       // 152
    GENX_(__NR_munlockall,        sys_munlockall),     // 153
-//zz    GENXY(__NR_sched_setparam,    sys_sched_setparam), // 154
-//zz 
+   GENXY(__NR_sched_setparam,    sys_sched_setparam), // 154
+
    GENXY(__NR_sched_getparam,         sys_sched_getparam),        // 155
    GENX_(__NR_sched_setscheduler,     sys_sched_setscheduler),    // 156
    GENX_(__NR_sched_getscheduler,     sys_sched_getscheduler),    // 157
@@ -2106,73 +2107,73 @@ const SyscallTableEntry VGP_(syscall_table)[] = {
 //zz    //   (__NR_sched_rr_get_interval,  sys_sched_rr_get_interval), // 161 */*
    GENXY(__NR_nanosleep,         sys_nanosleep),      // 162
    GENX_(__NR_mremap,            sys_mremap),         // 163
-//zz    LINX_(__NR_setresuid,         sys_setresuid16),    // 164
-//zz 
-//zz    LINXY(__NR_getresuid,         sys_getresuid16),    // 165
+   LINX_(__NR_setresuid,         sys_setresuid16),    // 164
+
+   LINXY(__NR_getresuid,         sys_getresuid16),    // 165
 //zz    //   (__NR_vm86,              sys_vm86),           // 166 x86/Linux-only
    GENX_(__NR_query_module,      sys_ni_syscall),     // 167
    GENXY(__NR_poll,              sys_poll),           // 168
 //zz    //   (__NR_nfsservctl,        sys_nfsservctl),     // 169 */Linux
 //zz 
-//zz    LINX_(__NR_setresgid,         sys_setresgid16),    // 170
-//zz    LINXY(__NR_getresgid,         sys_getresgid16),    // 171
-//zz    LINX_(__NR_prctl,             sys_prctl),          // 172
+   LINX_(__NR_setresgid,         sys_setresgid16),    // 170
+   LINXY(__NR_getresgid,         sys_getresgid16),    // 171
+   LINX_(__NR_prctl,             sys_prctl),          // 172
    PLAX_(__NR_rt_sigreturn,      sys_rt_sigreturn),   // 173 x86/Linux only?
    GENXY(__NR_rt_sigaction,      sys_rt_sigaction),   // 174
 
    GENXY(__NR_rt_sigprocmask,    sys_rt_sigprocmask), // 175
-//zz    GENXY(__NR_rt_sigpending,     sys_rt_sigpending),  // 176
+   GENXY(__NR_rt_sigpending,     sys_rt_sigpending),  // 176
    GENXY(__NR_rt_sigtimedwait,   sys_rt_sigtimedwait),// 177
-//zz    GENXY(__NR_rt_sigqueueinfo,   sys_rt_sigqueueinfo),// 178
+   GENXY(__NR_rt_sigqueueinfo,   sys_rt_sigqueueinfo),// 178
    GENX_(__NR_rt_sigsuspend,     sys_rt_sigsuspend),  // 179
-//zz 
-//zz    GENXY(__NR_pread64,           sys_pread64),        // 180
-//zz    GENX_(__NR_pwrite64,          sys_pwrite64),       // 181
-//zz    GENX_(__NR_chown,             sys_chown16),        // 182
+
+   GENXY(__NR_pread64,           sys_pread64),        // 180
+   GENX_(__NR_pwrite64,          sys_pwrite64),       // 181
+   GENX_(__NR_chown,             sys_chown16),        // 182
    GENXY(__NR_getcwd,            sys_getcwd),         // 183
-//zz    GENXY(__NR_capget,            sys_capget),         // 184
-//zz 
-//zz    GENX_(__NR_capset,            sys_capset),         // 185
+   GENXY(__NR_capget,            sys_capget),         // 184
+
+   GENX_(__NR_capset,            sys_capset),         // 185
    GENXY(__NR_sigaltstack,       sys_sigaltstack),    // 186
-//zz    LINXY(__NR_sendfile,          sys_sendfile),       // 187
-//zz    GENXY(__NR_getpmsg,           sys_getpmsg),        // 188
-//zz    GENX_(__NR_putpmsg,           sys_putpmsg),        // 189
+   LINXY(__NR_sendfile,          sys_sendfile),       // 187
+   GENXY(__NR_getpmsg,           sys_getpmsg),        // 188
+   GENX_(__NR_putpmsg,           sys_putpmsg),        // 189
 
    // Nb: we treat vfork as fork
    GENX_(__NR_vfork,             sys_fork),           // 190
    GENXY(__NR_ugetrlimit,        sys_getrlimit),      // 191
    GENXY(__NR_mmap2,             sys_mmap2),          // 192
-//zz    GENX_(__NR_truncate64,        sys_truncate64),     // 193
-//zz    GENX_(__NR_ftruncate64,       sys_ftruncate64),    // 194
-//zz    
+   GENX_(__NR_truncate64,        sys_truncate64),     // 193
+   GENX_(__NR_ftruncate64,       sys_ftruncate64),    // 194
+   
    PLAXY(__NR_stat64,            sys_stat64),         // 195
    PLAXY(__NR_lstat64,           sys_lstat64),        // 196
    PLAXY(__NR_fstat64,           sys_fstat64),        // 197
-//zz    GENX_(__NR_lchown32,          sys_lchown),         // 198
+   GENX_(__NR_lchown32,          sys_lchown),         // 198
    GENX_(__NR_getuid32,          sys_getuid),         // 199
 
    GENX_(__NR_getgid32,          sys_getgid),         // 200
    GENX_(__NR_geteuid32,         sys_geteuid),        // 201
    GENX_(__NR_getegid32,         sys_getegid),        // 202
-//zz    GENX_(__NR_setreuid32,        sys_setreuid),       // 203
-//zz    GENX_(__NR_setregid32,        sys_setregid),       // 204
+   GENX_(__NR_setreuid32,        sys_setreuid),       // 203
+   GENX_(__NR_setregid32,        sys_setregid),       // 204
 
    GENXY(__NR_getgroups32,       sys_getgroups),      // 205
-//zz    GENX_(__NR_setgroups32,       sys_setgroups),      // 206
-//zz    GENX_(__NR_fchown32,          sys_fchown),         // 207
-//zz    LINX_(__NR_setresuid32,       sys_setresuid),      // 208
+   GENX_(__NR_setgroups32,       sys_setgroups),      // 206
+   GENX_(__NR_fchown32,          sys_fchown),         // 207
+   LINX_(__NR_setresuid32,       sys_setresuid),      // 208
    LINXY(__NR_getresuid32,       sys_getresuid),      // 209
 
-//zz    LINX_(__NR_setresgid32,       sys_setresgid),      // 210
+   LINX_(__NR_setresgid32,       sys_setresgid),      // 210
    LINXY(__NR_getresgid32,       sys_getresgid),      // 211
-//zz    GENX_(__NR_chown32,           sys_chown),          // 212
-//zz    GENX_(__NR_setuid32,          sys_setuid),         // 213
-//zz    GENX_(__NR_setgid32,          sys_setgid),         // 214
-//zz 
-//zz    LINX_(__NR_setfsuid32,        sys_setfsuid),       // 215
-//zz    LINX_(__NR_setfsgid32,        sys_setfsgid),       // 216
+   GENX_(__NR_chown32,           sys_chown),          // 212
+   GENX_(__NR_setuid32,          sys_setuid),         // 213
+   GENX_(__NR_setgid32,          sys_setgid),         // 214
+
+   LINX_(__NR_setfsuid32,        sys_setfsuid),       // 215
+   LINX_(__NR_setfsgid32,        sys_setfsgid),       // 216
 //zz    //   (__NR_pivot_root,        sys_pivot_root),     // 217 */Linux
-//zz    GENXY(__NR_mincore,           sys_mincore),        // 218
+   GENXY(__NR_mincore,           sys_mincore),        // 218
    GENX_(__NR_madvise,           sys_madvise),        // 219
 
    GENXY(__NR_getdents64,        sys_getdents64),     // 220
@@ -2182,61 +2183,61 @@ const SyscallTableEntry VGP_(syscall_table)[] = {
    LINX_(__NR_gettid,            sys_gettid),         // 224
 
 //zz    //   (__NR_readahead,         sys_readahead),      // 225 */(Linux?)
-//zz    GENX_(__NR_setxattr,          sys_setxattr),       // 226
-//zz    GENX_(__NR_lsetxattr,         sys_lsetxattr),      // 227
-//zz    GENX_(__NR_fsetxattr,         sys_fsetxattr),      // 228
+   GENX_(__NR_setxattr,          sys_setxattr),       // 226
+   GENX_(__NR_lsetxattr,         sys_lsetxattr),      // 227
+   GENX_(__NR_fsetxattr,         sys_fsetxattr),      // 228
    GENXY(__NR_getxattr,          sys_getxattr),       // 229
-//zz 
-//zz    GENXY(__NR_lgetxattr,         sys_lgetxattr),      // 230
-//zz    GENXY(__NR_fgetxattr,         sys_fgetxattr),      // 231
-//zz    GENXY(__NR_listxattr,         sys_listxattr),      // 232
-//zz    GENXY(__NR_llistxattr,        sys_llistxattr),     // 233
-//zz    GENXY(__NR_flistxattr,        sys_flistxattr),     // 234
-//zz 
-//zz    GENX_(__NR_removexattr,       sys_removexattr),    // 235
-//zz    GENX_(__NR_lremovexattr,      sys_lremovexattr),   // 236
-//zz    GENX_(__NR_fremovexattr,      sys_fremovexattr),   // 237
+
+   GENXY(__NR_lgetxattr,         sys_lgetxattr),      // 230
+   GENXY(__NR_fgetxattr,         sys_fgetxattr),      // 231
+   GENXY(__NR_listxattr,         sys_listxattr),      // 232
+   GENXY(__NR_llistxattr,        sys_llistxattr),     // 233
+   GENXY(__NR_flistxattr,        sys_flistxattr),     // 234
+
+   GENX_(__NR_removexattr,       sys_removexattr),    // 235
+   GENX_(__NR_lremovexattr,      sys_lremovexattr),   // 236
+   GENX_(__NR_fremovexattr,      sys_fremovexattr),   // 237
 //zz    LINX_(__NR_tkill,             sys_tkill),          // 238 */Linux
-//zz    LINXY(__NR_sendfile64,        sys_sendfile64),     // 239
-//zz 
+   LINXY(__NR_sendfile64,        sys_sendfile64),     // 239
+
    LINXY(__NR_futex,             sys_futex),             // 240
-//zz    GENX_(__NR_sched_setaffinity, sys_sched_setaffinity), // 241
-//zz    GENXY(__NR_sched_getaffinity, sys_sched_getaffinity), // 242
+   GENX_(__NR_sched_setaffinity, sys_sched_setaffinity), // 241
+   GENXY(__NR_sched_getaffinity, sys_sched_getaffinity), // 242
    PLAX_(__NR_set_thread_area,   sys_set_thread_area),   // 243
-//zz    PLAX_(__NR_get_thread_area,   sys_get_thread_area),   // 244
-//zz 
-//zz    LINX_(__NR_io_setup,          sys_io_setup),       // 245
-//zz    LINX_(__NR_io_destroy,        sys_io_destroy),     // 246
-//zz    LINXY(__NR_io_getevents,      sys_io_getevents),   // 247
-//zz    LINX_(__NR_io_submit,         sys_io_submit),      // 248
-//zz    LINXY(__NR_io_cancel,         sys_io_cancel),      // 249
-//zz 
+   PLAX_(__NR_get_thread_area,   sys_get_thread_area),   // 244
+
+   LINX_(__NR_io_setup,          sys_io_setup),       // 245
+   LINX_(__NR_io_destroy,        sys_io_destroy),     // 246
+   LINXY(__NR_io_getevents,      sys_io_getevents),   // 247
+   LINX_(__NR_io_submit,         sys_io_submit),      // 248
+   LINXY(__NR_io_cancel,         sys_io_cancel),      // 249
+
 //zz    LINX_(__NR_fadvise64,         sys_fadvise64),      // 250 */(Linux?)
    GENX_(251,                    sys_ni_syscall),     // 251
    LINX_(__NR_exit_group,        sys_exit_group),     // 252
-//zz    GENXY(__NR_lookup_dcookie,    sys_lookup_dcookie), // 253
-//zz    LINXY(__NR_epoll_create,      sys_epoll_create),   // 254
-//zz 
-//zz    LINX_(__NR_epoll_ctl,         sys_epoll_ctl),         // 255
-//zz    LINXY(__NR_epoll_wait,        sys_epoll_wait),        // 256
+   GENXY(__NR_lookup_dcookie,    sys_lookup_dcookie), // 253
+   LINXY(__NR_epoll_create,      sys_epoll_create),   // 254
+
+   LINX_(__NR_epoll_ctl,         sys_epoll_ctl),         // 255
+   LINXY(__NR_epoll_wait,        sys_epoll_wait),        // 256
 //zz    //   (__NR_remap_file_pages,  sys_remap_file_pages),  // 257 */Linux
    LINX_(__NR_set_tid_address,   sys_set_tid_address),   // 258
-//zz    GENXY(__NR_timer_create,      sys_timer_create),      // 259
-//zz 
-//zz    GENXY(__NR_timer_settime,     sys_timer_settime),  // (timer_create+1)
-//zz    GENXY(__NR_timer_gettime,     sys_timer_gettime),  // (timer_create+2)
-//zz    GENX_(__NR_timer_getoverrun,  sys_timer_getoverrun),//(timer_create+3)
-//zz    GENX_(__NR_timer_delete,      sys_timer_delete),   // (timer_create+4)
-//zz    GENX_(__NR_clock_settime,     sys_clock_settime),  // (timer_create+5)
-//zz 
+   GENXY(__NR_timer_create,      sys_timer_create),      // 259
+
+   GENXY(__NR_timer_settime,     sys_timer_settime),  // (timer_create+1)
+   GENXY(__NR_timer_gettime,     sys_timer_gettime),  // (timer_create+2)
+   GENX_(__NR_timer_getoverrun,  sys_timer_getoverrun),//(timer_create+3)
+   GENX_(__NR_timer_delete,      sys_timer_delete),   // (timer_create+4)
+   GENX_(__NR_clock_settime,     sys_clock_settime),  // (timer_create+5)
+
    GENXY(__NR_clock_gettime,     sys_clock_gettime),  // (timer_create+6)
-//zz    GENXY(__NR_clock_getres,      sys_clock_getres),   // (timer_create+7)
+   GENXY(__NR_clock_getres,      sys_clock_getres),   // (timer_create+7)
 //zz    //   (__NR_clock_nanosleep,   sys_clock_nanosleep),// (timer_create+8) */*
-//zz    GENXY(__NR_statfs64,          sys_statfs64),       // 268
-//zz    GENXY(__NR_fstatfs64,         sys_fstatfs64),      // 269
-//zz 
+   GENXY(__NR_statfs64,          sys_statfs64),       // 268
+   GENXY(__NR_fstatfs64,         sys_fstatfs64),      // 269
+
    LINX_(__NR_tgkill,            sys_tgkill),         // 270 */Linux
-//zz    GENX_(__NR_utimes,            sys_utimes),         // 271
+   GENX_(__NR_utimes,            sys_utimes),         // 271
 //zz    LINX_(__NR_fadvise64_64,      sys_fadvise64_64),   // 272 */(Linux?)
    GENX_(__NR_vserver,           sys_ni_syscall),     // 273
 //zz    //   (__NR_mbind,             sys_mbind),          // 274 ?/?