From: Pedro Alves Date: Mon, 12 Apr 2010 13:25:51 +0000 (+0000) Subject: * regcache.c (set_register_cache): Invalidate regcaches before X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=45ba0d0206fe1872d8bc467268ffe3e9fe029ee2;p=binutils-gdb.git * 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. --- diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 87bf6956e1a..a860f5217bc 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 1c282791ba3..ec01f37e6de 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 29fa2ff30a7..9077a7198c8 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;