|
From: <sv...@va...> - 2007-11-29 03:08:33
|
Author: sewardj
Date: 2007-11-29 03:08:32 +0000 (Thu, 29 Nov 2007)
New Revision: 7249
Log:
Changes to make Memcheck work sanely on recent incarnations of AIX 5.3:
* add a few more syscall wrappers, and fix a couple of buggy ones
* intercept strcmp et al in a few more libraries
Modified:
trunk/coregrind/m_syswrap/priv_syswrap-aix5.h
trunk/coregrind/m_syswrap/syswrap-aix5.c
trunk/coregrind/m_syswrap/syswrap-ppc32-aix5.c
trunk/coregrind/m_syswrap/syswrap-ppc64-aix5.c
trunk/memcheck/mc_replace_strmem.c
Modified: trunk/coregrind/m_syswrap/priv_syswrap-aix5.h
===================================================================
--- trunk/coregrind/m_syswrap/priv_syswrap-aix5.h 2007-11-29 03:06:25 UTC (rev 7248)
+++ trunk/coregrind/m_syswrap/priv_syswrap-aix5.h 2007-11-29 03:08:32 UTC (rev 7249)
@@ -71,7 +71,6 @@
DECL_TEMPLATE(aix5, sys___libc_sbrk);
DECL_TEMPLATE(aix5, sys___msleep);
-DECL_TEMPLATE(aix5, sys__clock_gettime);
DECL_TEMPLATE(aix5, sys__clock_settime);
DECL_TEMPLATE(aix5, sys__exit);
DECL_TEMPLATE(aix5, sys__fp_fpscrx_sc);
@@ -104,6 +103,7 @@
DECL_TEMPLATE(aix5, sys_connext);
DECL_TEMPLATE(aix5, sys_execve);
DECL_TEMPLATE(aix5, sys_finfo);
+DECL_TEMPLATE(aix5, sys_fstatfs);
DECL_TEMPLATE(aix5, sys_fstatx);
DECL_TEMPLATE(aix5, sys_fsync);
DECL_TEMPLATE(aix5, sys_getdirent);
@@ -131,6 +131,7 @@
DECL_TEMPLATE(aix5, sys_kread);
DECL_TEMPLATE(aix5, sys_kreadv);
DECL_TEMPLATE(aix5, sys_kthread_ctl);
+DECL_TEMPLATE(aix5, sys_ktruncate);
DECL_TEMPLATE(aix5, sys_kwaitpid);
DECL_TEMPLATE(aix5, sys_kwrite);
DECL_TEMPLATE(aix5, sys_kwritev);
@@ -141,6 +142,7 @@
DECL_TEMPLATE(aix5, sys_mkdir);
DECL_TEMPLATE(aix5, sys_mmap);
DECL_TEMPLATE(aix5, sys_mprotect);
+DECL_TEMPLATE(aix5, sys_mntctl);
DECL_TEMPLATE(aix5, sys_munmap);
DECL_TEMPLATE(aix5, sys_naccept);
DECL_TEMPLATE(aix5, sys_ngetpeername);
Modified: trunk/coregrind/m_syswrap/syswrap-aix5.c
===================================================================
--- trunk/coregrind/m_syswrap/syswrap-aix5.c 2007-11-29 03:06:25 UTC (rev 7248)
+++ trunk/coregrind/m_syswrap/syswrap-aix5.c 2007-11-29 03:08:32 UTC (rev 7249)
@@ -479,12 +479,6 @@
/* __unload is handled in the platform-specific files. */
-PRE(sys__clock_gettime)
-{
- PRINT("_clock_gettime (UNDOCUMENTED) ( %d, %p )", ARG1, ARG2);
- PRE_REG_READ2(int, "_clock_gettime", int, arg1, int, arg2);
-}
-
PRE(sys__clock_settime)
{
PRINT("_clock_settime (UNDOCUMENTED) ( %d, %p )", ARG1, ARG2);
@@ -1069,6 +1063,17 @@
POST_MEM_WRITE( ARG3, ARG4 );
}
+PRE(sys_fstatfs)
+{
+ PRINT("sys_fstatfs ( %ld, %p )", ARG1, ARG2);
+ PRE_REG_READ2(UWord, "fstatfs", UWord, fd, struct statfs *, buf);
+ PRE_MEM_WRITE( "fstatfs(buf)", ARG2, sizeof(struct statfs) );
+}
+POST(sys_fstatfs)
+{
+ POST_MEM_WRITE( ARG2, sizeof(struct statfs) );
+}
+
PRE(sys_fstatx)
{
PRINT("fstatx ( %ld, %p, %ld, %ld )", ARG1, ARG2, ARG3, ARG4 );
@@ -1599,6 +1604,13 @@
PRINT("kthread_ctl (BOGUS HANDLER)");
}
+PRE(sys_ktruncate)
+{
+ PRINT("ktruncate( %p(%s), %lx, %lx )", ARG1,ARG1, ARG2, ARG3 );
+ PRE_REG_READ3(int, "ktruncate", char*, path, long, arg2, long, arg3 );
+ PRE_MEM_RASCIIZ( "ktruncate(path)", ARG1 );
+}
+
PRE(sys_kwaitpid)
{
/* Note: args 1 and 2 (status, pid) opposite way round
@@ -1702,6 +1714,27 @@
VG_(discard_translations)( addr, len, "POST(sys_mmap)" );
}
+PRE(sys_mntctl)
+{
+ PRINT("mntctl ( %ld, %ld, %p )", ARG1, ARG2, ARG3 );
+ PRE_REG_READ3(long, "mntctl", long, command, long, size, char*, buffer);
+ PRE_MEM_WRITE( "mntctl(buffer)", ARG3, ARG2 );
+}
+POST(sys_mntctl)
+{
+ vg_assert(SUCCESS);
+ if (RES == 0) {
+ /* Buffer too small. First word is the real required size. */
+ POST_MEM_WRITE( ARG3, sizeof(Word) );
+ } else {
+ /* RES is the number of struct vmount's written to the buf. But
+ these are variable length and to find the end would require
+ inspecting each in turn. So be simple and just mark the
+ entire buffer as defined. */
+ POST_MEM_WRITE( ARG3, ARG2 );
+ }
+}
+
PRE(sys_mprotect)
{
PRINT("mprotect (BOGUS HANDLER)( %p, %ld, %p )", ARG1, ARG2, ARG3);
Modified: trunk/coregrind/m_syswrap/syswrap-ppc32-aix5.c
===================================================================
--- trunk/coregrind/m_syswrap/syswrap-ppc32-aix5.c 2007-11-29 03:06:25 UTC (rev 7248)
+++ trunk/coregrind/m_syswrap/syswrap-ppc32-aix5.c 2007-11-29 03:08:32 UTC (rev 7249)
@@ -340,6 +340,7 @@
DECL_TEMPLATE(ppc32_aix5, sys___loadx);
DECL_TEMPLATE(ppc32_aix5, sys___unload);
+DECL_TEMPLATE(ppc32_aix5, sys__clock_gettime);
DECL_TEMPLATE(ppc32_aix5, sys_thread_setmymask_fast);
DECL_TEMPLATE(ppc32_aix5, sys_thread_setstate);
DECL_TEMPLATE(ppc32_aix5, sys_FAKE_SIGRETURN);
@@ -452,6 +453,20 @@
ML_(aix5_rescan_procmap_after_load_or_unload)();
}
+PRE(sys__clock_gettime)
+{
+ /* Seems like ARG3 points at a destination buffer? */
+ /* _clock_gettime (UNDOCUMENTED) ( 0, 0xA, 0x2FF21808 ) */
+ PRINT("_clock_gettime (UNDOCUMENTED) ( %d, %p, %p )", ARG1, ARG2, ARG3 );
+ PRE_REG_READ3(int, "_clock_gettime", int, arg1, int, arg2, void*, arg3);
+ PRE_MEM_WRITE( "_clock_gettime(dst)", ARG3, sizeof(struct timespec) );
+}
+POST(sys__clock_gettime)
+{
+ vg_assert(SUCCESS);
+ POST_MEM_WRITE( ARG3, sizeof(struct timespec) );
+}
+
PRE(sys_thread_setmymask_fast)
{
/* args: a 64-bit signal mask in ARG1/2.*/
@@ -730,7 +745,7 @@
PLAXY(__NR_AIX5___loadx, sys___loadx),
AIXX_(__NR_AIX5___msleep, sys___msleep),
PLAXY(__NR_AIX5___unload, sys___unload),
- AIXX_(__NR_AIX5__clock_gettime, sys__clock_gettime),
+ PLAXY(__NR_AIX5__clock_gettime, sys__clock_gettime),
AIXX_(__NR_AIX5__clock_settime, sys__clock_settime),
AIXX_(__NR_AIX5__exit, sys__exit),
AIXX_(__NR_AIX5__fp_fpscrx_sc, sys__fp_fpscrx_sc),
@@ -763,6 +778,7 @@
AIXX_(__NR_AIX5_connext, sys_connext),
AIXX_(__NR_AIX5_execve, sys_execve),
AIXXY(__NR_AIX5_finfo, sys_finfo),
+ AIXXY(__NR_AIX5_fstatfs, sys_fstatfs),
AIXXY(__NR_AIX5_fstatx, sys_fstatx),
AIXX_(__NR_AIX5_fsync, sys_fsync),
AIXXY(__NR_AIX5_getdirent, sys_getdirent),
@@ -790,6 +806,7 @@
AIXXY(__NR_AIX5_kread, sys_kread),
AIXXY(__NR_AIX5_kreadv, sys_kreadv),
AIXX_(__NR_AIX5_kthread_ctl, sys_kthread_ctl),
+ AIXX_(__NR_AIX5_ktruncate, sys_ktruncate),
AIXXY(__NR_AIX5_kwaitpid, sys_kwaitpid),
AIXX_(__NR_AIX5_kwrite, sys_kwrite),
AIXX_(__NR_AIX5_kwritev, sys_kwritev),
@@ -799,6 +816,7 @@
AIXX_(__NR_AIX5_lseek, sys_lseek),
AIXX_(__NR_AIX5_mkdir, sys_mkdir),
AIXXY(__NR_AIX5_mmap, sys_mmap),
+ AIXXY(__NR_AIX5_mntctl, sys_mntctl),
AIXXY(__NR_AIX5_mprotect, sys_mprotect),
AIXXY(__NR_AIX5_munmap, sys_munmap),
AIXXY(__NR_AIX5_naccept, sys_naccept),
Modified: trunk/coregrind/m_syswrap/syswrap-ppc64-aix5.c
===================================================================
--- trunk/coregrind/m_syswrap/syswrap-ppc64-aix5.c 2007-11-29 03:06:25 UTC (rev 7248)
+++ trunk/coregrind/m_syswrap/syswrap-ppc64-aix5.c 2007-11-29 03:08:32 UTC (rev 7249)
@@ -338,6 +338,7 @@
#define PRE(name) DEFN_PRE_TEMPLATE(ppc64_aix5, name)
#define POST(name) DEFN_POST_TEMPLATE(ppc64_aix5, name)
+DECL_TEMPLATE(ppc64_aix5, sys__clock_gettime);
DECL_TEMPLATE(ppc64_aix5, sys__fp_fpscrx64_);
DECL_TEMPLATE(ppc64_aix5, sys_kload);
DECL_TEMPLATE(ppc64_aix5, sys_kunload64);
@@ -345,6 +346,20 @@
DECL_TEMPLATE(ppc64_aix5, sys_FAKE_SIGRETURN);
+PRE(sys__clock_gettime)
+{
+ /* Seems like ARG2 points at a destination buffer? */
+ /* _clock_gettime (UNDOCUMENTED) ( 0, 0xA, 0x2FF21808 ) */
+ PRINT("_clock_gettime (UNDOCUMENTED) ( %d, %p, %p )", ARG1, ARG2, ARG3 );
+ PRE_REG_READ3(int, "_clock_gettime", int, arg1, int, arg2, void*, arg3);
+ PRE_MEM_WRITE( "_clock_gettime(dst)", ARG2, sizeof(struct timespec) );
+}
+POST(sys__clock_gettime)
+{
+ vg_assert(SUCCESS);
+ POST_MEM_WRITE( ARG2, sizeof(struct timespec) );
+}
+
PRE(sys__fp_fpscrx64_)
{
PRINT("_fp_fpscrx64_ (BOGUS HANDLER)");
@@ -638,6 +653,7 @@
= {
AIXXY(__NR_AIX5___libc_sbrk, sys___libc_sbrk),
AIXX_(__NR_AIX5___msleep, sys___msleep),
+ PLAXY(__NR_AIX5__clock_gettime, sys__clock_gettime),
AIXX_(__NR_AIX5__exit, sys__exit),
PLAX_(__NR_AIX5__fp_fpscrx64_, sys__fp_fpscrx64_),
AIXX_(__NR_AIX5__getpid, sys__getpid),
@@ -660,6 +676,8 @@
AIXX_(__NR_AIX5_close, sys_close),
AIXX_(__NR_AIX5_connext, sys_connext),
AIXX_(__NR_AIX5_execve, sys_execve),
+ AIXXY(__NR_AIX5_finfo, sys_finfo),
+ AIXXY(__NR_AIX5_fstatfs, sys_fstatfs),
AIXXY(__NR_AIX5_fstatx, sys_fstatx),
AIXXY(__NR_AIX5_getdirent, sys_getdirent),
AIXXY(__NR_AIX5_getdirent64, sys_getdirent64),
@@ -683,6 +701,7 @@
AIXXY(__NR_AIX5_kread, sys_kread),
AIXXY(__NR_AIX5_kreadv, sys_kreadv),
AIXX_(__NR_AIX5_kthread_ctl, sys_kthread_ctl),
+ AIXX_(__NR_AIX5_ktruncate, sys_ktruncate),
PLAXY(__NR_AIX5_kunload64, sys_kunload64),
AIXXY(__NR_AIX5_kwaitpid, sys_kwaitpid),
AIXX_(__NR_AIX5_kwrite, sys_kwrite),
@@ -690,6 +709,7 @@
AIXX_(__NR_AIX5_lseek, sys_lseek),
AIXX_(__NR_AIX5_mkdir, sys_mkdir),
AIXXY(__NR_AIX5_mmap, sys_mmap),
+ AIXXY(__NR_AIX5_mntctl, sys_mntctl),
AIXXY(__NR_AIX5_mprotect, sys_mprotect),
AIXXY(__NR_AIX5_munmap, sys_munmap),
AIXXY(__NR_AIX5_ngetpeername, sys_ngetpeername),
Modified: trunk/memcheck/mc_replace_strmem.c
===================================================================
--- trunk/memcheck/mc_replace_strmem.c 2007-11-29 03:06:25 UTC (rev 7248)
+++ trunk/memcheck/mc_replace_strmem.c 2007-11-29 03:08:32 UTC (rev 7249)
@@ -819,6 +819,9 @@
Str5FNs(libgdkZdso) /* libgdk.so */
Str5FNs(libcursesZdaZLshr42ZdoZR) /* libcurses.a(shr42.o) */
Str5FNs(libqtZda) /* libqt.a */
+Str5FNs(ZaZLlibglibZhZaZdsoZaZR) /* *(libglib-*.so*) */
+Str5FNs(ZaZLlibfontconfigZdsoZaZR) /* *(libfontconfig.so*) */
+Str5FNs(libQtZaa) /* libQt*.a */
#endif
#if defined(VGP_ppc64_aix5)
Str5FNs(NONE) /* in main exe */
@@ -832,6 +835,9 @@
Str5FNs(libCZdaZLshrcoreZu64ZdoZR) /* libC.a(shrcore_64.o) */
Str5FNs(libmpiZurZdaZLmpci64ZurZdoZR) /* libmpi_r.a(mpci64_r.o) */
Str5FNs(libqtZda) /* libqt.a */
+Str5FNs(ZaZLlibglibZhZaZdsoZaZR) /* *(libglib-*.so*) */
+Str5FNs(ZaZLlibfontconfigZdsoZaZR) /* *(libfontconfig.so*) */
+Str5FNs(libQtZaa) /* libQt*.a */
#endif
|