This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: [patch] gdbserver fails on 32-bit ppc rfs running in a-64 bit 2.6 linux kernel
- From: Daniel Jacobowitz <drow at false dot org>
- To: "Amit S. Kale" <amitkale at linsyssoft dot com>,GDB patches <gdb-patches at sources dot redhat dot com>
- Date: Thu, 16 Jun 2005 23:59:55 -0400
- Subject: Re: [patch] gdbserver fails on 32-bit ppc rfs running in a-64 bit 2.6 linux kernel
- References: <200503142137.35799.amitkale@linsyssoft.com> <20050314162252.GA23939@nevyn.them.org> <200503151836.22542.amitkale@linsyssoft.com> <20050316031609.GA29869@nevyn.them.org>
On Tue, Mar 15, 2005 at 10:16:09PM -0500, Daniel Jacobowitz wrote:
> On Tue, Mar 15, 2005 at 06:36:22PM +0530, Amit S. Kale wrote:
> > The strtoul change in my patch was already present. Sorry about that.
> >
> > You have changed the data type of thread_resume::thread as well as cont_thread
> > to unsigned long. "cont_thread = -1" and "(cont_thread > 0)" are still in
> > place. How does this work?
>
> Hmm, looks like you found a real problem here; would you like to fix
> it? Modern GDBs don't heavily use this code, because of the vCont
> packet. Otherwise I'll fix it, but I may not find time for a bit.
>
> > Can we use a thread value of "0" to indicate all threads or no-thread instead
> > of "-1"? The condition "cont_thread > 0" becomes valid if we do that.
>
> This value can be set from the remote protocol, so we would have to
> transform it in Hc/Hg support also.
Better late than never: this patch eliminates the bogus -1 checks.
Tested i686-linux, committed.
--
Daniel Jacobowitz
CodeSourcery, LLC
2005-06-16 Daniel Jacobowitz <dan@codesourcery.com>
* linux-low.c (linux_wait, linux_send_signal): Don't test
an unsigned long variable for > 0 if it could be MAX_ULONG.
* server.c (myresume): Likewise.
* target.c (set_desired_inferior): Likewise.
Index: linux-low.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/linux-low.c,v
retrieving revision 1.37
diff -u -p -r1.37 linux-low.c
--- linux-low.c 13 Jun 2005 01:59:22 -0000 1.37
+++ linux-low.c 17 Jun 2005 03:51:05 -0000
@@ -667,7 +667,7 @@ retry:
then we need to make sure we restart the other threads. We could
pick a thread at random or restart all; restarting all is less
arbitrary. */
- if (cont_thread > 0)
+ if (cont_thread != 0 && cont_thread != -1)
{
child = (struct thread_info *) find_inferior_id (&all_threads,
cont_thread);
@@ -1435,7 +1435,7 @@ linux_send_signal (int signum)
{
extern unsigned long signal_pid;
- if (cont_thread > 0)
+ if (cont_thread != 0 && cont_thread != -1)
{
struct process_info *process;
Index: server.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/server.c,v
retrieving revision 1.26
diff -u -p -r1.26 server.c
--- server.c 13 Jun 2005 01:59:22 -0000 1.26
+++ server.c 17 Jun 2005 03:51:05 -0000
@@ -281,7 +281,7 @@ myresume (int step, int sig)
struct thread_resume resume_info[2];
int n = 0;
- if (step || sig || cont_thread > 0)
+ if (step || sig || (cont_thread != 0 && cont_thread != -1))
{
resume_info[0].thread
= ((struct inferior_list_entry *) current_inferior)->id;
@@ -293,7 +293,7 @@ myresume (int step, int sig)
resume_info[n].thread = -1;
resume_info[n].step = 0;
resume_info[n].sig = 0;
- resume_info[n].leave_stopped = (cont_thread > 0);
+ resume_info[n].leave_stopped = (cont_thread != 0 && cont_thread != -1);
(*the_target->resume) (resume_info);
}
Index: target.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/target.c,v
retrieving revision 1.5
diff -u -p -r1.5 target.c
--- target.c 13 Jun 2005 01:59:22 -0000 1.5
+++ target.c 17 Jun 2005 03:51:05 -0000
@@ -42,7 +42,8 @@ set_desired_inferior (int use_general)
/* If we are continuing any (all) thread(s), use step_thread
to decide which thread to step and/or send the specified
signal to. */
- if (step_thread > 0 && (cont_thread == 0 || cont_thread == -1))
+ if ((step_thread != 0 && step_thread != -1)
+ && (cont_thread == 0 || cont_thread == -1))
found = (struct thread_info *) find_inferior_id (&all_threads,
step_thread);