From owner-p4-projects@FreeBSD.ORG Fri Oct 2 14:42:49 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id A85C1106568B; Fri, 2 Oct 2009 14:42:49 +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 6141D106568F for ; Fri, 2 Oct 2009 14:42:49 +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 4EEB08FC39 for ; Fri, 2 Oct 2009 14:42:49 +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 n92EgnAA029745 for ; Fri, 2 Oct 2009 14:42:49 GMT (envelope-from stas@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n92EgnCw029743 for perforce@freebsd.org; Fri, 2 Oct 2009 14:42:49 GMT (envelope-from stas@freebsd.org) Date: Fri, 2 Oct 2009 14:42:49 GMT Message-Id: <200910021442.n92EgnCw029743@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 169130 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: Fri, 02 Oct 2009 14:42:50 -0000 http://perforce.freebsd.org/chv.cgi?CH=169130 Change 169130 by stas@stas_yandex on 2009/10/02 14:42:33 - Add the workaround for memcheck's mprotect issue. Memcheck tracking scheme doesn't allow to mark memory bytes as unaddressable and defined simultaneously so if we mark them unaccessible on mprotect with PROT_NONE we loose any information on definiteness. So don't alter flags at all of permissions get decreased and operate only on unaccessible bytes if additional read/write permissions were granted. Affected files ... .. //depot/projects/valgrind/memcheck/mc_main.c#6 edit Differences ... ==== //depot/projects/valgrind/memcheck/mc_main.c#6 (text+ko) ==== @@ -1635,13 +1635,38 @@ } } +static void make_mem_defined_if_unaddressable ( Addr a, SizeT len ) +{ + SizeT i; + UChar vabits2; + DEBUG("make_mem_defined_if_unaddressable(%p, %llu)\n", a, (ULong)len); + for (i = 0; i < len; i++) { + vabits2 = get_vabits2( a+i ); + if (vabits2 == VA_BITS2_NOACCESS) { + set_vabits2(a+i, VA_BITS2_DEFINED); + if (UNLIKELY(MC_(clo_mc_level) >= 3)) { + MC_(helperc_b_store1)( a+i, 0 ); /* clear the origin tag */ + } + } + } +} + /* Track changes in the virtual memory space. */ static void track_perms_change( Addr a, SizeT len, Bool rr, Bool ww, Bool xx ) { +/* if (!(rr || ww)) MC_(make_mem_noaccess) ( a, len ); - MC_(make_mem_defined) ( a, len ); +*/ + /* + * Valgrind's memory management implementation is brain-damaged + * so we can't mark memory as unaccessible but defined :-( + * Thus we don't alter it if the new bits indicate the range + * as unaccessible and only change access bits for unaccessible + * bytes if permissions were given + */ + make_mem_defined_if_unaddressable ( a, len ); }