public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: John Baldwin <jhb@FreeBSD.org>
To: gdb-patches@sourceware.org
Subject: [PATCH 1/5] regcache: Add collect/supply_regset variants that accept a register base.
Date: Thu,  7 Jul 2022 17:58:12 -0700	[thread overview]
Message-ID: <20220708005816.9408-2-jhb@FreeBSD.org> (raw)
In-Reply-To: <20220708005816.9408-1-jhb@FreeBSD.org>

Some register sets described by an array of regcache_map_entry
structures do not have fixed register numbers in their associated
architecture but do describe a block of registers whose numbers are at
fixed offsets relative to some base register value.  An example of
this are the TLS register sets for the ARM and AArch64 architectures.

Currently OS-specific architectures create register maps and register
sets dynamically using the register base number.  However, this
requires duplicating the code to create the register map and register
set.  To reduce duplication, add variants of the collect_regset and
supply_regset regcache methods which accept a base register number.
For valid register map entries (i.e. not REGCACHE_MAP_SKIP), add this
base register number to the value from the map entry to determine the
final register number.
---
 gdb/regcache.c | 28 +++++++++++++++++++++++++---
 gdb/regcache.h | 24 ++++++++++++++++++++++--
 2 files changed, 47 insertions(+), 5 deletions(-)

diff --git a/gdb/regcache.c b/gdb/regcache.c
index 037659ef8fa..1db3d972ef8 100644
--- a/gdb/regcache.c
+++ b/gdb/regcache.c
@@ -1180,7 +1180,7 @@ regcache::transfer_regset_register (struct regcache *out_regcache, int regnum,
 /* See regcache.h.  */
 
 void
-regcache::transfer_regset (const struct regset *regset,
+regcache::transfer_regset (const struct regset *regset, int regbase,
 			   struct regcache *out_regcache,
 			   int regnum, const gdb_byte *in_buf,
 			   gdb_byte *out_buf, size_t size) const
@@ -1195,6 +1195,9 @@ regcache::transfer_regset (const struct regset *regset,
       int regno = map->regno;
       int slot_size = map->size;
 
+      if (regno != REGCACHE_MAP_SKIP)
+	regno += regbase;
+
       if (slot_size == 0 && regno != REGCACHE_MAP_SKIP)
 	slot_size = m_descr->sizeof_register[regno];
 
@@ -1242,7 +1245,18 @@ void
 regcache::supply_regset (const struct regset *regset,
 			 int regnum, const void *buf, size_t size)
 {
-  transfer_regset (regset, this, regnum, (const gdb_byte *) buf, nullptr, size);
+  transfer_regset (regset, 0, this, regnum, (const gdb_byte *) buf, nullptr,
+		   size);
+}
+
+/* See regcache.h.  */
+
+void
+regcache::supply_regset (const struct regset *regset, int regbase,
+			 int regnum, const void *buf, size_t size)
+{
+  transfer_regset (regset, regbase, this, regnum, (const gdb_byte *) buf,
+		   nullptr, size);
 }
 
 /* Collect register REGNUM from REGCACHE to BUF, using the register
@@ -1261,11 +1275,19 @@ void
 regcache::collect_regset (const struct regset *regset,
 			 int regnum, void *buf, size_t size) const
 {
-  transfer_regset (regset, nullptr, regnum, nullptr, (gdb_byte *) buf, size);
+  transfer_regset (regset, 0, nullptr, regnum, nullptr, (gdb_byte *) buf, size);
 }
 
 /* See regcache.h  */
 
+void
+regcache::collect_regset (const struct regset *regset, int regbase,
+			 int regnum, void *buf, size_t size) const
+{
+  transfer_regset (regset, regbase, nullptr, regnum, nullptr, (gdb_byte *) buf,
+		   size);
+}
+
 bool
 regcache_map_supplies (const struct regcache_map_entry *map, int regnum,
 		       struct gdbarch *gdbarch, size_t size)
diff --git a/gdb/regcache.h b/gdb/regcache.h
index 1dbba5ce9af..f01127b20fb 100644
--- a/gdb/regcache.h
+++ b/gdb/regcache.h
@@ -150,6 +150,14 @@ extern void regcache_collect_regset (const struct regset *regset,
 				     int regnum, void *buf, size_t size);
 
 
+extern void regcache_supply_regset (const struct regset *regset, int regbase,
+				    struct regcache *regcache,
+				    int regnum, const void *buf,
+				    size_t size);
+extern void regcache_collect_regset (const struct regset *regset, int regbase,
+				     const struct regcache *regcache,
+				     int regnum, void *buf, size_t size);
+
 /* Return true if a set of registers contains the value of the
    register numbered REGNUM.  The size of the set of registers is
    given in SIZE, and the layout of the set of registers is described
@@ -375,10 +383,22 @@ class regcache : public detached_regcache
   void cooked_write_part (int regnum, int offset, int len,
 			  const gdb_byte *buf);
 
+  /* Transfer a set of registers (as described by REGSET) between
+     REGCACHE and BUF.  If REGNUM == -1, transfer all registers
+     belonging to the regset, otherwise just the register numbered
+     REGNUM.  The REGSET's 'regmap' field must point to an array of
+     'struct regcache_map_entry'.  The valid register numbers in each
+     entry in 'struct regcache_map_entry' are offset by REGBASE.  */
+
+  void supply_regset (const struct regset *regset, int regbase,
+		      int regnum, const void *buf, size_t size);
+
+  void collect_regset (const struct regset *regset, int regbase, int regnum,
+		       void *buf, size_t size) const;
+
   void supply_regset (const struct regset *regset,
 		      int regnum, const void *buf, size_t size);
 
-
   void collect_regset (const struct regset *regset, int regnum,
 		       void *buf, size_t size) const;
 
@@ -419,7 +439,7 @@ class regcache : public detached_regcache
   /* Transfer a single or all registers belonging to a certain register
      set to or from a buffer.  This is the main worker function for
      regcache_supply_regset and regcache_collect_regset.  */
-  void transfer_regset (const struct regset *regset,
+  void transfer_regset (const struct regset *regset, int regbase,
 			struct regcache *out_regcache,
 			int regnum, const gdb_byte *in_buf,
 			gdb_byte *out_buf, size_t size) const;
-- 
2.36.1


  reply	other threads:[~2022-07-08  1:03 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-07-08  0:58 [PATCH 0/5] Improve support for regcache_map_entry with variable " John Baldwin
2022-07-08  0:58 ` John Baldwin [this message]
2022-11-22 19:56   ` [PATCH 1/5] regcache: Add collect/supply_regset variants that accept a " Simon Marchi
2022-11-22 20:18     ` Simon Marchi
2022-11-22 22:32     ` John Baldwin
2022-07-08  0:58 ` [PATCH 2/5] fbsd-nat: Use regset supply/collect methods John Baldwin
2022-11-22 20:20   ` Simon Marchi
2022-07-08  0:58 ` [PATCH 3/5] fbsd-nat: Pass an optional register base to the register set helpers John Baldwin
2022-11-22 20:38   ` Simon Marchi
2022-11-22 22:16     ` John Baldwin
2022-11-22 22:25       ` John Baldwin
2022-07-08  0:58 ` [PATCH 4/5] arm-fbsd: Use a static regset for the TLS register set John Baldwin
2022-11-22 20:39   ` Simon Marchi
2022-07-08  0:58 ` [PATCH 5/5] aarch64-fbsd: " John Baldwin
2022-11-22 20:40   ` Simon Marchi
2022-07-21 14:53 ` [PATCH 0/5] Improve support for regcache_map_entry with variable register base John Baldwin
2022-08-22 18:11   ` [PING] " John Baldwin
2022-09-20 17:50     ` John Baldwin
2022-10-20 20:26       ` [PING 4] " John Baldwin
2022-11-21 18:21         ` [PING 5] " John Baldwin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220708005816.9408-2-jhb@FreeBSD.org \
    --to=jhb@freebsd.org \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).