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