On Friday 04 December 2009, Nicolas Pitre wrote:
> On Fri, 4 Dec 2009, David Brownell wrote:
> 
> > Clean up arm_semihosting() entry a bit, comment some issues and just
> > which SVC opcodes are getting intercepted.  Microcontroller profile
> > cores will need a new entry, since they don't use SVC there (or even
> > have an SVC mode).
> 
> In that case they use BKPT 0xAB instead of SVC 0xAB.  And the 
> microcontroller profile has only thumb2 mode so no need to bother with 
> (the non existing) spsr.

Exactly:  a new entry is the simplest way.


> > -   struct arm *armv4_5 = target_to_armv4_5(target);
> > +   struct arm *arm = target_to_armv4_5(target);
> 
> Wouldn't it be time to s/target_to_armv4_5/target_to_arm/ everywhere?

Soonish, yes.  Also splitting some of the common code out to "arm.[hc]".

 
> > +   /* Check for PC == 8:  Supervisor Call vector
> > +    * REVISIT:  assumes low exception vectors, not hivecs...
> > +    * safer to test "was this entry from a vector catch".
> > +    */
> 
> There is no universal "vector catch" facility.  Some targets might have 
> to use a breakpoint instead.  And hardware breakpoints are precious 
> resources i.e. Feroceon/Dragonite have only one of those already 
> involved in single-step support for example.  So software breakpoints 
> are preferable when there is no vector catch.
> 
> But yet some targets have the vectors in ROM (or flash) pointing to a 
> jump table located in RAM.  In that case the breakpoint has to be placed 
> in the jump table instead.  So there is more to it than just 0x08 or 
> 0xffff0008.  This is why the enabling of semihosting is really 
> architecture dependent.

Right, and that's why it's just flagged as REVISIT.  There are surely
a few other issues too!  :)

Most of the ARM cores *do* have some flavor of vector catch, so for
those cores that will be the most straightforward solution.  Tracking
that kind of debug entry will at least address the hivec issue.

 
> > +   /* Core-specific code should make sure SPSR is retrieved
> > +    * when the above checks pass...
> > +    */
> > +   if (!arm->spsr->valid)
> > +           LOG_WARNING("SPSR not valid!");
> 
> Better return an error and stop rather than continuing with wrong 
> information in that case.

Good point.


_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to