From owner-p4-projects@FreeBSD.ORG Thu Aug 20 15:27:03 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 29FC7106568B; Thu, 20 Aug 2009 15:27:03 +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 C0529106564A for ; Thu, 20 Aug 2009 15:27:02 +0000 (UTC) (envelope-from stas@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id AF17A8FC51 for ; Thu, 20 Aug 2009 15:27:02 +0000 (UTC) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n7KFR2bo052920 for ; Thu, 20 Aug 2009 15:27:02 GMT (envelope-from stas@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n7KFR2w8052918 for perforce@freebsd.org; Thu, 20 Aug 2009 15:27:02 GMT (envelope-from stas@freebsd.org) Date: Thu, 20 Aug 2009 15:27:02 GMT Message-Id: <200908201527.n7KFR2w8052918@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to stas@freebsd.org using -f From: Stanislav Sedov To: Perforce Change Reviews Cc: Subject: PERFORCE change 167541 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: Thu, 20 Aug 2009 15:27:03 -0000 http://perforce.freebsd.org/chv.cgi?CH=167541 Change 167541 by stas@stas_yandex on 2009/08/20 15:26:15 - Implement resolve_pathname. Affected files ... .. //depot/projects/valgrind/coregrind/m_aspacemgr/aspacemgr-common.c#6 edit .. //depot/projects/valgrind/include/vki/vki-freebsd.h#16 edit Differences ... ==== //depot/projects/valgrind/coregrind/m_aspacemgr/aspacemgr-common.c#6 (text+ko) ==== @@ -332,6 +332,11 @@ return False; } +#if defined(VGO_freebsd) +#define M_FILEDESC_BUF 1000000 +static Char filedesc_buf[M_FILEDESC_BUF]; +#endif + Bool ML_(am_resolve_filename) ( Int fd, /*OUT*/HChar* buf, Int nbuf ) { #if defined(VGO_linux) @@ -345,9 +350,38 @@ return False; #elif defined(VGO_freebsd) - I_die_here; /* maybe just return False? */ - return False; + Int mib[4]; + SysRes sres; + vki_size_t len; + Int cnt; + Char *bp, *eb; + struct vki_kinfo_file *kf; + mib[0] = VKI_CTL_KERN; + mib[1] = VKI_KERN_PROC; + mib[2] = VKI_KERN_PROC_FILEDESC; + mib[3] = sr_Res(VG_(do_syscall0)(__NR_getpid)); + len = sizeof(filedesc_buf); + sres = VG_(do_syscall6)(__NR___sysctl, (UWord)mib, 4, (UWord)filedesc_buf, + (UWord)&len, 0, 0); + if (sr_isError(sres)) { + VG_(debugLog)(0, "sysctl(kern.proc.filedesc)", "%s\n", VG_(strerror)(sr_Err(sres))); + ML_(am_exit)(1); + } + /* Walk though the list. */ + bp = filedesc_buf; + eb = filedesc_buf + len; + while (bp < eb) { + kf = (struct vki_kinfo_file *)bp; + if (kf->kf_fd == fd) + break; + bp += kf->kf_structsize; + } + if (bp >= eb || *kf->kf_path == '\0') + return False; + VG_(strncpy)( buf, kf->kf_path, nbuf ); + VG_(debugLog)(0, "aspacem", "Valgrind: found %s for %d\n", kf->kf_path, fd); + return True; #elif defined(VGO_aix5) I_die_here; /* maybe just return False? */ return False; ==== //depot/projects/valgrind/include/vki/vki-freebsd.h#16 (text+ko) ==== @@ -1897,6 +1897,25 @@ int kve_ispare[3]; }; +struct vki_kinfo_file { + int kf_structsize; /* Variable size of record. */ + int kf_type; /* Descriptor type. */ + int kf_fd; /* Array index. */ + int kf_ref_count; /* Reference count. */ + int kf_flags; /* Flags. */ + int _kf_pad0; /* Round to 64 bit alignment */ + Off64T kf_offset; /* Seek location. */ + int kf_vnode_type; /* Vnode type. */ + int kf_sock_domain; /* Socket domain. */ + int kf_sock_type; /* Socket type. */ + int kf_sock_protocol; /* Socket protocol. */ + char kf_sa_local[128]; /* Socket address. */ + char kf_sa_peer[128]; /* Peer address. */ + int _kf_ispare[16]; /* Space for more stuff. */ + /* Truncated before copyout in sysctl */ + char kf_path[VKI_PATH_MAX]; /* Path to file, if any. */ +}; + #if defined(VGP_x86_freebsd) /* Special case.. adapt to what the 64 bit kernel gives us */ struct vki_kinfo_vmentry_32on64 { @@ -1927,6 +1946,7 @@ #define VKI_CTL_HW 6 #define VKI_KERN_PROC 14 #define VKI_KERN_PROC_VMMAP 13 +#define VKI_KERN_PROC_FILEDESC 33 #define VKI_HW_MACHINE 1 //----------------------------------------------------------------------