aboutsummaryrefslogtreecommitdiff
path: root/gdb/gdbserver
diff options
context:
space:
mode:
authorDaniel Jacobowitz <drow@false.org>2006-02-15 14:36:32 +0000
committerDaniel Jacobowitz <drow@false.org>2006-02-15 14:36:32 +0000
commit545587ee60ab7b4741ef01e616222da13e9edf8d (patch)
tree607bb3780c5958037a2b3a39efd36b13f5d5d825 /gdb/gdbserver
parente0ae6d6fe927d3b0a19d9f909f74a09127fa1654 (diff)
downloadgdb-545587ee60ab7b4741ef01e616222da13e9edf8d.zip
gdb-545587ee60ab7b4741ef01e616222da13e9edf8d.tar.gz
gdb-545587ee60ab7b4741ef01e616222da13e9edf8d.tar.bz2
* linux-low.c (regsets_store_inferior_registers): Read the regset
from the target before filling it.
Diffstat (limited to 'gdb/gdbserver')
-rw-r--r--gdb/gdbserver/ChangeLog5
-rw-r--r--gdb/gdbserver/linux-low.c20
2 files changed, 22 insertions, 3 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index 4646b35..a84b478 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,3 +1,8 @@
+2006-02-15 Daniel Jacobowitz <dan@codesourcery.com>
+
+ * linux-low.c (regsets_store_inferior_registers): Read the regset
+ from the target before filling it.
+
2006-02-08 Daniel Jacobowitz <dan@codesourcery.com>
* server.c (attach_inferior): Return SIGTRAP for a successful
diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c
index 9376803..8518484 100644
--- a/gdb/gdbserver/linux-low.c
+++ b/gdb/gdbserver/linux-low.c
@@ -1,5 +1,6 @@
/* Low level interface to ptrace, for the remote server for GDB.
- Copyright (C) 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+ Copyright (C) 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ 2006
Free Software Foundation, Inc.
This file is part of GDB.
@@ -1286,8 +1287,21 @@ regsets_store_inferior_registers ()
}
buf = malloc (regset->size);
- regset->fill_function (buf);
- res = ptrace (regset->set_request, inferior_pid, 0, buf);
+
+ /* First fill the buffer with the current register set contents,
+ in case there are any items in the kernel's regset that are
+ not in gdbserver's regcache. */
+ res = ptrace (regset->get_request, inferior_pid, 0, buf);
+
+ if (res == 0)
+ {
+ /* Then overlay our cached registers on that. */
+ regset->fill_function (buf);
+
+ /* Only now do we write the register set. */
+ res = ptrace (regset->set_request, inferior_pid, 0, buf);
+ }
+
if (res < 0)
{
if (errno == EIO)