From 4f844a660e65ffa5481c4ad2d844caca16d35790 Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Fri, 5 May 2006 22:39:12 +0000 Subject: [PATCH] * linux-nat.c (linux_nat_do_thread_registers): Use the regset_from_core_section infrastructure if the target supports it. * Makefile.in: Update dependencies. --- gdb/ChangeLog | 7 +++++ gdb/Makefile.in | 4 +-- gdb/linux-nat.c | 80 +++++++++++++++++++++++++++++++++++++++---------- 3 files changed, 73 insertions(+), 18 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 590e8d9570..b5e66679bf 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2006-05-05 David S. Miller + + * linux-nat.c (linux_nat_do_thread_registers): Use the + regset_from_core_section infrastructure if the target + supports it. + * Makefile.in: Update dependencies. + 2006-05-05: Paul Gilliam * ppc-linux-nat.c: Clean up types for ptrace. diff --git a/gdb/Makefile.in b/gdb/Makefile.in index e27a718f3b..a8b58a1e36 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -2198,8 +2198,8 @@ linux-fork.o: linux-fork.c $(defs_h) $(inferior_h) $(regcache_h) $(gdbcmd_h) \ $(linux_nat_h) linux-nat.o: linux-nat.c $(defs_h) $(inferior_h) $(target_h) $(gdb_string_h) \ $(gdb_wait_h) $(gdb_assert_h) $(linux_nat_h) $(gdbthread_h) \ - $(gdbcmd_h) $(regcache_h) $(inf_ptrace_h) $(auxv_h) $(elf_bfd_h) \ - $(gregset_h) $(gdbcore_h) $(gdbthread_h) $(gdb_stat_h) \ + $(gdbcmd_h) $(regcache_h) $(regset_h) $(inf_ptrace_h) $(auxv_h) \ + $(elf_bfd_h) $(gregset_h) $(gdbcore_h) $(gdbthread_h) $(gdb_stat_h) \ $(linux_fork_h) linux-thread-db.o: linux-thread-db.c $(defs_h) $(gdb_assert_h) \ $(gdb_proc_service_h) $(gdb_thread_db_h) $(bfd_h) $(exceptions_h) \ diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index f050e7e83f..31e46d6395 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -36,6 +36,7 @@ #include "gdbthread.h" #include "gdbcmd.h" #include "regcache.h" +#include "regset.h" #include "inf-ptrace.h" #include "auxv.h" #include /* for MAXPATHLEN */ @@ -2535,25 +2536,72 @@ linux_nat_do_thread_registers (bfd *obfd, ptid_t ptid, gdb_fpxregset_t fpxregs; #endif unsigned long lwp = ptid_get_lwp (ptid); + struct gdbarch *gdbarch = current_gdbarch; + const struct regset *regset; + int core_regset_p, record_reg_p; - fill_gregset (&gregs, -1); - note_data = (char *) elfcore_write_prstatus (obfd, - note_data, - note_size, - lwp, - stop_signal, &gregs); + core_regset_p = gdbarch_regset_from_core_section_p (gdbarch); + record_reg_p = 1; + if (core_regset_p) + { + regset = gdbarch_regset_from_core_section (gdbarch, ".reg", + sizeof (gregs)); + if (regset) + regset->collect_regset (regset, current_regcache, -1, + &gregs, sizeof (gregs)); + else + record_reg_p = 0; + } + else + fill_gregset (&gregs, -1); + + if (record_reg_p) + note_data = (char *) elfcore_write_prstatus (obfd, + note_data, + note_size, + lwp, + stop_signal, &gregs); + + record_reg_p = 1; + if (core_regset_p) + { + regset = gdbarch_regset_from_core_section (gdbarch, ".reg2", + sizeof (fpregs)); + if (regset) + regset->collect_regset (regset, current_regcache, -1, + &fpregs, sizeof (fpregs)); + else + record_reg_p = 0; + } + else + fill_fpregset (&fpregs, -1); + + if (record_reg_p) + note_data = (char *) elfcore_write_prfpreg (obfd, + note_data, + note_size, + &fpregs, sizeof (fpregs)); - fill_fpregset (&fpregs, -1); - note_data = (char *) elfcore_write_prfpreg (obfd, - note_data, - note_size, - &fpregs, sizeof (fpregs)); #ifdef FILL_FPXREGSET - fill_fpxregset (&fpxregs, -1); - note_data = (char *) elfcore_write_prxfpreg (obfd, - note_data, - note_size, - &fpxregs, sizeof (fpxregs)); + record_reg_p = 1; + if (core_regset_p) + { + regset = gdbarch_regset_from_core_section (gdbarch, ".reg-xfp", + sizeof (fpxregs)); + if (regset) + regset->collect_regset (regset, current_regcache, -1, + &fpxregs, sizeof (fpxregs)); + else + record_reg_p = 0; + } + else + fill_fpxregset (&fpxregs, -1); + + if (record_reg_p) + note_data = (char *) elfcore_write_prxfpreg (obfd, + note_data, + note_size, + &fpxregs, sizeof (fpxregs)); #endif return note_data; }