[openfirmware] r1265 - cpu/x86/pc/olpc/via
svn at openfirmware.info
svn at openfirmware.info
Fri Jul 31 22:05:33 CEST 2009
Author: wmb
Date: 2009-07-31 22:05:33 +0200 (Fri, 31 Jul 2009)
New Revision: 1265
Added:
cpu/x86/pc/olpc/via/fsupdate.fth
Log:
Via - added "fs-update" command for OS installation.
Added: cpu/x86/pc/olpc/via/fsupdate.fth
===================================================================
--- cpu/x86/pc/olpc/via/fsupdate.fth (rev 0)
+++ cpu/x86/pc/olpc/via/fsupdate.fth 2009-07-31 20:05:33 UTC (rev 1265)
@@ -0,0 +1,290 @@
+purpose: Secure NAND updater
+\ See license at end of file
+
+\ Depends on words from security.fth and copynand.fth
+
+: get-hex# ( -- n )
+ safe-parse-word
+ push-hex $number pop-base " Bad number" ?nand-abort
+;
+
+0 [if]
+0 value partition-map-offset
+0 value next-partition-start
+
+0 value partition#
+d# 256 constant /partition-entry
+: partition-adr ( -- adr ) partition# /partition-entry * load-base + ;
+: max-nand-offset ( -- n ) " usable-page-limit" $call-nand /nand-page * ;
+
+: add-partition ( name$ #eblocks -- )
+ partition# " max#partitions" $call-nand >= abort" Partition map overflow"
+
+ -rot ( #eblocks name$ )
+ partition-adr /partition-entry erase ( #eblocks name$ )
+ d# 15 min partition-adr swap move ( #eblocks )
+ next-partition-start partition-adr d# 16 + l! ( #eblocks )
+
+ dup -1 = if ( #eblocks )
+ drop max-nand-offset ( last-offset )
+ next-partition-start - ( #bytes )
+ else
+ /nand-block * ( #bytes )
+ then ( #bytes )
+
+ dup partition-adr d# 24 + l! \ size ( #bytes )
+
+ next-partition-start + to next-partition-start ( )
+ next-partition-start max-nand-offset > abort" NAND size overflow"
+
+ partition# 1+ to partition#
+;
+: start-partition-map ( -- )
+ load-base /nand-block h# ff fill
+ 0 to partition#
+\ 0 to next-partition-start
+ " partition-map-page#" $call-nand /nand-page * to partition-map-offset
+
+ partition-map-offset to next-partition-start
+ " FIS directory" 1 add-partition
+;
+: write-partition-map ( -- )
+ partition-map-offset /nand-page / dup " erase-block" $call-nand
+ load-base swap nand-pages/block " write-pages" $call-nand
+ nand-pages/block <> abort" Can't write partition map"
+ " read-partmap" $call-nand
+;
+
+0 value partition-page-offset
+: map-eblock# ( block# -- block#' ) partition-page-offset + ;
+
+\ XXX need to check for overwriting existing partition map
+[then]
+
+0 value last-eblock#
+: erase-eblock ( eblock# -- )
+ drop \ XXX
+;
+
+0 value secure-fsupdate?
+d# 128 constant /spec-maxline
+
+: erase-gap ( end-block -- )
+ dup last-eblock# > if
+ last-eblock# 1+ ?do i erase-eblock loop
+ else
+ drop
+ then
+;
+
+vocabulary nand-commands
+also nand-commands definitions
+
+0 [if]
+: set-partition: ( "partitionid" -- ) \ partitionid is number or name
+ safe-parse-word " $set-partition" $call-nand abort" Nonexistent partition#"
+;
+
+: partitions: ( "name" "#eblocks" ... -- )
+ start-partition-map
+ begin parse-word dup while ( name$ )
+ get-hex# add-partition ( )
+ repeat ( null$ )
+ 2drop
+ write-partition-map
+;
+[then]
+
+: zblocks: ( "eblock-size" "#eblocks" ... -- )
+ get-hex# to /nand-block
+ get-hex# to #image-eblocks
+ open-nand
+ #image-eblocks show-init
+ get-inflater
+;
+
+: zblocks-end: ( -- ) #image-eblocks erase-gap ;
+
+: data: ( "filename" -- )
+ safe-parse-word fn-buf place
+ " ${DN}${PN}\${CN}${FN}" expand$ image-name-buf place
+ open-img
+ true to secure-fsupdate?
+;
+
+: erase-all ( -- )
+ #image-eblocks 0 ?do i erase-eblock loop
+ #image-eblocks show-writing
+;
+
+: get-zdata ( comprlen -- )
+ secure-fsupdate? if
+ load-base /spec-maxline fileih read-line ( len end? error? )
+ " Spec line read error" ?nand-abort ( len end? )
+ 0= " Spec line too long" ?nand-abort ( len )
+ load-base swap ( adr len )
+ source $= 0= " Spec line mismatch" ?nand-abort ( )
+
+ fileih ( ih )
+ else ( )
+ source-id ( ih )
+ then ( ih )
+
+ >r load-base /nand-block + over r@ fgets ( comprlen #read r: ih )
+ <> " Short read of zdata file" ?nand-abort ( r: ih )
+
+ r> fgetc newline <> ( error? )
+ " Missing newline after zdata" ?nand-abort ( )
+
+ \ The "2+" skips the Zlib header
+ load-base /nand-block + 2+ load-base true (inflate) ( len )
+ /nand-block <> " Wrong expanded data length" ?nand-abort ( )
+;
+
+: zblock: ( "eblock#" "comprlen" "hashname" "hash-of-128KiB" -- )
+ get-hex# ( eblock# )
+ get-hex# >r ( eblock# r: comprlen )
+ safe-parse-word ( eblock# hashname$ r: comprlen )
+ safe-parse-word hex-decode ( eblock# hashname$ [ hash$ ] err? r: comprlen )
+ " Malformed hash string" ?nand-abort ( eblock# hashname$ hash$ r: comprlen )
+
+ r> get-zdata ( eblock# hashname$ hash$ )
+
+ 2>r ( eblock# hashname$ r: hash$ )
+ load-base /nand-block 2swap ( eblock# data$ hashname$ r: hash$ )
+ hash ( eblock# calc-hash$ r: hash$ )
+
+ 2r> $= 0= if ( eblock# )
+ ." Bad hash for eblock# " .x cr cr
+ ." Your USB key may be bad. Please try a different one." cr
+ ." See http://wiki.laptop.org/go/Bad_hash" cr cr
+ abort
+ then ( eblock# )
+
+ dup erase-gap ( eblock# )
+
+ dup /nand-block um* " seek" $call-nand ( eblock# error )
+ " Bad seek" ?nand-abort ( eblock# )
+
+ load-base /nand-block " write" $call-nand ( eblock# #written )
+ /nand-block <> ( eblock# error? )
+ " Error writing to NAND FLASH" ?nand-abort ( eblock# )
+
+ dup to last-eblock# ( eblock# )
+ show-written ( )
+;
+
+previous definitions
+
+: fs-update ( "devspec" -- )
+ load-crypto abort" Can't load hash routines"
+
+ false to secure-fsupdate?
+ safe-parse-word r/o open-file ( fd )
+ abort" Can't open file" ( fd )
+
+ file @ ( fd fd' )
+ over file ! linefeed line-delimiter c! ( fd fd' )
+ file ! ( fd )
+
+
+ also nand-commands
+ ['] include-file catch dup if
+ nip .error
+ then
+ previous
+ show-done
+ close-nand-ihs
+;
+
+: do-fs-update ( img$ -- )
+ tuck load-base h# c00000 + swap move ( len )
+ load-base h# c00000 + swap ( adr len )
+
+ ['] noop to show-progress
+
+\ clear-context nand-commands
+ also nand-commands
+
+ true to secure-fsupdate?
+ ['] include-buffer catch ?dup if nip nip .error security-failure then
+
+ previous
+\ only forth also definitions
+
+ show-done
+ close-nand-ihs
+;
+
+: fs-update-from-list ( devlist$ -- )
+ load-crypto if visible ." Crytpo load failed" cr show-sad security-failure then
+
+ visible ( devlist$ )
+ begin dup while ( rem$ )
+ bl left-parse-string ( rem$ dev$ )
+ dn-buf place ( rem$ )
+
+ null$ pn-buf place ( rem$ )
+ null$ cn-buf place ( rem$ )
+ " fs" bundle-present? if ( rem$ )
+ " Filesystem image found - " ?lease-debug
+ fskey$ to pubkey$ ( rem$ )
+ img$ sig$ sha-valid? if ( rem$ )
+ 2drop ( )
+ show-unlock ( )
+ img$ do-fs-update ( )
+ ." Rebooting in 10 seconds ..." cr
+ d# 10,000 ms bye
+ exit
+ then ( rem$ )
+ show-lock ( rem$ )
+ then ( rem$ )
+ repeat ( rem$ )
+ 2drop
+;
+: update-devices " disk: sd: http:\\172.18.0.1" ;
+: try-fs-update ( -- )
+ ." Searching for a NAND file system update image." cr
+ " disk: sd:" fs-update-from-list
+[ifdef] Later
+ ." Trying NANDblaster" cr
+ ['] nandblaster catch 0= if exit then
+ " http:\\172.18.0.1" fs-update-from-list
+[then]
+;
+
+: $update-nand ( devspec$ -- )
+ load-crypto abort" Can't load the crypto functions"
+ null$ cn-buf place ( devspec$ )
+ 2dup ( devspec$ devspec$ )
+ [char] : right-split-string dn-buf place ( devspec$ path+file$ )
+ [char] \ right-split-string ( devspec$ file$ path$ )
+ dup if 1- then pn-buf place ( devspec$ file$ )
+ 2drop ( devspec$ )
+ boot-read loaded do-fs-update ( )
+;
+: update-nand ( "devspec" -- ) safe-parse-word $update-nand ;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2007 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
More information about the openfirmware
mailing list