/* 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
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];
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
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)
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
void cooked_write_part (int regnum, int offset, int len,
const gdb_byte *buf);
- void supply_regset (const struct regset *regset,
+ /* 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;
/* 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;