]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[gdb/tdep] Use raw_supply_part_zeroed for AArch64
authorTom de Vries <tdevries@suse.de>
Tue, 12 Nov 2024 10:37:50 +0000 (11:37 +0100)
committerTom de Vries <tdevries@suse.de>
Tue, 12 Nov 2024 10:37:50 +0000 (11:37 +0100)
In gdb/aarch64-linux-tdep.c we find:
...
      gdb::byte_vector za_zeroed (za_bytes, 0);
      regcache->raw_supply (tdep->sme_za_regnum, za_zeroed);
...

We can't use reg_buffer::raw_supply_zeroed here because only part of the
register is written.

Add raw_supply_part_zeroed, and use it instead.

Likewise elsewhere in AArch64 tdep code.

Tested on aarch64-linux.

Approved-By: Luis Machado <luis.machado@arm.com>
gdb/aarch64-linux-tdep.c
gdb/nat/aarch64-scalable-linux-ptrace.c
gdb/regcache.c
gdb/regcache.h
gdbserver/regcache.cc
gdbserver/regcache.h
gdbsupport/common-regcache.h

index c608a84bc7118f619d678b180ff062beedd2259d..0937659bc813c2886d9250775a244c8803c11592 100644 (file)
@@ -1297,10 +1297,7 @@ aarch64_linux_supply_za_regset (const struct regset *regset,
       regcache->raw_supply (tdep->sme_za_regnum, buf);
     }
   else
-    {
-      gdb::byte_vector za_zeroed (za_bytes, 0);
-      regcache->raw_supply (tdep->sme_za_regnum, za_zeroed);
-    }
+    regcache->raw_supply_part_zeroed (tdep->sme_za_regnum, 0, za_bytes);
 }
 
 /* Collect register REGNUM from REGCACHE to BUF, using the register
index 0f1bedf780027d55bdb0087d7b68e9e79ec76135..1d226b4b7b387dddff948e98fd65228e117a779d 100644 (file)
@@ -920,8 +920,7 @@ aarch64_za_regs_copy_to_reg_buf (int tid, struct reg_buffer_common *reg_buf,
   else
     {
       size_t za_bytes = header->vl * header->vl;
-      gdb::byte_vector za_zeroed (za_bytes, 0);
-      reg_buf->raw_supply (za_regnum, za_zeroed);
+      reg_buf->raw_supply_part_zeroed (za_regnum, 0, za_bytes);
     }
 
   /* Handle the svg and svcr registers separately.  We need to calculate
@@ -1000,7 +999,7 @@ aarch64_za_regs_copy_from_reg_buf (int tid,
      in the thread with the ZA contents from the register cache, and they will
      differ in size.  */
   if (svg_changed)
-    reg_buf->raw_supply (za_regnum, za_zeroed);
+    reg_buf->raw_supply_part_zeroed (za_regnum, 0, za_bytes);
 
   /* When we update svg, we don't automatically initialize the ZA buffer.  If
      we have no ZA state and the ZA register contents in the register cache are
@@ -1078,8 +1077,7 @@ aarch64_zt_regs_copy_to_reg_buf (int tid, struct reg_buffer_common *reg_buf,
   else
     {
       /* Zero out ZT.  */
-      gdb::byte_vector zt_zeroed (AARCH64_SME2_ZT0_SIZE, 0);
-      reg_buf->raw_supply (zt_regnum, zt_zeroed.data ());
+      reg_buf->raw_supply_part_zeroed (zt_regnum, 0, AARCH64_SME2_ZT0_SIZE);
     }
 
   /* The register buffer should now contain the updated copy of the NT_ARM_ZT
index f04354d822f9c78db671e9cd41f15811b0770bd8..ab3f61601f7abecc46e31c85e1cd03a5cb28a5fe 100644 (file)
@@ -1189,6 +1189,16 @@ reg_buffer::raw_supply_zeroed (int regnum)
 
 /* See gdbsupport/common-regcache.h.  */
 
+void
+reg_buffer::raw_supply_part_zeroed (int regnum, int offset, size_t size)
+{
+  gdb::array_view<gdb_byte> dst = register_buffer (regnum).slice (offset, size);
+  memset (dst.data (), 0, dst.size ());
+  m_register_status[regnum] = REG_VALID;
+}
+
+/* See gdbsupport/common-regcache.h.  */
+
 void
 reg_buffer::raw_collect (int regnum, gdb::array_view<gdb_byte> dst) const
 {
index 2f4b7d94c69344bbe9d2f5b716874fc47c6720c4..8d026e0b4fe82d735709cd227cc66c291c8cadd4 100644 (file)
@@ -243,6 +243,9 @@ public:
      unavailable).  */
   void raw_supply_zeroed (int regnum);
 
+  /* See gdbsupport/common-regcache.h.  */
+  void raw_supply_part_zeroed (int regnum, int offset, size_t size) override;
+
   /* Supply part of register REGNUM to this register buffer.  Start at OFFSET in
      the register.  The size is given by the size of SRC.  The rest of the
      register left untouched.  */
index a37a985dd30b984c63c0b4bbbf4e73b756819d79..ef235b18c4139d7aae68ed8447ae237c63742d80 100644 (file)
@@ -370,6 +370,17 @@ supply_register_zeroed (struct regcache *regcache, int n)
 #endif
 }
 
+void
+regcache::raw_supply_part_zeroed (int regnum, int offset, size_t size)
+{
+  auto dst = register_data (this, regnum).slice (offset, size);
+  memset (dst.data (), 0, dst.size ());
+#ifndef IN_PROCESS_AGENT
+  if (register_status != NULL)
+    register_status[regnum] = REG_VALID;
+#endif
+}
+
 #ifndef IN_PROCESS_AGENT
 
 /* Supply register called NAME with value zero to REGCACHE.  */
index 1752c3979d398522432e5f294ad45aff30c0c641..ddf618e80ba22195c29269c0f25ea1c8ca6945b4 100644 (file)
@@ -52,6 +52,9 @@ struct regcache : public reg_buffer_common
   /* See gdbsupport/common-regcache.h.  */
   void raw_supply (int regnum, gdb::array_view<const gdb_byte> src) override;
 
+  /* See gdbsupport/common-regcache.h.  */
+  void raw_supply_part_zeroed (int regnum, int offset, size_t size) override;
+
   /* See gdbsupport/common-regcache.h.  */
   void raw_collect (int regnum, gdb::array_view<gdb_byte> dst) const override;
 
index f8704c16939ae1973812fd06d71649b854285e75..ef37d61b40a97dcdf7d008c92e10b9c28f4fc835 100644 (file)
@@ -96,6 +96,12 @@ struct reg_buffer_common
                                      regcache_register_size (this, regnum)));
   }
 
+  /* Supply part of register REGNUM with zeroed value.  Start at OFFSET in
+     the register, with size SIZE.  The rest of the register is left
+     untouched.  */
+  virtual void raw_supply_part_zeroed (int regnum, int offset, size_t size)
+    = 0;
+
   /* Collect register REGNUM from this register buffer and store its contents in
      DST.  */
   virtual void raw_collect (int regnum, gdb::array_view<gdb_byte> dst) const