diff options
author | Feiyang Chen <chenfeiyang@loongson.cn> | 2024-01-25 16:32:36 +0800 |
---|---|---|
committer | Tiezhu Yang <yangtiezhu@loongson.cn> | 2024-02-06 18:40:19 +0800 |
commit | e4d74c01e77365f1327e4e567e7579cdd3bf74f6 (patch) | |
tree | 57a80ffa2ea61b4754b9d71f89fcee012966bf05 /gdbserver | |
parent | 1e9569f383a3d5a88ee07d0c2401bd95613c222e (diff) | |
download | gdb-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.cc | 43 |
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 }; |