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
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
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
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
/* 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
{
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. */
#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. */
/* 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;
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