Author: mcayland Date: Sat Aug 21 12:21:01 2010 New Revision: 854 URL: http://tracker.coreboot.org/trac/openbios/changeset/854
Log: Alter (encode-bootpath) so that it processes a string on the stack rather than using the parse buffer directly. This enables us to ensure that execution of any platform-specific boot code can occur before the main "load & go" boot, even if they invoke Forth commands that alter the parse buffer.
Signed-off-by: Mark Cave-Ayland mark.cave-ayland@siriusit.co.uk
Modified: trunk/openbios-devel/forth/admin/userboot.fs trunk/openbios-devel/forth/debugging/client.fs
Modified: trunk/openbios-devel/forth/admin/userboot.fs ============================================================================== --- trunk/openbios-devel/forth/admin/userboot.fs Tue Aug 17 17:42:10 2010 (r853) +++ trunk/openbios-devel/forth/admin/userboot.fs Sat Aug 21 12:21:01 2010 (r854) @@ -1,10 +1,22 @@ \ 7.4.3.5 User commands for booting
: boot ( "{param-text}<cr>" -- ) - (encode-bootpath) \ Setup bootpath/bootargs + linefeed parse + + \ Copy NVRAM parameters from boot-file to bootargs in case any parameters have + \ been specified for the platform-specific boot code + s" boot-file" $find drop execute + encode-string + " /chosen" (find-dev) if + " bootargs" rot (property) + then + + \ Execute platform-specific boot code, e.g. kernel s" platform-boot" $find if - execute \ Execute platform-specific boot code + execute then + + (encode-bootpath) \ Setup bootpath/bootargs $load \ load and go go ;
Modified: trunk/openbios-devel/forth/debugging/client.fs ============================================================================== --- trunk/openbios-devel/forth/debugging/client.fs Tue Aug 17 17:42:10 2010 (r853) +++ trunk/openbios-devel/forth/debugging/client.fs Sat Aug 21 12:21:01 2010 (r854) @@ -55,16 +55,19 @@ then ;
-: (encode-bootpath) ( "{params}<cr>" -- bootpath-str bootpath-len) - \ Parse the current input buffer of a load/boot command and set both +: (encode-bootpath) ( param-str param-len -- bootpath-str bootpath-len) + \ Parse the <param> string from a load/boot command and set both \ the bootargs and bootpath properties as appropriate. - cr
\ bootpath - bl parse dup 0= if + bl left-split \ argstr argstr-len bootdevstr bootdevstr-len + dup 0= if
\ None specified. As per IEEE-1275 specification, search through each value \ in boot-device and use the first that returns a valid ihandle on open. + + 2drop \ drop the empty device string as we're going to use our own + s" boot-device" $find drop execute bl left-split begin @@ -80,8 +83,6 @@ then repeat 2drop - else - 0 0 2swap \ Fake (empty) parse string then
\ Set the bootpath property @@ -91,7 +92,7 @@ then
\ bootargs - linefeed parse dup 0= if + 2swap dup 0= if \ None specified, use default from nvram 2drop s" boot-file" $find drop execute then @@ -101,9 +102,6 @@ " /chosen" (find-dev) if " bootargs" rot (property) then - - \ Remove the remaining string - 2swap 2drop ;
: $load ( devstr len ) @@ -121,6 +119,7 @@ ;
: load ( "{params}<cr>" -- ) + linefeed parse (encode-bootpath) $load ;