Date: Fri, 21 Aug 2009 23:07:09 GMT From: Stanislav Sedov <stas@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 167595 for review Message-ID: <200908212307.n7LN79n6006627@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=167595 Change 167595 by stas@stas_orion on 2009/08/21 23:06:20 - Add a basic ioctl handler. With this chane the basic vlagrind on amd64 should be mostly functional. Affected files ... .. //depot/projects/valgrind/coregrind/m_syswrap/priv_syswrap-freebsd.h#18 edit .. //depot/projects/valgrind/coregrind/m_syswrap/syswrap-freebsd.c#37 edit Differences ... ==== //depot/projects/valgrind/coregrind/m_syswrap/priv_syswrap-freebsd.h#18 (text+ko) ==== @@ -261,6 +261,8 @@ DECL_TEMPLATE(freebsd, sys_thr_new); DECL_TEMPLATE(freebsd, sys_thr_kill); DECL_TEMPLATE(freebsd, sys_thr_kill2); +DECL_TEMPLATE(freebsd, sys_fcntl); +DECL_TEMPLATE(freebsd, sys_ioctl); #endif // __PRIV_SYSWRAP_FREEBSD_H /*--------------------------------------------------------------------*/ ==== //depot/projects/valgrind/coregrind/m_syswrap/syswrap-freebsd.c#37 (text+ko) ==== @@ -3102,6 +3102,58 @@ } } +PRE(sys_ioctl) +{ + UInt dir = _VKI_IOC_DIR(ARG2); + UInt size = _VKI_IOC_SIZE(ARG2); + *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); + +/* On FreeBSD, ALL ioctl's are IOR/IOW encoded. Just use the default decoder */ + 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); + } +} + +POST(sys_ioctl) +{ + UInt dir = _VKI_IOC_DIR(ARG2); + UInt size = _VKI_IOC_SIZE(ARG2); + vg_assert(SUCCESS); + if (size > 0 && (dir & _VKI_IOC_READ) + && RES == 0 && ARG3 != (Addr)NULL) + POST_MEM_WRITE(ARG3, size); +} + #undef PRE #undef POST @@ -3173,7 +3225,7 @@ // 4.3 sigpending 52 GENXY(__NR_sigaltstack, sys_sigaltstack), // 53 -// GENXY(__NR_ioctl, sys_ioctl), // 54 + BSDXY(__NR_ioctl, sys_ioctl), // 54 // BSDX_(__NR_reboot, sys_reboot), // 55 BSDX_(__NR_revoke, sys_revoke), // 56
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200908212307.n7LN79n6006627>