From patchwork Sun Feb 7 14:01:51 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marcin_Ko=C5=9Bcielnicki?= X-Patchwork-Id: 10753 Received: (qmail 65655 invoked by alias); 7 Feb 2016 14:01:56 -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 65630 invoked by uid 89); 7 Feb 2016 14:01:55 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.5 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD, SPF_PASS autolearn=ham version=3.3.2 spammy=agent, HContent-Transfer-Encoding:8bit X-HELO: xyzzy.0x04.net Received: from xyzzy.0x04.net (HELO xyzzy.0x04.net) (109.74.193.254) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sun, 07 Feb 2016 14:01:54 +0000 Received: from hogfather.0x04.net (89-65-66-135.dynamic.chello.pl [89.65.66.135]) by xyzzy.0x04.net (Postfix) with ESMTPS id 339AB3FE0F for ; Sun, 7 Feb 2016 15:02:41 +0100 (CET) Received: by hogfather.0x04.net (Postfix, from userid 1000) id 5EACA58008E; Sun, 7 Feb 2016 15:01:52 +0100 (CET) From: =?UTF-8?q?Marcin=20Ko=C5=9Bcielnicki?= To: gdb-patches@sourceware.org Cc: =?UTF-8?q?Marcin=20Ko=C5=9Bcielnicki?= Subject: [PATCH 3/8] gdb/s390: Fill pseudo register agent expression hooks. Date: Sun, 7 Feb 2016 15:01:51 +0100 Message-Id: <1454853711-18349-1-git-send-email-koriakin@0x04.net> In-Reply-To: <1453637529-26972-4-git-send-email-koriakin@0x04.net> References: <1453637529-26972-4-git-send-email-koriakin@0x04.net> MIME-Version: 1.0 X-IsSubscribed: yes gdb/ChangeLog: * s390-linux-tdep.c (s390_ax_pseudo_register_collect): New function. (s390_ax_pseudo_register_push_stack): New function. (s390_gdbarch_init): Fill ax_pseudo_register_collect and ax_pseudo_register_push_stack hooks. --- Added missing comments. gdb/ChangeLog | 7 +++++ gdb/s390-linux-tdep.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d24cccd..6260040 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,12 @@ 2016-02-07 Marcin Kościelnicki + * s390-linux-tdep.c (s390_ax_pseudo_register_collect): New function. + (s390_ax_pseudo_register_push_stack): New function. + (s390_gdbarch_init): Fill ax_pseudo_register_collect and + ax_pseudo_register_push_stack hooks. + +2016-02-07 Marcin Kościelnicki + * s390-linux-tdep.c (s390_supply_pseudo_pc): New function. (s390_gdbarch_init): Fill supply_pseudo_pc hook. diff --git a/gdb/s390-linux-tdep.c b/gdb/s390-linux-tdep.c index 144365c..97bd564 100644 --- a/gdb/s390-linux-tdep.c +++ b/gdb/s390-linux-tdep.c @@ -547,6 +547,86 @@ s390_pseudo_register_reggroup_p (struct gdbarch *gdbarch, int regnum, return default_register_reggroup_p (gdbarch, regnum, group); } +/* The "ax_pseudo_register_collect" gdbarch method. */ + +static int +s390_ax_pseudo_register_collect (struct gdbarch *gdbarch, + struct agent_expr *ax, int regnum) +{ + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + if (regnum == tdep->pc_regnum) + { + ax_reg_mask (ax, S390_PSWA_REGNUM); + } + else if (regnum == tdep->cc_regnum) + { + ax_reg_mask (ax, S390_PSWM_REGNUM); + } + else if (regnum_is_gpr_full (tdep, regnum)) + { + regnum -= tdep->gpr_full_regnum; + ax_reg_mask (ax, S390_R0_REGNUM + regnum); + ax_reg_mask (ax, S390_R0_UPPER_REGNUM + regnum); + } + else if (regnum_is_vxr_full (tdep, regnum)) + { + regnum -= tdep->v0_full_regnum; + ax_reg_mask (ax, S390_F0_REGNUM + regnum); + ax_reg_mask (ax, S390_V0_LOWER_REGNUM + regnum); + } + else + { + internal_error (__FILE__, __LINE__, _("invalid regnum")); + } + return 0; +} + +/* The "ax_pseudo_register_push_stack" gdbarch method. */ + +static int +s390_ax_pseudo_register_push_stack (struct gdbarch *gdbarch, + struct agent_expr *ax, int regnum) +{ + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + if (regnum == tdep->pc_regnum) + { + ax_reg (ax, S390_PSWA_REGNUM); + if (register_size (gdbarch, S390_PSWA_REGNUM) == 4) + { + ax_zero_ext (ax, 31); + } + } + else if (regnum == tdep->cc_regnum) + { + ax_reg (ax, S390_PSWM_REGNUM); + if (register_size (gdbarch, S390_PSWA_REGNUM) == 4) + ax_const_l (ax, 12); + else + ax_const_l (ax, 44); + ax_simple (ax, aop_rsh_unsigned); + ax_zero_ext (ax, 2); + } + else if (regnum_is_gpr_full (tdep, regnum)) + { + regnum -= tdep->gpr_full_regnum; + ax_reg (ax, S390_R0_REGNUM + regnum); + ax_reg (ax, S390_R0_UPPER_REGNUM + regnum); + ax_const_l (ax, 32); + ax_simple (ax, aop_lsh); + ax_simple (ax, aop_bit_or); + } + else if (regnum_is_vxr_full (tdep, regnum)) + { + /* Too large to stuff on the stack. */ + return 1; + } + else + { + internal_error (__FILE__, __LINE__, _("invalid regnum")); + } + return 0; +} + /* A helper for s390_software_single_step, decides if an instruction is a partial-execution instruction that needs to be executed until @@ -7886,6 +7966,10 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_tdesc_pseudo_register_type (gdbarch, s390_pseudo_register_type); set_tdesc_pseudo_register_reggroup_p (gdbarch, s390_pseudo_register_reggroup_p); + set_gdbarch_ax_pseudo_register_collect (gdbarch, + s390_ax_pseudo_register_collect); + set_gdbarch_ax_pseudo_register_push_stack + (gdbarch, s390_ax_pseudo_register_push_stack); tdesc_use_registers (gdbarch, tdesc, tdesc_data); set_gdbarch_register_name (gdbarch, s390_register_name);