X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fxtensa-linux-nat.c;h=eac68bbb26440db12ad9ffb69a46775be24a27dd;hb=e427af1889e6d169c3390f6960f1efdd08dca883;hp=c29f0c71e66b3511f21089b27b2b08b11f0e1f9c;hpb=d274ecf4ddf76768af57e27f654b9ce6784b391c;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/xtensa-linux-nat.c b/gdb/xtensa-linux-nat.c index c29f0c71e6..eac68bbb26 100644 --- a/gdb/xtensa-linux-nat.c +++ b/gdb/xtensa-linux-nat.c @@ -1,6 +1,6 @@ /* Xtensa GNU/Linux native support. - Copyright (C) 2007-2017 Free Software Foundation, Inc. + Copyright (C) 2007-2018 Free Software Foundation, Inc. This file is part of GDB. @@ -51,7 +51,7 @@ fill_gregset (const struct regcache *regcache, { int i; xtensa_elf_gregset_t *regs = (xtensa_elf_gregset_t *) gregsetp; - struct gdbarch *gdbarch = get_regcache_arch (regcache); + struct gdbarch *gdbarch = regcache->arch (); if (regnum == gdbarch_pc_regnum (gdbarch) || regnum == -1) regcache_raw_collect (regcache, gdbarch_pc_regnum (gdbarch), ®s->pc); @@ -82,6 +82,10 @@ fill_gregset (const struct regcache *regcache, regcache_raw_collect (regcache, gdbarch_tdep (gdbarch)->sar_regnum, ®s->sar); + if (regnum == gdbarch_tdep (gdbarch)->threadptr_regnum || regnum == -1) + regcache_raw_collect (regcache, + gdbarch_tdep (gdbarch)->threadptr_regnum, + ®s->threadptr); if (regnum >=gdbarch_tdep (gdbarch)->ar_base && regnum < gdbarch_tdep (gdbarch)->ar_base + gdbarch_tdep (gdbarch)->num_aregs) @@ -94,6 +98,20 @@ fill_gregset (const struct regcache *regcache, gdbarch_tdep (gdbarch)->ar_base + i, ®s->ar[i]); } + if (regnum >= gdbarch_tdep (gdbarch)->a0_base + && regnum < gdbarch_tdep (gdbarch)->a0_base + C0_NREGS) + regcache_raw_collect (regcache, regnum, + ®s->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, + ®s->ar[(4 * regs->windowbase + i) + % gdbarch_tdep (gdbarch)->num_aregs]); + } } static void @@ -103,7 +121,7 @@ supply_gregset_reg (struct regcache *regcache, int i; xtensa_elf_gregset_t *regs = (xtensa_elf_gregset_t *) gregsetp; - struct gdbarch *gdbarch = get_regcache_arch (regcache); + struct gdbarch *gdbarch = regcache->arch (); if (regnum == gdbarch_pc_regnum (gdbarch) || regnum == -1) regcache_raw_supply (regcache, gdbarch_pc_regnum (gdbarch), ®s->pc); @@ -134,6 +152,10 @@ supply_gregset_reg (struct regcache *regcache, regcache_raw_supply (regcache, gdbarch_tdep (gdbarch)->sar_regnum, ®s->sar); + if (regnum == gdbarch_tdep (gdbarch)->threadptr_regnum || regnum == -1) + regcache_raw_supply (regcache, + gdbarch_tdep (gdbarch)->threadptr_regnum, + ®s->threadptr); if (regnum >=gdbarch_tdep (gdbarch)->ar_base && regnum < gdbarch_tdep (gdbarch)->ar_base + gdbarch_tdep (gdbarch)->num_aregs) @@ -146,6 +168,20 @@ supply_gregset_reg (struct regcache *regcache, gdbarch_tdep (gdbarch)->ar_base + i, ®s->ar[i]); } + if (regnum >= gdbarch_tdep (gdbarch)->a0_base + && regnum < gdbarch_tdep (gdbarch)->a0_base + C0_NREGS) + regcache_raw_supply (regcache, regnum, + ®s->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, + ®s->ar[(4 * regs->windowbase + i) + % gdbarch_tdep (gdbarch)->num_aregs]); + } } void @@ -174,7 +210,7 @@ supply_fpregset (struct regcache *regcache, static void fetch_gregs (struct regcache *regcache, int regnum) { - int tid = ptid_get_lwp (inferior_ptid); + int tid = ptid_get_lwp (regcache_get_ptid (regcache)); gdb_gregset_t regs; int areg; @@ -193,7 +229,7 @@ fetch_gregs (struct regcache *regcache, int regnum) static void store_gregs (struct regcache *regcache, int regnum) { - int tid = ptid_get_lwp (inferior_ptid); + int tid = ptid_get_lwp (regcache_get_ptid (regcache)); gdb_gregset_t regs; int areg; @@ -221,7 +257,7 @@ static int xtreg_high; static void fetch_xtregs (struct regcache *regcache, int regnum) { - int tid = ptid_get_lwp (inferior_ptid); + int tid = ptid_get_lwp (regcache_get_ptid (regcache)); const xtensa_regtable_t *ptr; char xtregs [XTENSA_ELF_XTREG_SIZE]; @@ -237,7 +273,7 @@ fetch_xtregs (struct regcache *regcache, int regnum) static void store_xtregs (struct regcache *regcache, int regnum) { - int tid = ptid_get_lwp (inferior_ptid); + int tid = ptid_get_lwp (regcache_get_ptid (regcache)); const xtensa_regtable_t *ptr; char xtregs [XTENSA_ELF_XTREG_SIZE]; @@ -302,8 +338,6 @@ ps_get_thread_area (struct ps_prochandle *ph, return PS_OK; } -void _initialize_xtensa_linux_nat (void); - void _initialize_xtensa_linux_nat (void) {