Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* mips gdbserver reports R0 != 0
@ 2004-01-27 10:35 Atsushi Nemoto
  2004-01-27 14:17 ` Daniel Jacobowitz
  0 siblings, 1 reply; 7+ messages in thread
From: Atsushi Nemoto @ 2004-01-27 10:35 UTC (permalink / raw)
  To: gdb-patches

When I run gdbserver with multi-thread programs on Linux/MIPS, I
noticed sometimes 'step' or 'next' do not work correctly.  I found
that a value of R0 register in 'info reg' output was not 0
(0x30303030) when this problem happen.

> (gdb) c
> Continuing.
> [New Thread 1026]
> [Switching to Thread 1026]
> 
> Breakpoint 2, function1 (arg=0x0) at next.c:30
> 30                      if (func1() == 0) {
> (gdb) info reg
>           zero       at       v0       v1       a0       a1       a2       a3
>  R0   30303030 30048401 004009c8 00000001 00000000 00000000 7f7ffd28 00000000 

I could not see the reason (maybe regcache?), but this patch fixed my
problem.

--- gdb-6.0/gdb/gdbserver/linux-mips-low.c.org	Wed Jun 12 02:32:39 2002
+++ gdb-6.0/gdb/gdbserver/linux-mips-low.c	Tue Jan 27 19:31:58 2004
@@ -69,9 +69,6 @@
   if (mips_regmap[regno] == -1)
     return 1;
 
-  if (find_regno ("zero") == regno)
-    return 1;
-
   return 0;
 }
 
---
Atsushi Nemoto


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: mips gdbserver reports R0 != 0
  2004-01-27 10:35 mips gdbserver reports R0 != 0 Atsushi Nemoto
@ 2004-01-27 14:17 ` Daniel Jacobowitz
  2004-01-27 15:01   ` Atsushi Nemoto
  0 siblings, 1 reply; 7+ messages in thread
From: Daniel Jacobowitz @ 2004-01-27 14:17 UTC (permalink / raw)
  To: Atsushi Nemoto; +Cc: gdb-patches

On Tue, Jan 27, 2004 at 07:37:15PM +0900, Atsushi Nemoto wrote:
> When I run gdbserver with multi-thread programs on Linux/MIPS, I
> noticed sometimes 'step' or 'next' do not work correctly.  I found
> that a value of R0 register in 'info reg' output was not 0
> (0x30303030) when this problem happen.
> 
> > (gdb) c
> > Continuing.
> > [New Thread 1026]
> > [Switching to Thread 1026]
> > 
> > Breakpoint 2, function1 (arg=0x0) at next.c:30
> > 30                      if (func1() == 0) {
> > (gdb) info reg
> >           zero       at       v0       v1       a0       a1       a2       a3
> >  R0   30303030 30048401 004009c8 00000001 00000000 00000000 7f7ffd28 00000000 
> 
> I could not see the reason (maybe regcache?), but this patch fixed my
> problem.

Did it fix the stepping problem, or did it fix the value displayed for
$zero?

The register at that address is actually a saved flag used for syscall
restarting.  I have some local patches to support it properly, but I
haven't had time to do anything with them :(  Partly because of the
number of gross hacks involved.

> --- gdb-6.0/gdb/gdbserver/linux-mips-low.c.org	Wed Jun 12 02:32:39 2002
> +++ gdb-6.0/gdb/gdbserver/linux-mips-low.c	Tue Jan 27 19:31:58 2004
> @@ -69,9 +69,6 @@
>    if (mips_regmap[regno] == -1)
>      return 1;
>  
> -  if (find_regno ("zero") == regno)
> -    return 1;
> -
>    return 0;
>  }
>  
> ---
> Atsushi Nemoto
> 

-- 
Daniel Jacobowitz
MontaVista Software                         Debian GNU/Linux Developer


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: mips gdbserver reports R0 != 0
  2004-01-27 14:17 ` Daniel Jacobowitz
@ 2004-01-27 15:01   ` Atsushi Nemoto
  2004-01-27 17:12     ` Daniel Jacobowitz
  0 siblings, 1 reply; 7+ messages in thread
From: Atsushi Nemoto @ 2004-01-27 15:01 UTC (permalink / raw)
  To: drow; +Cc: gdb-patches

>>>>> On Tue, 27 Jan 2004 09:17:18 -0500, Daniel Jacobowitz <drow@mvista.com> said:

>> I could not see the reason (maybe regcache?), but this patch fixed
>> my problem.

drow> Did it fix the stepping problem, or did it fix the value
drow> displayed for $zero?

Both.  My stepping problem is triggered by wrong $zero value.  I tried
with 'set debug remote 1' and found gdb inserted breakpoint at wrong
place when stepping 'beqz' instruction.

drow> The register at that address is actually a saved flag used for
drow> syscall restarting.  I have some local patches to support it
drow> properly, but I haven't had time to do anything with them :(
drow> Partly because of the number of gross hacks involved.

The 'that address' means &pt_regs->regs[0] in kernel, right?

I had not noticed that.  Thank you.  So my patch is not correct.

Maybe the correct fix is clearing register cache in
new_register_cache().  I will try later.

---
Atsushi Nemoto


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: mips gdbserver reports R0 != 0
  2004-01-27 15:01   ` Atsushi Nemoto
@ 2004-01-27 17:12     ` Daniel Jacobowitz
  2004-01-28  1:33       ` Atsushi Nemoto
  0 siblings, 1 reply; 7+ messages in thread
From: Daniel Jacobowitz @ 2004-01-27 17:12 UTC (permalink / raw)
  To: Atsushi Nemoto; +Cc: gdb-patches

On Wed, Jan 28, 2004 at 12:07:17AM +0900, Atsushi Nemoto wrote:
> >>>>> On Tue, 27 Jan 2004 09:17:18 -0500, Daniel Jacobowitz <drow@mvista.com> said:
> 
> >> I could not see the reason (maybe regcache?), but this patch fixed
> >> my problem.
> 
> drow> Did it fix the stepping problem, or did it fix the value
> drow> displayed for $zero?
> 
> Both.  My stepping problem is triggered by wrong $zero value.  I tried
> with 'set debug remote 1' and found gdb inserted breakpoint at wrong
> place when stepping 'beqz' instruction.

Oh, I see how this happens now.  Thanks for the explanation; in that
case something definitely needs to be done.

> drow> The register at that address is actually a saved flag used for
> drow> syscall restarting.  I have some local patches to support it
> drow> properly, but I haven't had time to do anything with them :(
> drow> Partly because of the number of gross hacks involved.
> 
> The 'that address' means &pt_regs->regs[0] in kernel, right?
> 
> I had not noticed that.  Thank you.  So my patch is not correct.
> 
> Maybe the correct fix is clearing register cache in
> new_register_cache().  I will try later.

Explicitly zeroing the register cache should fix this, so I'd be
happier with that solution.

[Do you have a copyright assignment on file for GDB, btw?  If not, I'll
make the patch myself for you to test, to spare us the legal dance.]

-- 
Daniel Jacobowitz
MontaVista Software                         Debian GNU/Linux Developer


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: mips gdbserver reports R0 != 0
  2004-01-27 17:12     ` Daniel Jacobowitz
@ 2004-01-28  1:33       ` Atsushi Nemoto
  2004-01-29  1:51         ` Atsushi Nemoto
  0 siblings, 1 reply; 7+ messages in thread
From: Atsushi Nemoto @ 2004-01-28  1:33 UTC (permalink / raw)
  To: drow; +Cc: gdb-patches

>>>>> On Tue, 27 Jan 2004 12:12:04 -0500, Daniel Jacobowitz <drow@mvista.com> said:
>> Maybe the correct fix is clearing register cache in
>> new_register_cache().  I will try later.

drow> Explicitly zeroing the register cache should fix this, so I'd be
drow> happier with that solution.

drow> [Do you have a copyright assignment on file for GDB, btw?  If
drow> not, I'll make the patch myself for you to test, to spare us the
drow> legal dance.]

No, I don't.  Please make the patch for me.  Then I will try it.
Thank you.

---
Atsushi Nemoto


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: mips gdbserver reports R0 != 0
  2004-01-28  1:33       ` Atsushi Nemoto
@ 2004-01-29  1:51         ` Atsushi Nemoto
  2004-01-30 15:09           ` Daniel Jacobowitz
  0 siblings, 1 reply; 7+ messages in thread
From: Atsushi Nemoto @ 2004-01-29  1:51 UTC (permalink / raw)
  To: drow; +Cc: gdb-patches

>>>>> On Wed, 28 Jan 2004 10:34:15 +0900 (JST), Atsushi Nemoto <anemo@mba.ocn.ne.jp> said:
drow> Explicitly zeroing the register cache should fix this, so I'd be
drow> happier with that solution.

drow> [Do you have a copyright assignment on file for GDB, btw?  If
drow> not, I'll make the patch myself for you to test, to spare us the
drow> legal dance.]

anemo> No, I don't.  Please make the patch for me.  Then I will try
anemo> it.  Thank you.

I just inserted a line:

  memset (regcache->registers, 0, register_bytes);

to new_register_cache() (regcache.c:108) and it fixed my problem.  I
don't think anybody can do the legal dance on this line :-)

---
Atsushi Nemoto


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: mips gdbserver reports R0 != 0
  2004-01-29  1:51         ` Atsushi Nemoto
@ 2004-01-30 15:09           ` Daniel Jacobowitz
  0 siblings, 0 replies; 7+ messages in thread
From: Daniel Jacobowitz @ 2004-01-30 15:09 UTC (permalink / raw)
  To: gdb-patches; +Cc: Atsushi Nemoto

On Thu, Jan 29, 2004 at 10:52:30AM +0900, Atsushi Nemoto wrote:
> >>>>> On Wed, 28 Jan 2004 10:34:15 +0900 (JST), Atsushi Nemoto <anemo@mba.ocn.ne.jp> said:
> drow> Explicitly zeroing the register cache should fix this, so I'd be
> drow> happier with that solution.
> 
> drow> [Do you have a copyright assignment on file for GDB, btw?  If
> drow> not, I'll make the patch myself for you to test, to spare us the
> drow> legal dance.]
> 
> anemo> No, I don't.  Please make the patch for me.  Then I will try
> anemo> it.  Thank you.
> 
> I just inserted a line:
> 
>   memset (regcache->registers, 0, register_bytes);
> 
> to new_register_cache() (regcache.c:108) and it fixed my problem.  I
> don't think anybody can do the legal dance on this line :-)

Indeed.  Thanks!  I've committed this.

-- 
Daniel Jacobowitz
MontaVista Software                         Debian GNU/Linux Developer

2004-01-30  Daniel Jacobowitz  <drow@mvista.com>

	* regcache.c (new_register_cache): Clear the allocated register
	buffer.  Suggested by Atsushi Nemoto <anemo@mba.ocn.ne.jp>.

Index: regcache.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/regcache.c,v
retrieving revision 1.6
diff -u -p -r1.6 regcache.c
--- regcache.c	13 Jun 2002 19:29:46 -0000	1.6
+++ regcache.c	30 Jan 2004 15:08:48 -0000
@@ -1,5 +1,5 @@
 /* Register support routines for the remote server for GDB.
-   Copyright 2001, 2002
+   Copyright 2001, 2002, 2004
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -101,7 +101,10 @@ new_register_cache (void)
 
   regcache = malloc (sizeof (*regcache));
 
-  regcache->registers = malloc (register_bytes);
+  /* Make sure to zero-initialize the register cache when it is created,
+     in case there are registers the target never fetches.  This way they'll
+     read as zero instead of garbage.  */
+  regcache->registers = calloc (1, register_bytes);
   if (regcache->registers == NULL)
     fatal ("Could not allocate register cache.");
 


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2004-01-30 15:09 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-01-27 10:35 mips gdbserver reports R0 != 0 Atsushi Nemoto
2004-01-27 14:17 ` Daniel Jacobowitz
2004-01-27 15:01   ` Atsushi Nemoto
2004-01-27 17:12     ` Daniel Jacobowitz
2004-01-28  1:33       ` Atsushi Nemoto
2004-01-29  1:51         ` Atsushi Nemoto
2004-01-30 15:09           ` Daniel Jacobowitz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox