aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorMax Filippov <jcmvbkbc@gmail.com>2016-11-18 09:48:01 -0800
committerMax Filippov <jcmvbkbc@gmail.com>2017-03-27 12:58:52 -0700
commit0ce4291e3ffd90d2b94e02b4557d716c043bf02e (patch)
treec91df410cdd5c4d61f05a7b0286ed86ca6462f02 /gdb
parentc56054f9a80e157e3d2d5109821abd191b68f0ea (diff)
downloadgdb-0ce4291e3ffd90d2b94e02b4557d716c043bf02e.zip
gdb-0ce4291e3ffd90d2b94e02b4557d716c043bf02e.tar.gz
gdb-0ce4291e3ffd90d2b94e02b4557d716c043bf02e.tar.bz2
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.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog9
-rw-r--r--gdb/xtensa-linux-nat.c28
2 files changed, 37 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 5687fad..2faf489 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,14 @@
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.
* xtensa-tdep.c (C0_NREGS): Remove definition.
diff --git a/gdb/xtensa-linux-nat.c b/gdb/xtensa-linux-nat.c
index 69c7eef..a4b001e 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,
&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