From: Julian Seward Date: Thu, 29 Nov 2007 03:08:32 +0000 (+0000) Subject: Changes to make Memcheck work sanely on recent incarnations of AIX 5.3: X-Git-Tag: svn/VALGRIND_3_3_0~43 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=953b8549d742a548d8446464e9ae2ae0d06795e0;p=thirdparty%2Fvalgrind.git 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 git-svn-id: svn://svn.valgrind.org/valgrind/trunk@7249 --- diff --git a/coregrind/m_syswrap/priv_syswrap-aix5.h b/coregrind/m_syswrap/priv_syswrap-aix5.h index 4878e7e88b..0e691b9a3a 100644 --- a/coregrind/m_syswrap/priv_syswrap-aix5.h +++ b/coregrind/m_syswrap/priv_syswrap-aix5.h @@ -71,7 +71,6 @@ extern HChar* ML_(aix5debugstuff_pc_to_fnname) ( Addr pc ); 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_close); 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_kpread); 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_lseek); 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); diff --git a/coregrind/m_syswrap/syswrap-aix5.c b/coregrind/m_syswrap/syswrap-aix5.c index 9f6e48098d..09e234745e 100644 --- a/coregrind/m_syswrap/syswrap-aix5.c +++ b/coregrind/m_syswrap/syswrap-aix5.c @@ -479,12 +479,6 @@ PRE(sys___msleep) /* __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(sys_finfo) 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 @@ PRE(sys_kthread_ctl) 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 @@ POST(sys_mmap) 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); diff --git a/coregrind/m_syswrap/syswrap-ppc32-aix5.c b/coregrind/m_syswrap/syswrap-ppc32-aix5.c index 2eaa785f3f..9c12b00545 100644 --- a/coregrind/m_syswrap/syswrap-ppc32-aix5.c +++ b/coregrind/m_syswrap/syswrap-ppc32-aix5.c @@ -340,6 +340,7 @@ void VG_(cleanup_thread) ( ThreadArchState* arch ) 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 @@ POST(sys___unload) 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 @@ AIX5SCTabEntry aix5_ppc32_syscall_table[] 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 @@ AIX5SCTabEntry aix5_ppc32_syscall_table[] 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 @@ AIX5SCTabEntry aix5_ppc32_syscall_table[] 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 @@ AIX5SCTabEntry aix5_ppc32_syscall_table[] 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), diff --git a/coregrind/m_syswrap/syswrap-ppc64-aix5.c b/coregrind/m_syswrap/syswrap-ppc64-aix5.c index fb6aeb8276..3546039d86 100644 --- a/coregrind/m_syswrap/syswrap-ppc64-aix5.c +++ b/coregrind/m_syswrap/syswrap-ppc64-aix5.c @@ -338,6 +338,7 @@ void VG_(cleanup_thread) ( ThreadArchState* arch ) #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_thread_setstate); 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 @@ AIX5SCTabEntry aix5_ppc64_syscall_table[] = { 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 @@ AIX5SCTabEntry aix5_ppc64_syscall_table[] 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 @@ AIX5SCTabEntry aix5_ppc64_syscall_table[] 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 @@ AIX5SCTabEntry aix5_ppc64_syscall_table[] 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), diff --git a/memcheck/mc_replace_strmem.c b/memcheck/mc_replace_strmem.c index 46eaa288a5..bad862819a 100644 --- a/memcheck/mc_replace_strmem.c +++ b/memcheck/mc_replace_strmem.c @@ -819,6 +819,9 @@ Str5FNs(libGLZdaZLshrZdoZR) /* libGL.a(shr.o) */ 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(libmpiZurZdaZLmpipoe64ZurZdoZR) /* libmpi_r.a(mpipoe64_r.o) */ 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