diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 5687fada5b5..2faf4897a59 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2017-03-27 Max Filippov + + * xtensa-linux-nat.c (fill_gregset): Call regcache_raw_collect + for a single specified register or for all registers in + a0_base..a0_base + C0_NREGS range. + (supply_gregset_reg): Call regcache_raw_supply for a single + specified register or for all registers in a0_base..a0_base + + C0_NREGS range. + 2017-03-27 Max Filippov * arch/xtensa.h (C0_NREGS): Add definition. diff --git a/gdb/xtensa-linux-nat.c b/gdb/xtensa-linux-nat.c index 69c7eefa664..a4b001e86b9 100644 --- a/gdb/xtensa-linux-nat.c +++ b/gdb/xtensa-linux-nat.c @@ -94,6 +94,20 @@ fill_gregset (const struct regcache *regcache, gdbarch_tdep (gdbarch)->ar_base + i, ®s->ar[i]); } + if (regnum >= gdbarch_tdep (gdbarch)->a0_base + && regnum < gdbarch_tdep (gdbarch)->a0_base + C0_NREGS) + regcache_raw_collect (regcache, regnum, + ®s->ar[(4 * regs->windowbase + regnum + - gdbarch_tdep (gdbarch)->a0_base) + % gdbarch_tdep (gdbarch)->num_aregs]); + else if (regnum == -1) + { + for (i = 0; i < C0_NREGS; ++i) + regcache_raw_collect (regcache, + gdbarch_tdep (gdbarch)->a0_base + i, + ®s->ar[(4 * regs->windowbase + i) + % gdbarch_tdep (gdbarch)->num_aregs]); + } } static void @@ -146,6 +160,20 @@ supply_gregset_reg (struct regcache *regcache, gdbarch_tdep (gdbarch)->ar_base + i, ®s->ar[i]); } + if (regnum >= gdbarch_tdep (gdbarch)->a0_base + && regnum < gdbarch_tdep (gdbarch)->a0_base + C0_NREGS) + regcache_raw_supply (regcache, regnum, + ®s->ar[(4 * regs->windowbase + regnum + - gdbarch_tdep (gdbarch)->a0_base) + % gdbarch_tdep (gdbarch)->num_aregs]); + else if (regnum == -1) + { + for (i = 0; i < C0_NREGS; ++i) + regcache_raw_supply (regcache, + gdbarch_tdep (gdbarch)->a0_base + i, + ®s->ar[(4 * regs->windowbase + i) + % gdbarch_tdep (gdbarch)->num_aregs]); + } } void