]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Changes to make Memcheck work sanely on recent incarnations of AIX 5.3:
authorJulian Seward <jseward@acm.org>
Thu, 29 Nov 2007 03:08:32 +0000 (03:08 +0000)
committerJulian Seward <jseward@acm.org>
Thu, 29 Nov 2007 03:08:32 +0000 (03:08 +0000)
* 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

coregrind/m_syswrap/priv_syswrap-aix5.h
coregrind/m_syswrap/syswrap-aix5.c
coregrind/m_syswrap/syswrap-ppc32-aix5.c
coregrind/m_syswrap/syswrap-ppc64-aix5.c
memcheck/mc_replace_strmem.c

index 4878e7e88b18b44e5d239d9a487a5ecaf8a7af84..0e691b9a3af17b53ea0f499bacdbb6d1fdf345f5 100644 (file)
@@ -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);
index 9f6e48098d4b4d7b7bacbc99c104f5c430a90f0c..09e234745e75ffc2f52b81cb41dec77f2c442ef5 100644 (file)
@@ -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);
index 2eaa785f3f028a37aae313e82dcfd3b15acf01ab..9c12b00545066452975aa2e81890fab60f016026 100644 (file)
@@ -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),
index fb6aeb827645bab3094c92a077acd46c9f77ff04..3546039d86c3651edd436a06cff0b070dfbb9e46 100644 (file)
@@ -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),
index 46eaa288a5cb6cb2c942de3fef3c0cb71872521e..bad862819a4f92b417fd2b6794f8cdf47257790f 100644 (file)
@@ -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