aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/gdbserver/ChangeLog9
-rw-r--r--gdb/gdbserver/linux-x86-low.c5
-rw-r--r--gdb/gdbserver/regcache.c7
3 files changed, 21 insertions, 0 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index 87bf695..a860f52 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,3 +1,12 @@
+2010-04-12 Pedro Alves <pedro@codesourcery.com>
+
+ * regcache.c (set_register_cache): Invalidate regcaches before
+ changing the register cache layout.
+ (regcache_invalidate_one): Allow a NULL regcache.
+ * linux-x86-low.c (x86_linux_update_xmltarget): Invalidate
+ regcaches before changing the register cache layout or the target
+ regsets.
+
2010-04-12 H.J. Lu <hongjiu.lu@intel.com>
* linux-x86-low.c (x86_linux_update_xmltarget): Avoid unused
diff --git a/gdb/gdbserver/linux-x86-low.c b/gdb/gdbserver/linux-x86-low.c
index 1c28279..ec01f37 100644
--- a/gdb/gdbserver/linux-x86-low.c
+++ b/gdb/gdbserver/linux-x86-low.c
@@ -841,6 +841,11 @@ x86_linux_update_xmltarget (void)
if (!current_inferior)
return;
+ /* Before changing the register cache internal layout or the target
+ regsets, flush the contents of the current valid caches back to
+ the threads. */
+ regcache_invalidate ();
+
pid = pid_of (get_thread_lwp (current_inferior));
#ifdef __x86_64__
if (num_xmm_registers == 8)
diff --git a/gdb/gdbserver/regcache.c b/gdb/gdbserver/regcache.c
index 29fa2ff..9077a71 100644
--- a/gdb/gdbserver/regcache.c
+++ b/gdb/gdbserver/regcache.c
@@ -61,6 +61,9 @@ regcache_invalidate_one (struct inferior_list_entry *entry)
regcache = (struct regcache *) inferior_regcache_data (thread);
+ if (regcache == NULL)
+ return;
+
if (regcache->registers_valid)
{
struct thread_info *saved_inferior = current_inferior;
@@ -149,6 +152,10 @@ set_register_cache (struct reg *regs, int n)
{
int offset, i;
+ /* Before changing the register cache internal layout, flush the
+ contents of valid caches back to the threads. */
+ regcache_invalidate ();
+
reg_defs = regs;
num_registers = n;