From patchwork Tue Jun 3 05:01:54 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kyle McMartin X-Patchwork-Id: 1252 Received: (qmail 9188 invoked by alias); 3 Jun 2014 05:02:16 -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 9167 invoked by uid 89); 3 Jun 2014 05:02:14 -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, RP_MATCHES_RCVD, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 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; Tue, 03 Jun 2014 05:01:57 +0000 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s5351ueT020644 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 3 Jun 2014 01:01:56 -0400 Received: from redacted.bos.redhat.com ([10.18.17.143]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s5351sY3002323 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 3 Jun 2014 01:01:55 -0400 Date: Tue, 3 Jun 2014 01:01:54 -0400 From: Kyle McMartin To: gdb-patches@sourceware.org Subject: [PATCH 1/2] aarch64: extend decode_adrp to decode immediate offset Message-ID: <20140603050153.GB15355@redacted.bos.redhat.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20140603050011.GA15355@redacted.bos.redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-IsSubscribed: yes This is needed in order to figure out what an ADRP instruction is attempting to calculate the address of, for use by a further functionality. gdb/ 2014-06-03 Kyle McMartin * aarch64-tdep.c (decode_adrp): Generalise function to handle ADR as well as ADRP, and decode the offset. (aarch64_analyze_prologue): Discard unneeded arguments to decode_adrp. --- gdb/aarch64-tdep.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c index 4abe36e..9550f42 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -255,7 +255,7 @@ decode_add_sub_imm (CORE_ADDR addr, uint32_t insn, unsigned *rd, unsigned *rn, return 0; } -/* Decode an opcode if it represents an ADRP instruction. +/* Decode an opcode if it represents an ADRP/ADR instruction. ADDR specifies the address of the opcode. INSN specifies the opcode to test. @@ -264,16 +264,28 @@ decode_add_sub_imm (CORE_ADDR addr, uint32_t insn, unsigned *rd, unsigned *rn, Return 1 if the opcodes matches and is decoded, otherwise 0. */ static int -decode_adrp (CORE_ADDR addr, uint32_t insn, unsigned *rd) +decode_adrp (CORE_ADDR addr, uint32_t insn, int *page, unsigned *rd, + int64_t *imm) { - if (decode_masked_match (insn, 0x9f000000, 0x90000000)) + if (decode_masked_match (insn, 0x1f000000, 0x10000000)) { *rd = (insn >> 0) & 0x1f; + *imm = (extract_signed_bitfield (insn, 19, 5) << 2) + | ((insn >> 29) & 0x3); + *page = 0; + + if (insn & 0x80000000) + { + *page = 1; + *imm <<= 12; + } if (aarch64_debug) fprintf_unfiltered (gdb_stdlog, - "decode: 0x%s 0x%x adrp x%u, #?\n", - core_addr_to_string_nz (addr), insn, *rd); + "decode: 0x%s 0x%x %s x%u, #0x%llx\n", + core_addr_to_string_nz (addr), insn, + *page ? "adrp" : "adr", *rd, + (unsigned long long)*imm); return 1; } return 0; @@ -681,8 +693,10 @@ aarch64_analyze_prologue (struct gdbarch *gdbarch, unsigned rt2; int op_is_sub; int32_t imm; + int64_t imm64; unsigned cond; int is64; + int page; unsigned is_link; unsigned op; unsigned bit; @@ -692,7 +706,7 @@ aarch64_analyze_prologue (struct gdbarch *gdbarch, if (decode_add_sub_imm (start, insn, &rd, &rn, &imm)) regs[rd] = pv_add_constant (regs[rn], imm); - else if (decode_adrp (start, insn, &rd)) + else if (decode_adrp (start, insn, &page, &rd, &imm64)) regs[rd] = pv_unknown (); else if (decode_b (start, insn, &is_link, &offset)) {