Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 27 Oct 2008 20:25:08 GMT
From:      Peter Wemm <peter@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 152045 for review
Message-ID:  <200810272025.m9RKP8cp062927@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=152045

Change 152045 by peter@peter_freefall on 2008/10/27 20:24:17

	Stop depending on the getpath kernel module.  Re-parse the procfs curproc/map
	file as needed after each mmap operation.

Affected files ...

.. //depot/projects/valgrind/coregrind/m_aspacemgr/aspacemgr-freebsd.c#5 edit
.. //depot/projects/valgrind/coregrind/m_libcfile.c#6 edit
.. //depot/projects/valgrind/coregrind/m_main.c#7 edit

Differences ...

==== //depot/projects/valgrind/coregrind/m_aspacemgr/aspacemgr-freebsd.c#5 (text+ko) ====

@@ -349,49 +349,48 @@
    return ML_(am_get_fd_d_i_m)(fd, dev, ino, mode);
 }
 
-/* Given a file descriptor, attempt to deduce its filename.  To do
-   this, we use /proc/self/fd/<FD>.  If this doesn't point to a file,
-   or if it doesn't exist, we return False. */
+
+/* Given a memory address, attempt to deduce its filename.  To do
+   this, we use /proc/curproc/map.  If this fails, return false. */
 static
-Bool get_name_for_fd ( Int fd, HChar* buf, Int nbuf )
+Bool get_name_for_addr ( Addr search_addr, HChar* buf, Int nbuf )
 {
-   static int nr_fromfd = -1;
-   SysRes res;
-   Int   i;
+   Int i;
 
-   for (i = 0; i < nbuf; i++) buf[i] = 0;
-   if (nr_fromfd == -1) {
-      int oid[2];
-      int real_oid[10];
-      vki_size_t oidlen;
-      char *name = "machdep.getpath_fromfd_num";
-      vki_size_t len;
-      int sc;
-
-      oid[0] = 0;	/* magic */
-      oid[1] = 3;	/* undocumented */
-      oidlen = sizeof(real_oid);
-      res = VG_(do_syscall6)(__NR___sysctl, (UWord)oid, 2, (UWord)real_oid, (UWord)&oidlen, (UWord)name, VG_(strlen)(name));
-      oidlen /= sizeof(int);
-      if (!res.isError && oidlen > 0) {
-	 len = sizeof(sc);
-	 res = VG_(do_syscall6)(__NR___sysctl, (UWord)real_oid, oidlen, (UWord)&sc, (UWord)&len, 0, 0);
-	 if (!res.isError && sc > 0)
-	    nr_fromfd = sc;
-      }
-      if (nr_fromfd == -1)
-	 nr_fromfd = -2;
+   /* Callback function for parsing map */
+   static void get_name_for_addr_callback(Addr addr, SizeT len, UInt prot,
+                                ULong dev, ULong ino, ULong offset,
+                                const UChar* filename )
+   {
+      if (search_addr < addr)
+         return;
+      if (search_addr > (addr + len - 1))
+         return;
+      VG_(strncpy)( buf, filename, nbuf - 1);
    }
-   if (nr_fromfd < 0)
-      return False;
 
-   res = VG_(do_syscall3)(nr_fromfd, fd, (UWord)buf, nbuf);
-   if (!res.isError && buf[0] == '/')
+   for (i = 0; i < nbuf; i++) buf[i] = 0;
+   parse_procselfmaps( get_name_for_addr_callback, 0);
+   if (buf[0] == '/')
       return True;
    else
       return False;
 }
 
+/* Given a file descriptor, attempt to deduce its filename.  To do
+   this, we use /proc/self/fd/<FD>.  If this doesn't point to a file,
+   or if it doesn't exist, we return False. */
+static
+Bool get_name_for_fd ( Addr addr, Int fd, HChar* buf, Int nbuf )
+{
+   if (get_name_for_addr(addr, buf, nbuf)) {
+      if (0) VG_(debugLog)(0,"aspacem","get_name_for_addr succeeded %s!\n", buf);
+      return True;
+   }
+   if (0) VG_(debugLog)(0,"aspacem","get_name_for_addr failed!\n");
+   return False;
+}
+
 
 /*-----------------------------------------------------------------*/
 /*---                                                           ---*/
@@ -1929,7 +1928,7 @@
          seg.ino = ino;
          seg.mode = mode;
       }
-      if (get_name_for_fd(fd, buf, VKI_PATH_MAX)) {
+      if (get_name_for_fd(a, fd, buf, VKI_PATH_MAX)) {
          seg.fnIdx = allocate_segname( buf );
       }
    }
@@ -2144,7 +2143,7 @@
       seg.ino = ino;
       seg.mode = mode;
    }
-   if (get_name_for_fd(fd, buf, VKI_PATH_MAX)) {
+   if (get_name_for_fd(start, fd, buf, VKI_PATH_MAX)) {
       seg.fnIdx = allocate_segname( buf );
    }
    add_segment( &seg );
@@ -2419,7 +2418,7 @@
       seg.ino  = ino;
       seg.mode = mode;
    }
-   if (get_name_for_fd(fd, buf, VKI_PATH_MAX)) {
+   if (get_name_for_fd(seg.start, fd, buf, VKI_PATH_MAX)) {
       seg.fnIdx = allocate_segname( buf );
    }
    add_segment( &seg );
@@ -3213,11 +3212,6 @@
          foffset = 0;
       }
 
-#if 0
-      if (!filename)
-         filename = find_path(start);
-#endif
-
       prot = 0;
       if (rr == 'r') prot |= VKI_PROT_READ;
       if (ww == 'w') prot |= VKI_PROT_WRITE;

==== //depot/projects/valgrind/coregrind/m_libcfile.c#6 (text+ko) ====

@@ -92,30 +92,25 @@
    SysRes res;
 
    VG_(memset)(buf, 0, n_buf);
-//VG_(printf)("resolve_filename %d called\n", fd);
    if (nr_fromfd == -1) {
-      Int sc;
-      Int error;
+      Int error, sc;
       vki_size_t scl;
 
+      scl = sizeof(sc);
       sc = -1;
-      scl = sizeof(sc);
       error = VG_(sysctlbyname)("machdep.getpath_fromfd_num", &sc, &scl, 0, 0);
       if (error != -1 && sc > 0)
 	 nr_fromfd = sc;
       if (nr_fromfd == -1)
 	 nr_fromfd = -2;
    }
-//VG_(printf)("__getpath_fromfd syscall is %d\n", nr_fromfd);
    if (nr_fromfd < 0)
       return False;
 
    res = VG_(do_syscall3)(nr_fromfd, fd, (UWord)buf, n_buf);
    if (!res.isError && buf[0] == '/') {
-//VG_(printf)("__getpath_fromfd success path %s\n",buf);
       return True;
    } else {
-//VG_(printf)("__getpath_fromfd fail path %s\n",buf);
       return False;
    }
 }

==== //depot/projects/valgrind/coregrind/m_main.c#7 (text+ko) ====

@@ -324,7 +324,7 @@
    /* log to stderr by default, but usage message goes to stdout */
    tmp_log_fd = 2; 
 
-#if defined(VGO_freebsd)
+#if defined(VGO_freebsd) && 0
    {
       Int modid;
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200810272025.m9RKP8cp062927>