From 45ba0d0206fe1872d8bc467268ffe3e9fe029ee2 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Mon, 12 Apr 2010 13:25:51 +0000 Subject: [PATCH] * 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. --- gdb/gdbserver/ChangeLog | 9 +++++++++ gdb/gdbserver/linux-x86-low.c | 5 +++++ gdb/gdbserver/regcache.c | 7 +++++++ 3 files changed, 21 insertions(+) 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 + + * 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 * 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; -- 2.7.4