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>