aboutsummaryrefslogtreecommitdiff
path: root/gdbserver
diff options
context:
space:
mode:
authorFeiyang Chen <chenfeiyang@loongson.cn>2024-01-25 16:32:36 +0800
committerTiezhu Yang <yangtiezhu@loongson.cn>2024-02-06 18:40:19 +0800
commite4d74c01e77365f1327e4e567e7579cdd3bf74f6 (patch)
tree57a80ffa2ea61b4754b9d71f89fcee012966bf05 /gdbserver
parent1e9569f383a3d5a88ee07d0c2401bd95613c222e (diff)
downloadgdb-e4d74c01e77365f1327e4e567e7579cdd3bf74f6.zip
gdb-e4d74c01e77365f1327e4e567e7579cdd3bf74f6.tar.gz
gdb-e4d74c01e77365f1327e4e567e7579cdd3bf74f6.tar.bz2
gdb: LoongArch: Add LBT extension support
Loongson Binary Translation (LBT) is used to accelerate binary translation, which contains 4 scratch registers (scr0 to scr3), x86/ARM eflags (eflags) and x87 fpu stack pointer (ftop). This patch support gdb to fetch/store these registers. Signed-off-by: Feiyang Chen <chenfeiyang@loongson.cn> # Framework Signed-off-by: Binbin Zhou <zhoubinbin@loongson.cn> # Detail Optimizes Signed-off-by: Hui Li <lihui@loongson.cn> # Error Fixes Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
Diffstat (limited to 'gdbserver')
-rw-r--r--gdbserver/linux-loongarch-low.cc43
1 files changed, 43 insertions, 0 deletions
diff --git a/gdbserver/linux-loongarch-low.cc b/gdbserver/linux-loongarch-low.cc
index f33c5a6..f1e1deb 100644
--- a/gdbserver/linux-loongarch-low.cc
+++ b/gdbserver/linux-loongarch-low.cc
@@ -225,6 +225,47 @@ loongarch_store_lasxregset (struct regcache *regcache, const void *buf)
supply_register (regcache, LOONGARCH_FIRST_LASX_REGNUM + i, *regset + i);
}
+/* Collect lbt regs from REGCACHE into BUF. */
+
+static void
+loongarch_fill_lbtregset (struct regcache *regcache, void *buf)
+{
+ gdb_byte *regbuf = (gdb_byte*)buf;
+ int scrsize = register_size (regcache->tdesc, LOONGARCH_FIRST_SCR_REGNUM);
+ int eflagssize = register_size (regcache->tdesc, LOONGARCH_EFLAGS_REGNUM);
+ int i;
+
+ for (i = 0; i < LOONGARCH_LINUX_NUM_SCR; i++)
+ collect_register (regcache, LOONGARCH_FIRST_SCR_REGNUM + i, regbuf + scrsize * i);
+
+ collect_register (regcache, LOONGARCH_EFLAGS_REGNUM,
+ regbuf + LOONGARCH_LINUX_NUM_SCR * scrsize);
+ collect_register (regcache, LOONGARCH_FTOP_REGNUM,
+ regbuf + LOONGARCH_LINUX_NUM_SCR * scrsize + eflagssize);
+
+}
+
+/* Supply lbt regs from BUF into REGCACHE. */
+
+static void
+loongarch_store_lbtregset (struct regcache *regcache, const void *buf)
+{
+
+ gdb_byte *regbuf = (gdb_byte*)buf;
+ int scrsize = register_size (regcache->tdesc, LOONGARCH_FIRST_SCR_REGNUM);
+ int eflagssize = register_size (regcache->tdesc, LOONGARCH_EFLAGS_REGNUM);
+ int i;
+
+ for (i = 0; i < LOONGARCH_LINUX_NUM_SCR; i++)
+ supply_register (regcache, LOONGARCH_FIRST_SCR_REGNUM + i, regbuf + scrsize * i);
+
+ supply_register (regcache, LOONGARCH_EFLAGS_REGNUM,
+ regbuf + LOONGARCH_LINUX_NUM_SCR * scrsize);
+ supply_register (regcache, LOONGARCH_FTOP_REGNUM,
+ regbuf + LOONGARCH_LINUX_NUM_SCR * scrsize + eflagssize);
+
+}
+
/* LoongArch/Linux regsets. */
static struct regset_info loongarch_regsets[] = {
{ PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PRSTATUS, sizeof (elf_gregset_t),
@@ -235,6 +276,8 @@ static struct regset_info loongarch_regsets[] = {
OPTIONAL_REGS, loongarch_fill_lsxregset, loongarch_store_lsxregset },
{ PTRACE_GETREGSET, PTRACE_SETREGSET, NT_LARCH_LASX, sizeof (elf_lasxregset_t),
OPTIONAL_REGS, loongarch_fill_lasxregset, loongarch_store_lasxregset },
+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_LARCH_LBT, LOONGARCH_LBT_REGS_SIZE,
+ OPTIONAL_REGS, loongarch_fill_lbtregset, loongarch_store_lbtregset },
NULL_REGSET
};