From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 83233 invoked by alias); 19 Oct 2017 09:52:27 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 83216 invoked by uid 89); 19 Oct 2017 09:52:25 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=BAYES_00,RP_MATCHES_RCVD,SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=puzzle, magically X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 19 Oct 2017 09:52:23 +0000 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 60C7913A53; Thu, 19 Oct 2017 09:52:22 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 60C7913A53 Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=palves@redhat.com Received: from [127.0.0.1] (ovpn04.gateway.prod.ext.ams2.redhat.com [10.39.146.4]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9806CA50D3; Thu, 19 Oct 2017 09:52:21 +0000 (UTC) Subject: Re: [PATCH] [AArch64 Linux] Get rid of top byte from tagged address To: Yao Qi , gdb-patches@sourceware.org References: <1508400527-20718-1-git-send-email-yao.qi@linaro.org> From: Pedro Alves Message-ID: <561ea277-4b4c-ae82-01e1-1cde96cb54f2@redhat.com> Date: Thu, 19 Oct 2017 09:52:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 MIME-Version: 1.0 In-Reply-To: <1508400527-20718-1-git-send-email-yao.qi@linaro.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-SW-Source: 2017-10/txt/msg00596.txt.bz2 On 10/19/2017 09:08 AM, Yao Qi wrote: > ARMv8 supports tagged address, that is, the top one byte in address > is ignored. It is always enabled on aarch64-linux. In that case, why isn't the kernel itself stripping the top byte? OK, looking around, I found: https://www.kernel.org/doc/Documentation/arm64/tagged-pointers.txt where it's documented that the top byte must be 0 when calling into the kernel. Having this reference in the log is helpful. > The patch clear > the top byte of the virtual address, at the point before GDB/GDBserver > pass the address to /proc or ptrace syscall. The top byte of address is > still retained in the rest of GDB, because these bits can be used by > different applications in different ways. That is reason I didn't > implement gdbarch method addr_bits_remove to get rid of them. I'm fine with doing this if it's what arm/linaro folks want, though personally (with absolutely no experience in this) I have reservations about whether stripping the top byte in the special case of memory accesses is a good idea, since it may puzzle folks when they pass such pointers/addresses in registers/structures and things don't magically work then (and then gdb masks the problem when folks try to diagnose it, as in "but I can access the object via "p *s->ptr", why isn't this working??? bad gdb."). So I think this should be documented in the manual somewhere. > Before this patch, > (gdb) x/x 0x0000000000411030 > 0x411030 : 0x00000000 > (gdb) x/x 0xf000000000411030 > 0xf000000000411030: Cannot access memory at address 0xf000000000411030 > > After this patch, > > (gdb) x/x 0x0000000000411030 > 0x411030 : 0x00000000 > (gdb) x/x 0xf000000000411030 > 0xf000000000411030: 0x00000000 I think we should have a testsuite test for this. Could be something like the above (though I'd suggest making that 'global' variable have some value other than 0s to make sure we're reading the right memory). And/or something like: uint32_t global = 0x11223344; gdb_test "p *(uint32_t *) (((uintptr_t) 0xf << 60) | (uintptr_t) &global) == global" \ " = 1" \ "top byte ignored" > + if (object == TARGET_OBJECT_MEMORY) > + { > + /* ARMv8 supports tagged address, that is, the top one byte in > + virtual address is ignored. */ > + offset = offset & 0x0fffffffffffffffULL; In several places, instead of: V = V & MASK; you can write: V &= MASK; i.e here, write instead: offset &= 0x0fffffffffffffffULL; which is I think more usual. Thanks, Pedro Alves