[openfirmware] [commit] r3346 - forth/lib
repository service
svn at openfirmware.info
Tue Oct 2 02:59:50 CEST 2012
Author: wmb
Date: Tue Oct 2 02:59:50 2012
New Revision: 3346
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/3346
Log:
Debugger - the "up" keystroke ('U') was not working when debugging inside a do .. loop due to misinterpreting a pointer to the loop end address as a return address.
Modified:
forth/lib/debug.fth
forth/lib/rstrace.fth
Modified: forth/lib/debug.fth
==============================================================================
--- forth/lib/debug.fth Tue Oct 2 02:26:16 2012 (r3345)
+++ forth/lib/debug.fth Tue Oct 2 02:59:50 2012 (r3346)
@@ -87,24 +87,28 @@
headerless
\ Go up the return stack until we find an interesting caller
: up1 ( rp -- )
- begin na1+ dup rp0 @ <> while ( rs-adr )
- dup @ ( rs-adr ip )
- dup in-dictionary? if ( rs-adr ip )
- find-cfa dup indirect-call? if ( rs-adr xt )
- drop ( rs-adr )
- else ( rs-adr xt )
- nip ( rs-adr )
- scrolling-debug? if ( xt )
- cr ." [ Up to " dup .name ." ]" cr
- then ( xt )
- (debug ( )
- exit ( -- )
- then ( rs-adr )
- else ( rs-adr ip )
- drop ( rs-adr )
- then ( rs-adr )
- repeat ( rs-adr )
- drop ( )
+ begin na1+ dup rp0 @ <> while ( rs-adr )
+ dup @ ( rs-adr ip )
+ dup in-dictionary? if ( rs-adr ip )
+ dup loop-end? if ( rs-adr ip )
+ drop ( rs-adr )
+ else ( rs-adr ip )
+ find-cfa dup indirect-call? if ( rs-adr xt )
+ drop ( rs-adr )
+ else ( rs-adr xt )
+ nip ( rs-adr )
+ scrolling-debug? if ( xt )
+ cr ." [ Up to " dup .name ." ]" cr
+ then ( xt )
+ (debug ( )
+ exit ( -- )
+ then ( rs-adr )
+ then ( rs-adr )
+ else ( rs-adr )
+ drop ( rs-adr )
+ then ( rs-adr )
+ repeat ( rs-adr )
+ drop ( )
;
defer to-debug-window ' noop is to-debug-window
Modified: forth/lib/rstrace.fth
==============================================================================
--- forth/lib/rstrace.fth Tue Oct 2 02:26:16 2012 (r3345)
+++ forth/lib/rstrace.fth Tue Oct 2 02:59:50 2012 (r3346)
@@ -22,29 +22,32 @@
." Catch frame - SP: " @+ . ." my-self: " @+ . ." handler: " @+ .
;
1 bits/cell 1- lshift constant minus0
+: loop-end? ( adr -- flag )
+ dup reasonable-ip? 0= if ( adr )
+ drop false exit ( -- false )
+ then ( adr )
+ dup @ + ( adr' )
+ dup reasonable-ip? 0= if ( adr )
+ drop false exit ( -- false )
+ then ( adr )
+ ip>token -1 na+ token@ ( xt )
+ dup ['] (loop) = swap ['] (+loop) = or ( flag )
+;
+
: .do-or-n ( rs-adr n -- rs-adr' )
over @ reasonable-ip? 0= if ( rs-adr n )
\ The second number is not an IP so it could be a do loop frame
- over na1+ @ reasonable-ip? if ( rs-adr n )
- \ The third entry is a reasonable IP so it could be a do loop frame
- \ Make sure it points just past a loop end
- over na1+ @ dup @ + ( rs-adr n n2 )
- dup reasonable-ip? if ( rs-adr n adr )
- ip>token -1 na+ token@ ( rs-adr n xt )
- dup ['] (loop) = swap ['] (+loop) = or if ( rs-adr n )
- \ The two numbers span the +- boundary, so probably a do loop
- ." Do loop frame inside "
- over na1+ @ ip>token .current-word ( rs-adr n )
- over @ ( rs-adr n n1 )
- ." i: " tuck + . ( rs-adr n1 )
- ." limit: " minus0 + . ( rs-adr )
- 2 na+ exit
- then ( rs-adr n )
- else ( rs-adr n n2 )
- drop ( rs-adr n )
- then ( rs-adr n )
- then ( rs-adr n )
- then ( rs-adr n )
+ over na1+ @ ( rs-adr n n2 )
+ dup loop-end? if ( rs-adr n n2 )
+ ." Do loop frame inside "
+ ip>token .current-word ( rs-adr n )
+ over @ ( rs-adr n n1 )
+ ." i: " tuck + . ( rs-adr n1 )
+ ." limit: " minus0 + . ( rs-adr )
+ 2 na+ exit ( -- rs-adr' )
+ then ( rs-adr n n2 )
+ drop ( rs-adr n )
+ then ( rs-adr n )
9 u.r
;
: .traceline ( ipaddr -- )
More information about the openfirmware
mailing list