From owner-p4-projects@FreeBSD.ORG Mon Oct 27 20:25:09 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id D413C10656A4; Mon, 27 Oct 2008 20:25:08 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 9849510656A1 for ; Mon, 27 Oct 2008 20:25:08 +0000 (UTC) (envelope-from peter-gmail@wemm.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 8585C8FC16 for ; Mon, 27 Oct 2008 20:25:08 +0000 (UTC) (envelope-from peter-gmail@wemm.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id m9RKP8nq062929 for ; Mon, 27 Oct 2008 20:25:08 GMT (envelope-from peter-gmail@wemm.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id m9RKP8cp062927 for perforce@freebsd.org; Mon, 27 Oct 2008 20:25:08 GMT (envelope-from peter-gmail@wemm.org) Date: Mon, 27 Oct 2008 20:25:08 GMT Message-Id: <200810272025.m9RKP8cp062927@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to peter-gmail@wemm.org using -f From: Peter Wemm To: Perforce Change Reviews Cc: Subject: PERFORCE change 152045 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 27 Oct 2008 20:25:09 -0000 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/. 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/. 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;