From patchwork Wed Jul 23 16:30:39 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pierre Langlois X-Patchwork-Id: 2152 Received: (qmail 7781 invoked by alias); 23 Jul 2014 16:30:49 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 7768 invoked by uid 89); 23 Jul 2014 16:30:49 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.4 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.2 X-HELO: mail-wi0-f181.google.com Received: from mail-wi0-f181.google.com (HELO mail-wi0-f181.google.com) (209.85.212.181) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Wed, 23 Jul 2014 16:30:48 +0000 Received: by mail-wi0-f181.google.com with SMTP id bs8so2563552wib.8 for ; Wed, 23 Jul 2014 09:30:45 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=JgEIq9VF0ciVOxHzKWfU9HV5/JuJW6o0EYqw7KZqTgQ=; b=eF4nMVb+PhbqnI1cPExRMCtm8CtURVxT8uKvroT/C3aszuUo6AFfD4auRd+ArtOaIX ssqEOFw2asI4UunolgMd2r8UpZUeAqbhasvomnPU1WYQJFtuNKB6qSn18NgvSqF/Z83U xjR6t5Ik5tbYoA4LamTWSlC5ElCMRNXMI/ezK6zpx1p2j2U4ghAnAhdHX9IedduUdwmF Q8sxoUJjVXaFLR/Sc3l3rN4pVQgifDMOUX31KRqA+tHXDjP4JroEGcJu3RC6z1jv8W1y cbtY9xNRnIsA6J7/NP1pC+DdMBo47XJDsfG41zhL7l+fxgKBvcbKgBSbqpIOFuieAaQG IQOQ== X-Gm-Message-State: ALoCoQk8Cn/rl1uuln1ANIHdIOlAqlLOoFPueV/UgUzqBeGUJe8wOzq8Z6yAwFD5TAG3ITiHfIx7 X-Received: by 10.194.79.135 with SMTP id j7mr3679130wjx.56.1406133045277; Wed, 23 Jul 2014 09:30:45 -0700 (PDT) Received: from localhost.localdomain (cust64-dsl91-135-5.idnet.net. [91.135.5.64]) by mx.google.com with ESMTPSA id 20sm7513162wjt.42.2014.07.23.09.30.44 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 23 Jul 2014 09:30:44 -0700 (PDT) From: Pierre Langlois To: gdb-patches@sourceware.org Cc: Pierre Langlois Subject: [PATCH] Clarify the address and pointer conversions on AVR. Date: Wed, 23 Jul 2014 17:30:39 +0100 Message-Id: <1406133039-28166-1-git-send-email-pierre.langlois@embecosm.com> X-IsSubscribed: yes Hi all, This patch adds additional comments about the conversion of addresses to pointers and vice-versa on AVR. Special conversion needs to be done when dealing with an address in the flash address space, where both code and read-only data can be stored. Code and data pointers to flash are not addressed the same way: A code pointer is 16 bit addressed. A data pointer is 8 bit addressed, even if the data is in flash. Thanks, Pierre 2014-07-23 Pierre Langlois * avr-tdep.c (avr_address_to_pointer): Clarify the conversion in the comments. (avr_pointer_to_address): Likewise. --- gdb/avr-tdep.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/gdb/avr-tdep.c b/gdb/avr-tdep.c index be0b543..1f268f2 100644 --- a/gdb/avr-tdep.c +++ b/gdb/avr-tdep.c @@ -308,7 +308,7 @@ avr_address_to_pointer (struct gdbarch *gdbarch, /* Is it a data address in flash? */ if (AVR_TYPE_ADDRESS_CLASS_FLASH (type)) { - /* A data address in flash is always byte addressed. */ + /* A data pointer in flash is byte addressed. */ store_unsigned_integer (buf, TYPE_LENGTH (type), byte_order, avr_convert_iaddr_to_raw (addr)); } @@ -316,8 +316,8 @@ avr_address_to_pointer (struct gdbarch *gdbarch, else if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_FUNC || TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_METHOD) { - /* A code address, either a function pointer or the program counter, is - word (16 bits) addressed. */ + /* A code pointer is word (16 bits) addressed. We shift the address down + by 1 bit to convert it to a pointer. */ store_unsigned_integer (buf, TYPE_LENGTH (type), byte_order, avr_convert_iaddr_to_raw (addr >> 1)); } @@ -339,12 +339,19 @@ avr_pointer_to_address (struct gdbarch *gdbarch, /* Is it a data address in flash? */ if (AVR_TYPE_ADDRESS_CLASS_FLASH (type)) - return avr_make_iaddr (addr); + { + /* A data pointer in flash is already byte addressed. */ + return avr_make_iaddr (addr); + } /* Is it a code address? */ else if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_FUNC || TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_METHOD || TYPE_CODE_SPACE (TYPE_TARGET_TYPE (type))) - return avr_make_iaddr (addr << 1); + { + /* A code pointer is word (16 bits) addressed so we shift it up + by 1 bit to convert it to an address. */ + return avr_make_iaddr (addr << 1); + } else return avr_make_saddr (addr); }