From patchwork Thu Mar 23 14:14:05 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yao Qi X-Patchwork-Id: 19713 Received: (qmail 45229 invoked by alias); 23 Mar 2017 14:14:14 -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 45078 invoked by uid 89); 23 Mar 2017 14:14:10 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.0 required=5.0 tests=AWL, 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= X-HELO: mail-pg0-f66.google.com Received: from mail-pg0-f66.google.com (HELO mail-pg0-f66.google.com) (74.125.83.66) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 23 Mar 2017 14:14:08 +0000 Received: by mail-pg0-f66.google.com with SMTP id 81so28431465pgh.3 for ; Thu, 23 Mar 2017 07:14:09 -0700 (PDT) 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; bh=9DaN8uf7rOqRhqOj2kkNsiPDamMpI2FC+Ep5FSdNDPo=; b=cew/Ya3I2mLJkWqYWp0gQ793zjxGto2NFrZYs0ijMw+xa4Ltmq6DR+WWzXij0bV4Sb SMIMQMr4eHVtO+usd+NI7NgGmOW63rBrZoiN0MyDC4BslOLGmjp3p1y7/t1SaTm6GNTF oYhhZ6u6F3qYg9gtjcQvm9eQ5tdwK/Wn6+eagaEBZRShJkq8GvQ3g+CwdTzUTdJ4F16D pDhdHVG2hJ1MwacciRYh7oLbZbPWS0Uo/OrGaE6rN09FvTS2RDzoB1u+qS9MWiIu7bb6 zH+/rU0gOBNCfHkFBIbz4P0zdx0UWa9q2ez9zt/BrMgfIBtFBRJUW2ub0Tqixp02+ApJ X8lg== X-Gm-Message-State: AFeK/H3uEASHT9K8lelTvUbeId9HsG8MCO4/LkL3W1EfgqVVc5KksjtxxtFM3Uzz6qxYOQ== X-Received: by 10.98.96.65 with SMTP id u62mr3285862pfb.219.1490278448179; Thu, 23 Mar 2017 07:14:08 -0700 (PDT) Received: from E107787-LIN.cambridge.arm.com (gcc114.osuosl.org. [140.211.9.72]) by smtp.gmail.com with ESMTPSA id y186sm10696968pfg.52.2017.03.23.07.14.07 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 23 Mar 2017 07:14:07 -0700 (PDT) From: Yao Qi X-Google-Original-From: Yao Qi To: gdb-patches@sourceware.org Subject: [pushed] Handle PRFM in AArch64 process record Date: Thu, 23 Mar 2017 14:14:05 +0000 Message-Id: <1490278445-13453-1-git-send-email-yao.qi@linaro.org> X-IsSubscribed: yes This patch fixes the bug of handling PRFM instruction. PRFM is documented in a table with other load and store instructions, but it doesn't do any load or store. This patch also adds a unit test to PRFM instruction. gdb: 2017-03-23 Yao Qi * aarch64-tdep.c (aarch64_process_record_test): Declare. (_initialize_aarch64_tdep): Register it. (aarch64_record_load_store): Handle PRFM instruction. (aarch64_process_record_test): New function. --- gdb/ChangeLog | 7 +++++++ gdb/aarch64-tdep.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 64 insertions(+), 3 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index cd863de..9cfc5aa 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,12 @@ 2017-03-23 Yao Qi + * aarch64-tdep.c (aarch64_process_record_test): Declare. + (_initialize_aarch64_tdep): Register it. + (aarch64_record_load_store): Handle PRFM instruction. + (aarch64_process_record_test): New function. + +2017-03-23 Yao Qi + * aarch64-tdep.c (aarch64_record_load_store): Fix code indentation. diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c index 486dac3..f340d57 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -3038,6 +3038,11 @@ aarch64_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file) paddress (gdbarch, tdep->lowest_pc)); } +namespace selftests +{ +static void aarch64_process_record_test (void); +} + /* Suppress warning from -Wmissing-prototypes. */ extern initialize_file_ftype _initialize_aarch64_tdep; @@ -3060,6 +3065,7 @@ When on, AArch64 specific debugging is enabled."), #if GDB_SELF_TEST register_self_test (selftests::aarch64_analyze_prologue_test); + register_self_test (selftests::aarch64_process_record_test); #endif } @@ -3617,10 +3623,23 @@ aarch64_record_load_store (insn_decode_record *aarch64_insn_r) } else { - if (size_bits != 0x03) - ld_flag = 0x01; + if (size_bits == 0x3 && vector_flag == 0x0 && opc == 0x2) + { + /* PRFM (immediate) */ + return AARCH64_RECORD_SUCCESS; + } + else if (size_bits == 0x2 && vector_flag == 0x0 && opc == 0x2) + { + /* LDRSW (immediate) */ + ld_flag = 0x1; + } else - return AARCH64_RECORD_UNKNOWN; + { + if (opc & 0x01) + ld_flag = 0x01; + else + ld_flag = 0x0; + } } if (record_debug) @@ -3949,6 +3968,41 @@ deallocate_reg_mem (insn_decode_record *record) xfree (record->aarch64_mems); } +#if GDB_SELF_TEST +namespace selftests { + +static void +aarch64_process_record_test (void) +{ + struct gdbarch_info info; + uint32_t ret; + + gdbarch_info_init (&info); + info.bfd_arch_info = bfd_scan_arch ("aarch64"); + + struct gdbarch *gdbarch = gdbarch_find_by_info (info); + SELF_CHECK (gdbarch != NULL); + + insn_decode_record aarch64_record; + + memset (&aarch64_record, 0, sizeof (insn_decode_record)); + aarch64_record.regcache = NULL; + aarch64_record.this_addr = 0; + aarch64_record.gdbarch = gdbarch; + + /* 20 00 80 f9 prfm pldl1keep, [x1] */ + aarch64_record.aarch64_insn = 0xf9800020; + ret = aarch64_record_decode_insn_handler (&aarch64_record); + SELF_CHECK (ret == AARCH64_RECORD_SUCCESS); + SELF_CHECK (aarch64_record.reg_rec_count == 0); + SELF_CHECK (aarch64_record.mem_rec_count == 0); + + deallocate_reg_mem (&aarch64_record); +} + +} // namespace selftests +#endif /* GDB_SELF_TEST */ + /* Parse the current instruction and record the values of the registers and memory that will be changed in current instruction to record_arch_list return -1 if something is wrong. */