From owner-p4-projects@FreeBSD.ORG Mon Nov 10 20:51:22 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id CAEF21065692; Mon, 10 Nov 2008 20:51:22 +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 8AE44106568D for ; Mon, 10 Nov 2008 20:51:22 +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 76F018FC23 for ; Mon, 10 Nov 2008 20:51:22 +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 mAAKpMjc032981 for ; Mon, 10 Nov 2008 20:51:22 GMT (envelope-from peter-gmail@wemm.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id mAAKpMPk032977 for perforce@freebsd.org; Mon, 10 Nov 2008 20:51:22 GMT (envelope-from peter-gmail@wemm.org) Date: Mon, 10 Nov 2008 20:51:22 GMT Message-Id: <200811102051.mAAKpMPk032977@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 152762 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, 10 Nov 2008 20:51:23 -0000 http://perforce.freebsd.org/chv.cgi?CH=152762 Change 152762 by peter@peter_hammer on 2008/11/10 20:50:38 Hack! Hack! Oh the shame.. Affected files ... .. //depot/projects/valgrind/coregrind/m_aspacemgr/aspacemgr-freebsd.c#12 edit .. //depot/projects/valgrind/include/vki/vki-freebsd.h#13 edit Differences ... ==== //depot/projects/valgrind/coregrind/m_aspacemgr/aspacemgr-freebsd.c#12 (text+ko) ==== @@ -2919,6 +2919,62 @@ /* static ... to keep it out of the stack frame. */ static Char procmap_buf[M_PROCMAP_BUF]; +#if defined(VGP_x86_freebsd) +static Bool is32on64(void) +{ + Int oid[2]; + vki_size_t len; + char machbuf[32]; + static Int is32on64 = -1; + SysRes sres; + + if (is32on64 == -1) { + oid[0] = VKI_CTL_HW; + oid[1] = VKI_HW_MACHINE; + len = sizeof(machbuf); + sres = VG_(do_syscall6)(__NR___sysctl, (UWord)oid, 2, (UWord)machbuf, (UWord)&len, 0, 0); + if (!sres.isError) { + machbuf[31] = '\0'; + if (VG_(strcmp)(machbuf, "amd64") == 0) + is32on64 = 1; + else + is32on64 = 0; + } else { + is32on64 = -2; + } + } + if (is32on64 == 1) { + return True; + } else { + return False; + } +} + +static void fix_32on64(vki_size_t *len) +{ + struct vki_kinfo_vmentry_32on64 *kve64, t; + struct vki_kinfo_vmentry *kve32; + + aspacem_assert(sizeof(vki_kinfo_vmentry) < sizeof(vki_kinfo_vmentry_32on64)); + kve64 = (struct vki_kinfo_vmentry_32on64 *)procmap_buf; + kve32 = (struct vki_kinfo_vmentry *)procmap_buf; + for (i = 0; i < *len / sizeof(vki_kinfo_vmentry_32on64); i++, kve32++, kve64++) { + t = *kve64; + aspacem_assert(t.kve_start < 0x100000000ul); + aspacem_assert(t.kve_end < 0x100000000ul); + kve32->kve_structsize = t.kve_structsize; + kve32->kve_start = t.kve_start; + kve32->kve_end = t.kve_end; + kve32->kve_protection = t.kve_protection; + kve32->kve_path = t.kve_path; + kve32->kve_offset = t.kve_offset; + kve32->kve_fsid = t.kve_fsid; + kve32->kve_fileid = t.kve_fileid; + } + *len = *len * sizeof(vki_kinfo_vmentry) / sizeof(vki_kinfo_vmentry_32on64); +} +#endif + static void parse_procselfmaps ( void (*record_mapping)( Addr addr, SizeT len, UInt prot, ULong dev, ULong ino, ULong offset, @@ -2950,6 +3006,10 @@ VG_(debugLog)(0, "procselfmaps", "sysctl %ld\n", sres.err); ML_(am_exit)(1); } +#if defined(VGP_x86_freebsd) + if (is32on64()) + fix_32on64(&len); +#endif gapStart = Addr_MIN; i = 0; ==== //depot/projects/valgrind/include/vki/vki-freebsd.h#13 (text+ko) ==== @@ -1810,6 +1810,28 @@ int kve_ispare[3]; }; +#if defined(VGP_x86_freebsd) +/* Special case.. adapt to what the 64 bit kernel gives us */ +struct vki_kinfo_vmentry_32on64 { + int kve_structsize; + int kve_type; + ULong kve_start; + ULong kve_end; + int kve_flags; + int kve_resident; + int kve_private_resident; + int kve_protection; + int kve_ref_count; + int kve_shadow_count; + char kve_path[VKI_PATH_MAX]; + ULong kve_pspare[8]; + Off64T kve_offset; + ULong kve_fileid; + UInt kve_fsid; + int kve_ispare[3]; +}; +#endif + //---------------------------------------------------------------------- // From sys/sysctl.h (and related) //----------------------------------------------------------------------