gdb: xtensa-linux: add call0 support

Correctly handle a0- registers. This allows debugging call0 code in
linux natively.
The register structure is the same for windowed and call0 ABIs because
currently linux kernel internally requires windowed registers, so they are
always present.

gdb/
2017-03-27  Max Filippov  <jcmvbkbc@gmail.com>

	* 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.
This commit is contained in:
Max Filippov 2016-11-18 09:48:01 -08:00
parent c56054f9a8
commit 0ce4291e3f
2 changed files with 37 additions and 0 deletions

View File

@ -1,3 +1,12 @@
2017-03-27 Max Filippov <jcmvbkbc@gmail.com>
* 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 <jcmvbkbc@gmail.com>
* arch/xtensa.h (C0_NREGS): Add definition.

View File

@ -94,6 +94,20 @@ fill_gregset (const struct regcache *regcache,
gdbarch_tdep (gdbarch)->ar_base + i,
&regs->ar[i]);
}
if (regnum >= gdbarch_tdep (gdbarch)->a0_base
&& regnum < gdbarch_tdep (gdbarch)->a0_base + C0_NREGS)
regcache_raw_collect (regcache, regnum,
&regs->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,
&regs->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,
&regs->ar[i]);
}
if (regnum >= gdbarch_tdep (gdbarch)->a0_base
&& regnum < gdbarch_tdep (gdbarch)->a0_base + C0_NREGS)
regcache_raw_supply (regcache, regnum,
&regs->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,
&regs->ar[(4 * regs->windowbase + i)
% gdbarch_tdep (gdbarch)->num_aregs]);
}
}
void