[Pdbg] [PATCH 8/9] main: Convert gdbserver command to path based targeting

Amitay Isaacs amitay at ozlabs.org
Thu Nov 22 16:50:47 AEDT 2018


On Thu, 2018-11-22 at 13:54 +1100, Rashmica Gupta wrote:
> On Tue, 2018-11-20 at 15:19 +1100, Amitay Isaacs wrote:
> > Signed-off-by: Amitay Isaacs <amitay at ozlabs.org>
> > ---
> >  src/pdbgproxy.c | 72 +++++++++++++++++++++++----------------------
> > ----
> >  1 file changed, 33 insertions(+), 39 deletions(-)
> > 
> > diff --git a/src/pdbgproxy.c b/src/pdbgproxy.c
> > 
> 
> ...
> 
> >  static int gdbserver(uint16_t port)
> >  {
> > -	struct pdbg_target *target = NULL;
> > +	struct pdbg_target *target, *adu, *thread = NULL;
> >  	uint64_t msr;
> >  	int rc;
> >  
> > -	for_each_class_target("thread", target) {
> > -		if (!target_selected(target))
> > +	for_each_path_target_class("thread", target) {
> > +		if (pdbg_target_probe(target) != PDBG_TARGET_ENABLED)
> >  			continue;
> > -		if (pdbg_target_probe(target) == PDBG_TARGET_ENABLED)
> > -			break;
> > +
> > +		if (!thread) {
> > +			thread = target;
> > +		} else {
> > +			fprintf(stderr, "GDB server cannot be run on
> > multiple threads at once.\n");
> 
> Nice
> 
> 
> > +			return 0;
> > +		}
> >  	}
> > -	if (!target->class)
> > -		return -1;
> 
> This check was to return if the user specified a target that didn't
> exist (rather than segfault). Can you add a check for that here?
> Maybe:
> 
> if (!thread)
> 	return -1;
> 
> Would also be good to add in a useful message like "didn't find a
> valid
> thread".

Good catch.  Will add the check.

> 
> Otherwise, this looks good to me :)
> 
> 
> > -	assert(!strcmp(target->class, "thread"));
> > +
> > +	//
> >  	// Temporary until I can get this working a bit smoother on p9
> > -	if (strcmp(target->compatible, "ibm,power8-thread")) {
> > +	if (strcmp(thread->compatible, "ibm,power8-thread")) {
> >  		PR_ERROR("GDBSERVER is only tested on POWER8\n");
> >  		return -1;
> >  	}
> >  
> >  	/* Check endianess in MSR */
> > -	rc = ram_getmsr(target, &msr);
> > +	rc = ram_getmsr(thread, &msr);
> >  	if (rc) {
> >  		PR_ERROR("Couldn't read the MSR. Are all threads on
> > this chiplet quiesced?\n");
> >  		return 1;
> >  	}
> >  	littleendian = 0x01 & msr;
> >  
> > -	gdbserver_start(target, port);
> > +	/* Select ADU target */
> > +	pdbg_for_each_class_target("adu", adu) {
> > +		if (pdbg_target_probe(adu) == PDBG_TARGET_ENABLED)
> > +			break;
> > +	}
> > +
> > +	if (!adu) {
> > +		PR_ERROR("No ADU found\n");
> > +		return 0;
> > +	}
> > +
> > +	gdbserver_start(thread, adu, port);
> >  	return 0;
> >  }
> >  #else
> > -- 
> > 2.19.1
> > 

Amitay.
-- 

You're currently going through a difficult transition period called "Life."



More information about the Pdbg mailing list