out of syswrap-generic into syswrap-linux) from the DARWIN branch.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@9219
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);
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);
// 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?
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); // * (?)
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);
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
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
}
// 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;
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);
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);
SET_STATUS_Failure( VKI_EMFILE );
} else {
if (VG_(clo_track_fds))
- record_fd_open_named(tid, RES);
+ ML_(record_fd_open_named)(tid, RES);
}
}
{
vg_assert(SUCCESS);
if (VG_(clo_track_fds))
- record_fd_open_named(tid, RES);
+ ML_(record_fd_open_named)(tid, RES);
}
PRE(sys_fchdir)
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);
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
}
#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
------------------------------------------------------------------ */
//.. 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
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
// _____(__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
// _____(__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
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
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