]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Merge a large chunk of r8949 (the part that moved fcntl and ioctl wrappers
authorNicholas Nethercote <njn@valgrind.org>
Sun, 22 Feb 2009 23:00:30 +0000 (23:00 +0000)
committerNicholas Nethercote <njn@valgrind.org>
Sun, 22 Feb 2009 23:00:30 +0000 (23:00 +0000)
out of syswrap-generic into syswrap-linux) from the DARWIN branch.

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

coregrind/m_syswrap/priv_syswrap-generic.h
coregrind/m_syswrap/priv_syswrap-linux.h
coregrind/m_syswrap/syswrap-amd64-linux.c
coregrind/m_syswrap/syswrap-generic.c
coregrind/m_syswrap/syswrap-linux.c
coregrind/m_syswrap/syswrap-ppc32-linux.c
coregrind/m_syswrap/syswrap-ppc64-linux.c
coregrind/m_syswrap/syswrap-x86-linux.c

index 87e37797571fe59e421d6e594d4486981d6adf9d..1c93aa05e61e05ee6a0dccdc80123152ad3ee036 100644 (file)
@@ -52,6 +52,7 @@ extern Bool ML_(client_signal_OK)(Int sigNo);
 extern
 Bool ML_(fd_allowed)(Int fd, const Char *syscallname, ThreadId tid, Bool soft);
 
+extern void ML_(record_fd_open_named)          (ThreadId tid, Int fd);
 extern void ML_(record_fd_open_nameless)       (ThreadId tid, Int fd);
 extern void ML_(record_fd_open_with_given_name)(ThreadId tid, Int fd,
                                                 char *pathname);
@@ -103,7 +104,6 @@ DECL_TEMPLATE(generic, sys_mkdir);
 DECL_TEMPLATE(generic, sys_rmdir);
 DECL_TEMPLATE(generic, sys_dup);
 DECL_TEMPLATE(generic, sys_times);
-DECL_TEMPLATE(generic, sys_fcntl);        // POSIX (but complicated)
 DECL_TEMPLATE(generic, sys_setpgid);
 DECL_TEMPLATE(generic, sys_umask);
 DECL_TEMPLATE(generic, sys_dup2);
@@ -178,7 +178,6 @@ DECL_TEMPLATE(generic, sys_newfstat);              // * P (SVr4,BSD4.3)
 // For the remainder, not really sure yet
 DECL_TEMPLATE(generic, sys_ptrace);                // (x86?) (almost-P)
 DECL_TEMPLATE(generic, sys_setrlimit);             // SVr4, 4.3BSD
-DECL_TEMPLATE(generic, sys_ioctl);                 // x86? (various)
 DECL_TEMPLATE(generic, sys_old_getrlimit);         // SVr4, 4.3BSD L?
 DECL_TEMPLATE(generic, sys_statfs);                // * L?
 DECL_TEMPLATE(generic, sys_fstatfs);               // * L?
@@ -198,7 +197,6 @@ DECL_TEMPLATE(generic, sys_ftruncate64);           // %% (P?)
 DECL_TEMPLATE(generic, sys_lchown);                // * (L?)
 DECL_TEMPLATE(generic, sys_mincore);               // * L?
 DECL_TEMPLATE(generic, sys_getdents64);            // * (SVr4,SVID?)
-DECL_TEMPLATE(generic, sys_fcntl64);               // * P?
 DECL_TEMPLATE(generic, sys_statfs64);              // * (?)
 DECL_TEMPLATE(generic, sys_fstatfs64);             // * (?)
 
index 09c4372bbe3c0c12b8dc7e152d74e0f67d15abad..6d9beaab200be071455cb380ac4a68618e18863a 100644 (file)
@@ -48,6 +48,11 @@ DECL_TEMPLATE(linux, sys_mount);
 DECL_TEMPLATE(linux, sys_oldumount);
 DECL_TEMPLATE(linux, sys_umount);
 
+// POSIX, but various sub-cases differ between Linux and Darwin.
+DECL_TEMPLATE(linux, sys_fcntl);
+DECL_TEMPLATE(linux, sys_fcntl64);
+DECL_TEMPLATE(linux, sys_ioctl);
+
 DECL_TEMPLATE(linux, sys_setfsuid16);
 DECL_TEMPLATE(linux, sys_setfsuid);
 DECL_TEMPLATE(linux, sys_setfsgid16);
index 69ad7443893bc99f95053faca876d369ca128632..47c280db484f1a4264fd311a4d23e32fe6b0d03d 100644 (file)
@@ -1034,7 +1034,7 @@ const SyscallTableEntry ML_(syscall_table)[] = {
    LINXY(__NR_rt_sigprocmask,    sys_rt_sigprocmask), // 14 
 
    PLAX_(__NR_rt_sigreturn,      sys_rt_sigreturn),   // 15 
-   GENXY(__NR_ioctl,             sys_ioctl),          // 16 
+   LINXY(__NR_ioctl,             sys_ioctl),          // 16 
    GENXY(__NR_pread64,           sys_pread64_on64bitplat),  // 17 
    GENX_(__NR_pwrite64,          sys_pwrite64_on64bitplat), // 18 
    GENXY(__NR_readv,             sys_readv),          // 19 
@@ -1101,7 +1101,7 @@ const SyscallTableEntry ML_(syscall_table)[] = {
 
    PLAXY(__NR_msgrcv,            sys_msgrcv),         // 70 
    PLAXY(__NR_msgctl,            sys_msgctl),         // 71 
-   GENXY(__NR_fcntl,             sys_fcntl),          // 72 
+   LINXY(__NR_fcntl,             sys_fcntl),          // 72 
    GENX_(__NR_flock,             sys_flock),          // 73 
    GENX_(__NR_fsync,             sys_fsync),          // 74 
 
index e885b975ed6e563d16c8e04e2ea97f906d16414e..0583b0076ce6fb220822e8dea13fe36583e4cc78 100644 (file)
@@ -569,7 +569,7 @@ void ML_(record_fd_open_with_given_name)(ThreadId tid, Int fd, char *pathname)
 }
 
 // Record opening of an fd, and find its name.
-static void record_fd_open_named(ThreadId tid, Int fd)
+void ML_(record_fd_open_named)(ThreadId tid, Int fd)
 {
    static HChar buf[VKI_PATH_MAX];
    Char* name;
@@ -756,7 +756,7 @@ void VG_(init_preopened_fds)(void)
 
          if (fno != f.res)
             if (VG_(clo_track_fds))
-               record_fd_open_named(-1, fno);
+               ML_(record_fd_open_named)(-1, fno);
       }
 
       VG_(lseek)(f.res, d.d_off, VKI_SEEK_SET);
@@ -866,7 +866,7 @@ static void check_cmsg_for_fds(ThreadId tid, struct vki_msghdr *msg)
             if(VG_(clo_track_fds))
                // XXX: must we check the range on these fds with
                //      ML_(fd_allowed)()?
-               record_fd_open_named(tid, fds[i]);
+               ML_(record_fd_open_named)(tid, fds[i]);
       }
 
       cm = VKI_CMSG_NXTHDR(msg, cm);
@@ -2709,7 +2709,7 @@ POST(sys_dup)
       SET_STATUS_Failure( VKI_EMFILE );
    } else {
       if (VG_(clo_track_fds))
-         record_fd_open_named(tid, RES);
+         ML_(record_fd_open_named)(tid, RES);
    }
 }
 
@@ -2725,7 +2725,7 @@ POST(sys_dup2)
 {
    vg_assert(SUCCESS);
    if (VG_(clo_track_fds))
-      record_fd_open_named(tid, RES);
+      ML_(record_fd_open_named)(tid, RES);
 }
 
 PRE(sys_fchdir)
@@ -2747,135 +2747,6 @@ PRE(sys_fchmod)
    PRE_REG_READ2(long, "fchmod", unsigned int, fildes, vki_mode_t, mode);
 }
 
-PRE(sys_fcntl)
-{
-   switch (ARG2) {
-   // These ones ignore ARG3.
-   case VKI_F_GETFD:
-   case VKI_F_GETFL:
-   case VKI_F_GETOWN:
-   case VKI_F_GETSIG:
-   case VKI_F_GETLEASE:
-      PRINT("sys_fcntl ( %ld, %ld )", ARG1,ARG2);
-      PRE_REG_READ2(long, "fcntl", unsigned int, fd, unsigned int, cmd);
-      break;
-
-   // These ones use ARG3 as "arg".
-   case VKI_F_DUPFD:
-   case VKI_F_SETFD:
-   case VKI_F_SETFL:
-   case VKI_F_SETLEASE:
-   case VKI_F_NOTIFY:
-   case VKI_F_SETOWN:
-   case VKI_F_SETSIG:
-      PRINT("sys_fcntl[ARG3=='arg'] ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
-      PRE_REG_READ3(long, "fcntl",
-                    unsigned int, fd, unsigned int, cmd, unsigned long, arg);
-      break;
-
-   // These ones use ARG3 as "lock".
-   case VKI_F_GETLK:
-   case VKI_F_SETLK:
-   case VKI_F_SETLKW:
-#  if defined(VGP_x86_linux)
-   case VKI_F_GETLK64:
-   case VKI_F_SETLK64:
-   case VKI_F_SETLKW64:
-#  endif
-      PRINT("sys_fcntl[ARG3=='lock'] ( %ld, %ld, %#lx )", ARG1,ARG2,ARG3);
-      PRE_REG_READ3(long, "fcntl",
-                    unsigned int, fd, unsigned int, cmd,
-                    struct flock64 *, lock);
-      break;
-   }
-
-#  if defined(VGP_x86_linux)
-   if (ARG2 == VKI_F_SETLKW || ARG2 == VKI_F_SETLKW64)
-#  else
-   if (ARG2 == VKI_F_SETLKW)
-#  endif
-      *flags |= SfMayBlock;
-}
-
-POST(sys_fcntl)
-{
-   vg_assert(SUCCESS);
-   if (ARG2 == VKI_F_DUPFD) {
-      if (!ML_(fd_allowed)(RES, "fcntl(DUPFD)", tid, True)) {
-         VG_(close)(RES);
-         SET_STATUS_Failure( VKI_EMFILE );
-      } else {
-         if (VG_(clo_track_fds))
-            record_fd_open_named(tid, RES);
-      }
-   }
-}
-
-// XXX: wrapper only suitable for 32-bit systems
-PRE(sys_fcntl64)
-{
-   switch (ARG2) {
-   // These ones ignore ARG3.
-   case VKI_F_GETFD:
-   case VKI_F_GETFL:
-   case VKI_F_GETOWN:
-   case VKI_F_SETOWN:
-   case VKI_F_GETSIG:
-   case VKI_F_SETSIG:
-   case VKI_F_GETLEASE:
-      PRINT("sys_fcntl64 ( %ld, %ld )", ARG1,ARG2);
-      PRE_REG_READ2(long, "fcntl64", unsigned int, fd, unsigned int, cmd);
-      break;
-
-   // These ones use ARG3 as "arg".
-   case VKI_F_DUPFD:
-   case VKI_F_SETFD:
-   case VKI_F_SETFL:
-   case VKI_F_SETLEASE:
-   case VKI_F_NOTIFY:
-      PRINT("sys_fcntl64[ARG3=='arg'] ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
-      PRE_REG_READ3(long, "fcntl64",
-                    unsigned int, fd, unsigned int, cmd, unsigned long, arg);
-      break;
-
-   // These ones use ARG3 as "lock".
-   case VKI_F_GETLK:
-   case VKI_F_SETLK:
-   case VKI_F_SETLKW:
-#  if defined(VGP_x86_linux)
-   case VKI_F_GETLK64:
-   case VKI_F_SETLK64:
-   case VKI_F_SETLKW64:
-#  endif
-      PRINT("sys_fcntl64[ARG3=='lock'] ( %ld, %ld, %#lx )", ARG1,ARG2,ARG3);
-      PRE_REG_READ3(long, "fcntl64",
-                    unsigned int, fd, unsigned int, cmd,
-                    struct flock64 *, lock);
-      break;
-   }
-   
-#  if defined(VGP_x86_linux)
-   if (ARG2 == VKI_F_SETLKW || ARG2 == VKI_F_SETLKW64)
-#  else
-   if (ARG2 == VKI_F_SETLKW)
-#  endif
-      *flags |= SfMayBlock;
-}
-
-POST(sys_fcntl64)
-{
-   vg_assert(SUCCESS);
-   if (ARG2 == VKI_F_DUPFD) {
-      if (!ML_(fd_allowed)(RES, "fcntl64(DUPFD)", tid, True)) {
-         VG_(close)(RES);
-         SET_STATUS_Failure( VKI_EMFILE );
-      } else {
-         if (VG_(clo_track_fds))
-            record_fd_open_named(tid, RES);
-      }
-   }
-}
-
 PRE(sys_newfstat)
 {
    PRINT("sys_newfstat ( %ld, %#lx )", ARG1,ARG2);
@@ -3184,1887 +3055,6 @@ PRE(sys_getuid)
    PRE_REG_READ0(long, "getuid");
 }
 
-// XXX: I reckon some of these cases must be x86-specific
-PRE(sys_ioctl)
-{
-   *flags |= SfMayBlock;
-   PRINT("sys_ioctl ( %ld, 0x%lx, %#lx )",ARG1,ARG2,ARG3);
-   PRE_REG_READ3(long, "ioctl",
-                 unsigned int, fd, unsigned int, request, unsigned long, arg);
-
-   switch (ARG2 /* request */) {
-   case VKI_TCSETS:
-   case VKI_TCSETSW:
-   case VKI_TCSETSF:
-      PRE_MEM_READ( "ioctl(TCSET{S,SW,SF})", ARG3, sizeof(struct vki_termios) );
-      break; 
-   case VKI_TCGETS:
-      PRE_MEM_WRITE( "ioctl(TCGETS)", ARG3, sizeof(struct vki_termios) );
-      break;
-   case VKI_TCSETA:
-   case VKI_TCSETAW:
-   case VKI_TCSETAF:
-      PRE_MEM_READ( "ioctl(TCSET{A,AW,AF})", ARG3, sizeof(struct vki_termio) );
-      break;
-   case VKI_TCGETA:
-      PRE_MEM_WRITE( "ioctl(TCGETA)", ARG3, sizeof(struct vki_termio) );
-      break;
-   case VKI_TCSBRK:
-   case VKI_TCXONC:
-   case VKI_TCSBRKP:
-   case VKI_TCFLSH:
-      /* These just take an int by value */
-      break;
-   case VKI_TIOCGWINSZ:
-      PRE_MEM_WRITE( "ioctl(TIOCGWINSZ)", ARG3, sizeof(struct vki_winsize) );
-      break;
-   case VKI_TIOCSWINSZ:
-      PRE_MEM_READ( "ioctl(TIOCSWINSZ)",  ARG3, sizeof(struct vki_winsize) );
-      break;
-   case VKI_TIOCMBIS:
-      PRE_MEM_READ( "ioctl(TIOCMBIS)",    ARG3, sizeof(unsigned int) );
-      break;
-   case VKI_TIOCMBIC:
-      PRE_MEM_READ( "ioctl(TIOCMBIC)",    ARG3, sizeof(unsigned int) );
-      break;
-   case VKI_TIOCMSET:
-      PRE_MEM_READ( "ioctl(TIOCMSET)",    ARG3, sizeof(unsigned int) );
-      break;
-   case VKI_TIOCMGET:
-      PRE_MEM_WRITE( "ioctl(TIOCMGET)",   ARG3, sizeof(unsigned int) );
-      break;
-   case VKI_TIOCLINUX:
-      PRE_MEM_READ( "ioctl(TIOCLINUX)",   ARG3, sizeof(char *) );
-      if (*(char *)ARG3 == 11) {
-        PRE_MEM_READ( "ioctl(TIOCLINUX, 11)", ARG3, 2 * sizeof(char *) );
-      }
-      break;
-   case VKI_TIOCGPGRP:
-      /* Get process group ID for foreground processing group. */
-      PRE_MEM_WRITE( "ioctl(TIOCGPGRP)", ARG3, sizeof(vki_pid_t) );
-      break;
-   case VKI_TIOCSPGRP:
-      /* Set a process group ID? */
-      PRE_MEM_WRITE( "ioctl(TIOCGPGRP)", ARG3, sizeof(vki_pid_t) );
-      break;
-   case VKI_TIOCGPTN: /* Get Pty Number (of pty-mux device) */
-      PRE_MEM_WRITE( "ioctl(TIOCGPTN)", ARG3, sizeof(int) );
-      break;
-   case VKI_TIOCSCTTY:
-      /* Just takes an int value.  */
-      break;
-   case VKI_TIOCSPTLCK: /* Lock/unlock Pty */
-      PRE_MEM_READ( "ioctl(TIOCSPTLCK)", ARG3, sizeof(int) );
-      break;
-   case VKI_FIONBIO:
-      PRE_MEM_READ( "ioctl(FIONBIO)",    ARG3, sizeof(int) );
-      break;
-   case VKI_FIOASYNC:
-      PRE_MEM_READ( "ioctl(FIOASYNC)",   ARG3, sizeof(int) );
-      break;
-   case VKI_FIONREAD:                /* identical to SIOCINQ */
-      PRE_MEM_WRITE( "ioctl(FIONREAD)",  ARG3, sizeof(int) );
-      break;
-
-   case VKI_TIOCSERGETLSR:
-      PRE_MEM_WRITE( "ioctl(TIOCSERGETLSR)", ARG3, sizeof(int) );
-      break;
-   case VKI_TIOCGICOUNT:
-      PRE_MEM_WRITE( "ioctl(TIOCGICOUNT)", ARG3,
-                     sizeof(struct vki_serial_icounter_struct) );
-      break;
-
-   case VKI_SG_SET_COMMAND_Q:
-      PRE_MEM_READ( "ioctl(SG_SET_COMMAND_Q)", ARG3, sizeof(int) );
-      break;
-   case VKI_SG_IO:
-      PRE_MEM_WRITE( "ioctl(SG_IO)", ARG3, sizeof(vki_sg_io_hdr_t) );
-      break;
-   case VKI_SG_GET_SCSI_ID:
-      PRE_MEM_WRITE( "ioctl(SG_GET_SCSI_ID)", ARG3, sizeof(vki_sg_scsi_id_t) );
-      break;
-   case VKI_SG_SET_RESERVED_SIZE:
-      PRE_MEM_READ( "ioctl(SG_SET_RESERVED_SIZE)", ARG3, sizeof(int) );
-      break;
-   case VKI_SG_SET_TIMEOUT:
-      PRE_MEM_READ( "ioctl(SG_SET_TIMEOUT)", ARG3, sizeof(int) );
-      break;
-   case VKI_SG_GET_RESERVED_SIZE:
-      PRE_MEM_WRITE( "ioctl(SG_GET_RESERVED_SIZE)", ARG3, sizeof(int) );
-      break;
-   case VKI_SG_GET_TIMEOUT:
-      break;
-   case VKI_SG_GET_VERSION_NUM:
-      PRE_MEM_WRITE(  "ioctl(SG_GET_VERSION_NUM)",  ARG3, sizeof(int) );
-      break;
-   case VKI_SG_EMULATED_HOST: /* 0x2203 */
-      PRE_MEM_WRITE( "ioctl(SG_EMULATED_HOST)",    ARG3, sizeof(int) );
-      break;
-   case VKI_SG_GET_SG_TABLESIZE: /* 0x227f */
-      PRE_MEM_WRITE( "ioctl(SG_GET_SG_TABLESIZE)", ARG3, sizeof(int) );
-      break;
-
-   case VKI_IIOCGETCPS:
-      PRE_MEM_WRITE( "ioctl(IIOCGETCPS)", ARG3,
-                    VKI_ISDN_MAX_CHANNELS * 2 * sizeof(unsigned long) );
-      break;
-   case VKI_IIOCNETGPN:
-      PRE_MEM_READ( "ioctl(IIOCNETGPN)",
-                    (Addr)&((vki_isdn_net_ioctl_phone *)ARG3)->name,
-                    sizeof(((vki_isdn_net_ioctl_phone *)ARG3)->name) );
-      PRE_MEM_WRITE( "ioctl(IIOCNETGPN)", ARG3,
-                    sizeof(vki_isdn_net_ioctl_phone) );
-      break;
-
-      /* These all use struct ifreq AFAIK */
-   case VKI_SIOCGIFINDEX:        /* get iface index              */
-      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFINDEX)",
-                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
-      PRE_MEM_WRITE( "ioctl(SIOCGIFINDEX)", ARG3, sizeof(struct vki_ifreq));
-      break;
-   case VKI_SIOCGIFFLAGS:        /* get flags                    */
-      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFFLAGS)",
-                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
-      PRE_MEM_WRITE( "ioctl(SIOCGIFFLAGS)", ARG3, sizeof(struct vki_ifreq));
-      break;
-   case VKI_SIOCGIFHWADDR:       /* Get hardware address         */
-      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFHWADDR)",
-                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
-      PRE_MEM_WRITE( "ioctl(SIOCGIFHWADDR)", ARG3, sizeof(struct vki_ifreq));
-      break;
-   case VKI_SIOCGIFMTU:          /* get MTU size                 */
-      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFMTU)",
-                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
-      PRE_MEM_WRITE( "ioctl(SIOCGIFMTU)", ARG3, sizeof(struct vki_ifreq));
-      break;
-   case VKI_SIOCGIFADDR:         /* get PA address               */
-      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFADDR)",
-                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
-      PRE_MEM_WRITE( "ioctl(SIOCGIFADDR)", ARG3, sizeof(struct vki_ifreq));
-      break;
-   case VKI_SIOCGIFNETMASK:      /* get network PA mask          */
-      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFNETMASK)",
-                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
-      PRE_MEM_WRITE( "ioctl(SIOCGIFNETMASK)", ARG3, sizeof(struct vki_ifreq));
-      break;
-   case VKI_SIOCGIFMETRIC:       /* get metric                   */
-      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFMETRIC)",
-                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
-      PRE_MEM_WRITE( "ioctl(SIOCGIFMETRIC)", ARG3, sizeof(struct vki_ifreq));
-      break;
-   case VKI_SIOCGIFMAP:          /* Get device parameters        */
-      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFMAP)",
-                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
-      PRE_MEM_WRITE( "ioctl(SIOCGIFMAP)", ARG3, sizeof(struct vki_ifreq));
-      break;
-   case VKI_SIOCGIFTXQLEN:       /* Get the tx queue length      */
-      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFTXQLEN)",
-                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
-      PRE_MEM_WRITE( "ioctl(SIOCGIFTXQLEN)", ARG3, sizeof(struct vki_ifreq));
-      break;
-   case VKI_SIOCGIFDSTADDR:      /* get remote PA address        */
-      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFDSTADDR)",
-                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
-      PRE_MEM_WRITE( "ioctl(SIOCGIFDSTADDR)", ARG3, sizeof(struct vki_ifreq));
-      break;
-   case VKI_SIOCGIFBRDADDR:      /* get broadcast PA address     */
-      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFBRDADDR)",
-                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
-      PRE_MEM_WRITE( "ioctl(SIOCGIFBRDADDR)", ARG3, sizeof(struct vki_ifreq));
-      break;
-   case VKI_SIOCGIFNAME:         /* get iface name               */
-      PRE_MEM_READ( "ioctl(SIOCGIFNAME)",
-                     (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_ifindex,
-                     sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_ifindex) );
-      PRE_MEM_WRITE( "ioctl(SIOCGIFNAME)", ARG3, sizeof(struct vki_ifreq));
-      break;
-   case VKI_SIOCGMIIPHY:         /* get hardware entry           */
-      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFMIIPHY)",
-                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
-      PRE_MEM_WRITE( "ioctl(SIOCGIFMIIPHY)", ARG3, sizeof(struct vki_ifreq));
-      break;
-   case VKI_SIOCGMIIREG:         /* get hardware entry registers */
-      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFMIIREG)",
-                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
-      PRE_MEM_READ( "ioctl(SIOCGIFMIIREG)",
-                     (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id,
-                     sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id) );
-      PRE_MEM_READ( "ioctl(SIOCGIFMIIREG)",
-                     (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->reg_num,
-                     sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->reg_num) );
-      PRE_MEM_WRITE( "ioctl(SIOCGIFMIIREG)", ARG3, 
-                    sizeof(struct vki_ifreq));
-      break;
-   case VKI_SIOCGIFCONF:         /* get iface list               */
-      /* WAS:
-        PRE_MEM_WRITE( "ioctl(SIOCGIFCONF)", ARG3, sizeof(struct ifconf));
-        KERNEL_DO_SYSCALL(tid,RES);
-        if (!VG_(is_kerror)(RES) && RES == 0)
-        POST_MEM_WRITE(ARG3, sizeof(struct ifconf));
-      */
-      PRE_MEM_READ( "ioctl(SIOCGIFCONF)",
-                    (Addr)&((struct vki_ifconf *)ARG3)->ifc_len,
-                    sizeof(((struct vki_ifconf *)ARG3)->ifc_len));
-      PRE_MEM_READ( "ioctl(SIOCGIFCONF)",
-                    (Addr)&((struct vki_ifconf *)ARG3)->vki_ifc_buf,
-                    sizeof(((struct vki_ifconf *)ARG3)->vki_ifc_buf));
-      if ( ARG3 ) {
-        // TODO len must be readable and writable
-        // buf pointer only needs to be readable
-        struct vki_ifconf *ifc = (struct vki_ifconf *) ARG3;
-        PRE_MEM_WRITE( "ioctl(SIOCGIFCONF).ifc_buf",
-                       (Addr)(ifc->vki_ifc_buf), ifc->ifc_len );
-      }
-      break;
-   case VKI_SIOCGSTAMP:
-      PRE_MEM_WRITE( "ioctl(SIOCGSTAMP)", ARG3, sizeof(struct vki_timeval));
-      break;
-      /* SIOCOUTQ is an ioctl that, when called on a socket, returns
-        the number of bytes currently in that socket's send buffer.
-        It writes this value as an int to the memory location
-        indicated by the third argument of ioctl(2). */
-   case VKI_SIOCOUTQ:
-      PRE_MEM_WRITE( "ioctl(SIOCOUTQ)", ARG3, sizeof(int));
-      break;
-   case VKI_SIOCGRARP:           /* get RARP table entry         */
-   case VKI_SIOCGARP:            /* get ARP table entry          */
-      PRE_MEM_WRITE( "ioctl(SIOCGARP)", ARG3, sizeof(struct vki_arpreq));
-      break;
-                    
-   case VKI_SIOCSIFFLAGS:        /* set flags                    */
-      PRE_MEM_RASCIIZ( "ioctl(SIOCSIFFLAGS)",
-                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
-      PRE_MEM_READ( "ioctl(SIOCSIFFLAGS)",
-                     (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_flags,
-                     sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_flags) );
-      break;
-   case VKI_SIOCSIFMAP:          /* Set device parameters        */
-      PRE_MEM_RASCIIZ( "ioctl(SIOCSIFMAP)",
-                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
-      PRE_MEM_READ( "ioctl(SIOCSIFMAP)",
-                     (Addr)&((struct vki_ifreq *)ARG3)->ifr_map,
-                     sizeof(((struct vki_ifreq *)ARG3)->ifr_map) );
-      break;
-   case VKI_SIOCSIFTXQLEN:       /* Set the tx queue length      */
-      PRE_MEM_RASCIIZ( "ioctl(SIOCSIFTXQLEN)",
-                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
-      PRE_MEM_READ( "ioctl(SIOCSIFTXQLEN)",
-                     (Addr)&((struct vki_ifreq *)ARG3)->ifr_qlen,
-                     sizeof(((struct vki_ifreq *)ARG3)->ifr_qlen) );
-      break;
-   case VKI_SIOCSIFADDR:         /* set PA address               */
-   case VKI_SIOCSIFDSTADDR:      /* set remote PA address        */
-   case VKI_SIOCSIFBRDADDR:      /* set broadcast PA address     */
-   case VKI_SIOCSIFNETMASK:      /* set network PA mask          */
-      PRE_MEM_RASCIIZ( "ioctl(SIOCSIF*ADDR)",
-                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
-      PRE_MEM_READ( "ioctl(SIOCSIF*ADDR)",
-                     (Addr)&((struct vki_ifreq *)ARG3)->ifr_addr,
-                     sizeof(((struct vki_ifreq *)ARG3)->ifr_addr) );
-      break;
-   case VKI_SIOCSIFMETRIC:       /* set metric                   */
-      PRE_MEM_RASCIIZ( "ioctl(SIOCSIFMETRIC)",
-                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
-      PRE_MEM_READ( "ioctl(SIOCSIFMETRIC)",
-                     (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_metric,
-                     sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_metric) );
-      break;
-   case VKI_SIOCSIFMTU:          /* set MTU size                 */
-      PRE_MEM_RASCIIZ( "ioctl(SIOCSIFMTU)",
-                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
-      PRE_MEM_READ( "ioctl(SIOCSIFMTU)",
-                     (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_mtu,
-                     sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_mtu) );
-      break;
-   case VKI_SIOCSIFHWADDR:       /* set hardware address         */
-      PRE_MEM_RASCIIZ( "ioctl(SIOCSIFHWADDR)",
-                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
-      PRE_MEM_READ( "ioctl(SIOCSIFHWADDR)",
-                     (Addr)&((struct vki_ifreq *)ARG3)->ifr_hwaddr,
-                     sizeof(((struct vki_ifreq *)ARG3)->ifr_hwaddr) );
-      break;
-   case VKI_SIOCSMIIREG:         /* set hardware entry registers */
-      PRE_MEM_RASCIIZ( "ioctl(SIOCSMIIREG)",
-                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
-      PRE_MEM_READ( "ioctl(SIOCSMIIREG)",
-                     (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id,
-                     sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id) );
-      PRE_MEM_READ( "ioctl(SIOCSMIIREG)",
-                     (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->reg_num,
-                     sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->reg_num) );
-      PRE_MEM_READ( "ioctl(SIOCSMIIREG)",
-                     (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->val_in,
-                     sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->val_in) );
-      break;
-      /* Routing table calls.  */
-   case VKI_SIOCADDRT:           /* add routing table entry      */
-   case VKI_SIOCDELRT:           /* delete routing table entry   */
-      PRE_MEM_READ( "ioctl(SIOCADDRT/DELRT)", ARG3, 
-                   sizeof(struct vki_rtentry));
-      break;
-
-      /* RARP cache control calls. */
-   case VKI_SIOCDRARP:           /* delete RARP table entry      */
-   case VKI_SIOCSRARP:           /* set RARP table entry         */
-      /* ARP cache control calls. */
-   case VKI_SIOCSARP:            /* set ARP table entry          */
-   case VKI_SIOCDARP:            /* delete ARP table entry       */
-      PRE_MEM_READ( "ioctl(SIOCSIFFLAGS)", ARG3, sizeof(struct vki_ifreq));
-      break;
-
-   case VKI_SIOCGPGRP:
-      PRE_MEM_WRITE( "ioctl(SIOCGPGRP)", ARG3, sizeof(int) );
-      break;
-   case VKI_SIOCSPGRP:
-      PRE_MEM_READ( "ioctl(SIOCSPGRP)", ARG3, sizeof(int) );
-      //tst->sys_flags &= ~SfMayBlock;
-      break;
-
-      /* linux/soundcard interface (OSS) */
-   case VKI_SNDCTL_SEQ_GETOUTCOUNT:
-   case VKI_SNDCTL_SEQ_GETINCOUNT:
-   case VKI_SNDCTL_SEQ_PERCMODE:
-   case VKI_SNDCTL_SEQ_TESTMIDI:
-   case VKI_SNDCTL_SEQ_RESETSAMPLES:
-   case VKI_SNDCTL_SEQ_NRSYNTHS:
-   case VKI_SNDCTL_SEQ_NRMIDIS:
-   case VKI_SNDCTL_SEQ_GETTIME:
-   case VKI_SNDCTL_DSP_GETFMTS:
-   case VKI_SNDCTL_DSP_GETTRIGGER:
-   case VKI_SNDCTL_DSP_GETODELAY:
-   case VKI_SNDCTL_DSP_GETSPDIF:
-   case VKI_SNDCTL_DSP_GETCAPS:
-   case VKI_SOUND_PCM_READ_RATE:
-   case VKI_SOUND_PCM_READ_CHANNELS:
-   case VKI_SOUND_PCM_READ_BITS:
-#if !defined(VGA_ppc32) && !defined(VGA_ppc64)
-   case (VKI_SOUND_PCM_READ_BITS|0x40000000): /* what the fuck ? */
-#endif
-   case VKI_SOUND_PCM_READ_FILTER:
-      PRE_MEM_WRITE( "ioctl(SNDCTL_XXX|SOUND_XXX (SIOR, int))", 
-                    ARG3, sizeof(int));
-      break;
-   case VKI_SNDCTL_SEQ_CTRLRATE:
-   case VKI_SNDCTL_DSP_SPEED:
-   case VKI_SNDCTL_DSP_STEREO:
-   case VKI_SNDCTL_DSP_GETBLKSIZE: 
-   case VKI_SNDCTL_DSP_CHANNELS:
-   case VKI_SOUND_PCM_WRITE_FILTER:
-   case VKI_SNDCTL_DSP_SUBDIVIDE:
-   case VKI_SNDCTL_DSP_SETFRAGMENT:
-   case VKI_SNDCTL_DSP_GETCHANNELMASK:
-   case VKI_SNDCTL_DSP_BIND_CHANNEL:
-   case VKI_SNDCTL_TMR_TIMEBASE:
-   case VKI_SNDCTL_TMR_TEMPO:
-   case VKI_SNDCTL_TMR_SOURCE:
-   case VKI_SNDCTL_MIDI_PRETIME:
-   case VKI_SNDCTL_MIDI_MPUMODE:
-      PRE_MEM_READ( "ioctl(SNDCTL_XXX|SOUND_XXX (SIOWR, int))", 
-                    ARG3, sizeof(int));
-      PRE_MEM_WRITE( "ioctl(SNDCTL_XXX|SOUND_XXX (SIOWR, int))", 
-                    ARG3, sizeof(int));
-      break;
-   case VKI_SNDCTL_DSP_GETOSPACE:
-   case VKI_SNDCTL_DSP_GETISPACE:
-      PRE_MEM_WRITE( "ioctl(SNDCTL_XXX|SOUND_XXX (SIOR, audio_buf_info))",
-                     ARG3, sizeof(vki_audio_buf_info));
-      break;
-   case VKI_SNDCTL_DSP_SETTRIGGER:
-      PRE_MEM_READ( "ioctl(SNDCTL_XXX|SOUND_XXX (SIOW, int))", 
-                    ARG3, sizeof(int));
-      break;
-
-   case VKI_SNDCTL_DSP_POST:
-   case VKI_SNDCTL_DSP_RESET:
-   case VKI_SNDCTL_DSP_SYNC:
-   case VKI_SNDCTL_DSP_SETSYNCRO:
-   case VKI_SNDCTL_DSP_SETDUPLEX:
-      break;
-
-      /* linux/soundcard interface (ALSA) */
-   case VKI_SNDRV_PCM_IOCTL_HW_FREE:
-   case VKI_SNDRV_PCM_IOCTL_HWSYNC:
-   case VKI_SNDRV_PCM_IOCTL_PREPARE:
-   case VKI_SNDRV_PCM_IOCTL_RESET:
-   case VKI_SNDRV_PCM_IOCTL_START:
-   case VKI_SNDRV_PCM_IOCTL_DROP:
-   case VKI_SNDRV_PCM_IOCTL_DRAIN:
-   case VKI_SNDRV_PCM_IOCTL_RESUME:
-   case VKI_SNDRV_PCM_IOCTL_XRUN:
-   case VKI_SNDRV_PCM_IOCTL_UNLINK:
-   case VKI_SNDRV_TIMER_IOCTL_START:
-   case VKI_SNDRV_TIMER_IOCTL_STOP:
-   case VKI_SNDRV_TIMER_IOCTL_CONTINUE:
-   case VKI_SNDRV_TIMER_IOCTL_PAUSE:
-      break;
-
-      /* Real Time Clock (/dev/rtc) ioctls */
-   case VKI_RTC_UIE_ON:
-   case VKI_RTC_UIE_OFF:
-   case VKI_RTC_AIE_ON:
-   case VKI_RTC_AIE_OFF:
-   case VKI_RTC_PIE_ON:
-   case VKI_RTC_PIE_OFF:
-   case VKI_RTC_IRQP_SET:
-      break;
-   case VKI_RTC_RD_TIME:
-   case VKI_RTC_ALM_READ:
-      PRE_MEM_WRITE( "ioctl(RTC_RD_TIME/ALM_READ)", 
-                    ARG3, sizeof(struct vki_rtc_time));
-      break;
-   case VKI_RTC_ALM_SET:
-      PRE_MEM_READ( "ioctl(RTC_ALM_SET)", ARG3, sizeof(struct vki_rtc_time));
-      break;
-   case VKI_RTC_IRQP_READ:
-      PRE_MEM_WRITE( "ioctl(RTC_IRQP_READ)", ARG3, sizeof(unsigned long));
-      break;
-
-      /* Block devices */
-   case VKI_BLKROSET:
-      PRE_MEM_READ( "ioctl(BLKROSET)", ARG3, sizeof(int));
-      break;
-   case VKI_BLKROGET:
-      PRE_MEM_WRITE( "ioctl(BLKROGET)", ARG3, sizeof(int));
-      break;
-   case VKI_BLKGETSIZE:
-      PRE_MEM_WRITE( "ioctl(BLKGETSIZE)", ARG3, sizeof(unsigned long));
-      break;
-   case VKI_BLKRASET:
-      break;
-   case VKI_BLKRAGET:
-      PRE_MEM_WRITE( "ioctl(BLKRAGET)", ARG3, sizeof(long));
-      break;
-   case VKI_BLKFRASET:
-      break;
-   case VKI_BLKFRAGET:
-      PRE_MEM_WRITE( "ioctl(BLKFRAGET)", ARG3, sizeof(long));
-      break;
-   case VKI_BLKSECTGET:
-      PRE_MEM_WRITE( "ioctl(BLKSECTGET)", ARG3, sizeof(unsigned short));
-      break;
-   case VKI_BLKSSZGET:
-      PRE_MEM_WRITE( "ioctl(BLKSSZGET)", ARG3, sizeof(int));
-      break;
-   case VKI_BLKBSZGET:
-      PRE_MEM_WRITE( "ioctl(BLKBSZGET)", ARG3, sizeof(int));
-      break;
-   case VKI_BLKBSZSET:
-      PRE_MEM_READ( "ioctl(BLKBSZSET)", ARG3, sizeof(int));
-      break;
-   case VKI_BLKGETSIZE64:
-      PRE_MEM_WRITE( "ioctl(BLKGETSIZE64)", ARG3, sizeof(unsigned long long));
-      break;
-
-      /* Hard disks */
-   case VKI_HDIO_GETGEO: /* 0x0301 */
-      PRE_MEM_WRITE( "ioctl(HDIO_GETGEO)", ARG3, sizeof(struct vki_hd_geometry));
-      break;
-   case VKI_HDIO_GET_DMA: /* 0x030b */
-      PRE_MEM_WRITE( "ioctl(HDIO_GET_DMA)", ARG3, sizeof(long));
-      break;
-   case VKI_HDIO_GET_IDENTITY: /* 0x030d */
-      PRE_MEM_WRITE( "ioctl(HDIO_GET_IDENTITY)", ARG3,
-                     VKI_SIZEOF_STRUCT_HD_DRIVEID );
-      break;
-
-      /* CD ROM stuff (??)  */
-   case VKI_CDROM_GET_MCN:
-      PRE_MEM_READ( "ioctl(CDROM_GET_MCN)", ARG3,
-                    sizeof(struct vki_cdrom_mcn) );
-      break;
-   case VKI_CDROM_SEND_PACKET:
-      PRE_MEM_READ( "ioctl(CDROM_SEND_PACKET)", ARG3,
-                    sizeof(struct vki_cdrom_generic_command));
-      break;
-   case VKI_CDROMSUBCHNL:
-      PRE_MEM_READ( "ioctl(CDROMSUBCHNL (cdsc_format, char))",
-                   (Addr) &(((struct vki_cdrom_subchnl*) ARG3)->cdsc_format),
-                   sizeof(((struct vki_cdrom_subchnl*) ARG3)->cdsc_format));
-      PRE_MEM_WRITE( "ioctl(CDROMSUBCHNL)", ARG3, 
-                    sizeof(struct vki_cdrom_subchnl));
-      break;
-   case VKI_CDROMREADMODE2:
-      PRE_MEM_READ( "ioctl(CDROMREADMODE2)", ARG3, VKI_CD_FRAMESIZE_RAW0 );
-      break;
-   case VKI_CDROMREADTOCHDR:
-      PRE_MEM_WRITE( "ioctl(CDROMREADTOCHDR)", ARG3, 
-                    sizeof(struct vki_cdrom_tochdr));
-      break;
-   case VKI_CDROMREADTOCENTRY:
-      PRE_MEM_READ( "ioctl(CDROMREADTOCENTRY (cdte_format, char))",
-                   (Addr) &(((struct vki_cdrom_tocentry*) ARG3)->cdte_format),
-                   sizeof(((struct vki_cdrom_tocentry*) ARG3)->cdte_format));
-      PRE_MEM_READ( "ioctl(CDROMREADTOCENTRY (cdte_track, char))",
-                   (Addr) &(((struct vki_cdrom_tocentry*) ARG3)->cdte_track), 
-                   sizeof(((struct vki_cdrom_tocentry*) ARG3)->cdte_track));
-      PRE_MEM_WRITE( "ioctl(CDROMREADTOCENTRY)", ARG3, 
-                    sizeof(struct vki_cdrom_tocentry));
-      break;
-   case VKI_CDROMMULTISESSION: /* 0x5310 */
-      PRE_MEM_WRITE( "ioctl(CDROMMULTISESSION)", ARG3,
-                    sizeof(struct vki_cdrom_multisession));
-      break;
-   case VKI_CDROMVOLREAD: /* 0x5313 */
-      PRE_MEM_WRITE( "ioctl(CDROMVOLREAD)", ARG3,
-                    sizeof(struct vki_cdrom_volctrl));
-      break;
-   case VKI_CDROMREADRAW: /* 0x5314 */
-      PRE_MEM_READ( "ioctl(CDROMREADRAW)", ARG3, sizeof(struct vki_cdrom_msf));
-      PRE_MEM_WRITE( "ioctl(CDROMREADRAW)", ARG3, VKI_CD_FRAMESIZE_RAW);
-      break;
-   case VKI_CDROMREADAUDIO: /* 0x530e */
-      PRE_MEM_READ( "ioctl(CDROMREADAUDIO)", ARG3,
-                    sizeof (struct vki_cdrom_read_audio));
-      if ( ARG3 ) {
-         /* ToDo: don't do any of the following if the structure is invalid */
-         struct vki_cdrom_read_audio *cra = (struct vki_cdrom_read_audio *) ARG3;
-        PRE_MEM_WRITE( "ioctl(CDROMREADAUDIO).buf",
-                       (Addr)(cra->buf), cra->nframes * VKI_CD_FRAMESIZE_RAW);
-      }
-      break;      
-   case VKI_CDROMPLAYMSF:
-      PRE_MEM_READ( "ioctl(CDROMPLAYMSF)", ARG3, sizeof(struct vki_cdrom_msf));
-      break;
-      /* The following two are probably bogus (should check args
-        for readability).  JRS 20021117 */
-   case VKI_CDROM_DRIVE_STATUS: /* 0x5326 */
-   case VKI_CDROM_CLEAR_OPTIONS: /* 0x5321 */
-      break;
-
-   case VKI_FIGETBSZ:
-      PRE_MEM_WRITE( "ioctl(FIGETBSZ)", ARG3, sizeof(unsigned long));
-      break;
-   case VKI_FIBMAP:
-      PRE_MEM_READ( "ioctl(FIBMAP)", ARG3, sizeof(unsigned long));
-      break;
-
-   case VKI_FBIOGET_VSCREENINFO: /* 0x4600 */
-      PRE_MEM_WRITE( "ioctl(FBIOGET_VSCREENINFO)", ARG3,
-                     sizeof(struct vki_fb_var_screeninfo));
-      break;
-   case VKI_FBIOGET_FSCREENINFO: /* 0x4602 */
-      PRE_MEM_WRITE( "ioctl(FBIOGET_FSCREENINFO)", ARG3,
-                     sizeof(struct vki_fb_fix_screeninfo));
-      break;
-
-   case VKI_PPCLAIM:
-   case VKI_PPEXCL:
-   case VKI_PPYIELD:
-   case VKI_PPRELEASE:
-      break;
-   case VKI_PPSETMODE:
-      PRE_MEM_READ( "ioctl(PPSETMODE)",   ARG3, sizeof(int) );
-      break;
-   case VKI_PPGETMODE:
-      PRE_MEM_WRITE( "ioctl(PPGETMODE)",  ARG3, sizeof(int) );
-      break;
-   case VKI_PPSETPHASE:
-      PRE_MEM_READ(  "ioctl(PPSETPHASE)", ARG3, sizeof(int) );
-      break;
-   case VKI_PPGETPHASE:
-      PRE_MEM_WRITE( "ioctl(PPGETPHASE)", ARG3, sizeof(int) );
-      break;
-   case VKI_PPGETMODES:
-      PRE_MEM_WRITE( "ioctl(PPGETMODES)", ARG3, sizeof(unsigned int) );
-      break;
-   case VKI_PPSETFLAGS:
-      PRE_MEM_READ(  "ioctl(PPSETFLAGS)", ARG3, sizeof(int) );
-      break;
-   case VKI_PPGETFLAGS:
-      PRE_MEM_WRITE( "ioctl(PPGETFLAGS)", ARG3, sizeof(int) );
-      break;
-   case VKI_PPRSTATUS:
-      PRE_MEM_WRITE( "ioctl(PPRSTATUS)",  ARG3, sizeof(unsigned char) );
-      break;
-   case VKI_PPRDATA:
-      PRE_MEM_WRITE( "ioctl(PPRDATA)",    ARG3, sizeof(unsigned char) );
-      break;
-   case VKI_PPRCONTROL:
-      PRE_MEM_WRITE( "ioctl(PPRCONTROL)", ARG3, sizeof(unsigned char) );
-      break;
-   case VKI_PPWDATA:
-      PRE_MEM_READ(  "ioctl(PPWDATA)",    ARG3, sizeof(unsigned char) );
-      break;
-   case VKI_PPWCONTROL:
-      PRE_MEM_READ(  "ioctl(PPWCONTROL)", ARG3, sizeof(unsigned char) );
-      break;
-   case VKI_PPFCONTROL:
-      PRE_MEM_READ(  "ioctl(PPFCONTROL)", ARG3, 2 * sizeof(unsigned char) );
-      break;
-   case VKI_PPDATADIR:
-      PRE_MEM_READ(  "ioctl(PPDATADIR)",  ARG3, sizeof(int) );
-      break;
-   case VKI_PPNEGOT:
-      PRE_MEM_READ(  "ioctl(PPNEGOT)",    ARG3, sizeof(int) );
-      break;
-   case VKI_PPWCTLONIRQ:
-      PRE_MEM_READ(  "ioctl(PPWCTLONIRQ)",ARG3, sizeof(unsigned char) );
-      break;
-   case VKI_PPCLRIRQ:
-      PRE_MEM_WRITE( "ioctl(PPCLRIRQ)",   ARG3, sizeof(int) );
-      break;
-   case VKI_PPSETTIME:
-      PRE_MEM_READ(  "ioctl(PPSETTIME)",  ARG3, sizeof(struct vki_timeval) );
-      break;
-   case VKI_PPGETTIME:
-      PRE_MEM_WRITE( "ioctl(PPGETTIME)",  ARG3, sizeof(struct vki_timeval) );
-      break;
-
-   case VKI_GIO_FONT:
-      PRE_MEM_WRITE( "ioctl(GIO_FONT)", ARG3, 32 * 256 );
-      break;
-   case VKI_PIO_FONT:
-      PRE_MEM_READ( "ioctl(PIO_FONT)", ARG3, 32 * 256 );
-      break;
-
-   case VKI_GIO_FONTX:
-      PRE_MEM_READ( "ioctl(GIO_FONTX)", ARG3, sizeof(struct vki_consolefontdesc) );
-      if ( ARG3 ) {
-         /* ToDo: don't do any of the following if the structure is invalid */
-         struct vki_consolefontdesc *cfd = (struct vki_consolefontdesc *)ARG3;
-         PRE_MEM_WRITE( "ioctl(GIO_FONTX).chardata", (Addr)cfd->chardata,
-                        32 * cfd->charcount );
-      }
-      break;
-   case VKI_PIO_FONTX:
-      PRE_MEM_READ( "ioctl(PIO_FONTX)", ARG3, sizeof(struct vki_consolefontdesc) );
-      if ( ARG3 ) {
-         /* ToDo: don't do any of the following if the structure is invalid */
-         struct vki_consolefontdesc *cfd = (struct vki_consolefontdesc *)ARG3;
-         PRE_MEM_READ( "ioctl(PIO_FONTX).chardata", (Addr)cfd->chardata,
-                       32 * cfd->charcount );
-      }
-      break;
-
-   case VKI_PIO_FONTRESET:
-      break;
-
-   case VKI_GIO_CMAP:
-      PRE_MEM_WRITE( "ioctl(GIO_CMAP)", ARG3, 16 * 3 );
-      break;
-   case VKI_PIO_CMAP:
-      PRE_MEM_READ( "ioctl(PIO_CMAP)", ARG3, 16 * 3 );
-      break;
-
-   case VKI_KIOCSOUND:
-   case VKI_KDMKTONE:
-      break;
-
-   case VKI_KDGETLED:
-      PRE_MEM_WRITE( "ioctl(KDGETLED)", ARG3, sizeof(char) );
-      break;
-   case VKI_KDSETLED:
-      break;
-
-   case VKI_KDGKBTYPE:
-      PRE_MEM_WRITE( "ioctl(KDGKBTYPE)", ARG3, sizeof(char) );
-      break;
-
-   case VKI_KDADDIO:
-   case VKI_KDDELIO:
-   case VKI_KDENABIO:
-   case VKI_KDDISABIO:
-      break;
-
-   case VKI_KDSETMODE:
-      break;
-   case VKI_KDGETMODE:
-      PRE_MEM_WRITE( "ioctl(KDGETMODE)", ARG3, sizeof(int) );
-      break;
-
-   case VKI_KDMAPDISP:
-   case VKI_KDUNMAPDISP:
-      break;
-
-   case VKI_GIO_SCRNMAP:
-      PRE_MEM_WRITE( "ioctl(GIO_SCRNMAP)", ARG3, VKI_E_TABSZ );
-      break;
-   case VKI_PIO_SCRNMAP:
-      PRE_MEM_READ( "ioctl(PIO_SCRNMAP)", ARG3, VKI_E_TABSZ  );
-      break;
-   case VKI_GIO_UNISCRNMAP:
-      PRE_MEM_WRITE( "ioctl(GIO_UNISCRNMAP)", ARG3,
-                     VKI_E_TABSZ * sizeof(unsigned short) );
-      break;
-   case VKI_PIO_UNISCRNMAP:
-      PRE_MEM_READ( "ioctl(PIO_UNISCRNMAP)", ARG3,
-                    VKI_E_TABSZ * sizeof(unsigned short) );
-      break;
-
-   case VKI_GIO_UNIMAP:
-      if ( ARG3 ) {
-         struct vki_unimapdesc *desc = (struct vki_unimapdesc *) ARG3;
-         PRE_MEM_READ( "ioctl(GIO_UNIMAP)", (Addr)&desc->entry_ct,
-                       sizeof(unsigned short));
-         PRE_MEM_READ( "ioctl(GIO_UNIMAP)", (Addr)&desc->entries,
-                       sizeof(struct vki_unipair *));
-         PRE_MEM_WRITE( "ioctl(GIO_UNIMAP).entries", (Addr)desc->entries,
-                        desc->entry_ct * sizeof(struct vki_unipair));
-      }
-      break;
-   case VKI_PIO_UNIMAP:
-      if ( ARG3 ) {
-         struct vki_unimapdesc *desc = (struct vki_unimapdesc *) ARG3;
-         PRE_MEM_READ( "ioctl(GIO_UNIMAP)", (Addr)&desc->entry_ct,
-                       sizeof(unsigned short) );
-         PRE_MEM_READ( "ioctl(GIO_UNIMAP)", (Addr)&desc->entries,
-                       sizeof(struct vki_unipair *) );
-         PRE_MEM_READ( "ioctl(PIO_UNIMAP).entries", (Addr)desc->entries,
-                       desc->entry_ct * sizeof(struct vki_unipair) );
-      }
-      break;
-   case VKI_PIO_UNIMAPCLR:
-      PRE_MEM_READ( "ioctl(GIO_UNIMAP)", ARG3, sizeof(struct vki_unimapinit));
-      break;
-
-   case VKI_KDGKBMODE:
-      PRE_MEM_WRITE( "ioctl(KDGKBMODE)", ARG3, sizeof(int) );
-      break;
-   case VKI_KDSKBMODE:
-      break;
-      
-   case VKI_KDGKBMETA:
-      PRE_MEM_WRITE( "ioctl(KDGKBMETA)", ARG3, sizeof(int) );
-      break;
-   case VKI_KDSKBMETA:
-      break;
-      
-   case VKI_KDGKBLED:
-      PRE_MEM_WRITE( "ioctl(KDGKBLED)", ARG3, sizeof(char) );
-      break;
-   case VKI_KDSKBLED:
-      break;
-      
-   case VKI_KDGKBENT:
-      PRE_MEM_READ( "ioctl(KDGKBENT).kb_table",
-                    (Addr)&((struct vki_kbentry *)ARG3)->kb_table,
-                    sizeof(((struct vki_kbentry *)ARG3)->kb_table) );
-      PRE_MEM_READ( "ioctl(KDGKBENT).kb_index",
-                    (Addr)&((struct vki_kbentry *)ARG3)->kb_index,
-                    sizeof(((struct vki_kbentry *)ARG3)->kb_index) );
-      PRE_MEM_WRITE( "ioctl(KDGKBENT).kb_value",
-                    (Addr)&((struct vki_kbentry *)ARG3)->kb_value,
-                    sizeof(((struct vki_kbentry *)ARG3)->kb_value) );
-      break;
-   case VKI_KDSKBENT:
-      PRE_MEM_READ( "ioctl(KDSKBENT).kb_table",
-                    (Addr)&((struct vki_kbentry *)ARG3)->kb_table,
-                    sizeof(((struct vki_kbentry *)ARG3)->kb_table) );
-      PRE_MEM_READ( "ioctl(KDSKBENT).kb_index",
-                    (Addr)&((struct vki_kbentry *)ARG3)->kb_index,
-                    sizeof(((struct vki_kbentry *)ARG3)->kb_index) );
-      PRE_MEM_READ( "ioctl(KDSKBENT).kb_value",
-                    (Addr)&((struct vki_kbentry *)ARG3)->kb_value,
-                    sizeof(((struct vki_kbentry *)ARG3)->kb_value) );
-      break;
-      
-   case VKI_KDGKBSENT:
-      PRE_MEM_READ( "ioctl(KDGKBSENT).kb_func",
-                    (Addr)&((struct vki_kbsentry *)ARG3)->kb_func,
-                    sizeof(((struct vki_kbsentry *)ARG3)->kb_func) );
-      PRE_MEM_WRITE( "ioctl(KDGKSENT).kb_string",
-                    (Addr)((struct vki_kbsentry *)ARG3)->kb_string,
-                    sizeof(((struct vki_kbsentry *)ARG3)->kb_string) );
-      break;
-   case VKI_KDSKBSENT:
-      PRE_MEM_READ( "ioctl(KDSKBSENT).kb_func",
-                    (Addr)&((struct vki_kbsentry *)ARG3)->kb_func,
-                    sizeof(((struct vki_kbsentry *)ARG3)->kb_func) );
-      PRE_MEM_RASCIIZ( "ioctl(KDSKBSENT).kb_string",
-                       (Addr)((struct vki_kbsentry *)ARG3)->kb_string );
-      break;
-      
-   case VKI_KDGKBDIACR:
-      PRE_MEM_WRITE( "ioctl(KDGKBDIACR)", ARG3, sizeof(struct vki_kbdiacrs) );
-      break;
-   case VKI_KDSKBDIACR:
-      PRE_MEM_READ( "ioctl(KDSKBDIACR)", ARG3, sizeof(struct vki_kbdiacrs) );
-      break;
-      
-   case VKI_KDGETKEYCODE:
-      PRE_MEM_READ( "ioctl(KDGETKEYCODE).scancode",
-                    (Addr)&((struct vki_kbkeycode *)ARG3)->scancode,
-                    sizeof(((struct vki_kbkeycode *)ARG3)->scancode) );
-      PRE_MEM_WRITE( "ioctl(KDGETKEYCODE).keycode",
-                    (Addr)((struct vki_kbkeycode *)ARG3)->keycode,
-                    sizeof(((struct vki_kbkeycode *)ARG3)->keycode) );
-      break;
-   case VKI_KDSETKEYCODE:
-      PRE_MEM_READ( "ioctl(KDSETKEYCODE).scancode",
-                    (Addr)&((struct vki_kbkeycode *)ARG3)->scancode,
-                    sizeof(((struct vki_kbkeycode *)ARG3)->scancode) );
-      PRE_MEM_READ( "ioctl(KDSETKEYCODE).keycode",
-                    (Addr)((struct vki_kbkeycode *)ARG3)->keycode,
-                    sizeof(((struct vki_kbkeycode *)ARG3)->keycode) );
-      break;
-      
-   case VKI_KDSIGACCEPT:
-      break;
-
-   case VKI_KDKBDREP:
-      PRE_MEM_READ( "ioctl(KBKBDREP)", ARG3, sizeof(struct vki_kbd_repeat) );
-      break;
-
-   case VKI_KDFONTOP:
-      if ( ARG3 ) {
-         struct vki_console_font_op *op = (struct vki_console_font_op *) ARG3;
-         PRE_MEM_READ( "ioctl(KDFONTOP)", (Addr)op,
-                       sizeof(struct vki_console_font_op) );
-         switch ( op->op ) {
-            case VKI_KD_FONT_OP_SET:
-               PRE_MEM_READ( "ioctl(KDFONTOP,KD_FONT_OP_SET).data",
-                             (Addr)op->data,
-                             (op->width + 7) / 8 * 32 * op->charcount );
-               break;
-            case VKI_KD_FONT_OP_GET:
-               if ( op->data )
-                  PRE_MEM_WRITE( "ioctl(KDFONTOP,KD_FONT_OP_GET).data",
-                                 (Addr)op->data,
-                                 (op->width + 7) / 8 * 32 * op->charcount );
-               break;
-            case VKI_KD_FONT_OP_SET_DEFAULT:
-               if ( op->data )
-                  PRE_MEM_RASCIIZ( "ioctl(KDFONTOP,KD_FONT_OP_SET_DEFAULT).data",
-                                   (Addr)op->data );
-               break;
-            case VKI_KD_FONT_OP_COPY:
-               break;
-         }
-      }
-      break;
-
-   case VKI_VT_OPENQRY:
-      PRE_MEM_WRITE( "ioctl(VT_OPENQRY)", ARG3, sizeof(int) );
-      break;
-   case VKI_VT_GETMODE:
-      PRE_MEM_WRITE( "ioctl(VT_GETMODE)", ARG3, sizeof(struct vki_vt_mode) );
-      break;
-   case VKI_VT_SETMODE:
-      PRE_MEM_READ( "ioctl(VT_SETMODE)", ARG3, sizeof(struct vki_vt_mode) );
-      break;
-   case VKI_VT_GETSTATE:
-      PRE_MEM_READ( "ioctl(VT_GETSTATE)", ARG3, sizeof(struct vki_vt_stat) );
-      PRE_MEM_WRITE( "ioctl(VT_GETSTATE).v_active",
-                     (Addr) &(((struct vki_vt_stat*) ARG3)->v_active),
-                     sizeof(((struct vki_vt_stat*) ARG3)->v_active));
-      PRE_MEM_WRITE( "ioctl(VT_GETSTATE).v_state",
-                     (Addr) &(((struct vki_vt_stat*) ARG3)->v_state),
-                     sizeof(((struct vki_vt_stat*) ARG3)->v_state));
-      break;
-   case VKI_VT_RELDISP:
-   case VKI_VT_ACTIVATE:
-   case VKI_VT_WAITACTIVE:
-   case VKI_VT_DISALLOCATE:
-      break;
-   case VKI_VT_RESIZE:
-      PRE_MEM_READ( "ioctl(VT_RESIZE)", ARG3, sizeof(struct vki_vt_sizes) );
-      break;
-   case VKI_VT_RESIZEX:
-      PRE_MEM_READ( "ioctl(VT_RESIZEX)", ARG3, sizeof(struct vki_vt_consize) );
-      break;
-   case VKI_VT_LOCKSWITCH:
-   case VKI_VT_UNLOCKSWITCH:
-      break;
-
-   case VKI_USBDEVFS_CONTROL:
-      if ( ARG3 ) {
-         struct vki_usbdevfs_ctrltransfer *vkuc = (struct vki_usbdevfs_ctrltransfer *)ARG3;
-         PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).bRequestType", (Addr)&vkuc->bRequestType, sizeof(vkuc->bRequestType));
-         PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).bRequest", (Addr)&vkuc->bRequest, sizeof(vkuc->bRequest));
-         PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).wValue", (Addr)&vkuc->wValue, sizeof(vkuc->wValue));
-         PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).wIndex", (Addr)&vkuc->wIndex, sizeof(vkuc->wIndex));
-         PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).wLength", (Addr)&vkuc->wLength, sizeof(vkuc->wLength));
-         PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).timeout", (Addr)&vkuc->timeout, sizeof(vkuc->timeout));
-         if (vkuc->bRequestType & 0x80)
-            PRE_MEM_WRITE( "ioctl(USBDEVFS_CONTROL).data", (Addr)vkuc->data, vkuc->wLength);
-         else
-            PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).data", (Addr)vkuc->data, vkuc->wLength);
-      }
-      break;
-   case VKI_USBDEVFS_BULK:
-      if ( ARG3 ) {
-         struct vki_usbdevfs_bulktransfer *vkub = (struct vki_usbdevfs_bulktransfer *)ARG3;
-         PRE_MEM_READ( "ioctl(USBDEVFS_BULK)", ARG3, sizeof(struct vki_usbdevfs_bulktransfer));
-         if (vkub->ep & 0x80)
-            PRE_MEM_WRITE( "ioctl(USBDEVFS_BULK).data", (Addr)vkub->data, vkub->len);
-         else
-            PRE_MEM_READ( "ioctl(USBDEVFS_BULK).data", (Addr)vkub->data, vkub->len);
-         break;
-      }
-   case VKI_USBDEVFS_GETDRIVER:
-      if ( ARG3 ) {
-         struct vki_usbdevfs_getdriver *vkugd = (struct vki_usbdevfs_getdriver *) ARG3;
-         PRE_MEM_WRITE( "ioctl(USBDEVFS_GETDRIVER)", (Addr)&vkugd->driver, sizeof(vkugd->driver));
-         break;
-      }
-   case VKI_USBDEVFS_SUBMITURB:
-      if ( ARG3 ) {
-         struct vki_usbdevfs_urb *vkuu = (struct vki_usbdevfs_urb *)ARG3;
-
-         /* Not the whole struct needs to be initialized */
-         PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).ep", (Addr)&vkuu->endpoint, sizeof(vkuu->endpoint));
-         PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).type", (Addr)&vkuu->type, sizeof(vkuu->type));
-         PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).flags", (Addr)&vkuu->flags, sizeof(vkuu->flags));
-         PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer", (Addr)&vkuu->buffer, sizeof(vkuu->buffer));
-         PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer_length", (Addr)&vkuu->buffer_length, sizeof(vkuu->buffer_length));
-         PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).usercontext", (Addr)&vkuu->usercontext, sizeof(vkuu->usercontext));
-         if (vkuu->endpoint & 0x80)
-            PRE_MEM_WRITE( "ioctl(USBDEVFS_URB).buffer", (Addr)vkuu->buffer, vkuu->buffer_length);
-         else
-            PRE_MEM_READ( "ioctl(USBDEVFS_URB).buffer", (Addr)vkuu->buffer, vkuu->buffer_length);
-         /* FIXME: Does not handle all cases this ioctl can do, ISOs are missing. */
-         break;
-      }
-   case VKI_USBDEVFS_REAPURB:
-   case VKI_USBDEVFS_REAPURBNDELAY:
-      if ( ARG3 ) {
-         PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB)", ARG3, sizeof(struct vki_usbdevfs_urb *));
-         break;
-      }
-   case VKI_USBDEVFS_CONNECTINFO:
-      PRE_MEM_WRITE( "ioctl(USBDEVFS_CONNECTINFO)", ARG3, sizeof(struct vki_usbdevfs_connectinfo));
-      break;
-   case VKI_USBDEVFS_IOCTL:
-      if ( ARG3 ) {
-         struct vki_usbdevfs_ioctl *vkui = (struct vki_usbdevfs_ioctl *)ARG3;
-         UInt dir2, size2;
-         PRE_MEM_READ("ioctl(USBDEVFS_IOCTL)", (Addr)vkui, sizeof(struct vki_usbdevfs_ioctl));
-         dir2  = _VKI_IOC_DIR(vkui->ioctl_code);
-         size2 = _VKI_IOC_SIZE(vkui->ioctl_code);
-         if (size2 > 0) {
-            if (dir2 & _VKI_IOC_WRITE)
-               PRE_MEM_READ("ioctl(USBDEVFS_IOCTL).dataWrite", (Addr)vkui->data, size2);
-            else if (dir2 & _VKI_IOC_READ)
-               PRE_MEM_WRITE("ioctl(USBDEVFS_IOCTL).dataRead", (Addr)vkui->data, size2);
-         }
-      }
-      break;
-
-      /* I2C (/dev/i2c-*) ioctls */
-   case VKI_I2C_SLAVE:
-   case VKI_I2C_SLAVE_FORCE:
-   case VKI_I2C_TENBIT:
-   case VKI_I2C_PEC:
-      break;
-   case VKI_I2C_FUNCS:
-      PRE_MEM_WRITE( "ioctl(I2C_FUNCS)", ARG3, sizeof(unsigned long) );
-      break;
-
-      /* Wireless extensions ioctls */
-   case VKI_SIOCSIWCOMMIT:
-   case VKI_SIOCSIWNWID:
-   case VKI_SIOCSIWFREQ:
-   case VKI_SIOCSIWMODE:
-   case VKI_SIOCSIWSENS:
-   case VKI_SIOCSIWRANGE:
-   case VKI_SIOCSIWPRIV:
-   case VKI_SIOCSIWSTATS:
-   case VKI_SIOCSIWSPY:
-   case VKI_SIOCSIWTHRSPY:
-   case VKI_SIOCSIWAP:
-   case VKI_SIOCSIWSCAN:
-   case VKI_SIOCSIWESSID:
-   case VKI_SIOCSIWRATE:
-   case VKI_SIOCSIWNICKN:
-   case VKI_SIOCSIWRTS:
-   case VKI_SIOCSIWFRAG:
-   case VKI_SIOCSIWTXPOW:
-   case VKI_SIOCSIWRETRY:
-   case VKI_SIOCSIWENCODE:
-   case VKI_SIOCSIWPOWER:
-   case VKI_SIOCSIWGENIE:
-   case VKI_SIOCSIWMLME:
-   case VKI_SIOCSIWAUTH:
-   case VKI_SIOCSIWENCODEEXT:
-   case VKI_SIOCSIWPMKSA:
-      break;
-   case VKI_SIOCGIWNAME:
-      if (ARG3) {
-         PRE_MEM_WRITE("ioctl(SIOCGIWNAME)",
-                       (Addr)((struct vki_iwreq *)ARG3)->u.name,
-                       sizeof(((struct vki_iwreq *)ARG3)->u.name));
-      }
-      break;
-   case VKI_SIOCGIWNWID:
-   case VKI_SIOCGIWSENS:
-   case VKI_SIOCGIWRATE:
-   case VKI_SIOCGIWRTS:
-   case VKI_SIOCGIWFRAG:
-   case VKI_SIOCGIWTXPOW:
-   case VKI_SIOCGIWRETRY:
-   case VKI_SIOCGIWPOWER:
-   case VKI_SIOCGIWAUTH:
-      if (ARG3) {
-         PRE_MEM_WRITE("ioctl(SIOCGIW[NWID|SENS|RATE|RTS|FRAG|TXPOW|"
-                       "RETRY|PARAM|AUTH])",
-                       (Addr)&((struct vki_iwreq *)ARG3)->u.nwid,
-                       sizeof(struct vki_iw_param));
-      }
-      break;
-   case VKI_SIOCGIWFREQ:
-      if (ARG3) {
-         PRE_MEM_WRITE("ioctl(SIOCGIWFREQ",
-                       (Addr)&((struct vki_iwreq *)ARG3)->u.freq,
-                       sizeof(struct vki_iw_freq));
-      }
-      break;
-   case VKI_SIOCGIWMODE:
-      if (ARG3) {
-         PRE_MEM_WRITE("ioctl(SIOCGIWMODE",
-                       (Addr)&((struct vki_iwreq *)ARG3)->u.mode,
-                       sizeof(__vki_u32));
-      }
-      break;
-   case VKI_SIOCGIWRANGE:
-   case VKI_SIOCGIWPRIV:
-   case VKI_SIOCGIWSTATS:
-   case VKI_SIOCGIWSPY:
-   case VKI_SIOCGIWTHRSPY:
-   case VKI_SIOCGIWAPLIST:
-   case VKI_SIOCGIWSCAN:
-   case VKI_SIOCGIWESSID:
-   case VKI_SIOCGIWNICKN:
-   case VKI_SIOCGIWENCODE:
-   case VKI_SIOCGIWGENIE:
-   case VKI_SIOCGIWENCODEEXT:
-      if (ARG3) {
-         struct vki_iw_point* point;
-         point = &((struct vki_iwreq *)ARG3)->u.data;
-         PRE_MEM_WRITE("ioctl(SIOCGIW[RANGE|PRIV|STATS|SPY|THRSPY|"
-                       "APLIST|SCAN|ESSID|NICKN|ENCODE|GENIE|ENCODEEXT])",
-                       (Addr)point->pointer, point->length);
-      }
-      break;
-   case VKI_SIOCGIWAP:
-      if (ARG3) {
-         PRE_MEM_WRITE("ioctl(SIOCGIWAP)",
-                       (Addr)&((struct vki_iwreq *)ARG3)->u.ap_addr,
-                       sizeof(struct vki_sockaddr));
-      }
-      break;
-
-      /* We don't have any specific information on it, so
-        try to do something reasonable based on direction and
-        size bits.  The encoding scheme is described in
-        /usr/include/asm/ioctl.h.  
-
-        According to Simon Hausmann, _IOC_READ means the kernel
-        writes a value to the ioctl value passed from the user
-        space and the other way around with _IOC_WRITE. */
-   default: {
-      UInt dir  = _VKI_IOC_DIR(ARG2);
-      UInt size = _VKI_IOC_SIZE(ARG2);
-      if (VG_(strstr)(VG_(clo_sim_hints), "lax-ioctls") != NULL) {
-        /* 
-         * Be very lax about ioctl handling; the only
-         * assumption is that the size is correct. Doesn't
-         * require the full buffer to be initialized when
-         * writing.  Without this, using some device
-         * drivers with a large number of strange ioctl
-         * commands becomes very tiresome.
-         */
-      } else if (/* size == 0 || */ dir == _VKI_IOC_NONE) {
-        static Int moans = 3;
-        if (moans > 0 && !VG_(clo_xml)) {
-           moans--;
-           VG_(message)(Vg_UserMsg, 
-                        "Warning: noted but unhandled ioctl 0x%lx"
-                        " with no size/direction hints",
-                        ARG2); 
-           VG_(message)(Vg_UserMsg, 
-                        "   This could cause spurious value errors"
-                        " to appear.");
-           VG_(message)(Vg_UserMsg, 
-                        "   See README_MISSING_SYSCALL_OR_IOCTL for "
-                        "guidance on writing a proper wrapper." );
-        }
-      } else {
-        if ((dir & _VKI_IOC_WRITE) && size > 0)
-           PRE_MEM_READ( "ioctl(generic)", ARG3, size);
-        if ((dir & _VKI_IOC_READ) && size > 0)
-           PRE_MEM_WRITE( "ioctl(generic)", ARG3, size);
-      }
-      break;
-   }
-   }   
-}
-
-POST(sys_ioctl)
-{
-   vg_assert(SUCCESS);
-   switch (ARG2 /* request */) {
-   case VKI_TCSETS:
-   case VKI_TCSETSW:
-   case VKI_TCSETSF:
-      break; 
-   case VKI_TCGETS:
-      POST_MEM_WRITE( ARG3, sizeof(struct vki_termios) );
-      break;
-   case VKI_TCSETA:
-   case VKI_TCSETAW:
-   case VKI_TCSETAF:
-      break;
-   case VKI_TCGETA:
-      POST_MEM_WRITE( ARG3, sizeof(struct vki_termio) );
-      break;
-   case VKI_TCSBRK:
-   case VKI_TCXONC:
-   case VKI_TCSBRKP:
-   case VKI_TCFLSH:
-      break;
-   case VKI_TIOCGWINSZ:
-      POST_MEM_WRITE( ARG3, sizeof(struct vki_winsize) );
-      break;
-   case VKI_TIOCSWINSZ:
-   case VKI_TIOCMBIS:
-   case VKI_TIOCMBIC:
-   case VKI_TIOCMSET:
-      break;
-   case VKI_TIOCMGET:
-      POST_MEM_WRITE( ARG3, sizeof(unsigned int) );
-      break;
-   case VKI_TIOCLINUX:
-      POST_MEM_WRITE( ARG3, sizeof(char *) );
-      break;
-   case VKI_TIOCGPGRP:
-      /* Get process group ID for foreground processing group. */
-      POST_MEM_WRITE( ARG3, sizeof(vki_pid_t) );
-      break;
-   case VKI_TIOCSPGRP:
-      /* Set a process group ID? */
-      POST_MEM_WRITE( ARG3, sizeof(vki_pid_t) );
-      break;
-   case VKI_TIOCGPTN: /* Get Pty Number (of pty-mux device) */
-      POST_MEM_WRITE( ARG3, sizeof(int));
-      break;
-   case VKI_TIOCSCTTY:
-      break;
-   case VKI_TIOCSPTLCK: /* Lock/unlock Pty */
-      break;
-   case VKI_FIONBIO:
-      break;
-   case VKI_FIOASYNC:
-      break;
-   case VKI_FIONREAD:                /* identical to SIOCINQ */
-      POST_MEM_WRITE( ARG3, sizeof(int) );
-      break;
-
-   case VKI_TIOCSERGETLSR:
-      POST_MEM_WRITE( ARG3, sizeof(int) );
-      break;
-   case VKI_TIOCGICOUNT:
-      POST_MEM_WRITE( ARG3, sizeof(struct vki_serial_icounter_struct) );
-      break;
-
-   case VKI_SG_SET_COMMAND_Q:
-      break;
-   case VKI_SG_IO:
-      POST_MEM_WRITE(ARG3, sizeof(vki_sg_io_hdr_t));
-      break;
-   case VKI_SG_GET_SCSI_ID:
-      POST_MEM_WRITE(ARG3, sizeof(vki_sg_scsi_id_t));
-      break;
-   case VKI_SG_SET_RESERVED_SIZE:
-      break;
-   case VKI_SG_SET_TIMEOUT:
-      break;
-   case VKI_SG_GET_RESERVED_SIZE:
-      POST_MEM_WRITE(ARG3, sizeof(int));
-      break;
-   case VKI_SG_GET_TIMEOUT:
-      break;
-   case VKI_SG_GET_VERSION_NUM:
-      POST_MEM_WRITE(ARG3, sizeof(int));
-      break;
-   case VKI_SG_EMULATED_HOST:
-      POST_MEM_WRITE(ARG3, sizeof(int));
-      break;
-   case VKI_SG_GET_SG_TABLESIZE:
-      POST_MEM_WRITE(ARG3, sizeof(int));
-      break;      
-
-   case VKI_IIOCGETCPS:
-      POST_MEM_WRITE( ARG3, VKI_ISDN_MAX_CHANNELS * 2 * sizeof(unsigned long) );
-      break;
-   case VKI_IIOCNETGPN:
-      POST_MEM_WRITE( ARG3, sizeof(vki_isdn_net_ioctl_phone) );
-      break;
-
-      /* These all use struct ifreq AFAIK */
-   case VKI_SIOCGIFINDEX:        /* get iface index              */
-      POST_MEM_WRITE( (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_ifindex,
-                      sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_ifindex) );
-      break;
-   case VKI_SIOCGIFFLAGS:        /* get flags                    */
-      POST_MEM_WRITE( (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_flags,
-                      sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_flags) );
-      break;
-   case VKI_SIOCGIFHWADDR:       /* Get hardware address         */
-      POST_MEM_WRITE( (Addr)&((struct vki_ifreq *)ARG3)->ifr_hwaddr,
-                      sizeof(((struct vki_ifreq *)ARG3)->ifr_hwaddr) );
-      break;
-   case VKI_SIOCGIFMTU:          /* get MTU size                 */
-      POST_MEM_WRITE( (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_mtu,
-                      sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_mtu) );
-      break;
-   case VKI_SIOCGIFADDR:         /* get PA address               */
-   case VKI_SIOCGIFDSTADDR:      /* get remote PA address        */
-   case VKI_SIOCGIFBRDADDR:      /* get broadcast PA address     */
-   case VKI_SIOCGIFNETMASK:      /* get network PA mask          */
-      POST_MEM_WRITE(
-                (Addr)&((struct vki_ifreq *)ARG3)->ifr_addr,
-                sizeof(((struct vki_ifreq *)ARG3)->ifr_addr) );
-      break;
-   case VKI_SIOCGIFMETRIC:       /* get metric                   */
-      POST_MEM_WRITE(
-                (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_metric,
-                sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_metric) );
-      break;
-   case VKI_SIOCGIFMAP:          /* Get device parameters        */
-      POST_MEM_WRITE(
-                (Addr)&((struct vki_ifreq *)ARG3)->ifr_map,
-                sizeof(((struct vki_ifreq *)ARG3)->ifr_map) );
-      break;
-     break;
-   case VKI_SIOCGIFTXQLEN:       /* Get the tx queue length      */
-      POST_MEM_WRITE(
-                (Addr)&((struct vki_ifreq *)ARG3)->ifr_qlen,
-                sizeof(((struct vki_ifreq *)ARG3)->ifr_qlen) );
-      break;
-   case VKI_SIOCGIFNAME:         /* get iface name               */
-      POST_MEM_WRITE(
-                (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_name,
-                sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_name) );
-      break;
-   case VKI_SIOCGMIIPHY:         /* get hardware entry           */
-      POST_MEM_WRITE(
-                (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id,
-                sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id) );
-      break;
-   case VKI_SIOCGMIIREG:         /* get hardware entry registers */
-      POST_MEM_WRITE(
-                (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->val_out,
-                sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->val_out) );
-      break;
-   case VKI_SIOCGIFCONF:         /* get iface list               */
-      /* WAS:
-        PRE_MEM_WRITE("ioctl(SIOCGIFCONF)", ARG3, sizeof(struct ifconf));
-        KERNEL_DO_SYSCALL(tid,RES);
-        if (!VG_(is_kerror)(RES) && RES == 0)
-        POST_MEM_WRITE(ARG3, sizeof(struct ifconf));
-      */
-      if (RES == 0 && ARG3 ) {
-        struct vki_ifconf *ifc = (struct vki_ifconf *) ARG3;
-        if (ifc->vki_ifc_buf != NULL)
-           POST_MEM_WRITE( (Addr)(ifc->vki_ifc_buf), ifc->ifc_len );
-      }
-      break;
-   case VKI_SIOCGSTAMP:
-      POST_MEM_WRITE( ARG3, sizeof(struct vki_timeval) );
-      break;
-      /* SIOCOUTQ is an ioctl that, when called on a socket, returns
-        the number of bytes currently in that socket's send buffer.
-        It writes this value as an int to the memory location
-        indicated by the third argument of ioctl(2). */
-   case VKI_SIOCOUTQ:
-      POST_MEM_WRITE(ARG3, sizeof(int));
-      break;
-   case VKI_SIOCGRARP:           /* get RARP table entry         */
-   case VKI_SIOCGARP:            /* get ARP table entry          */
-      POST_MEM_WRITE(ARG3, sizeof(struct vki_arpreq));
-      break;
-                    
-   case VKI_SIOCSIFFLAGS:        /* set flags                    */
-   case VKI_SIOCSIFMAP:          /* Set device parameters        */
-   case VKI_SIOCSIFTXQLEN:       /* Set the tx queue length      */
-   case VKI_SIOCSIFDSTADDR:      /* set remote PA address        */
-   case VKI_SIOCSIFBRDADDR:      /* set broadcast PA address     */
-   case VKI_SIOCSIFNETMASK:      /* set network PA mask          */
-   case VKI_SIOCSIFMETRIC:       /* set metric                   */
-   case VKI_SIOCSIFADDR:         /* set PA address               */
-   case VKI_SIOCSIFMTU:          /* set MTU size                 */
-   case VKI_SIOCSIFHWADDR:       /* set hardware address         */
-   case VKI_SIOCSMIIREG:         /* set hardware entry registers */
-      break;
-      /* Routing table calls.  */
-   case VKI_SIOCADDRT:           /* add routing table entry      */
-   case VKI_SIOCDELRT:           /* delete routing table entry   */
-      break;
-
-      /* RARP cache control calls. */
-   case VKI_SIOCDRARP:           /* delete RARP table entry      */
-   case VKI_SIOCSRARP:           /* set RARP table entry         */
-      /* ARP cache control calls. */
-   case VKI_SIOCSARP:            /* set ARP table entry          */
-   case VKI_SIOCDARP:            /* delete ARP table entry       */
-      break;
-
-   case VKI_SIOCGPGRP:
-      POST_MEM_WRITE(ARG3, sizeof(int));
-      break;
-   case VKI_SIOCSPGRP:
-      break;
-
-      /* linux/soundcard interface (OSS) */
-   case VKI_SNDCTL_SEQ_GETOUTCOUNT:
-   case VKI_SNDCTL_SEQ_GETINCOUNT:
-   case VKI_SNDCTL_SEQ_PERCMODE:
-   case VKI_SNDCTL_SEQ_TESTMIDI:
-   case VKI_SNDCTL_SEQ_RESETSAMPLES:
-   case VKI_SNDCTL_SEQ_NRSYNTHS:
-   case VKI_SNDCTL_SEQ_NRMIDIS:
-   case VKI_SNDCTL_SEQ_GETTIME:
-   case VKI_SNDCTL_DSP_GETFMTS:
-   case VKI_SNDCTL_DSP_GETTRIGGER:
-   case VKI_SNDCTL_DSP_GETODELAY:
-   case VKI_SNDCTL_DSP_GETSPDIF:
-   case VKI_SNDCTL_DSP_GETCAPS:
-   case VKI_SOUND_PCM_READ_RATE:
-   case VKI_SOUND_PCM_READ_CHANNELS:
-   case VKI_SOUND_PCM_READ_BITS:
-#if !defined(VGA_ppc32) && !defined(VGA_ppc64)
-   case (VKI_SOUND_PCM_READ_BITS|0x40000000): /* what the fuck ? */
-#endif
-   case VKI_SOUND_PCM_READ_FILTER:
-      POST_MEM_WRITE(ARG3, sizeof(int));
-      break;
-   case VKI_SNDCTL_SEQ_CTRLRATE:
-   case VKI_SNDCTL_DSP_SPEED:
-   case VKI_SNDCTL_DSP_STEREO:
-   case VKI_SNDCTL_DSP_GETBLKSIZE: 
-   case VKI_SNDCTL_DSP_CHANNELS:
-   case VKI_SOUND_PCM_WRITE_FILTER:
-   case VKI_SNDCTL_DSP_SUBDIVIDE:
-   case VKI_SNDCTL_DSP_SETFRAGMENT:
-   case VKI_SNDCTL_DSP_GETCHANNELMASK:
-   case VKI_SNDCTL_DSP_BIND_CHANNEL:
-   case VKI_SNDCTL_TMR_TIMEBASE:
-   case VKI_SNDCTL_TMR_TEMPO:
-   case VKI_SNDCTL_TMR_SOURCE:
-   case VKI_SNDCTL_MIDI_PRETIME:
-   case VKI_SNDCTL_MIDI_MPUMODE:
-      break;
-   case VKI_SNDCTL_DSP_GETOSPACE:
-   case VKI_SNDCTL_DSP_GETISPACE:
-      POST_MEM_WRITE(ARG3, sizeof(vki_audio_buf_info));
-      break;
-   case VKI_SNDCTL_DSP_SETTRIGGER:
-      break;
-
-   case VKI_SNDCTL_DSP_POST:
-   case VKI_SNDCTL_DSP_RESET:
-   case VKI_SNDCTL_DSP_SYNC:
-   case VKI_SNDCTL_DSP_SETSYNCRO:
-   case VKI_SNDCTL_DSP_SETDUPLEX:
-      break;
-
-      /* linux/soundcard interface (ALSA) */
-   case VKI_SNDRV_PCM_IOCTL_HW_FREE:
-   case VKI_SNDRV_PCM_IOCTL_HWSYNC:
-   case VKI_SNDRV_PCM_IOCTL_PREPARE:
-   case VKI_SNDRV_PCM_IOCTL_RESET:
-   case VKI_SNDRV_PCM_IOCTL_START:
-   case VKI_SNDRV_PCM_IOCTL_DROP:
-   case VKI_SNDRV_PCM_IOCTL_DRAIN:
-   case VKI_SNDRV_PCM_IOCTL_RESUME:
-   case VKI_SNDRV_PCM_IOCTL_XRUN:
-   case VKI_SNDRV_PCM_IOCTL_UNLINK:
-   case VKI_SNDRV_TIMER_IOCTL_START:
-   case VKI_SNDRV_TIMER_IOCTL_STOP:
-   case VKI_SNDRV_TIMER_IOCTL_CONTINUE:
-   case VKI_SNDRV_TIMER_IOCTL_PAUSE:
-      break;
-
-      /* Real Time Clock (/dev/rtc) ioctls */
-   case VKI_RTC_UIE_ON:
-   case VKI_RTC_UIE_OFF:
-   case VKI_RTC_AIE_ON:
-   case VKI_RTC_AIE_OFF:
-   case VKI_RTC_PIE_ON:
-   case VKI_RTC_PIE_OFF:
-   case VKI_RTC_IRQP_SET:
-      break;
-   case VKI_RTC_RD_TIME:
-   case VKI_RTC_ALM_READ:
-      POST_MEM_WRITE(ARG3, sizeof(struct vki_rtc_time));
-      break;
-   case VKI_RTC_ALM_SET:
-      break;
-   case VKI_RTC_IRQP_READ:
-      POST_MEM_WRITE(ARG3, sizeof(unsigned long));
-      break;
-
-      /* Block devices */
-   case VKI_BLKROSET:
-      break;
-   case VKI_BLKROGET:
-      POST_MEM_WRITE(ARG3, sizeof(int));
-      break;
-   case VKI_BLKGETSIZE:
-      POST_MEM_WRITE(ARG3, sizeof(unsigned long));
-      break;
-   case VKI_BLKRASET:
-      break;
-   case VKI_BLKRAGET:
-      POST_MEM_WRITE(ARG3, sizeof(long));
-      break;
-   case VKI_BLKFRASET:
-      break;
-   case VKI_BLKFRAGET:
-      POST_MEM_WRITE(ARG3, sizeof(long));
-      break;
-   case VKI_BLKSECTGET:
-      POST_MEM_WRITE(ARG3, sizeof(unsigned short));
-      break;
-   case VKI_BLKSSZGET:
-      POST_MEM_WRITE(ARG3, sizeof(int));
-      break;
-   case VKI_BLKBSZGET:
-      POST_MEM_WRITE(ARG3, sizeof(int));
-      break;
-   case VKI_BLKBSZSET:
-      break;
-   case VKI_BLKGETSIZE64:
-      POST_MEM_WRITE(ARG3, sizeof(unsigned long long));
-      break;
-
-      /* Hard disks */
-   case VKI_HDIO_GETGEO: /* 0x0301 */
-      POST_MEM_WRITE(ARG3, sizeof(struct vki_hd_geometry));
-      break;
-   case VKI_HDIO_GET_DMA: /* 0x030b */
-      POST_MEM_WRITE(ARG3, sizeof(long));
-      break;
-   case VKI_HDIO_GET_IDENTITY: /* 0x030d */
-      POST_MEM_WRITE(ARG3, VKI_SIZEOF_STRUCT_HD_DRIVEID );
-      break;
-
-      /* CD ROM stuff (??)  */
-   case VKI_CDROMSUBCHNL:
-      POST_MEM_WRITE(ARG3, sizeof(struct vki_cdrom_subchnl));
-      break;
-   case VKI_CDROMREADTOCHDR:
-      POST_MEM_WRITE(ARG3, sizeof(struct vki_cdrom_tochdr));
-      break;
-   case VKI_CDROMREADTOCENTRY:
-      POST_MEM_WRITE(ARG3, sizeof(struct vki_cdrom_tocentry));
-      break;
-   case VKI_CDROMMULTISESSION:
-      POST_MEM_WRITE(ARG3, sizeof(struct vki_cdrom_multisession));
-      break;
-   case VKI_CDROMVOLREAD:
-      POST_MEM_WRITE(ARG3, sizeof(struct vki_cdrom_volctrl));
-      break;
-   case VKI_CDROMREADRAW:
-      POST_MEM_WRITE(ARG3, VKI_CD_FRAMESIZE_RAW);
-      break;
-   case VKI_CDROMREADAUDIO:
-   {
-      struct vki_cdrom_read_audio *cra = (struct vki_cdrom_read_audio *) ARG3;
-      POST_MEM_WRITE( (Addr)(cra->buf), cra->nframes * VKI_CD_FRAMESIZE_RAW);
-      break;
-   }
-      
-   case VKI_CDROMPLAYMSF:
-      break;
-      /* The following two are probably bogus (should check args
-        for readability).  JRS 20021117 */
-   case VKI_CDROM_DRIVE_STATUS: /* 0x5326 */
-   case VKI_CDROM_CLEAR_OPTIONS: /* 0x5321 */
-      break;
-
-   case VKI_FIGETBSZ:
-      POST_MEM_WRITE(ARG3, sizeof(unsigned long));
-      break;
-   case VKI_FIBMAP:
-      POST_MEM_WRITE(ARG3, sizeof(unsigned long));
-      break;
-
-   case VKI_FBIOGET_VSCREENINFO: //0x4600
-      POST_MEM_WRITE(ARG3, sizeof(struct vki_fb_var_screeninfo));
-      break;
-   case VKI_FBIOGET_FSCREENINFO: //0x4602
-      POST_MEM_WRITE(ARG3, sizeof(struct vki_fb_fix_screeninfo));
-      break;
-
-   case VKI_PPCLAIM:
-   case VKI_PPEXCL:
-   case VKI_PPYIELD:
-   case VKI_PPRELEASE:
-   case VKI_PPSETMODE:
-   case VKI_PPSETPHASE:
-   case VKI_PPSETFLAGS:
-   case VKI_PPWDATA:
-   case VKI_PPWCONTROL:
-   case VKI_PPFCONTROL:
-   case VKI_PPDATADIR:
-   case VKI_PPNEGOT:
-   case VKI_PPWCTLONIRQ:
-   case VKI_PPSETTIME:
-      break;
-   case VKI_PPGETMODE:
-      POST_MEM_WRITE( ARG3, sizeof(int) );
-      break;
-   case VKI_PPGETPHASE:
-      POST_MEM_WRITE( ARG3, sizeof(int) );
-      break;
-   case VKI_PPGETMODES:
-      POST_MEM_WRITE( ARG3, sizeof(unsigned int) );
-      break;
-   case VKI_PPGETFLAGS:
-      POST_MEM_WRITE( ARG3, sizeof(int) );
-      break;
-   case VKI_PPRSTATUS:
-      POST_MEM_WRITE( ARG3, sizeof(unsigned char) );
-      break;
-   case VKI_PPRDATA:
-      POST_MEM_WRITE( ARG3, sizeof(unsigned char) );
-      break;
-   case VKI_PPRCONTROL:
-      POST_MEM_WRITE( ARG3, sizeof(unsigned char) );
-      break;
-   case VKI_PPCLRIRQ:
-      POST_MEM_WRITE( ARG3, sizeof(int) );
-      break;
-   case VKI_PPGETTIME:
-      POST_MEM_WRITE( ARG3, sizeof(struct vki_timeval) );
-      break;
-
-   case VKI_GIO_FONT:
-      POST_MEM_WRITE( ARG3, 32 * 256 );
-      break;
-   case VKI_PIO_FONT:
-      break;
-
-   case VKI_GIO_FONTX:
-      POST_MEM_WRITE( (Addr)((struct vki_consolefontdesc *)ARG3)->chardata,
-                      32 * ((struct vki_consolefontdesc *)ARG3)->charcount );
-      break;
-   case VKI_PIO_FONTX:
-      break;
-
-   case VKI_PIO_FONTRESET:
-      break;
-
-   case VKI_GIO_CMAP:
-      POST_MEM_WRITE( ARG3, 16 * 3 );
-      break;
-   case VKI_PIO_CMAP:
-      break;
-
-   case VKI_KIOCSOUND:
-   case VKI_KDMKTONE:
-      break;
-
-   case VKI_KDGETLED:
-      POST_MEM_WRITE( ARG3, sizeof(char) );
-      break;
-   case VKI_KDSETLED:
-      break;
-
-   case VKI_KDGKBTYPE:
-      POST_MEM_WRITE( ARG3, sizeof(char) );
-      break;
-
-   case VKI_KDADDIO:
-   case VKI_KDDELIO:
-   case VKI_KDENABIO:
-   case VKI_KDDISABIO:
-      break;
-
-   case VKI_KDSETMODE:
-      break;
-   case VKI_KDGETMODE:
-      POST_MEM_WRITE( ARG3, sizeof(int) );
-      break;
-
-   case VKI_KDMAPDISP:
-   case VKI_KDUNMAPDISP:
-      break;
-
-   case VKI_GIO_SCRNMAP:
-      POST_MEM_WRITE( ARG3, VKI_E_TABSZ );
-      break;
-   case VKI_PIO_SCRNMAP:
-      break;
-   case VKI_GIO_UNISCRNMAP:
-      POST_MEM_WRITE( ARG3, VKI_E_TABSZ * sizeof(unsigned short) );
-      break;
-   case VKI_PIO_UNISCRNMAP:
-      break;
-
-   case VKI_GIO_UNIMAP:
-      if ( ARG3 ) {
-         struct vki_unimapdesc *desc = (struct vki_unimapdesc *) ARG3;
-         POST_MEM_WRITE( (Addr)&desc->entry_ct, sizeof(desc->entry_ct));
-         POST_MEM_WRITE( (Addr)desc->entries,
-                        desc->entry_ct * sizeof(struct vki_unipair) );
-      }
-      break;
-   case VKI_PIO_UNIMAP:
-      break;
-   case VKI_PIO_UNIMAPCLR:
-      break;
-
-   case VKI_KDGKBMODE:
-      POST_MEM_WRITE( ARG3, sizeof(int) );
-      break;
-   case VKI_KDSKBMODE:
-      break;
-      
-   case VKI_KDGKBMETA:
-      POST_MEM_WRITE( ARG3, sizeof(int) );
-      break;
-   case VKI_KDSKBMETA:
-      break;
-      
-   case VKI_KDGKBLED:
-      POST_MEM_WRITE( ARG3, sizeof(char) );
-      break;
-   case VKI_KDSKBLED:
-      break;
-      
-   case VKI_KDGKBENT:
-      POST_MEM_WRITE( (Addr)&((struct vki_kbentry *)ARG3)->kb_value,
-                      sizeof(((struct vki_kbentry *)ARG3)->kb_value) );
-      break;
-   case VKI_KDSKBENT:
-      break;
-      
-   case VKI_KDGKBSENT:
-      POST_MEM_WRITE( (Addr)((struct vki_kbsentry *)ARG3)->kb_string,
-                      sizeof(((struct vki_kbsentry *)ARG3)->kb_string) );
-      break;
-   case VKI_KDSKBSENT:
-      break;
-      
-   case VKI_KDGKBDIACR:
-      POST_MEM_WRITE( ARG3, sizeof(struct vki_kbdiacrs) );
-      break;
-   case VKI_KDSKBDIACR:
-      break;
-      
-   case VKI_KDGETKEYCODE:
-      POST_MEM_WRITE( (Addr)((struct vki_kbkeycode *)ARG3)->keycode,
-                      sizeof(((struct vki_kbkeycode *)ARG3)->keycode) );
-      break;
-   case VKI_KDSETKEYCODE:
-      break;
-      
-   case VKI_KDSIGACCEPT:
-      break;
-
-   case VKI_KDKBDREP:
-      break;
-
-   case VKI_KDFONTOP:
-      if ( ARG3 ) {
-         struct vki_console_font_op *op = (struct vki_console_font_op *) ARG3;
-         switch ( op->op ) {
-            case VKI_KD_FONT_OP_SET:
-               break;
-            case VKI_KD_FONT_OP_GET:
-               if ( op->data )
-                  POST_MEM_WRITE( (Addr) op->data,
-                                  (op->width + 7) / 8 * 32 * op->charcount );
-               break;
-            case VKI_KD_FONT_OP_SET_DEFAULT:
-               break;
-            case VKI_KD_FONT_OP_COPY:
-               break;
-         }
-         POST_MEM_WRITE( (Addr) op, sizeof(*op));
-      }
-      break;
-
-   case VKI_VT_OPENQRY:
-      POST_MEM_WRITE( ARG3, sizeof(int) );
-      break;
-   case VKI_VT_GETMODE:
-      POST_MEM_WRITE( ARG3, sizeof(struct vki_vt_mode) );
-      break;
-   case VKI_VT_SETMODE:
-      break;
-   case VKI_VT_GETSTATE:
-      POST_MEM_WRITE( (Addr) &(((struct vki_vt_stat*) ARG3)->v_active),
-                      sizeof(((struct vki_vt_stat*) ARG3)->v_active) );
-      POST_MEM_WRITE( (Addr) &(((struct vki_vt_stat*) ARG3)->v_state),
-                      sizeof(((struct vki_vt_stat*) ARG3)->v_state) );
-      break;
-   case VKI_VT_RELDISP:
-   case VKI_VT_ACTIVATE:
-   case VKI_VT_WAITACTIVE:
-   case VKI_VT_DISALLOCATE:
-      break;
-   case VKI_VT_RESIZE:
-      break;
-   case VKI_VT_RESIZEX:
-      break;
-   case VKI_VT_LOCKSWITCH:
-   case VKI_VT_UNLOCKSWITCH:
-      break;
-
-   case VKI_USBDEVFS_CONTROL:
-      if ( ARG3 ) {
-         struct vki_usbdevfs_ctrltransfer *vkuc = (struct vki_usbdevfs_ctrltransfer *)ARG3;
-         if (vkuc->bRequestType & 0x80)
-            POST_MEM_WRITE((Addr)vkuc->data, RES);
-         break;
-      }
-   case VKI_USBDEVFS_BULK:
-      if ( ARG3 ) {
-         struct vki_usbdevfs_bulktransfer *vkub = (struct vki_usbdevfs_bulktransfer *)ARG3;
-         if (vkub->ep & 0x80)
-            POST_MEM_WRITE((Addr)vkub->data, RES);
-         break;
-      }
-   case VKI_USBDEVFS_GETDRIVER:
-      if ( ARG3 ) {
-         struct vki_usbdevfs_getdriver *vkugd = (struct vki_usbdevfs_getdriver *)ARG3;
-         POST_MEM_WRITE((Addr)&vkugd->driver, sizeof(vkugd->driver));
-         break;
-      }
-   case VKI_USBDEVFS_REAPURB:
-   case VKI_USBDEVFS_REAPURBNDELAY:
-      if ( ARG3 ) {
-         struct vki_usbdevfs_urb **vkuu = (struct vki_usbdevfs_urb**)ARG3;
-         if (!*vkuu)
-            break;
-         POST_MEM_WRITE((Addr) &((*vkuu)->status),sizeof((*vkuu)->status));
-         if ((*vkuu)->endpoint & 0x80)
-            POST_MEM_WRITE((Addr)(*vkuu)->buffer, (*vkuu)->actual_length);
-         break;
-      }
-   case VKI_USBDEVFS_CONNECTINFO:
-      POST_MEM_WRITE(ARG3, sizeof(struct vki_usbdevfs_connectinfo));
-      break;
-   case VKI_USBDEVFS_IOCTL:
-      if ( ARG3 ) {
-         struct vki_usbdevfs_ioctl *vkui = (struct vki_usbdevfs_ioctl *)ARG3;
-         UInt dir2, size2;
-         dir2  = _VKI_IOC_DIR(vkui->ioctl_code);
-         size2 = _VKI_IOC_SIZE(vkui->ioctl_code);
-         if (size2 > 0) {
-            if (dir2 & _VKI_IOC_READ) 
-               POST_MEM_WRITE((Addr)vkui->data, size2);
-         }
-      }
-      break;
-
-      /* I2C (/dev/i2c-*) ioctls */
-   case VKI_I2C_SLAVE:
-   case VKI_I2C_SLAVE_FORCE:
-   case VKI_I2C_TENBIT:
-   case VKI_I2C_PEC:
-      break;
-   case VKI_I2C_FUNCS:
-      POST_MEM_WRITE( ARG3, sizeof(unsigned long) );
-      break;
-
-      /* Wireless extensions ioctls */
-   case VKI_SIOCSIWCOMMIT:
-   case VKI_SIOCSIWNWID:
-   case VKI_SIOCSIWFREQ:
-   case VKI_SIOCSIWMODE:
-   case VKI_SIOCSIWSENS:
-   case VKI_SIOCSIWRANGE:
-   case VKI_SIOCSIWPRIV:
-   case VKI_SIOCSIWSTATS:
-   case VKI_SIOCSIWSPY:
-   case VKI_SIOCSIWTHRSPY:
-   case VKI_SIOCSIWAP:
-   case VKI_SIOCSIWSCAN:
-   case VKI_SIOCSIWESSID:
-   case VKI_SIOCSIWRATE:
-   case VKI_SIOCSIWNICKN:
-   case VKI_SIOCSIWRTS:
-   case VKI_SIOCSIWFRAG:
-   case VKI_SIOCSIWTXPOW:
-   case VKI_SIOCSIWRETRY:
-   case VKI_SIOCSIWENCODE:
-   case VKI_SIOCSIWPOWER:
-   case VKI_SIOCSIWGENIE:
-   case VKI_SIOCSIWMLME:
-   case VKI_SIOCSIWAUTH:
-   case VKI_SIOCSIWENCODEEXT:
-   case VKI_SIOCSIWPMKSA:
-      break;
-   case VKI_SIOCGIWNAME:
-      if (ARG3) {
-         POST_MEM_WRITE((Addr)((struct vki_iwreq *)ARG3)->u.name,
-                        sizeof(((struct vki_iwreq *)ARG3)->u.name));
-      }
-      break;
-   case VKI_SIOCGIWNWID:
-   case VKI_SIOCGIWSENS:
-   case VKI_SIOCGIWRATE:
-   case VKI_SIOCGIWRTS:
-   case VKI_SIOCGIWFRAG:
-   case VKI_SIOCGIWTXPOW:
-   case VKI_SIOCGIWRETRY:
-   case VKI_SIOCGIWPOWER:
-   case VKI_SIOCGIWAUTH:
-      if (ARG3) {
-         POST_MEM_WRITE((Addr)&((struct vki_iwreq *)ARG3)->u.param,
-                        sizeof(struct vki_iw_param));
-      }
-      break;
-   case VKI_SIOCGIWFREQ:
-      if (ARG3) {
-         POST_MEM_WRITE((Addr)&((struct vki_iwreq *)ARG3)->u.freq,
-                        sizeof(struct vki_iw_freq));
-      }
-      break;
-   case VKI_SIOCGIWMODE:
-      if (ARG3) {
-         POST_MEM_WRITE((Addr)&((struct vki_iwreq *)ARG3)->u.mode,
-                       sizeof(__vki_u32));
-      }
-      break;
-   case VKI_SIOCGIWRANGE:
-   case VKI_SIOCGIWPRIV:
-   case VKI_SIOCGIWSTATS:
-   case VKI_SIOCGIWSPY:
-   case VKI_SIOCGIWTHRSPY:
-   case VKI_SIOCGIWAPLIST:
-   case VKI_SIOCGIWSCAN:
-   case VKI_SIOCGIWESSID:
-   case VKI_SIOCGIWNICKN:
-   case VKI_SIOCGIWENCODE:
-   case VKI_SIOCGIWGENIE:
-   case VKI_SIOCGIWENCODEEXT:
-      if (ARG3) {
-         struct vki_iw_point* point;
-         point = &((struct vki_iwreq *)ARG3)->u.data;
-         POST_MEM_WRITE((Addr)point->pointer, point->length);
-      }
-      break;
-   case VKI_SIOCGIWAP:
-      if (ARG3) {
-         POST_MEM_WRITE((Addr)&((struct vki_iwreq *)ARG3)->u.ap_addr,
-                        sizeof(struct vki_sockaddr));
-      }
-      break;
-
-      /* We don't have any specific information on it, so
-        try to do something reasonable based on direction and
-        size bits.  The encoding scheme is described in
-        /usr/include/asm/ioctl.h.  
-
-        According to Simon Hausmann, _IOC_READ means the kernel
-        writes a value to the ioctl value passed from the user
-        space and the other way around with _IOC_WRITE. */
-   default: {
-      UInt dir  = _VKI_IOC_DIR(ARG2);
-      UInt size = _VKI_IOC_SIZE(ARG2);
-      if (size > 0 && (dir & _VKI_IOC_READ)
-         && RES == 0 
-         && ARG3 != (Addr)NULL)
-        POST_MEM_WRITE(ARG3, size);
-      break;
-   }
-   }
-}
 
 /* 
    If we're sending a SIGKILL to one of our own threads, then simulate
index 442f9aedb63919f369b5b2cb3cd483bc7f4a22fc..adeaf460ba31cc2efa6ca52f02ae2b3327de2176 100644 (file)
@@ -3155,6 +3155,2024 @@ POST(sys_lookup_dcookie)
 }
 #endif
 
+/* ---------------------------------------------------------------------
+   fcntl wrappers
+   ------------------------------------------------------------------ */
+
+PRE(sys_fcntl)
+{
+   switch (ARG2) {
+   // These ones ignore ARG3.
+   case VKI_F_GETFD:
+   case VKI_F_GETFL:
+   case VKI_F_GETOWN:
+   case VKI_F_GETSIG:
+   case VKI_F_GETLEASE:
+      PRINT("sys_fcntl ( %ld, %ld )", ARG1,ARG2);
+      PRE_REG_READ2(long, "fcntl", unsigned int, fd, unsigned int, cmd);
+      break;
+
+   // These ones use ARG3 as "arg".
+   case VKI_F_DUPFD:
+   case VKI_F_SETFD:
+   case VKI_F_SETFL:
+   case VKI_F_SETLEASE:
+   case VKI_F_NOTIFY:
+   case VKI_F_SETOWN:
+   case VKI_F_SETSIG:
+      PRINT("sys_fcntl[ARG3=='arg'] ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
+      PRE_REG_READ3(long, "fcntl",
+                    unsigned int, fd, unsigned int, cmd, unsigned long, arg);
+      break;
+
+   // These ones use ARG3 as "lock".
+   case VKI_F_GETLK:
+   case VKI_F_SETLK:
+   case VKI_F_SETLKW:
+#  if defined(VGP_x86_linux)
+   case VKI_F_GETLK64:
+   case VKI_F_SETLK64:
+   case VKI_F_SETLKW64:
+#  endif
+      PRINT("sys_fcntl[ARG3=='lock'] ( %ld, %ld, %#lx )", ARG1,ARG2,ARG3);
+      PRE_REG_READ3(long, "fcntl",
+                    unsigned int, fd, unsigned int, cmd,
+                    struct flock64 *, lock);
+      break;
+   }
+
+#  if defined(VGP_x86_linux)
+   if (ARG2 == VKI_F_SETLKW || ARG2 == VKI_F_SETLKW64)
+#  else
+   if (ARG2 == VKI_F_SETLKW)
+#  endif
+      *flags |= SfMayBlock;
+}
+
+POST(sys_fcntl)
+{
+   vg_assert(SUCCESS);
+   if (ARG2 == VKI_F_DUPFD) {
+      if (!ML_(fd_allowed)(RES, "fcntl(DUPFD)", tid, True)) {
+         VG_(close)(RES);
+         SET_STATUS_Failure( VKI_EMFILE );
+      } else {
+         if (VG_(clo_track_fds))
+            ML_(record_fd_open_named)(tid, RES);
+      }
+   }
+}
+
+// XXX: wrapper only suitable for 32-bit systems
+PRE(sys_fcntl64)
+{
+   switch (ARG2) {
+   // These ones ignore ARG3.
+   case VKI_F_GETFD:
+   case VKI_F_GETFL:
+   case VKI_F_GETOWN:
+   case VKI_F_SETOWN:
+   case VKI_F_GETSIG:
+   case VKI_F_SETSIG:
+   case VKI_F_GETLEASE:
+      PRINT("sys_fcntl64 ( %ld, %ld )", ARG1,ARG2);
+      PRE_REG_READ2(long, "fcntl64", unsigned int, fd, unsigned int, cmd);
+      break;
+
+   // These ones use ARG3 as "arg".
+   case VKI_F_DUPFD:
+   case VKI_F_SETFD:
+   case VKI_F_SETFL:
+   case VKI_F_SETLEASE:
+   case VKI_F_NOTIFY:
+      PRINT("sys_fcntl64[ARG3=='arg'] ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
+      PRE_REG_READ3(long, "fcntl64",
+                    unsigned int, fd, unsigned int, cmd, unsigned long, arg);
+      break;
+
+   // These ones use ARG3 as "lock".
+   case VKI_F_GETLK:
+   case VKI_F_SETLK:
+   case VKI_F_SETLKW:
+#  if defined(VGP_x86_linux)
+   case VKI_F_GETLK64:
+   case VKI_F_SETLK64:
+   case VKI_F_SETLKW64:
+#  endif
+      PRINT("sys_fcntl64[ARG3=='lock'] ( %ld, %ld, %#lx )", ARG1,ARG2,ARG3);
+      PRE_REG_READ3(long, "fcntl64",
+                    unsigned int, fd, unsigned int, cmd,
+                    struct flock64 *, lock);
+      break;
+   }
+   
+#  if defined(VGP_x86_linux)
+   if (ARG2 == VKI_F_SETLKW || ARG2 == VKI_F_SETLKW64)
+#  else
+   if (ARG2 == VKI_F_SETLKW)
+#  endif
+      *flags |= SfMayBlock;
+}
+
+POST(sys_fcntl64)
+{
+   vg_assert(SUCCESS);
+   if (ARG2 == VKI_F_DUPFD) {
+      if (!ML_(fd_allowed)(RES, "fcntl64(DUPFD)", tid, True)) {
+         VG_(close)(RES);
+         SET_STATUS_Failure( VKI_EMFILE );
+      } else {
+         if (VG_(clo_track_fds))
+            ML_(record_fd_open_named)(tid, RES);
+      }
+   }
+}
+
+/* ---------------------------------------------------------------------
+   ioctl wrappers
+   ------------------------------------------------------------------ */
+
+PRE(sys_ioctl)
+{
+   *flags |= SfMayBlock;
+   PRINT("sys_ioctl ( %ld, 0x%lx, %#lx )",ARG1,ARG2,ARG3);
+   PRE_REG_READ3(long, "ioctl",
+                 unsigned int, fd, unsigned int, request, unsigned long, arg);
+
+   switch (ARG2 /* request */) {
+   case VKI_TCSETS:
+   case VKI_TCSETSW:
+   case VKI_TCSETSF:
+      PRE_MEM_READ( "ioctl(TCSET{S,SW,SF})", ARG3, sizeof(struct vki_termios) );
+      break; 
+   case VKI_TCGETS:
+      PRE_MEM_WRITE( "ioctl(TCGETS)", ARG3, sizeof(struct vki_termios) );
+      break;
+   case VKI_TCSETA:
+   case VKI_TCSETAW:
+   case VKI_TCSETAF:
+      PRE_MEM_READ( "ioctl(TCSET{A,AW,AF})", ARG3, sizeof(struct vki_termio) );
+      break;
+   case VKI_TCGETA:
+      PRE_MEM_WRITE( "ioctl(TCGETA)", ARG3, sizeof(struct vki_termio) );
+      break;
+   case VKI_TCSBRK:
+   case VKI_TCXONC:
+   case VKI_TCSBRKP:
+   case VKI_TCFLSH:
+      /* These just take an int by value */
+      break;
+   case VKI_TIOCGWINSZ:
+      PRE_MEM_WRITE( "ioctl(TIOCGWINSZ)", ARG3, sizeof(struct vki_winsize) );
+      break;
+   case VKI_TIOCSWINSZ:
+      PRE_MEM_READ( "ioctl(TIOCSWINSZ)",  ARG3, sizeof(struct vki_winsize) );
+      break;
+   case VKI_TIOCMBIS:
+      PRE_MEM_READ( "ioctl(TIOCMBIS)",    ARG3, sizeof(unsigned int) );
+      break;
+   case VKI_TIOCMBIC:
+      PRE_MEM_READ( "ioctl(TIOCMBIC)",    ARG3, sizeof(unsigned int) );
+      break;
+   case VKI_TIOCMSET:
+      PRE_MEM_READ( "ioctl(TIOCMSET)",    ARG3, sizeof(unsigned int) );
+      break;
+   case VKI_TIOCMGET:
+      PRE_MEM_WRITE( "ioctl(TIOCMGET)",   ARG3, sizeof(unsigned int) );
+      break;
+   case VKI_TIOCLINUX:
+      PRE_MEM_READ( "ioctl(TIOCLINUX)",   ARG3, sizeof(char *) );
+      if (*(char *)ARG3 == 11) {
+        PRE_MEM_READ( "ioctl(TIOCLINUX, 11)", ARG3, 2 * sizeof(char *) );
+      }
+      break;
+   case VKI_TIOCGPGRP:
+      /* Get process group ID for foreground processing group. */
+      PRE_MEM_WRITE( "ioctl(TIOCGPGRP)", ARG3, sizeof(vki_pid_t) );
+      break;
+   case VKI_TIOCSPGRP:
+      /* Set a process group ID? */
+      PRE_MEM_WRITE( "ioctl(TIOCGPGRP)", ARG3, sizeof(vki_pid_t) );
+      break;
+   case VKI_TIOCGPTN: /* Get Pty Number (of pty-mux device) */
+      PRE_MEM_WRITE( "ioctl(TIOCGPTN)", ARG3, sizeof(int) );
+      break;
+   case VKI_TIOCSCTTY:
+      /* Just takes an int value.  */
+      break;
+   case VKI_TIOCSPTLCK: /* Lock/unlock Pty */
+      PRE_MEM_READ( "ioctl(TIOCSPTLCK)", ARG3, sizeof(int) );
+      break;
+   case VKI_FIONBIO:
+      PRE_MEM_READ( "ioctl(FIONBIO)",    ARG3, sizeof(int) );
+      break;
+   case VKI_FIOASYNC:
+      PRE_MEM_READ( "ioctl(FIOASYNC)",   ARG3, sizeof(int) );
+      break;
+   case VKI_FIONREAD:                /* identical to SIOCINQ */
+      PRE_MEM_WRITE( "ioctl(FIONREAD)",  ARG3, sizeof(int) );
+      break;
+
+   case VKI_TIOCSERGETLSR:
+      PRE_MEM_WRITE( "ioctl(TIOCSERGETLSR)", ARG3, sizeof(int) );
+      break;
+   case VKI_TIOCGICOUNT:
+      PRE_MEM_WRITE( "ioctl(TIOCGICOUNT)", ARG3,
+                     sizeof(struct vki_serial_icounter_struct) );
+      break;
+
+   case VKI_SG_SET_COMMAND_Q:
+      PRE_MEM_READ( "ioctl(SG_SET_COMMAND_Q)", ARG3, sizeof(int) );
+      break;
+   case VKI_SG_IO:
+      PRE_MEM_WRITE( "ioctl(SG_IO)", ARG3, sizeof(vki_sg_io_hdr_t) );
+      break;
+   case VKI_SG_GET_SCSI_ID:
+      PRE_MEM_WRITE( "ioctl(SG_GET_SCSI_ID)", ARG3, sizeof(vki_sg_scsi_id_t) );
+      break;
+   case VKI_SG_SET_RESERVED_SIZE:
+      PRE_MEM_READ( "ioctl(SG_SET_RESERVED_SIZE)", ARG3, sizeof(int) );
+      break;
+   case VKI_SG_SET_TIMEOUT:
+      PRE_MEM_READ( "ioctl(SG_SET_TIMEOUT)", ARG3, sizeof(int) );
+      break;
+   case VKI_SG_GET_RESERVED_SIZE:
+      PRE_MEM_WRITE( "ioctl(SG_GET_RESERVED_SIZE)", ARG3, sizeof(int) );
+      break;
+   case VKI_SG_GET_TIMEOUT:
+      break;
+   case VKI_SG_GET_VERSION_NUM:
+      PRE_MEM_WRITE(  "ioctl(SG_GET_VERSION_NUM)",  ARG3, sizeof(int) );
+      break;
+   case VKI_SG_EMULATED_HOST: /* 0x2203 */
+      PRE_MEM_WRITE( "ioctl(SG_EMULATED_HOST)",    ARG3, sizeof(int) );
+      break;
+   case VKI_SG_GET_SG_TABLESIZE: /* 0x227f */
+      PRE_MEM_WRITE( "ioctl(SG_GET_SG_TABLESIZE)", ARG3, sizeof(int) );
+      break;
+
+   case VKI_IIOCGETCPS:
+      PRE_MEM_WRITE( "ioctl(IIOCGETCPS)", ARG3,
+                    VKI_ISDN_MAX_CHANNELS * 2 * sizeof(unsigned long) );
+      break;
+   case VKI_IIOCNETGPN:
+      PRE_MEM_READ( "ioctl(IIOCNETGPN)",
+                    (Addr)&((vki_isdn_net_ioctl_phone *)ARG3)->name,
+                    sizeof(((vki_isdn_net_ioctl_phone *)ARG3)->name) );
+      PRE_MEM_WRITE( "ioctl(IIOCNETGPN)", ARG3,
+                    sizeof(vki_isdn_net_ioctl_phone) );
+      break;
+
+      /* These all use struct ifreq AFAIK */
+   case VKI_SIOCGIFINDEX:        /* get iface index              */
+      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFINDEX)",
+                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
+      PRE_MEM_WRITE( "ioctl(SIOCGIFINDEX)", ARG3, sizeof(struct vki_ifreq));
+      break;
+   case VKI_SIOCGIFFLAGS:        /* get flags                    */
+      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFFLAGS)",
+                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
+      PRE_MEM_WRITE( "ioctl(SIOCGIFFLAGS)", ARG3, sizeof(struct vki_ifreq));
+      break;
+   case VKI_SIOCGIFHWADDR:       /* Get hardware address         */
+      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFHWADDR)",
+                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
+      PRE_MEM_WRITE( "ioctl(SIOCGIFHWADDR)", ARG3, sizeof(struct vki_ifreq));
+      break;
+   case VKI_SIOCGIFMTU:          /* get MTU size                 */
+      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFMTU)",
+                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
+      PRE_MEM_WRITE( "ioctl(SIOCGIFMTU)", ARG3, sizeof(struct vki_ifreq));
+      break;
+   case VKI_SIOCGIFADDR:         /* get PA address               */
+      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFADDR)",
+                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
+      PRE_MEM_WRITE( "ioctl(SIOCGIFADDR)", ARG3, sizeof(struct vki_ifreq));
+      break;
+   case VKI_SIOCGIFNETMASK:      /* get network PA mask          */
+      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFNETMASK)",
+                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
+      PRE_MEM_WRITE( "ioctl(SIOCGIFNETMASK)", ARG3, sizeof(struct vki_ifreq));
+      break;
+   case VKI_SIOCGIFMETRIC:       /* get metric                   */
+      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFMETRIC)",
+                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
+      PRE_MEM_WRITE( "ioctl(SIOCGIFMETRIC)", ARG3, sizeof(struct vki_ifreq));
+      break;
+   case VKI_SIOCGIFMAP:          /* Get device parameters        */
+      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFMAP)",
+                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
+      PRE_MEM_WRITE( "ioctl(SIOCGIFMAP)", ARG3, sizeof(struct vki_ifreq));
+      break;
+   case VKI_SIOCGIFTXQLEN:       /* Get the tx queue length      */
+      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFTXQLEN)",
+                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
+      PRE_MEM_WRITE( "ioctl(SIOCGIFTXQLEN)", ARG3, sizeof(struct vki_ifreq));
+      break;
+   case VKI_SIOCGIFDSTADDR:      /* get remote PA address        */
+      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFDSTADDR)",
+                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
+      PRE_MEM_WRITE( "ioctl(SIOCGIFDSTADDR)", ARG3, sizeof(struct vki_ifreq));
+      break;
+   case VKI_SIOCGIFBRDADDR:      /* get broadcast PA address     */
+      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFBRDADDR)",
+                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
+      PRE_MEM_WRITE( "ioctl(SIOCGIFBRDADDR)", ARG3, sizeof(struct vki_ifreq));
+      break;
+   case VKI_SIOCGIFNAME:         /* get iface name               */
+      PRE_MEM_READ( "ioctl(SIOCGIFNAME)",
+                     (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_ifindex,
+                     sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_ifindex) );
+      PRE_MEM_WRITE( "ioctl(SIOCGIFNAME)", ARG3, sizeof(struct vki_ifreq));
+      break;
+   case VKI_SIOCGMIIPHY:         /* get hardware entry           */
+      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFMIIPHY)",
+                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
+      PRE_MEM_WRITE( "ioctl(SIOCGIFMIIPHY)", ARG3, sizeof(struct vki_ifreq));
+      break;
+   case VKI_SIOCGMIIREG:         /* get hardware entry registers */
+      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFMIIREG)",
+                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
+      PRE_MEM_READ( "ioctl(SIOCGIFMIIREG)",
+                     (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id,
+                     sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id) );
+      PRE_MEM_READ( "ioctl(SIOCGIFMIIREG)",
+                     (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->reg_num,
+                     sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->reg_num) );
+      PRE_MEM_WRITE( "ioctl(SIOCGIFMIIREG)", ARG3, 
+                    sizeof(struct vki_ifreq));
+      break;
+   case VKI_SIOCGIFCONF:         /* get iface list               */
+      /* WAS:
+        PRE_MEM_WRITE( "ioctl(SIOCGIFCONF)", ARG3, sizeof(struct ifconf));
+        KERNEL_DO_SYSCALL(tid,RES);
+        if (!VG_(is_kerror)(RES) && RES == 0)
+        POST_MEM_WRITE(ARG3, sizeof(struct ifconf));
+      */
+      PRE_MEM_READ( "ioctl(SIOCGIFCONF)",
+                    (Addr)&((struct vki_ifconf *)ARG3)->ifc_len,
+                    sizeof(((struct vki_ifconf *)ARG3)->ifc_len));
+      PRE_MEM_READ( "ioctl(SIOCGIFCONF)",
+                    (Addr)&((struct vki_ifconf *)ARG3)->vki_ifc_buf,
+                    sizeof(((struct vki_ifconf *)ARG3)->vki_ifc_buf));
+      if ( ARG3 ) {
+        // TODO len must be readable and writable
+        // buf pointer only needs to be readable
+        struct vki_ifconf *ifc = (struct vki_ifconf *) ARG3;
+        PRE_MEM_WRITE( "ioctl(SIOCGIFCONF).ifc_buf",
+                       (Addr)(ifc->vki_ifc_buf), ifc->ifc_len );
+      }
+      break;
+   case VKI_SIOCGSTAMP:
+      PRE_MEM_WRITE( "ioctl(SIOCGSTAMP)", ARG3, sizeof(struct vki_timeval));
+      break;
+      /* SIOCOUTQ is an ioctl that, when called on a socket, returns
+        the number of bytes currently in that socket's send buffer.
+        It writes this value as an int to the memory location
+        indicated by the third argument of ioctl(2). */
+   case VKI_SIOCOUTQ:
+      PRE_MEM_WRITE( "ioctl(SIOCOUTQ)", ARG3, sizeof(int));
+      break;
+   case VKI_SIOCGRARP:           /* get RARP table entry         */
+   case VKI_SIOCGARP:            /* get ARP table entry          */
+      PRE_MEM_WRITE( "ioctl(SIOCGARP)", ARG3, sizeof(struct vki_arpreq));
+      break;
+                    
+   case VKI_SIOCSIFFLAGS:        /* set flags                    */
+      PRE_MEM_RASCIIZ( "ioctl(SIOCSIFFLAGS)",
+                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
+      PRE_MEM_READ( "ioctl(SIOCSIFFLAGS)",
+                     (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_flags,
+                     sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_flags) );
+      break;
+   case VKI_SIOCSIFMAP:          /* Set device parameters        */
+      PRE_MEM_RASCIIZ( "ioctl(SIOCSIFMAP)",
+                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
+      PRE_MEM_READ( "ioctl(SIOCSIFMAP)",
+                     (Addr)&((struct vki_ifreq *)ARG3)->ifr_map,
+                     sizeof(((struct vki_ifreq *)ARG3)->ifr_map) );
+      break;
+   case VKI_SIOCSIFTXQLEN:       /* Set the tx queue length      */
+      PRE_MEM_RASCIIZ( "ioctl(SIOCSIFTXQLEN)",
+                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
+      PRE_MEM_READ( "ioctl(SIOCSIFTXQLEN)",
+                     (Addr)&((struct vki_ifreq *)ARG3)->ifr_qlen,
+                     sizeof(((struct vki_ifreq *)ARG3)->ifr_qlen) );
+      break;
+   case VKI_SIOCSIFADDR:         /* set PA address               */
+   case VKI_SIOCSIFDSTADDR:      /* set remote PA address        */
+   case VKI_SIOCSIFBRDADDR:      /* set broadcast PA address     */
+   case VKI_SIOCSIFNETMASK:      /* set network PA mask          */
+      PRE_MEM_RASCIIZ( "ioctl(SIOCSIF*ADDR)",
+                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
+      PRE_MEM_READ( "ioctl(SIOCSIF*ADDR)",
+                     (Addr)&((struct vki_ifreq *)ARG3)->ifr_addr,
+                     sizeof(((struct vki_ifreq *)ARG3)->ifr_addr) );
+      break;
+   case VKI_SIOCSIFMETRIC:       /* set metric                   */
+      PRE_MEM_RASCIIZ( "ioctl(SIOCSIFMETRIC)",
+                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
+      PRE_MEM_READ( "ioctl(SIOCSIFMETRIC)",
+                     (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_metric,
+                     sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_metric) );
+      break;
+   case VKI_SIOCSIFMTU:          /* set MTU size                 */
+      PRE_MEM_RASCIIZ( "ioctl(SIOCSIFMTU)",
+                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
+      PRE_MEM_READ( "ioctl(SIOCSIFMTU)",
+                     (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_mtu,
+                     sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_mtu) );
+      break;
+   case VKI_SIOCSIFHWADDR:       /* set hardware address         */
+      PRE_MEM_RASCIIZ( "ioctl(SIOCSIFHWADDR)",
+                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
+      PRE_MEM_READ( "ioctl(SIOCSIFHWADDR)",
+                     (Addr)&((struct vki_ifreq *)ARG3)->ifr_hwaddr,
+                     sizeof(((struct vki_ifreq *)ARG3)->ifr_hwaddr) );
+      break;
+   case VKI_SIOCSMIIREG:         /* set hardware entry registers */
+      PRE_MEM_RASCIIZ( "ioctl(SIOCSMIIREG)",
+                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
+      PRE_MEM_READ( "ioctl(SIOCSMIIREG)",
+                     (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id,
+                     sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id) );
+      PRE_MEM_READ( "ioctl(SIOCSMIIREG)",
+                     (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->reg_num,
+                     sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->reg_num) );
+      PRE_MEM_READ( "ioctl(SIOCSMIIREG)",
+                     (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->val_in,
+                     sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->val_in) );
+      break;
+      /* Routing table calls.  */
+   case VKI_SIOCADDRT:           /* add routing table entry      */
+   case VKI_SIOCDELRT:           /* delete routing table entry   */
+      PRE_MEM_READ( "ioctl(SIOCADDRT/DELRT)", ARG3, 
+                   sizeof(struct vki_rtentry));
+      break;
+
+      /* RARP cache control calls. */
+   case VKI_SIOCDRARP:           /* delete RARP table entry      */
+   case VKI_SIOCSRARP:           /* set RARP table entry         */
+      /* ARP cache control calls. */
+   case VKI_SIOCSARP:            /* set ARP table entry          */
+   case VKI_SIOCDARP:            /* delete ARP table entry       */
+      PRE_MEM_READ( "ioctl(SIOCSIFFLAGS)", ARG3, sizeof(struct vki_ifreq));
+      break;
+
+   case VKI_SIOCGPGRP:
+      PRE_MEM_WRITE( "ioctl(SIOCGPGRP)", ARG3, sizeof(int) );
+      break;
+   case VKI_SIOCSPGRP:
+      PRE_MEM_READ( "ioctl(SIOCSPGRP)", ARG3, sizeof(int) );
+      //tst->sys_flags &= ~SfMayBlock;
+      break;
+
+      /* linux/soundcard interface (OSS) */
+   case VKI_SNDCTL_SEQ_GETOUTCOUNT:
+   case VKI_SNDCTL_SEQ_GETINCOUNT:
+   case VKI_SNDCTL_SEQ_PERCMODE:
+   case VKI_SNDCTL_SEQ_TESTMIDI:
+   case VKI_SNDCTL_SEQ_RESETSAMPLES:
+   case VKI_SNDCTL_SEQ_NRSYNTHS:
+   case VKI_SNDCTL_SEQ_NRMIDIS:
+   case VKI_SNDCTL_SEQ_GETTIME:
+   case VKI_SNDCTL_DSP_GETFMTS:
+   case VKI_SNDCTL_DSP_GETTRIGGER:
+   case VKI_SNDCTL_DSP_GETODELAY:
+   case VKI_SNDCTL_DSP_GETSPDIF:
+   case VKI_SNDCTL_DSP_GETCAPS:
+   case VKI_SOUND_PCM_READ_RATE:
+   case VKI_SOUND_PCM_READ_CHANNELS:
+   case VKI_SOUND_PCM_READ_BITS:
+#if !defined(VGA_ppc32) && !defined(VGA_ppc64)
+   case (VKI_SOUND_PCM_READ_BITS|0x40000000): /* what the fuck ? */
+#endif
+   case VKI_SOUND_PCM_READ_FILTER:
+      PRE_MEM_WRITE( "ioctl(SNDCTL_XXX|SOUND_XXX (SIOR, int))", 
+                    ARG3, sizeof(int));
+      break;
+   case VKI_SNDCTL_SEQ_CTRLRATE:
+   case VKI_SNDCTL_DSP_SPEED:
+   case VKI_SNDCTL_DSP_STEREO:
+   case VKI_SNDCTL_DSP_GETBLKSIZE: 
+   case VKI_SNDCTL_DSP_CHANNELS:
+   case VKI_SOUND_PCM_WRITE_FILTER:
+   case VKI_SNDCTL_DSP_SUBDIVIDE:
+   case VKI_SNDCTL_DSP_SETFRAGMENT:
+   case VKI_SNDCTL_DSP_GETCHANNELMASK:
+   case VKI_SNDCTL_DSP_BIND_CHANNEL:
+   case VKI_SNDCTL_TMR_TIMEBASE:
+   case VKI_SNDCTL_TMR_TEMPO:
+   case VKI_SNDCTL_TMR_SOURCE:
+   case VKI_SNDCTL_MIDI_PRETIME:
+   case VKI_SNDCTL_MIDI_MPUMODE:
+      PRE_MEM_READ( "ioctl(SNDCTL_XXX|SOUND_XXX (SIOWR, int))", 
+                    ARG3, sizeof(int));
+      PRE_MEM_WRITE( "ioctl(SNDCTL_XXX|SOUND_XXX (SIOWR, int))", 
+                    ARG3, sizeof(int));
+      break;
+   case VKI_SNDCTL_DSP_GETOSPACE:
+   case VKI_SNDCTL_DSP_GETISPACE:
+      PRE_MEM_WRITE( "ioctl(SNDCTL_XXX|SOUND_XXX (SIOR, audio_buf_info))",
+                     ARG3, sizeof(vki_audio_buf_info));
+      break;
+   case VKI_SNDCTL_DSP_SETTRIGGER:
+      PRE_MEM_READ( "ioctl(SNDCTL_XXX|SOUND_XXX (SIOW, int))", 
+                    ARG3, sizeof(int));
+      break;
+
+   case VKI_SNDCTL_DSP_POST:
+   case VKI_SNDCTL_DSP_RESET:
+   case VKI_SNDCTL_DSP_SYNC:
+   case VKI_SNDCTL_DSP_SETSYNCRO:
+   case VKI_SNDCTL_DSP_SETDUPLEX:
+      break;
+
+      /* linux/soundcard interface (ALSA) */
+   case VKI_SNDRV_PCM_IOCTL_HW_FREE:
+   case VKI_SNDRV_PCM_IOCTL_HWSYNC:
+   case VKI_SNDRV_PCM_IOCTL_PREPARE:
+   case VKI_SNDRV_PCM_IOCTL_RESET:
+   case VKI_SNDRV_PCM_IOCTL_START:
+   case VKI_SNDRV_PCM_IOCTL_DROP:
+   case VKI_SNDRV_PCM_IOCTL_DRAIN:
+   case VKI_SNDRV_PCM_IOCTL_RESUME:
+   case VKI_SNDRV_PCM_IOCTL_XRUN:
+   case VKI_SNDRV_PCM_IOCTL_UNLINK:
+   case VKI_SNDRV_TIMER_IOCTL_START:
+   case VKI_SNDRV_TIMER_IOCTL_STOP:
+   case VKI_SNDRV_TIMER_IOCTL_CONTINUE:
+   case VKI_SNDRV_TIMER_IOCTL_PAUSE:
+      break;
+
+      /* Real Time Clock (/dev/rtc) ioctls */
+   case VKI_RTC_UIE_ON:
+   case VKI_RTC_UIE_OFF:
+   case VKI_RTC_AIE_ON:
+   case VKI_RTC_AIE_OFF:
+   case VKI_RTC_PIE_ON:
+   case VKI_RTC_PIE_OFF:
+   case VKI_RTC_IRQP_SET:
+      break;
+   case VKI_RTC_RD_TIME:
+   case VKI_RTC_ALM_READ:
+      PRE_MEM_WRITE( "ioctl(RTC_RD_TIME/ALM_READ)", 
+                    ARG3, sizeof(struct vki_rtc_time));
+      break;
+   case VKI_RTC_ALM_SET:
+      PRE_MEM_READ( "ioctl(RTC_ALM_SET)", ARG3, sizeof(struct vki_rtc_time));
+      break;
+   case VKI_RTC_IRQP_READ:
+      PRE_MEM_WRITE( "ioctl(RTC_IRQP_READ)", ARG3, sizeof(unsigned long));
+      break;
+
+      /* Block devices */
+   case VKI_BLKROSET:
+      PRE_MEM_READ( "ioctl(BLKROSET)", ARG3, sizeof(int));
+      break;
+   case VKI_BLKROGET:
+      PRE_MEM_WRITE( "ioctl(BLKROGET)", ARG3, sizeof(int));
+      break;
+   case VKI_BLKGETSIZE:
+      PRE_MEM_WRITE( "ioctl(BLKGETSIZE)", ARG3, sizeof(unsigned long));
+      break;
+   case VKI_BLKRASET:
+      break;
+   case VKI_BLKRAGET:
+      PRE_MEM_WRITE( "ioctl(BLKRAGET)", ARG3, sizeof(long));
+      break;
+   case VKI_BLKFRASET:
+      break;
+   case VKI_BLKFRAGET:
+      PRE_MEM_WRITE( "ioctl(BLKFRAGET)", ARG3, sizeof(long));
+      break;
+   case VKI_BLKSECTGET:
+      PRE_MEM_WRITE( "ioctl(BLKSECTGET)", ARG3, sizeof(unsigned short));
+      break;
+   case VKI_BLKSSZGET:
+      PRE_MEM_WRITE( "ioctl(BLKSSZGET)", ARG3, sizeof(int));
+      break;
+   case VKI_BLKBSZGET:
+      PRE_MEM_WRITE( "ioctl(BLKBSZGET)", ARG3, sizeof(int));
+      break;
+   case VKI_BLKBSZSET:
+      PRE_MEM_READ( "ioctl(BLKBSZSET)", ARG3, sizeof(int));
+      break;
+   case VKI_BLKGETSIZE64:
+      PRE_MEM_WRITE( "ioctl(BLKGETSIZE64)", ARG3, sizeof(unsigned long long));
+      break;
+
+      /* Hard disks */
+   case VKI_HDIO_GETGEO: /* 0x0301 */
+      PRE_MEM_WRITE( "ioctl(HDIO_GETGEO)", ARG3, sizeof(struct vki_hd_geometry));
+      break;
+   case VKI_HDIO_GET_DMA: /* 0x030b */
+      PRE_MEM_WRITE( "ioctl(HDIO_GET_DMA)", ARG3, sizeof(long));
+      break;
+   case VKI_HDIO_GET_IDENTITY: /* 0x030d */
+      PRE_MEM_WRITE( "ioctl(HDIO_GET_IDENTITY)", ARG3,
+                     VKI_SIZEOF_STRUCT_HD_DRIVEID );
+      break;
+
+      /* CD ROM stuff (??)  */
+   case VKI_CDROM_GET_MCN:
+      PRE_MEM_READ( "ioctl(CDROM_GET_MCN)", ARG3,
+                    sizeof(struct vki_cdrom_mcn) );
+      break;
+   case VKI_CDROM_SEND_PACKET:
+      PRE_MEM_READ( "ioctl(CDROM_SEND_PACKET)", ARG3,
+                    sizeof(struct vki_cdrom_generic_command));
+      break;
+   case VKI_CDROMSUBCHNL:
+      PRE_MEM_READ( "ioctl(CDROMSUBCHNL (cdsc_format, char))",
+                   (Addr) &(((struct vki_cdrom_subchnl*) ARG3)->cdsc_format),
+                   sizeof(((struct vki_cdrom_subchnl*) ARG3)->cdsc_format));
+      PRE_MEM_WRITE( "ioctl(CDROMSUBCHNL)", ARG3, 
+                    sizeof(struct vki_cdrom_subchnl));
+      break;
+   case VKI_CDROMREADMODE2:
+      PRE_MEM_READ( "ioctl(CDROMREADMODE2)", ARG3, VKI_CD_FRAMESIZE_RAW0 );
+      break;
+   case VKI_CDROMREADTOCHDR:
+      PRE_MEM_WRITE( "ioctl(CDROMREADTOCHDR)", ARG3, 
+                    sizeof(struct vki_cdrom_tochdr));
+      break;
+   case VKI_CDROMREADTOCENTRY:
+      PRE_MEM_READ( "ioctl(CDROMREADTOCENTRY (cdte_format, char))",
+                   (Addr) &(((struct vki_cdrom_tocentry*) ARG3)->cdte_format),
+                   sizeof(((struct vki_cdrom_tocentry*) ARG3)->cdte_format));
+      PRE_MEM_READ( "ioctl(CDROMREADTOCENTRY (cdte_track, char))",
+                   (Addr) &(((struct vki_cdrom_tocentry*) ARG3)->cdte_track), 
+                   sizeof(((struct vki_cdrom_tocentry*) ARG3)->cdte_track));
+      PRE_MEM_WRITE( "ioctl(CDROMREADTOCENTRY)", ARG3, 
+                    sizeof(struct vki_cdrom_tocentry));
+      break;
+   case VKI_CDROMMULTISESSION: /* 0x5310 */
+      PRE_MEM_WRITE( "ioctl(CDROMMULTISESSION)", ARG3,
+                    sizeof(struct vki_cdrom_multisession));
+      break;
+   case VKI_CDROMVOLREAD: /* 0x5313 */
+      PRE_MEM_WRITE( "ioctl(CDROMVOLREAD)", ARG3,
+                    sizeof(struct vki_cdrom_volctrl));
+      break;
+   case VKI_CDROMREADRAW: /* 0x5314 */
+      PRE_MEM_READ( "ioctl(CDROMREADRAW)", ARG3, sizeof(struct vki_cdrom_msf));
+      PRE_MEM_WRITE( "ioctl(CDROMREADRAW)", ARG3, VKI_CD_FRAMESIZE_RAW);
+      break;
+   case VKI_CDROMREADAUDIO: /* 0x530e */
+      PRE_MEM_READ( "ioctl(CDROMREADAUDIO)", ARG3,
+                    sizeof (struct vki_cdrom_read_audio));
+      if ( ARG3 ) {
+         /* ToDo: don't do any of the following if the structure is invalid */
+         struct vki_cdrom_read_audio *cra = (struct vki_cdrom_read_audio *) ARG3;
+        PRE_MEM_WRITE( "ioctl(CDROMREADAUDIO).buf",
+                       (Addr)(cra->buf), cra->nframes * VKI_CD_FRAMESIZE_RAW);
+      }
+      break;      
+   case VKI_CDROMPLAYMSF:
+      PRE_MEM_READ( "ioctl(CDROMPLAYMSF)", ARG3, sizeof(struct vki_cdrom_msf));
+      break;
+      /* The following two are probably bogus (should check args
+        for readability).  JRS 20021117 */
+   case VKI_CDROM_DRIVE_STATUS: /* 0x5326 */
+   case VKI_CDROM_CLEAR_OPTIONS: /* 0x5321 */
+      break;
+
+   case VKI_FIGETBSZ:
+      PRE_MEM_WRITE( "ioctl(FIGETBSZ)", ARG3, sizeof(unsigned long));
+      break;
+   case VKI_FIBMAP:
+      PRE_MEM_READ( "ioctl(FIBMAP)", ARG3, sizeof(unsigned long));
+      break;
+
+   case VKI_FBIOGET_VSCREENINFO: /* 0x4600 */
+      PRE_MEM_WRITE( "ioctl(FBIOGET_VSCREENINFO)", ARG3,
+                     sizeof(struct vki_fb_var_screeninfo));
+      break;
+   case VKI_FBIOGET_FSCREENINFO: /* 0x4602 */
+      PRE_MEM_WRITE( "ioctl(FBIOGET_FSCREENINFO)", ARG3,
+                     sizeof(struct vki_fb_fix_screeninfo));
+      break;
+
+   case VKI_PPCLAIM:
+   case VKI_PPEXCL:
+   case VKI_PPYIELD:
+   case VKI_PPRELEASE:
+      break;
+   case VKI_PPSETMODE:
+      PRE_MEM_READ( "ioctl(PPSETMODE)",   ARG3, sizeof(int) );
+      break;
+   case VKI_PPGETMODE:
+      PRE_MEM_WRITE( "ioctl(PPGETMODE)",  ARG3, sizeof(int) );
+      break;
+   case VKI_PPSETPHASE:
+      PRE_MEM_READ(  "ioctl(PPSETPHASE)", ARG3, sizeof(int) );
+      break;
+   case VKI_PPGETPHASE:
+      PRE_MEM_WRITE( "ioctl(PPGETPHASE)", ARG3, sizeof(int) );
+      break;
+   case VKI_PPGETMODES:
+      PRE_MEM_WRITE( "ioctl(PPGETMODES)", ARG3, sizeof(unsigned int) );
+      break;
+   case VKI_PPSETFLAGS:
+      PRE_MEM_READ(  "ioctl(PPSETFLAGS)", ARG3, sizeof(int) );
+      break;
+   case VKI_PPGETFLAGS:
+      PRE_MEM_WRITE( "ioctl(PPGETFLAGS)", ARG3, sizeof(int) );
+      break;
+   case VKI_PPRSTATUS:
+      PRE_MEM_WRITE( "ioctl(PPRSTATUS)",  ARG3, sizeof(unsigned char) );
+      break;
+   case VKI_PPRDATA:
+      PRE_MEM_WRITE( "ioctl(PPRDATA)",    ARG3, sizeof(unsigned char) );
+      break;
+   case VKI_PPRCONTROL:
+      PRE_MEM_WRITE( "ioctl(PPRCONTROL)", ARG3, sizeof(unsigned char) );
+      break;
+   case VKI_PPWDATA:
+      PRE_MEM_READ(  "ioctl(PPWDATA)",    ARG3, sizeof(unsigned char) );
+      break;
+   case VKI_PPWCONTROL:
+      PRE_MEM_READ(  "ioctl(PPWCONTROL)", ARG3, sizeof(unsigned char) );
+      break;
+   case VKI_PPFCONTROL:
+      PRE_MEM_READ(  "ioctl(PPFCONTROL)", ARG3, 2 * sizeof(unsigned char) );
+      break;
+   case VKI_PPDATADIR:
+      PRE_MEM_READ(  "ioctl(PPDATADIR)",  ARG3, sizeof(int) );
+      break;
+   case VKI_PPNEGOT:
+      PRE_MEM_READ(  "ioctl(PPNEGOT)",    ARG3, sizeof(int) );
+      break;
+   case VKI_PPWCTLONIRQ:
+      PRE_MEM_READ(  "ioctl(PPWCTLONIRQ)",ARG3, sizeof(unsigned char) );
+      break;
+   case VKI_PPCLRIRQ:
+      PRE_MEM_WRITE( "ioctl(PPCLRIRQ)",   ARG3, sizeof(int) );
+      break;
+   case VKI_PPSETTIME:
+      PRE_MEM_READ(  "ioctl(PPSETTIME)",  ARG3, sizeof(struct vki_timeval) );
+      break;
+   case VKI_PPGETTIME:
+      PRE_MEM_WRITE( "ioctl(PPGETTIME)",  ARG3, sizeof(struct vki_timeval) );
+      break;
+
+   case VKI_GIO_FONT:
+      PRE_MEM_WRITE( "ioctl(GIO_FONT)", ARG3, 32 * 256 );
+      break;
+   case VKI_PIO_FONT:
+      PRE_MEM_READ( "ioctl(PIO_FONT)", ARG3, 32 * 256 );
+      break;
+
+   case VKI_GIO_FONTX:
+      PRE_MEM_READ( "ioctl(GIO_FONTX)", ARG3, sizeof(struct vki_consolefontdesc) );
+      if ( ARG3 ) {
+         /* ToDo: don't do any of the following if the structure is invalid */
+         struct vki_consolefontdesc *cfd = (struct vki_consolefontdesc *)ARG3;
+         PRE_MEM_WRITE( "ioctl(GIO_FONTX).chardata", (Addr)cfd->chardata,
+                        32 * cfd->charcount );
+      }
+      break;
+   case VKI_PIO_FONTX:
+      PRE_MEM_READ( "ioctl(PIO_FONTX)", ARG3, sizeof(struct vki_consolefontdesc) );
+      if ( ARG3 ) {
+         /* ToDo: don't do any of the following if the structure is invalid */
+         struct vki_consolefontdesc *cfd = (struct vki_consolefontdesc *)ARG3;
+         PRE_MEM_READ( "ioctl(PIO_FONTX).chardata", (Addr)cfd->chardata,
+                       32 * cfd->charcount );
+      }
+      break;
+
+   case VKI_PIO_FONTRESET:
+      break;
+
+   case VKI_GIO_CMAP:
+      PRE_MEM_WRITE( "ioctl(GIO_CMAP)", ARG3, 16 * 3 );
+      break;
+   case VKI_PIO_CMAP:
+      PRE_MEM_READ( "ioctl(PIO_CMAP)", ARG3, 16 * 3 );
+      break;
+
+   case VKI_KIOCSOUND:
+   case VKI_KDMKTONE:
+      break;
+
+   case VKI_KDGETLED:
+      PRE_MEM_WRITE( "ioctl(KDGETLED)", ARG3, sizeof(char) );
+      break;
+   case VKI_KDSETLED:
+      break;
+
+   case VKI_KDGKBTYPE:
+      PRE_MEM_WRITE( "ioctl(KDGKBTYPE)", ARG3, sizeof(char) );
+      break;
+
+   case VKI_KDADDIO:
+   case VKI_KDDELIO:
+   case VKI_KDENABIO:
+   case VKI_KDDISABIO:
+      break;
+
+   case VKI_KDSETMODE:
+      break;
+   case VKI_KDGETMODE:
+      PRE_MEM_WRITE( "ioctl(KDGETMODE)", ARG3, sizeof(int) );
+      break;
+
+   case VKI_KDMAPDISP:
+   case VKI_KDUNMAPDISP:
+      break;
+
+   case VKI_GIO_SCRNMAP:
+      PRE_MEM_WRITE( "ioctl(GIO_SCRNMAP)", ARG3, VKI_E_TABSZ );
+      break;
+   case VKI_PIO_SCRNMAP:
+      PRE_MEM_READ( "ioctl(PIO_SCRNMAP)", ARG3, VKI_E_TABSZ  );
+      break;
+   case VKI_GIO_UNISCRNMAP:
+      PRE_MEM_WRITE( "ioctl(GIO_UNISCRNMAP)", ARG3,
+                     VKI_E_TABSZ * sizeof(unsigned short) );
+      break;
+   case VKI_PIO_UNISCRNMAP:
+      PRE_MEM_READ( "ioctl(PIO_UNISCRNMAP)", ARG3,
+                    VKI_E_TABSZ * sizeof(unsigned short) );
+      break;
+
+   case VKI_GIO_UNIMAP:
+      if ( ARG3 ) {
+         struct vki_unimapdesc *desc = (struct vki_unimapdesc *) ARG3;
+         PRE_MEM_READ( "ioctl(GIO_UNIMAP)", (Addr)&desc->entry_ct,
+                       sizeof(unsigned short));
+         PRE_MEM_READ( "ioctl(GIO_UNIMAP)", (Addr)&desc->entries,
+                       sizeof(struct vki_unipair *));
+         PRE_MEM_WRITE( "ioctl(GIO_UNIMAP).entries", (Addr)desc->entries,
+                        desc->entry_ct * sizeof(struct vki_unipair));
+      }
+      break;
+   case VKI_PIO_UNIMAP:
+      if ( ARG3 ) {
+         struct vki_unimapdesc *desc = (struct vki_unimapdesc *) ARG3;
+         PRE_MEM_READ( "ioctl(GIO_UNIMAP)", (Addr)&desc->entry_ct,
+                       sizeof(unsigned short) );
+         PRE_MEM_READ( "ioctl(GIO_UNIMAP)", (Addr)&desc->entries,
+                       sizeof(struct vki_unipair *) );
+         PRE_MEM_READ( "ioctl(PIO_UNIMAP).entries", (Addr)desc->entries,
+                       desc->entry_ct * sizeof(struct vki_unipair) );
+      }
+      break;
+   case VKI_PIO_UNIMAPCLR:
+      PRE_MEM_READ( "ioctl(GIO_UNIMAP)", ARG3, sizeof(struct vki_unimapinit));
+      break;
+
+   case VKI_KDGKBMODE:
+      PRE_MEM_WRITE( "ioctl(KDGKBMODE)", ARG3, sizeof(int) );
+      break;
+   case VKI_KDSKBMODE:
+      break;
+      
+   case VKI_KDGKBMETA:
+      PRE_MEM_WRITE( "ioctl(KDGKBMETA)", ARG3, sizeof(int) );
+      break;
+   case VKI_KDSKBMETA:
+      break;
+      
+   case VKI_KDGKBLED:
+      PRE_MEM_WRITE( "ioctl(KDGKBLED)", ARG3, sizeof(char) );
+      break;
+   case VKI_KDSKBLED:
+      break;
+      
+   case VKI_KDGKBENT:
+      PRE_MEM_READ( "ioctl(KDGKBENT).kb_table",
+                    (Addr)&((struct vki_kbentry *)ARG3)->kb_table,
+                    sizeof(((struct vki_kbentry *)ARG3)->kb_table) );
+      PRE_MEM_READ( "ioctl(KDGKBENT).kb_index",
+                    (Addr)&((struct vki_kbentry *)ARG3)->kb_index,
+                    sizeof(((struct vki_kbentry *)ARG3)->kb_index) );
+      PRE_MEM_WRITE( "ioctl(KDGKBENT).kb_value",
+                    (Addr)&((struct vki_kbentry *)ARG3)->kb_value,
+                    sizeof(((struct vki_kbentry *)ARG3)->kb_value) );
+      break;
+   case VKI_KDSKBENT:
+      PRE_MEM_READ( "ioctl(KDSKBENT).kb_table",
+                    (Addr)&((struct vki_kbentry *)ARG3)->kb_table,
+                    sizeof(((struct vki_kbentry *)ARG3)->kb_table) );
+      PRE_MEM_READ( "ioctl(KDSKBENT).kb_index",
+                    (Addr)&((struct vki_kbentry *)ARG3)->kb_index,
+                    sizeof(((struct vki_kbentry *)ARG3)->kb_index) );
+      PRE_MEM_READ( "ioctl(KDSKBENT).kb_value",
+                    (Addr)&((struct vki_kbentry *)ARG3)->kb_value,
+                    sizeof(((struct vki_kbentry *)ARG3)->kb_value) );
+      break;
+      
+   case VKI_KDGKBSENT:
+      PRE_MEM_READ( "ioctl(KDGKBSENT).kb_func",
+                    (Addr)&((struct vki_kbsentry *)ARG3)->kb_func,
+                    sizeof(((struct vki_kbsentry *)ARG3)->kb_func) );
+      PRE_MEM_WRITE( "ioctl(KDGKSENT).kb_string",
+                    (Addr)((struct vki_kbsentry *)ARG3)->kb_string,
+                    sizeof(((struct vki_kbsentry *)ARG3)->kb_string) );
+      break;
+   case VKI_KDSKBSENT:
+      PRE_MEM_READ( "ioctl(KDSKBSENT).kb_func",
+                    (Addr)&((struct vki_kbsentry *)ARG3)->kb_func,
+                    sizeof(((struct vki_kbsentry *)ARG3)->kb_func) );
+      PRE_MEM_RASCIIZ( "ioctl(KDSKBSENT).kb_string",
+                       (Addr)((struct vki_kbsentry *)ARG3)->kb_string );
+      break;
+      
+   case VKI_KDGKBDIACR:
+      PRE_MEM_WRITE( "ioctl(KDGKBDIACR)", ARG3, sizeof(struct vki_kbdiacrs) );
+      break;
+   case VKI_KDSKBDIACR:
+      PRE_MEM_READ( "ioctl(KDSKBDIACR)", ARG3, sizeof(struct vki_kbdiacrs) );
+      break;
+      
+   case VKI_KDGETKEYCODE:
+      PRE_MEM_READ( "ioctl(KDGETKEYCODE).scancode",
+                    (Addr)&((struct vki_kbkeycode *)ARG3)->scancode,
+                    sizeof(((struct vki_kbkeycode *)ARG3)->scancode) );
+      PRE_MEM_WRITE( "ioctl(KDGETKEYCODE).keycode",
+                    (Addr)((struct vki_kbkeycode *)ARG3)->keycode,
+                    sizeof(((struct vki_kbkeycode *)ARG3)->keycode) );
+      break;
+   case VKI_KDSETKEYCODE:
+      PRE_MEM_READ( "ioctl(KDSETKEYCODE).scancode",
+                    (Addr)&((struct vki_kbkeycode *)ARG3)->scancode,
+                    sizeof(((struct vki_kbkeycode *)ARG3)->scancode) );
+      PRE_MEM_READ( "ioctl(KDSETKEYCODE).keycode",
+                    (Addr)((struct vki_kbkeycode *)ARG3)->keycode,
+                    sizeof(((struct vki_kbkeycode *)ARG3)->keycode) );
+      break;
+      
+   case VKI_KDSIGACCEPT:
+      break;
+
+   case VKI_KDKBDREP:
+      PRE_MEM_READ( "ioctl(KBKBDREP)", ARG3, sizeof(struct vki_kbd_repeat) );
+      break;
+
+   case VKI_KDFONTOP:
+      if ( ARG3 ) {
+         struct vki_console_font_op *op = (struct vki_console_font_op *) ARG3;
+         PRE_MEM_READ( "ioctl(KDFONTOP)", (Addr)op,
+                       sizeof(struct vki_console_font_op) );
+         switch ( op->op ) {
+            case VKI_KD_FONT_OP_SET:
+               PRE_MEM_READ( "ioctl(KDFONTOP,KD_FONT_OP_SET).data",
+                             (Addr)op->data,
+                             (op->width + 7) / 8 * 32 * op->charcount );
+               break;
+            case VKI_KD_FONT_OP_GET:
+               if ( op->data )
+                  PRE_MEM_WRITE( "ioctl(KDFONTOP,KD_FONT_OP_GET).data",
+                                 (Addr)op->data,
+                                 (op->width + 7) / 8 * 32 * op->charcount );
+               break;
+            case VKI_KD_FONT_OP_SET_DEFAULT:
+               if ( op->data )
+                  PRE_MEM_RASCIIZ( "ioctl(KDFONTOP,KD_FONT_OP_SET_DEFAULT).data",
+                                   (Addr)op->data );
+               break;
+            case VKI_KD_FONT_OP_COPY:
+               break;
+         }
+      }
+      break;
+
+   case VKI_VT_OPENQRY:
+      PRE_MEM_WRITE( "ioctl(VT_OPENQRY)", ARG3, sizeof(int) );
+      break;
+   case VKI_VT_GETMODE:
+      PRE_MEM_WRITE( "ioctl(VT_GETMODE)", ARG3, sizeof(struct vki_vt_mode) );
+      break;
+   case VKI_VT_SETMODE:
+      PRE_MEM_READ( "ioctl(VT_SETMODE)", ARG3, sizeof(struct vki_vt_mode) );
+      break;
+   case VKI_VT_GETSTATE:
+      PRE_MEM_READ( "ioctl(VT_GETSTATE)", ARG3, sizeof(struct vki_vt_stat) );
+      PRE_MEM_WRITE( "ioctl(VT_GETSTATE).v_active",
+                     (Addr) &(((struct vki_vt_stat*) ARG3)->v_active),
+                     sizeof(((struct vki_vt_stat*) ARG3)->v_active));
+      PRE_MEM_WRITE( "ioctl(VT_GETSTATE).v_state",
+                     (Addr) &(((struct vki_vt_stat*) ARG3)->v_state),
+                     sizeof(((struct vki_vt_stat*) ARG3)->v_state));
+      break;
+   case VKI_VT_RELDISP:
+   case VKI_VT_ACTIVATE:
+   case VKI_VT_WAITACTIVE:
+   case VKI_VT_DISALLOCATE:
+      break;
+   case VKI_VT_RESIZE:
+      PRE_MEM_READ( "ioctl(VT_RESIZE)", ARG3, sizeof(struct vki_vt_sizes) );
+      break;
+   case VKI_VT_RESIZEX:
+      PRE_MEM_READ( "ioctl(VT_RESIZEX)", ARG3, sizeof(struct vki_vt_consize) );
+      break;
+   case VKI_VT_LOCKSWITCH:
+   case VKI_VT_UNLOCKSWITCH:
+      break;
+
+   case VKI_USBDEVFS_CONTROL:
+      if ( ARG3 ) {
+         struct vki_usbdevfs_ctrltransfer *vkuc = (struct vki_usbdevfs_ctrltransfer *)ARG3;
+         PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).bRequestType", (Addr)&vkuc->bRequestType, sizeof(vkuc->bRequestType));
+         PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).bRequest", (Addr)&vkuc->bRequest, sizeof(vkuc->bRequest));
+         PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).wValue", (Addr)&vkuc->wValue, sizeof(vkuc->wValue));
+         PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).wIndex", (Addr)&vkuc->wIndex, sizeof(vkuc->wIndex));
+         PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).wLength", (Addr)&vkuc->wLength, sizeof(vkuc->wLength));
+         PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).timeout", (Addr)&vkuc->timeout, sizeof(vkuc->timeout));
+         if (vkuc->bRequestType & 0x80)
+            PRE_MEM_WRITE( "ioctl(USBDEVFS_CONTROL).data", (Addr)vkuc->data, vkuc->wLength);
+         else
+            PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).data", (Addr)vkuc->data, vkuc->wLength);
+      }
+      break;
+   case VKI_USBDEVFS_BULK:
+      if ( ARG3 ) {
+         struct vki_usbdevfs_bulktransfer *vkub = (struct vki_usbdevfs_bulktransfer *)ARG3;
+         PRE_MEM_READ( "ioctl(USBDEVFS_BULK)", ARG3, sizeof(struct vki_usbdevfs_bulktransfer));
+         if (vkub->ep & 0x80)
+            PRE_MEM_WRITE( "ioctl(USBDEVFS_BULK).data", (Addr)vkub->data, vkub->len);
+         else
+            PRE_MEM_READ( "ioctl(USBDEVFS_BULK).data", (Addr)vkub->data, vkub->len);
+         break;
+      }
+   case VKI_USBDEVFS_GETDRIVER:
+      if ( ARG3 ) {
+         struct vki_usbdevfs_getdriver *vkugd = (struct vki_usbdevfs_getdriver *) ARG3;
+         PRE_MEM_WRITE( "ioctl(USBDEVFS_GETDRIVER)", (Addr)&vkugd->driver, sizeof(vkugd->driver));
+         break;
+      }
+   case VKI_USBDEVFS_SUBMITURB:
+      if ( ARG3 ) {
+         struct vki_usbdevfs_urb *vkuu = (struct vki_usbdevfs_urb *)ARG3;
+
+         /* Not the whole struct needs to be initialized */
+         PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).ep", (Addr)&vkuu->endpoint, sizeof(vkuu->endpoint));
+         PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).type", (Addr)&vkuu->type, sizeof(vkuu->type));
+         PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).flags", (Addr)&vkuu->flags, sizeof(vkuu->flags));
+         PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer", (Addr)&vkuu->buffer, sizeof(vkuu->buffer));
+         PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer_length", (Addr)&vkuu->buffer_length, sizeof(vkuu->buffer_length));
+         PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).usercontext", (Addr)&vkuu->usercontext, sizeof(vkuu->usercontext));
+         if (vkuu->endpoint & 0x80)
+            PRE_MEM_WRITE( "ioctl(USBDEVFS_URB).buffer", (Addr)vkuu->buffer, vkuu->buffer_length);
+         else
+            PRE_MEM_READ( "ioctl(USBDEVFS_URB).buffer", (Addr)vkuu->buffer, vkuu->buffer_length);
+         /* FIXME: Does not handle all cases this ioctl can do, ISOs are missing. */
+         break;
+      }
+   case VKI_USBDEVFS_REAPURB:
+   case VKI_USBDEVFS_REAPURBNDELAY:
+      if ( ARG3 ) {
+         PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB)", ARG3, sizeof(struct vki_usbdevfs_urb *));
+         break;
+      }
+   case VKI_USBDEVFS_CONNECTINFO:
+      PRE_MEM_WRITE( "ioctl(USBDEVFS_CONNECTINFO)", ARG3, sizeof(struct vki_usbdevfs_connectinfo));
+      break;
+   case VKI_USBDEVFS_IOCTL:
+      if ( ARG3 ) {
+         struct vki_usbdevfs_ioctl *vkui = (struct vki_usbdevfs_ioctl *)ARG3;
+         UInt dir2, size2;
+         PRE_MEM_READ("ioctl(USBDEVFS_IOCTL)", (Addr)vkui, sizeof(struct vki_usbdevfs_ioctl));
+         dir2  = _VKI_IOC_DIR(vkui->ioctl_code);
+         size2 = _VKI_IOC_SIZE(vkui->ioctl_code);
+         if (size2 > 0) {
+            if (dir2 & _VKI_IOC_WRITE)
+               PRE_MEM_READ("ioctl(USBDEVFS_IOCTL).dataWrite", (Addr)vkui->data, size2);
+            else if (dir2 & _VKI_IOC_READ)
+               PRE_MEM_WRITE("ioctl(USBDEVFS_IOCTL).dataRead", (Addr)vkui->data, size2);
+         }
+      }
+      break;
+
+      /* I2C (/dev/i2c-*) ioctls */
+   case VKI_I2C_SLAVE:
+   case VKI_I2C_SLAVE_FORCE:
+   case VKI_I2C_TENBIT:
+   case VKI_I2C_PEC:
+      break;
+   case VKI_I2C_FUNCS:
+      PRE_MEM_WRITE( "ioctl(I2C_FUNCS)", ARG3, sizeof(unsigned long) );
+      break;
+
+      /* Wireless extensions ioctls */
+   case VKI_SIOCSIWCOMMIT:
+   case VKI_SIOCSIWNWID:
+   case VKI_SIOCSIWFREQ:
+   case VKI_SIOCSIWMODE:
+   case VKI_SIOCSIWSENS:
+   case VKI_SIOCSIWRANGE:
+   case VKI_SIOCSIWPRIV:
+   case VKI_SIOCSIWSTATS:
+   case VKI_SIOCSIWSPY:
+   case VKI_SIOCSIWTHRSPY:
+   case VKI_SIOCSIWAP:
+   case VKI_SIOCSIWSCAN:
+   case VKI_SIOCSIWESSID:
+   case VKI_SIOCSIWRATE:
+   case VKI_SIOCSIWNICKN:
+   case VKI_SIOCSIWRTS:
+   case VKI_SIOCSIWFRAG:
+   case VKI_SIOCSIWTXPOW:
+   case VKI_SIOCSIWRETRY:
+   case VKI_SIOCSIWENCODE:
+   case VKI_SIOCSIWPOWER:
+   case VKI_SIOCSIWGENIE:
+   case VKI_SIOCSIWMLME:
+   case VKI_SIOCSIWAUTH:
+   case VKI_SIOCSIWENCODEEXT:
+   case VKI_SIOCSIWPMKSA:
+      break;
+   case VKI_SIOCGIWNAME:
+      if (ARG3) {
+         PRE_MEM_WRITE("ioctl(SIOCGIWNAME)",
+                       (Addr)((struct vki_iwreq *)ARG3)->u.name,
+                       sizeof(((struct vki_iwreq *)ARG3)->u.name));
+      }
+      break;
+   case VKI_SIOCGIWNWID:
+   case VKI_SIOCGIWSENS:
+   case VKI_SIOCGIWRATE:
+   case VKI_SIOCGIWRTS:
+   case VKI_SIOCGIWFRAG:
+   case VKI_SIOCGIWTXPOW:
+   case VKI_SIOCGIWRETRY:
+   case VKI_SIOCGIWPOWER:
+   case VKI_SIOCGIWAUTH:
+      if (ARG3) {
+         PRE_MEM_WRITE("ioctl(SIOCGIW[NWID|SENS|RATE|RTS|FRAG|TXPOW|"
+                       "RETRY|PARAM|AUTH])",
+                       (Addr)&((struct vki_iwreq *)ARG3)->u.nwid,
+                       sizeof(struct vki_iw_param));
+      }
+      break;
+   case VKI_SIOCGIWFREQ:
+      if (ARG3) {
+         PRE_MEM_WRITE("ioctl(SIOCGIWFREQ",
+                       (Addr)&((struct vki_iwreq *)ARG3)->u.freq,
+                       sizeof(struct vki_iw_freq));
+      }
+      break;
+   case VKI_SIOCGIWMODE:
+      if (ARG3) {
+         PRE_MEM_WRITE("ioctl(SIOCGIWMODE",
+                       (Addr)&((struct vki_iwreq *)ARG3)->u.mode,
+                       sizeof(__vki_u32));
+      }
+      break;
+   case VKI_SIOCGIWRANGE:
+   case VKI_SIOCGIWPRIV:
+   case VKI_SIOCGIWSTATS:
+   case VKI_SIOCGIWSPY:
+   case VKI_SIOCGIWTHRSPY:
+   case VKI_SIOCGIWAPLIST:
+   case VKI_SIOCGIWSCAN:
+   case VKI_SIOCGIWESSID:
+   case VKI_SIOCGIWNICKN:
+   case VKI_SIOCGIWENCODE:
+   case VKI_SIOCGIWGENIE:
+   case VKI_SIOCGIWENCODEEXT:
+      if (ARG3) {
+         struct vki_iw_point* point;
+         point = &((struct vki_iwreq *)ARG3)->u.data;
+         PRE_MEM_WRITE("ioctl(SIOCGIW[RANGE|PRIV|STATS|SPY|THRSPY|"
+                       "APLIST|SCAN|ESSID|NICKN|ENCODE|GENIE|ENCODEEXT])",
+                       (Addr)point->pointer, point->length);
+      }
+      break;
+   case VKI_SIOCGIWAP:
+      if (ARG3) {
+         PRE_MEM_WRITE("ioctl(SIOCGIWAP)",
+                       (Addr)&((struct vki_iwreq *)ARG3)->u.ap_addr,
+                       sizeof(struct vki_sockaddr));
+      }
+      break;
+
+      /* We don't have any specific information on it, so
+        try to do something reasonable based on direction and
+        size bits.  The encoding scheme is described in
+        /usr/include/asm/ioctl.h.  
+
+        According to Simon Hausmann, _IOC_READ means the kernel
+        writes a value to the ioctl value passed from the user
+        space and the other way around with _IOC_WRITE. */
+   default: {
+      UInt dir  = _VKI_IOC_DIR(ARG2);
+      UInt size = _VKI_IOC_SIZE(ARG2);
+      if (VG_(strstr)(VG_(clo_sim_hints), "lax-ioctls") != NULL) {
+        /* 
+         * Be very lax about ioctl handling; the only
+         * assumption is that the size is correct. Doesn't
+         * require the full buffer to be initialized when
+         * writing.  Without this, using some device
+         * drivers with a large number of strange ioctl
+         * commands becomes very tiresome.
+         */
+      } else if (/* size == 0 || */ dir == _VKI_IOC_NONE) {
+        static Int moans = 3;
+        if (moans > 0 && !VG_(clo_xml)) {
+           moans--;
+           VG_(message)(Vg_UserMsg, 
+                        "Warning: noted but unhandled ioctl 0x%lx"
+                        " with no size/direction hints",
+                        ARG2); 
+           VG_(message)(Vg_UserMsg, 
+                        "   This could cause spurious value errors"
+                        " to appear.");
+           VG_(message)(Vg_UserMsg, 
+                        "   See README_MISSING_SYSCALL_OR_IOCTL for "
+                        "guidance on writing a proper wrapper." );
+        }
+      } else {
+        if ((dir & _VKI_IOC_WRITE) && size > 0)
+           PRE_MEM_READ( "ioctl(generic)", ARG3, size);
+        if ((dir & _VKI_IOC_READ) && size > 0)
+           PRE_MEM_WRITE( "ioctl(generic)", ARG3, size);
+      }
+      break;
+   }
+   }   
+}
+
+POST(sys_ioctl)
+{
+   vg_assert(SUCCESS);
+   switch (ARG2 /* request */) {
+   case VKI_TCSETS:
+   case VKI_TCSETSW:
+   case VKI_TCSETSF:
+      break; 
+   case VKI_TCGETS:
+      POST_MEM_WRITE( ARG3, sizeof(struct vki_termios) );
+      break;
+   case VKI_TCSETA:
+   case VKI_TCSETAW:
+   case VKI_TCSETAF:
+      break;
+   case VKI_TCGETA:
+      POST_MEM_WRITE( ARG3, sizeof(struct vki_termio) );
+      break;
+   case VKI_TCSBRK:
+   case VKI_TCXONC:
+   case VKI_TCSBRKP:
+   case VKI_TCFLSH:
+      break;
+   case VKI_TIOCGWINSZ:
+      POST_MEM_WRITE( ARG3, sizeof(struct vki_winsize) );
+      break;
+   case VKI_TIOCSWINSZ:
+   case VKI_TIOCMBIS:
+   case VKI_TIOCMBIC:
+   case VKI_TIOCMSET:
+      break;
+   case VKI_TIOCMGET:
+      POST_MEM_WRITE( ARG3, sizeof(unsigned int) );
+      break;
+   case VKI_TIOCLINUX:
+      POST_MEM_WRITE( ARG3, sizeof(char *) );
+      break;
+   case VKI_TIOCGPGRP:
+      /* Get process group ID for foreground processing group. */
+      POST_MEM_WRITE( ARG3, sizeof(vki_pid_t) );
+      break;
+   case VKI_TIOCSPGRP:
+      /* Set a process group ID? */
+      POST_MEM_WRITE( ARG3, sizeof(vki_pid_t) );
+      break;
+   case VKI_TIOCGPTN: /* Get Pty Number (of pty-mux device) */
+      POST_MEM_WRITE( ARG3, sizeof(int));
+      break;
+   case VKI_TIOCSCTTY:
+      break;
+   case VKI_TIOCSPTLCK: /* Lock/unlock Pty */
+      break;
+   case VKI_FIONBIO:
+      break;
+   case VKI_FIOASYNC:
+      break;
+   case VKI_FIONREAD:                /* identical to SIOCINQ */
+      POST_MEM_WRITE( ARG3, sizeof(int) );
+      break;
+
+   case VKI_TIOCSERGETLSR:
+      POST_MEM_WRITE( ARG3, sizeof(int) );
+      break;
+   case VKI_TIOCGICOUNT:
+      POST_MEM_WRITE( ARG3, sizeof(struct vki_serial_icounter_struct) );
+      break;
+
+   case VKI_SG_SET_COMMAND_Q:
+      break;
+   case VKI_SG_IO:
+      POST_MEM_WRITE(ARG3, sizeof(vki_sg_io_hdr_t));
+      break;
+   case VKI_SG_GET_SCSI_ID:
+      POST_MEM_WRITE(ARG3, sizeof(vki_sg_scsi_id_t));
+      break;
+   case VKI_SG_SET_RESERVED_SIZE:
+      break;
+   case VKI_SG_SET_TIMEOUT:
+      break;
+   case VKI_SG_GET_RESERVED_SIZE:
+      POST_MEM_WRITE(ARG3, sizeof(int));
+      break;
+   case VKI_SG_GET_TIMEOUT:
+      break;
+   case VKI_SG_GET_VERSION_NUM:
+      POST_MEM_WRITE(ARG3, sizeof(int));
+      break;
+   case VKI_SG_EMULATED_HOST:
+      POST_MEM_WRITE(ARG3, sizeof(int));
+      break;
+   case VKI_SG_GET_SG_TABLESIZE:
+      POST_MEM_WRITE(ARG3, sizeof(int));
+      break;      
+
+   case VKI_IIOCGETCPS:
+      POST_MEM_WRITE( ARG3, VKI_ISDN_MAX_CHANNELS * 2 * sizeof(unsigned long) );
+      break;
+   case VKI_IIOCNETGPN:
+      POST_MEM_WRITE( ARG3, sizeof(vki_isdn_net_ioctl_phone) );
+      break;
+
+      /* These all use struct ifreq AFAIK */
+   case VKI_SIOCGIFINDEX:        /* get iface index              */
+      POST_MEM_WRITE( (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_ifindex,
+                      sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_ifindex) );
+      break;
+   case VKI_SIOCGIFFLAGS:        /* get flags                    */
+      POST_MEM_WRITE( (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_flags,
+                      sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_flags) );
+      break;
+   case VKI_SIOCGIFHWADDR:       /* Get hardware address         */
+      POST_MEM_WRITE( (Addr)&((struct vki_ifreq *)ARG3)->ifr_hwaddr,
+                      sizeof(((struct vki_ifreq *)ARG3)->ifr_hwaddr) );
+      break;
+   case VKI_SIOCGIFMTU:          /* get MTU size                 */
+      POST_MEM_WRITE( (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_mtu,
+                      sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_mtu) );
+      break;
+   case VKI_SIOCGIFADDR:         /* get PA address               */
+   case VKI_SIOCGIFDSTADDR:      /* get remote PA address        */
+   case VKI_SIOCGIFBRDADDR:      /* get broadcast PA address     */
+   case VKI_SIOCGIFNETMASK:      /* get network PA mask          */
+      POST_MEM_WRITE(
+                (Addr)&((struct vki_ifreq *)ARG3)->ifr_addr,
+                sizeof(((struct vki_ifreq *)ARG3)->ifr_addr) );
+      break;
+   case VKI_SIOCGIFMETRIC:       /* get metric                   */
+      POST_MEM_WRITE(
+                (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_metric,
+                sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_metric) );
+      break;
+   case VKI_SIOCGIFMAP:          /* Get device parameters        */
+      POST_MEM_WRITE(
+                (Addr)&((struct vki_ifreq *)ARG3)->ifr_map,
+                sizeof(((struct vki_ifreq *)ARG3)->ifr_map) );
+      break;
+     break;
+   case VKI_SIOCGIFTXQLEN:       /* Get the tx queue length      */
+      POST_MEM_WRITE(
+                (Addr)&((struct vki_ifreq *)ARG3)->ifr_qlen,
+                sizeof(((struct vki_ifreq *)ARG3)->ifr_qlen) );
+      break;
+   case VKI_SIOCGIFNAME:         /* get iface name               */
+      POST_MEM_WRITE(
+                (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_name,
+                sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_name) );
+      break;
+   case VKI_SIOCGMIIPHY:         /* get hardware entry           */
+      POST_MEM_WRITE(
+                (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id,
+                sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id) );
+      break;
+   case VKI_SIOCGMIIREG:         /* get hardware entry registers */
+      POST_MEM_WRITE(
+                (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->val_out,
+                sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->val_out) );
+      break;
+   case VKI_SIOCGIFCONF:         /* get iface list               */
+      /* WAS:
+        PRE_MEM_WRITE("ioctl(SIOCGIFCONF)", ARG3, sizeof(struct ifconf));
+        KERNEL_DO_SYSCALL(tid,RES);
+        if (!VG_(is_kerror)(RES) && RES == 0)
+        POST_MEM_WRITE(ARG3, sizeof(struct ifconf));
+      */
+      if (RES == 0 && ARG3 ) {
+        struct vki_ifconf *ifc = (struct vki_ifconf *) ARG3;
+        if (ifc->vki_ifc_buf != NULL)
+           POST_MEM_WRITE( (Addr)(ifc->vki_ifc_buf), ifc->ifc_len );
+      }
+      break;
+   case VKI_SIOCGSTAMP:
+      POST_MEM_WRITE( ARG3, sizeof(struct vki_timeval) );
+      break;
+      /* SIOCOUTQ is an ioctl that, when called on a socket, returns
+        the number of bytes currently in that socket's send buffer.
+        It writes this value as an int to the memory location
+        indicated by the third argument of ioctl(2). */
+   case VKI_SIOCOUTQ:
+      POST_MEM_WRITE(ARG3, sizeof(int));
+      break;
+   case VKI_SIOCGRARP:           /* get RARP table entry         */
+   case VKI_SIOCGARP:            /* get ARP table entry          */
+      POST_MEM_WRITE(ARG3, sizeof(struct vki_arpreq));
+      break;
+                    
+   case VKI_SIOCSIFFLAGS:        /* set flags                    */
+   case VKI_SIOCSIFMAP:          /* Set device parameters        */
+   case VKI_SIOCSIFTXQLEN:       /* Set the tx queue length      */
+   case VKI_SIOCSIFDSTADDR:      /* set remote PA address        */
+   case VKI_SIOCSIFBRDADDR:      /* set broadcast PA address     */
+   case VKI_SIOCSIFNETMASK:      /* set network PA mask          */
+   case VKI_SIOCSIFMETRIC:       /* set metric                   */
+   case VKI_SIOCSIFADDR:         /* set PA address               */
+   case VKI_SIOCSIFMTU:          /* set MTU size                 */
+   case VKI_SIOCSIFHWADDR:       /* set hardware address         */
+   case VKI_SIOCSMIIREG:         /* set hardware entry registers */
+      break;
+      /* Routing table calls.  */
+   case VKI_SIOCADDRT:           /* add routing table entry      */
+   case VKI_SIOCDELRT:           /* delete routing table entry   */
+      break;
+
+      /* RARP cache control calls. */
+   case VKI_SIOCDRARP:           /* delete RARP table entry      */
+   case VKI_SIOCSRARP:           /* set RARP table entry         */
+      /* ARP cache control calls. */
+   case VKI_SIOCSARP:            /* set ARP table entry          */
+   case VKI_SIOCDARP:            /* delete ARP table entry       */
+      break;
+
+   case VKI_SIOCGPGRP:
+      POST_MEM_WRITE(ARG3, sizeof(int));
+      break;
+   case VKI_SIOCSPGRP:
+      break;
+
+      /* linux/soundcard interface (OSS) */
+   case VKI_SNDCTL_SEQ_GETOUTCOUNT:
+   case VKI_SNDCTL_SEQ_GETINCOUNT:
+   case VKI_SNDCTL_SEQ_PERCMODE:
+   case VKI_SNDCTL_SEQ_TESTMIDI:
+   case VKI_SNDCTL_SEQ_RESETSAMPLES:
+   case VKI_SNDCTL_SEQ_NRSYNTHS:
+   case VKI_SNDCTL_SEQ_NRMIDIS:
+   case VKI_SNDCTL_SEQ_GETTIME:
+   case VKI_SNDCTL_DSP_GETFMTS:
+   case VKI_SNDCTL_DSP_GETTRIGGER:
+   case VKI_SNDCTL_DSP_GETODELAY:
+   case VKI_SNDCTL_DSP_GETSPDIF:
+   case VKI_SNDCTL_DSP_GETCAPS:
+   case VKI_SOUND_PCM_READ_RATE:
+   case VKI_SOUND_PCM_READ_CHANNELS:
+   case VKI_SOUND_PCM_READ_BITS:
+#if !defined(VGA_ppc32) && !defined(VGA_ppc64)
+   case (VKI_SOUND_PCM_READ_BITS|0x40000000): /* what the fuck ? */
+#endif
+   case VKI_SOUND_PCM_READ_FILTER:
+      POST_MEM_WRITE(ARG3, sizeof(int));
+      break;
+   case VKI_SNDCTL_SEQ_CTRLRATE:
+   case VKI_SNDCTL_DSP_SPEED:
+   case VKI_SNDCTL_DSP_STEREO:
+   case VKI_SNDCTL_DSP_GETBLKSIZE: 
+   case VKI_SNDCTL_DSP_CHANNELS:
+   case VKI_SOUND_PCM_WRITE_FILTER:
+   case VKI_SNDCTL_DSP_SUBDIVIDE:
+   case VKI_SNDCTL_DSP_SETFRAGMENT:
+   case VKI_SNDCTL_DSP_GETCHANNELMASK:
+   case VKI_SNDCTL_DSP_BIND_CHANNEL:
+   case VKI_SNDCTL_TMR_TIMEBASE:
+   case VKI_SNDCTL_TMR_TEMPO:
+   case VKI_SNDCTL_TMR_SOURCE:
+   case VKI_SNDCTL_MIDI_PRETIME:
+   case VKI_SNDCTL_MIDI_MPUMODE:
+      break;
+   case VKI_SNDCTL_DSP_GETOSPACE:
+   case VKI_SNDCTL_DSP_GETISPACE:
+      POST_MEM_WRITE(ARG3, sizeof(vki_audio_buf_info));
+      break;
+   case VKI_SNDCTL_DSP_SETTRIGGER:
+      break;
+
+   case VKI_SNDCTL_DSP_POST:
+   case VKI_SNDCTL_DSP_RESET:
+   case VKI_SNDCTL_DSP_SYNC:
+   case VKI_SNDCTL_DSP_SETSYNCRO:
+   case VKI_SNDCTL_DSP_SETDUPLEX:
+      break;
+
+      /* linux/soundcard interface (ALSA) */
+   case VKI_SNDRV_PCM_IOCTL_HW_FREE:
+   case VKI_SNDRV_PCM_IOCTL_HWSYNC:
+   case VKI_SNDRV_PCM_IOCTL_PREPARE:
+   case VKI_SNDRV_PCM_IOCTL_RESET:
+   case VKI_SNDRV_PCM_IOCTL_START:
+   case VKI_SNDRV_PCM_IOCTL_DROP:
+   case VKI_SNDRV_PCM_IOCTL_DRAIN:
+   case VKI_SNDRV_PCM_IOCTL_RESUME:
+   case VKI_SNDRV_PCM_IOCTL_XRUN:
+   case VKI_SNDRV_PCM_IOCTL_UNLINK:
+   case VKI_SNDRV_TIMER_IOCTL_START:
+   case VKI_SNDRV_TIMER_IOCTL_STOP:
+   case VKI_SNDRV_TIMER_IOCTL_CONTINUE:
+   case VKI_SNDRV_TIMER_IOCTL_PAUSE:
+      break;
+
+      /* Real Time Clock (/dev/rtc) ioctls */
+   case VKI_RTC_UIE_ON:
+   case VKI_RTC_UIE_OFF:
+   case VKI_RTC_AIE_ON:
+   case VKI_RTC_AIE_OFF:
+   case VKI_RTC_PIE_ON:
+   case VKI_RTC_PIE_OFF:
+   case VKI_RTC_IRQP_SET:
+      break;
+   case VKI_RTC_RD_TIME:
+   case VKI_RTC_ALM_READ:
+      POST_MEM_WRITE(ARG3, sizeof(struct vki_rtc_time));
+      break;
+   case VKI_RTC_ALM_SET:
+      break;
+   case VKI_RTC_IRQP_READ:
+      POST_MEM_WRITE(ARG3, sizeof(unsigned long));
+      break;
+
+      /* Block devices */
+   case VKI_BLKROSET:
+      break;
+   case VKI_BLKROGET:
+      POST_MEM_WRITE(ARG3, sizeof(int));
+      break;
+   case VKI_BLKGETSIZE:
+      POST_MEM_WRITE(ARG3, sizeof(unsigned long));
+      break;
+   case VKI_BLKRASET:
+      break;
+   case VKI_BLKRAGET:
+      POST_MEM_WRITE(ARG3, sizeof(long));
+      break;
+   case VKI_BLKFRASET:
+      break;
+   case VKI_BLKFRAGET:
+      POST_MEM_WRITE(ARG3, sizeof(long));
+      break;
+   case VKI_BLKSECTGET:
+      POST_MEM_WRITE(ARG3, sizeof(unsigned short));
+      break;
+   case VKI_BLKSSZGET:
+      POST_MEM_WRITE(ARG3, sizeof(int));
+      break;
+   case VKI_BLKBSZGET:
+      POST_MEM_WRITE(ARG3, sizeof(int));
+      break;
+   case VKI_BLKBSZSET:
+      break;
+   case VKI_BLKGETSIZE64:
+      POST_MEM_WRITE(ARG3, sizeof(unsigned long long));
+      break;
+
+      /* Hard disks */
+   case VKI_HDIO_GETGEO: /* 0x0301 */
+      POST_MEM_WRITE(ARG3, sizeof(struct vki_hd_geometry));
+      break;
+   case VKI_HDIO_GET_DMA: /* 0x030b */
+      POST_MEM_WRITE(ARG3, sizeof(long));
+      break;
+   case VKI_HDIO_GET_IDENTITY: /* 0x030d */
+      POST_MEM_WRITE(ARG3, VKI_SIZEOF_STRUCT_HD_DRIVEID );
+      break;
+
+      /* CD ROM stuff (??)  */
+   case VKI_CDROMSUBCHNL:
+      POST_MEM_WRITE(ARG3, sizeof(struct vki_cdrom_subchnl));
+      break;
+   case VKI_CDROMREADTOCHDR:
+      POST_MEM_WRITE(ARG3, sizeof(struct vki_cdrom_tochdr));
+      break;
+   case VKI_CDROMREADTOCENTRY:
+      POST_MEM_WRITE(ARG3, sizeof(struct vki_cdrom_tocentry));
+      break;
+   case VKI_CDROMMULTISESSION:
+      POST_MEM_WRITE(ARG3, sizeof(struct vki_cdrom_multisession));
+      break;
+   case VKI_CDROMVOLREAD:
+      POST_MEM_WRITE(ARG3, sizeof(struct vki_cdrom_volctrl));
+      break;
+   case VKI_CDROMREADRAW:
+      POST_MEM_WRITE(ARG3, VKI_CD_FRAMESIZE_RAW);
+      break;
+   case VKI_CDROMREADAUDIO:
+   {
+      struct vki_cdrom_read_audio *cra = (struct vki_cdrom_read_audio *) ARG3;
+      POST_MEM_WRITE( (Addr)(cra->buf), cra->nframes * VKI_CD_FRAMESIZE_RAW);
+      break;
+   }
+      
+   case VKI_CDROMPLAYMSF:
+      break;
+      /* The following two are probably bogus (should check args
+        for readability).  JRS 20021117 */
+   case VKI_CDROM_DRIVE_STATUS: /* 0x5326 */
+   case VKI_CDROM_CLEAR_OPTIONS: /* 0x5321 */
+      break;
+
+   case VKI_FIGETBSZ:
+      POST_MEM_WRITE(ARG3, sizeof(unsigned long));
+      break;
+   case VKI_FIBMAP:
+      POST_MEM_WRITE(ARG3, sizeof(unsigned long));
+      break;
+
+   case VKI_FBIOGET_VSCREENINFO: //0x4600
+      POST_MEM_WRITE(ARG3, sizeof(struct vki_fb_var_screeninfo));
+      break;
+   case VKI_FBIOGET_FSCREENINFO: //0x4602
+      POST_MEM_WRITE(ARG3, sizeof(struct vki_fb_fix_screeninfo));
+      break;
+
+   case VKI_PPCLAIM:
+   case VKI_PPEXCL:
+   case VKI_PPYIELD:
+   case VKI_PPRELEASE:
+   case VKI_PPSETMODE:
+   case VKI_PPSETPHASE:
+   case VKI_PPSETFLAGS:
+   case VKI_PPWDATA:
+   case VKI_PPWCONTROL:
+   case VKI_PPFCONTROL:
+   case VKI_PPDATADIR:
+   case VKI_PPNEGOT:
+   case VKI_PPWCTLONIRQ:
+   case VKI_PPSETTIME:
+      break;
+   case VKI_PPGETMODE:
+      POST_MEM_WRITE( ARG3, sizeof(int) );
+      break;
+   case VKI_PPGETPHASE:
+      POST_MEM_WRITE( ARG3, sizeof(int) );
+      break;
+   case VKI_PPGETMODES:
+      POST_MEM_WRITE( ARG3, sizeof(unsigned int) );
+      break;
+   case VKI_PPGETFLAGS:
+      POST_MEM_WRITE( ARG3, sizeof(int) );
+      break;
+   case VKI_PPRSTATUS:
+      POST_MEM_WRITE( ARG3, sizeof(unsigned char) );
+      break;
+   case VKI_PPRDATA:
+      POST_MEM_WRITE( ARG3, sizeof(unsigned char) );
+      break;
+   case VKI_PPRCONTROL:
+      POST_MEM_WRITE( ARG3, sizeof(unsigned char) );
+      break;
+   case VKI_PPCLRIRQ:
+      POST_MEM_WRITE( ARG3, sizeof(int) );
+      break;
+   case VKI_PPGETTIME:
+      POST_MEM_WRITE( ARG3, sizeof(struct vki_timeval) );
+      break;
+
+   case VKI_GIO_FONT:
+      POST_MEM_WRITE( ARG3, 32 * 256 );
+      break;
+   case VKI_PIO_FONT:
+      break;
+
+   case VKI_GIO_FONTX:
+      POST_MEM_WRITE( (Addr)((struct vki_consolefontdesc *)ARG3)->chardata,
+                      32 * ((struct vki_consolefontdesc *)ARG3)->charcount );
+      break;
+   case VKI_PIO_FONTX:
+      break;
+
+   case VKI_PIO_FONTRESET:
+      break;
+
+   case VKI_GIO_CMAP:
+      POST_MEM_WRITE( ARG3, 16 * 3 );
+      break;
+   case VKI_PIO_CMAP:
+      break;
+
+   case VKI_KIOCSOUND:
+   case VKI_KDMKTONE:
+      break;
+
+   case VKI_KDGETLED:
+      POST_MEM_WRITE( ARG3, sizeof(char) );
+      break;
+   case VKI_KDSETLED:
+      break;
+
+   case VKI_KDGKBTYPE:
+      POST_MEM_WRITE( ARG3, sizeof(char) );
+      break;
+
+   case VKI_KDADDIO:
+   case VKI_KDDELIO:
+   case VKI_KDENABIO:
+   case VKI_KDDISABIO:
+      break;
+
+   case VKI_KDSETMODE:
+      break;
+   case VKI_KDGETMODE:
+      POST_MEM_WRITE( ARG3, sizeof(int) );
+      break;
+
+   case VKI_KDMAPDISP:
+   case VKI_KDUNMAPDISP:
+      break;
+
+   case VKI_GIO_SCRNMAP:
+      POST_MEM_WRITE( ARG3, VKI_E_TABSZ );
+      break;
+   case VKI_PIO_SCRNMAP:
+      break;
+   case VKI_GIO_UNISCRNMAP:
+      POST_MEM_WRITE( ARG3, VKI_E_TABSZ * sizeof(unsigned short) );
+      break;
+   case VKI_PIO_UNISCRNMAP:
+      break;
+
+   case VKI_GIO_UNIMAP:
+      if ( ARG3 ) {
+         struct vki_unimapdesc *desc = (struct vki_unimapdesc *) ARG3;
+         POST_MEM_WRITE( (Addr)&desc->entry_ct, sizeof(desc->entry_ct));
+         POST_MEM_WRITE( (Addr)desc->entries,
+                        desc->entry_ct * sizeof(struct vki_unipair) );
+      }
+      break;
+   case VKI_PIO_UNIMAP:
+      break;
+   case VKI_PIO_UNIMAPCLR:
+      break;
+
+   case VKI_KDGKBMODE:
+      POST_MEM_WRITE( ARG3, sizeof(int) );
+      break;
+   case VKI_KDSKBMODE:
+      break;
+      
+   case VKI_KDGKBMETA:
+      POST_MEM_WRITE( ARG3, sizeof(int) );
+      break;
+   case VKI_KDSKBMETA:
+      break;
+      
+   case VKI_KDGKBLED:
+      POST_MEM_WRITE( ARG3, sizeof(char) );
+      break;
+   case VKI_KDSKBLED:
+      break;
+      
+   case VKI_KDGKBENT:
+      POST_MEM_WRITE( (Addr)&((struct vki_kbentry *)ARG3)->kb_value,
+                      sizeof(((struct vki_kbentry *)ARG3)->kb_value) );
+      break;
+   case VKI_KDSKBENT:
+      break;
+      
+   case VKI_KDGKBSENT:
+      POST_MEM_WRITE( (Addr)((struct vki_kbsentry *)ARG3)->kb_string,
+                      sizeof(((struct vki_kbsentry *)ARG3)->kb_string) );
+      break;
+   case VKI_KDSKBSENT:
+      break;
+      
+   case VKI_KDGKBDIACR:
+      POST_MEM_WRITE( ARG3, sizeof(struct vki_kbdiacrs) );
+      break;
+   case VKI_KDSKBDIACR:
+      break;
+      
+   case VKI_KDGETKEYCODE:
+      POST_MEM_WRITE( (Addr)((struct vki_kbkeycode *)ARG3)->keycode,
+                      sizeof(((struct vki_kbkeycode *)ARG3)->keycode) );
+      break;
+   case VKI_KDSETKEYCODE:
+      break;
+      
+   case VKI_KDSIGACCEPT:
+      break;
+
+   case VKI_KDKBDREP:
+      break;
+
+   case VKI_KDFONTOP:
+      if ( ARG3 ) {
+         struct vki_console_font_op *op = (struct vki_console_font_op *) ARG3;
+         switch ( op->op ) {
+            case VKI_KD_FONT_OP_SET:
+               break;
+            case VKI_KD_FONT_OP_GET:
+               if ( op->data )
+                  POST_MEM_WRITE( (Addr) op->data,
+                                  (op->width + 7) / 8 * 32 * op->charcount );
+               break;
+            case VKI_KD_FONT_OP_SET_DEFAULT:
+               break;
+            case VKI_KD_FONT_OP_COPY:
+               break;
+         }
+         POST_MEM_WRITE( (Addr) op, sizeof(*op));
+      }
+      break;
+
+   case VKI_VT_OPENQRY:
+      POST_MEM_WRITE( ARG3, sizeof(int) );
+      break;
+   case VKI_VT_GETMODE:
+      POST_MEM_WRITE( ARG3, sizeof(struct vki_vt_mode) );
+      break;
+   case VKI_VT_SETMODE:
+      break;
+   case VKI_VT_GETSTATE:
+      POST_MEM_WRITE( (Addr) &(((struct vki_vt_stat*) ARG3)->v_active),
+                      sizeof(((struct vki_vt_stat*) ARG3)->v_active) );
+      POST_MEM_WRITE( (Addr) &(((struct vki_vt_stat*) ARG3)->v_state),
+                      sizeof(((struct vki_vt_stat*) ARG3)->v_state) );
+      break;
+   case VKI_VT_RELDISP:
+   case VKI_VT_ACTIVATE:
+   case VKI_VT_WAITACTIVE:
+   case VKI_VT_DISALLOCATE:
+      break;
+   case VKI_VT_RESIZE:
+      break;
+   case VKI_VT_RESIZEX:
+      break;
+   case VKI_VT_LOCKSWITCH:
+   case VKI_VT_UNLOCKSWITCH:
+      break;
+
+   case VKI_USBDEVFS_CONTROL:
+      if ( ARG3 ) {
+         struct vki_usbdevfs_ctrltransfer *vkuc = (struct vki_usbdevfs_ctrltransfer *)ARG3;
+         if (vkuc->bRequestType & 0x80)
+            POST_MEM_WRITE((Addr)vkuc->data, RES);
+         break;
+      }
+   case VKI_USBDEVFS_BULK:
+      if ( ARG3 ) {
+         struct vki_usbdevfs_bulktransfer *vkub = (struct vki_usbdevfs_bulktransfer *)ARG3;
+         if (vkub->ep & 0x80)
+            POST_MEM_WRITE((Addr)vkub->data, RES);
+         break;
+      }
+   case VKI_USBDEVFS_GETDRIVER:
+      if ( ARG3 ) {
+         struct vki_usbdevfs_getdriver *vkugd = (struct vki_usbdevfs_getdriver *)ARG3;
+         POST_MEM_WRITE((Addr)&vkugd->driver, sizeof(vkugd->driver));
+         break;
+      }
+   case VKI_USBDEVFS_REAPURB:
+   case VKI_USBDEVFS_REAPURBNDELAY:
+      if ( ARG3 ) {
+         struct vki_usbdevfs_urb **vkuu = (struct vki_usbdevfs_urb**)ARG3;
+         if (!*vkuu)
+            break;
+         POST_MEM_WRITE((Addr) &((*vkuu)->status),sizeof((*vkuu)->status));
+         if ((*vkuu)->endpoint & 0x80)
+            POST_MEM_WRITE((Addr)(*vkuu)->buffer, (*vkuu)->actual_length);
+         break;
+      }
+   case VKI_USBDEVFS_CONNECTINFO:
+      POST_MEM_WRITE(ARG3, sizeof(struct vki_usbdevfs_connectinfo));
+      break;
+   case VKI_USBDEVFS_IOCTL:
+      if ( ARG3 ) {
+         struct vki_usbdevfs_ioctl *vkui = (struct vki_usbdevfs_ioctl *)ARG3;
+         UInt dir2, size2;
+         dir2  = _VKI_IOC_DIR(vkui->ioctl_code);
+         size2 = _VKI_IOC_SIZE(vkui->ioctl_code);
+         if (size2 > 0) {
+            if (dir2 & _VKI_IOC_READ) 
+               POST_MEM_WRITE((Addr)vkui->data, size2);
+         }
+      }
+      break;
+
+      /* I2C (/dev/i2c-*) ioctls */
+   case VKI_I2C_SLAVE:
+   case VKI_I2C_SLAVE_FORCE:
+   case VKI_I2C_TENBIT:
+   case VKI_I2C_PEC:
+      break;
+   case VKI_I2C_FUNCS:
+      POST_MEM_WRITE( ARG3, sizeof(unsigned long) );
+      break;
+
+      /* Wireless extensions ioctls */
+   case VKI_SIOCSIWCOMMIT:
+   case VKI_SIOCSIWNWID:
+   case VKI_SIOCSIWFREQ:
+   case VKI_SIOCSIWMODE:
+   case VKI_SIOCSIWSENS:
+   case VKI_SIOCSIWRANGE:
+   case VKI_SIOCSIWPRIV:
+   case VKI_SIOCSIWSTATS:
+   case VKI_SIOCSIWSPY:
+   case VKI_SIOCSIWTHRSPY:
+   case VKI_SIOCSIWAP:
+   case VKI_SIOCSIWSCAN:
+   case VKI_SIOCSIWESSID:
+   case VKI_SIOCSIWRATE:
+   case VKI_SIOCSIWNICKN:
+   case VKI_SIOCSIWRTS:
+   case VKI_SIOCSIWFRAG:
+   case VKI_SIOCSIWTXPOW:
+   case VKI_SIOCSIWRETRY:
+   case VKI_SIOCSIWENCODE:
+   case VKI_SIOCSIWPOWER:
+   case VKI_SIOCSIWGENIE:
+   case VKI_SIOCSIWMLME:
+   case VKI_SIOCSIWAUTH:
+   case VKI_SIOCSIWENCODEEXT:
+   case VKI_SIOCSIWPMKSA:
+      break;
+   case VKI_SIOCGIWNAME:
+      if (ARG3) {
+         POST_MEM_WRITE((Addr)((struct vki_iwreq *)ARG3)->u.name,
+                        sizeof(((struct vki_iwreq *)ARG3)->u.name));
+      }
+      break;
+   case VKI_SIOCGIWNWID:
+   case VKI_SIOCGIWSENS:
+   case VKI_SIOCGIWRATE:
+   case VKI_SIOCGIWRTS:
+   case VKI_SIOCGIWFRAG:
+   case VKI_SIOCGIWTXPOW:
+   case VKI_SIOCGIWRETRY:
+   case VKI_SIOCGIWPOWER:
+   case VKI_SIOCGIWAUTH:
+      if (ARG3) {
+         POST_MEM_WRITE((Addr)&((struct vki_iwreq *)ARG3)->u.param,
+                        sizeof(struct vki_iw_param));
+      }
+      break;
+   case VKI_SIOCGIWFREQ:
+      if (ARG3) {
+         POST_MEM_WRITE((Addr)&((struct vki_iwreq *)ARG3)->u.freq,
+                        sizeof(struct vki_iw_freq));
+      }
+      break;
+   case VKI_SIOCGIWMODE:
+      if (ARG3) {
+         POST_MEM_WRITE((Addr)&((struct vki_iwreq *)ARG3)->u.mode,
+                       sizeof(__vki_u32));
+      }
+      break;
+   case VKI_SIOCGIWRANGE:
+   case VKI_SIOCGIWPRIV:
+   case VKI_SIOCGIWSTATS:
+   case VKI_SIOCGIWSPY:
+   case VKI_SIOCGIWTHRSPY:
+   case VKI_SIOCGIWAPLIST:
+   case VKI_SIOCGIWSCAN:
+   case VKI_SIOCGIWESSID:
+   case VKI_SIOCGIWNICKN:
+   case VKI_SIOCGIWENCODE:
+   case VKI_SIOCGIWGENIE:
+   case VKI_SIOCGIWENCODEEXT:
+      if (ARG3) {
+         struct vki_iw_point* point;
+         point = &((struct vki_iwreq *)ARG3)->u.data;
+         POST_MEM_WRITE((Addr)point->pointer, point->length);
+      }
+      break;
+   case VKI_SIOCGIWAP:
+      if (ARG3) {
+         POST_MEM_WRITE((Addr)&((struct vki_iwreq *)ARG3)->u.ap_addr,
+                        sizeof(struct vki_sockaddr));
+      }
+      break;
+
+      /* We don't have any specific information on it, so
+        try to do something reasonable based on direction and
+        size bits.  The encoding scheme is described in
+        /usr/include/asm/ioctl.h.  
+
+        According to Simon Hausmann, _IOC_READ means the kernel
+        writes a value to the ioctl value passed from the user
+        space and the other way around with _IOC_WRITE. */
+   default: {
+      UInt dir  = _VKI_IOC_DIR(ARG2);
+      UInt size = _VKI_IOC_SIZE(ARG2);
+      if (size > 0 && (dir & _VKI_IOC_READ)
+         && RES == 0 
+         && ARG3 != (Addr)NULL)
+        POST_MEM_WRITE(ARG3, size);
+      break;
+   }
+   }
+}
+
 /* ---------------------------------------------------------------------
    socketcall wrapper helpers
    ------------------------------------------------------------------ */
index 432c0afcb4fd8d7fca219df611d06bef11cd448b..940eae767265464662dad57a21fb9247c13dce36 100644 (file)
@@ -1557,9 +1557,9 @@ const SyscallTableEntry ML_(syscall_table)[] = {
 //..    GENX_(__NR_acct,              sys_acct),              // 51
    LINX_(__NR_umount2,           sys_umount),            // 52
 //..    GENX_(__NR_lock,              sys_ni_syscall),        // 53
-   GENXY(__NR_ioctl,             sys_ioctl),             // 54
+   LINXY(__NR_ioctl,             sys_ioctl),             // 54
 //.. 
-   GENXY(__NR_fcntl,             sys_fcntl),             // 55
+   LINXY(__NR_fcntl,             sys_fcntl),             // 55
 //..    GENX_(__NR_mpx,               sys_ni_syscall),        // 56
    GENX_(__NR_setpgid,           sys_setpgid),           // 57
 //..    GENX_(__NR_ulimit,            sys_ni_syscall),        // 58
@@ -1741,7 +1741,7 @@ const SyscallTableEntry ML_(syscall_table)[] = {
 
    GENXY(__NR_getdents64,        sys_getdents64),        // 202
 //..    //   (__NR_pivot_root,        sys_pivot_root),        // 203 */Linux
-   GENXY(__NR_fcntl64,           sys_fcntl64),           // 204
+   LINXY(__NR_fcntl64,           sys_fcntl64),           // 204
    GENX_(__NR_madvise,           sys_madvise),           // 205
    GENXY(__NR_mincore,           sys_mincore),           // 206
    LINX_(__NR_gettid,            sys_gettid),            // 207
index f98eb83155aea2f34c4a9cfdbf33f7fb721d3ef5..a45686f85d632dbfb4dabd5fe0006bc80fef990d 100644 (file)
@@ -1204,9 +1204,9 @@ const SyscallTableEntry ML_(syscall_table)[] = {
 // _____(__NR_acct,              sys_acct),               //  51
    LINX_(__NR_umount2,           sys_umount),             //  52
 // _____(__NR_lock,              sys_lock),               //  53
-   GENXY(__NR_ioctl,             sys_ioctl),              //  54
+   LINXY(__NR_ioctl,             sys_ioctl),              //  54
 
-   GENXY(__NR_fcntl,             sys_fcntl),              //  55
+   LINXY(__NR_fcntl,             sys_fcntl),              //  55
 // _____(__NR_mpx,               sys_mpx),                //  56
    GENX_(__NR_setpgid,           sys_setpgid),            //  57
 // _____(__NR_ulimit,            sys_ulimit),             //  58
@@ -1384,7 +1384,7 @@ const SyscallTableEntry ML_(syscall_table)[] = {
 // _____(__NR_multiplexer,       sys_multiplexer),        // 201
    GENXY(__NR_getdents64,        sys_getdents64),         // 202
 // _____(__NR_pivot_root,        sys_pivot_root),         // 203
-   GENXY(__NR_fcntl64,           sys_fcntl64),            // 204 !!!!?? 32bit only */
+   LINXY(__NR_fcntl64,           sys_fcntl64),            // 204 !!!!?? 32bit only */
 
    GENX_(__NR_madvise,           sys_madvise),            // 205
 // _____(__NR_mincore,           sys_mincore),            // 206
index b787bd406b55a3e70720800459397d9a438dea6a..3357a1bae3c9f0c10bbe6c1d871631688fc677c9 100644 (file)
@@ -1903,9 +1903,9 @@ const SyscallTableEntry ML_(syscall_table)[] = {
    GENX_(__NR_acct,              sys_acct),           // 51
    LINX_(__NR_umount2,           sys_umount),         // 52
    GENX_(__NR_lock,              sys_ni_syscall),     // 53
-   GENXY(__NR_ioctl,             sys_ioctl),          // 54
+   LINXY(__NR_ioctl,             sys_ioctl),          // 54
 
-   GENXY(__NR_fcntl,             sys_fcntl),          // 55
+   LINXY(__NR_fcntl,             sys_fcntl),          // 55
    GENX_(__NR_mpx,               sys_ni_syscall),     // 56
    GENX_(__NR_setpgid,           sys_setpgid),        // 57
    GENX_(__NR_ulimit,            sys_ni_syscall),     // 58
@@ -2107,7 +2107,7 @@ const SyscallTableEntry ML_(syscall_table)[] = {
    GENX_(__NR_madvise,           sys_madvise),        // 219
 
    GENXY(__NR_getdents64,        sys_getdents64),     // 220
-   GENXY(__NR_fcntl64,           sys_fcntl64),        // 221
+   LINXY(__NR_fcntl64,           sys_fcntl64),        // 221
    GENX_(222,                    sys_ni_syscall),     // 222
    PLAXY(223,                    sys_syscall223),     // 223 // sys_bproc?
    LINX_(__NR_gettid,            sys_gettid),         // 224