aboutsummaryrefslogtreecommitdiff
path: root/gdb/riscv-linux-tdep.c
diff options
context:
space:
mode:
authorAndrew Burgess <andrew.burgess@embecosm.com>2020-12-02 15:10:06 +0000
committerAndrew Burgess <andrew.burgess@embecosm.com>2021-01-18 14:14:11 +0000
commit6a9ad81c449922e8c0d3228c18422f68136eef17 (patch)
tree7d9dfb01516aed307b3f1531b8a00dc12296ff0c /gdb/riscv-linux-tdep.c
parent326adec374dd43086dbf9bb2b8f18d547389e678 (diff)
downloadgdb-6a9ad81c449922e8c0d3228c18422f68136eef17.zip
gdb-6a9ad81c449922e8c0d3228c18422f68136eef17.tar.gz
gdb-6a9ad81c449922e8c0d3228c18422f68136eef17.tar.bz2
gdb/riscv: use a single regset supply function for riscv fbsd & linux
The RISC-V x0 register is hard-coded to zero. As such neither Linux or FreeBSD supply the value of the register x0 in their core dump files. For FreeBSD we take care of this by manually supplying the value of x0 in riscv_fbsd_supply_gregset, however we don't do this for Linux. As a result after loading a core file on Linux we see this behaviour: (gdb) p $x0 $1 = <unavailable> In this commit I make riscv_fbsd_supply_gregset a common function that can be shared between RISC-V for FreeBSD and Linux, this resolves the above issue. There is a similar problem for the two registers `fflags` and `frm`. These two floating point related CSRs are a little weird. They are separate CSRs in the RISC-V specification, but are actually sub-fields of the `fcsr` CSR. As a result neither Linux or FreeBSD supply the `fflags` or `frm` registers as separate fields in their core dumps, and so, after restoring a core dump these register are similarly unavailable. In this commit I supply `fflags` and `frm` by first asking for the value of `fcsr`, extracting the two fields, and using these to supply the values for `fflags` and `frm`. gdb/ChangeLog: * riscv-fbsd-tdep.c (riscv_fbsd_supply_gregset): Delete. (riscv_fbsd_gregset): Use riscv_supply_regset. (riscv_fbsd_fpregset): Likewise. * riscv-linux-tdep.c (riscv_linux_gregset): Likewise. (riscv_linux_fregset): Likewise. * riscv-tdep.c (riscv_supply_regset): Define new function. * riscv-tdep.h (riscv_supply_regset): Declare new function.
Diffstat (limited to 'gdb/riscv-linux-tdep.c')
-rw-r--r--gdb/riscv-linux-tdep.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/gdb/riscv-linux-tdep.c b/gdb/riscv-linux-tdep.c
index 079f88b..ca97a60 100644
--- a/gdb/riscv-linux-tdep.c
+++ b/gdb/riscv-linux-tdep.c
@@ -52,14 +52,14 @@ static const struct regcache_map_entry riscv_linux_fregmap[] =
static const struct regset riscv_linux_gregset =
{
- riscv_linux_gregmap, regcache_supply_regset, regcache_collect_regset
+ riscv_linux_gregmap, riscv_supply_regset, regcache_collect_regset
};
/* Define the FP register regset. */
static const struct regset riscv_linux_fregset =
{
- riscv_linux_fregmap, regcache_supply_regset, regcache_collect_regset
+ riscv_linux_fregmap, riscv_supply_regset, regcache_collect_regset
};
/* Define hook for core file support. */