This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Fix solib-disc.exp regression with x86 gdbserver


On Sunday 11 April 2010 22:12:08, H.J. Lu wrote:
> This patch breaks gdbserver on AVX. We have
> 
> 1. Connect from GDB with XML support:
>       gdbserver enables XML support.
> 2. Disconnect.
> 3. Reconnect from any GDB
>        a. gdberver assumes GDB doesn't support XML sets to
>           target to Linux without AVX.
>        b. Gdbserver  aborts when it tries to invalidate regcache
>            since the target doesn't support AVX registers.
> 
> I will try to fix it.
> 

Then, this means we're invalidating the regcache too late. 
We're flushing the old regcache contents to the threads, that were
created using the previous gdb's register layout, but we're flushing
the data using the _new_ register cache layout and low target
methods.  That sounds wrong indeed.

I think this would help.  Or is this still too late?

-- 
Pedro Alves

2010-04-12  Pedro Alves  <pedro@codesourcery.com>

	gdb/gdbserver/
	* 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/linux-x86-low.c |    5 +++++
 gdb/gdbserver/regcache.c      |    7 +++++++
 2 files changed, 12 insertions(+)

Index: src/gdb/gdbserver/regcache.c
===================================================================
--- src.orig/gdb/gdbserver/regcache.c	2010-04-12 08:03:43.000000000 +0100
+++ src/gdb/gdbserver/regcache.c	2010-04-12 08:20:23.000000000 +0100
@@ -61,6 +61,9 @@ regcache_invalidate_one (struct inferior
 
   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, in
 {
   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;
 
Index: src/gdb/gdbserver/linux-x86-low.c
===================================================================
--- src.orig/gdb/gdbserver/linux-x86-low.c	2010-04-12 08:23:08.000000000 +0100
+++ src/gdb/gdbserver/linux-x86-low.c	2010-04-12 08:37:57.000000000 +0100
@@ -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)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]