From patchwork Fri Mar 3 22:06:34 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yao Qi X-Patchwork-Id: 19430 Received: (qmail 29033 invoked by alias); 3 Mar 2017 22:06:45 -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 28805 invoked by uid 89); 3 Mar 2017 22:06:44 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.4 required=5.0 tests=BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS autolearn=ham version=3.3.2 spammy=GDB's, Hx-languages-length:3878, GDBs X-HELO: mail-wm0-f68.google.com Received: from mail-wm0-f68.google.com (HELO mail-wm0-f68.google.com) (74.125.82.68) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 03 Mar 2017 22:06:43 +0000 Received: by mail-wm0-f68.google.com with SMTP id m70so5058540wma.1 for ; Fri, 03 Mar 2017 14:06:43 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=FZPsJTA0I1IvVO76o06PyfCJro2vY//c3BajkNRuBM8=; b=TOPq6SIB2XK+uEMrqnlPVa8B4XEEXqV0r2qc1uqZAr69nyebspkGw7Sp3ehBIWe7Hv 4ejKcXdbZG3cJC/zqs/shOYX+INmoBcjNzSLV43GYVn16V0WyWptck5+/Ko/ZX091i2p oRa8LzFvtjX+uF/CDtveE9kG/8VyATYpDwailII8ylH60U1Ugi37Gn4x675t0uHwfbsC c9+RfkfJSzeC4P2A9QHKBDMGlBu4AQFi4v6AfOV9Y5K9PzehhDUQ6q2uCjNLI8mQzZaR LDbK2/L2c4gPvbVRhjbPZilBlPvVmiC37g9BvFkseEHaPXyE+AJb920i0h3mQLwZKGLI KFMQ== X-Gm-Message-State: AMke39ko25p379/nzamrOXPluMWc90gerXysjLU4JPS1Y7YS0TAT6mrV4m1iWnqEasCmyg== X-Received: by 10.28.157.67 with SMTP id g64mr4727787wme.111.1488578801269; Fri, 03 Mar 2017 14:06:41 -0800 (PST) Received: from E107787-LIN.Home ([194.214.185.158]) by smtp.gmail.com with ESMTPSA id z70sm16755855wrc.2.2017.03.03.14.06.39 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 03 Mar 2017 14:06:40 -0800 (PST) From: Yao Qi X-Google-Original-From: Yao Qi To: gdb-patches@sourceware.org Subject: [PATCH 1/3] Add instruction_reader to arm process record Date: Fri, 3 Mar 2017 22:06:34 +0000 Message-Id: <1488578796-4481-2-git-send-email-yao.qi@linaro.org> In-Reply-To: <1488578796-4481-1-git-send-email-yao.qi@linaro.org> References: <1488578796-4481-1-git-send-email-yao.qi@linaro.org> X-IsSubscribed: yes This patch adds an abstract class abstract_memory_reader a and pass it to the code reading instructions in arm process record, rather than using target_read_memory to read from real target. This paves the way for adding more unit tests to arm process record. gdb: 2017-03-03 Yao Qi * arm-tdep.c (abstract_memory_reader): New class. (instruction_reader): New class. (extract_arm_insn): Add argument 'reader'. Callers updated. (decode_insn): Likewise. --- gdb/arm-tdep.c | 46 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c index 3aee722..b43368e 100644 --- a/gdb/arm-tdep.c +++ b/gdb/arm-tdep.c @@ -12905,17 +12905,43 @@ thumb2_record_decode_insn_handler (insn_decode_record *thumb2_insn_r) return -1; } +/* Abstract memory reader. */ + +class abstract_memory_reader +{ +public: + /* Read LEN bytes of target memory at address MEMADDR, placing the + results in GDB's memory at BUF. Return true on success. */ + + virtual bool read (CORE_ADDR memaddr, gdb_byte *buf, const size_t len) = 0; +}; + +/* Instruction reader from real target. */ + +class instruction_reader : public abstract_memory_reader +{ + public: + bool read (CORE_ADDR memaddr, gdb_byte *buf, const size_t len) + { + if (target_read_memory (memaddr, buf, len)) + return false; + else + return true; + } +}; + /* Extracts arm/thumb/thumb2 insn depending on the size, and returns 0 on success and positive val on fauilure. */ static int -extract_arm_insn (insn_decode_record *insn_record, uint32_t insn_size) +extract_arm_insn (abstract_memory_reader& reader, + insn_decode_record *insn_record, uint32_t insn_size) { gdb_byte buf[insn_size]; memset (&buf[0], 0, insn_size); - if (target_read_memory (insn_record->this_addr, &buf[0], insn_size)) + if (!reader.read (insn_record->this_addr, buf, insn_size)) return 1; insn_record->arm_insn = (uint32_t) extract_unsigned_integer (&buf[0], insn_size, @@ -12929,8 +12955,8 @@ typedef int (*sti_arm_hdl_fp_t) (insn_decode_record*); dispatch it. */ static int -decode_insn (insn_decode_record *arm_record, record_type_t record_type, - uint32_t insn_size) +decode_insn (abstract_memory_reader &reader, insn_decode_record *arm_record, + record_type_t record_type, uint32_t insn_size) { /* (Starting from numerical 0); bits 25, 26, 27 decodes type of arm @@ -12964,7 +12990,7 @@ decode_insn (insn_decode_record *arm_record, record_type_t record_type, uint32_t ret = 0; /* return value: negative:failure 0:success. */ uint32_t insn_id = 0; - if (extract_arm_insn (arm_record, insn_size)) + if (extract_arm_insn (reader, arm_record, insn_size)) { if (record_debug) { @@ -13073,7 +13099,8 @@ arm_process_record (struct gdbarch *gdbarch, struct regcache *regcache, paddress (gdbarch, arm_record.this_addr)); } - if (extract_arm_insn (&arm_record, 2)) + instruction_reader reader; + if (extract_arm_insn (reader, &arm_record, 2)) { if (record_debug) { @@ -13094,7 +13121,7 @@ arm_process_record (struct gdbarch *gdbarch, struct regcache *regcache, if (!(u_regval & t_bit)) { /* We are decoding arm insn. */ - ret = decode_insn (&arm_record, ARM_RECORD, ARM_INSN_SIZE_BYTES); + ret = decode_insn (reader, &arm_record, ARM_RECORD, ARM_INSN_SIZE_BYTES); } else { @@ -13102,13 +13129,14 @@ arm_process_record (struct gdbarch *gdbarch, struct regcache *regcache, /* is it thumb2 insn? */ if ((0x1D == insn_id) || (0x1E == insn_id) || (0x1F == insn_id)) { - ret = decode_insn (&arm_record, THUMB2_RECORD, + ret = decode_insn (reader, &arm_record, THUMB2_RECORD, THUMB2_INSN_SIZE_BYTES); } else { /* We are decoding thumb insn. */ - ret = decode_insn (&arm_record, THUMB_RECORD, THUMB_INSN_SIZE_BYTES); + ret = decode_insn (reader, &arm_record, THUMB_RECORD, + THUMB_INSN_SIZE_BYTES); } }