So we have to dig into the deep end of breakpoint and watchpoint handling :)
Here are some thoughts about the situation.
(Everything about breakpoints applies equally to watchpoints.)

As I can see it we have two different levels in breakpoint handling:
- adding and removing breakpoints  - this is not target specific and can 
be handled in breakpoint.c
- enabling(activating) and disabling breakpoints on the target, this is 
called "set" and "unset" in the arm7_9 code, those functions
are not available to the higher level code in breakpoint.c

Note: void arm7_9_disable_bkpts_and_wpts(struct target_s *target) is 
never called

The logic we need in the run_algoritm code is
a) Disable (unset) all breakpoints            
                                           arm7_9_disable_bkpts_and_wpts
b) Add the temporary breakpoint used by the algorithm              
breakpoint_add(target, exit_point, exit_breakpoint_size, BKPT_HARD))  
in  armv4_5_run_algorithm
c) Enable (set) the temporary 
breakpoint                                         
arm7_9_enable_breakpoints(target)  called by  arm7_9_resume when running 
the algorithm
d) Run the algorithm
e) Unset and Remove the temporary  breakpoint                          
breakpoint_remove(target, exit_point) called from  armv4_5_run_algorithm
f) Enable all 
breakpoints                                                                     
arm7_9_enable_breakpoints(target)  called by  arm7_9_resume

The problems are that
- The breakpoint cannot be added in (b) since    arm7_9->wp_available < 
1 even though all  hardware watchpoint units are free  after 
arm7_9_disable_bkpts_and_wpts in (a)
- In c) ALL breakpoints in the breakponts linked list will be enabled by 
the resume code

One solution is to first unset all breakpoints, then save the watchpoint 
and breakpoint list pointers  and the arm7_9->wp_available to temporary 
variables in the algoritm code (and be careful hove to restore stuff on 
errors)
Now we have a clean breakpoint list and can add the temporary 
breakpoint, run the algoritm and remove the temporary breakpoint and 
restore the saved state. This is all done in the run_algorithm function.
The application stuff will be enabled(set) when calling resume next time.
This does not touch any code outside the run_algorithm,  but perhaps we 
should first have new look at the general breakpoint handling code.


The variable name set in breakpoint_t and watchpoint_t are a bit cyptic, 
perhaps they should be renamed  to set_to_hwunit ?? (  and set = 1 means 
mapped to hardware unit 0, open to confusion, but changes can introduce 
short term errors)

Comments ?


Regards
Magnus

_______________________________________________
Openocd-development mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to