[openfirmware] r1383 - cpu/x86/pc/olpc/via dev/mmc/sdhci

svn at openfirmware.info svn at openfirmware.info
Thu Oct 1 10:38:31 CEST 2009


Author: wmb
Date: 2009-10-01 10:38:31 +0200 (Thu, 01 Oct 2009)
New Revision: 1383

Modified:
   cpu/x86/pc/olpc/via/fsupdate.fth
   cpu/x86/pc/olpc/via/padlock.fth
   dev/mmc/sdhci/sdhci.fth
Log:
Via - fixed several issues with fs-update
1) Now handles large chunk sizes correctly
2) "dir int:\" immediately after fs-update now works
3) Better error checking for truncated .zd files
4) Check the hash by default, using the hardware SHA256 engine for speed
5) Display the CPU temperature to verify that the thermal monitor works (prevents overheating)


Modified: cpu/x86/pc/olpc/via/fsupdate.fth
===================================================================
--- cpu/x86/pc/olpc/via/fsupdate.fth	2009-10-01 08:30:21 UTC (rev 1382)
+++ cpu/x86/pc/olpc/via/fsupdate.fth	2009-10-01 08:38:31 UTC (rev 1383)
@@ -3,6 +3,9 @@
 
 \ Depends on words from security.fth and copynand.fth
 
+: cpu-temperature  ( -- degrees-C )  h# 1169 msr@ drop  ;
+: show-temperature  ( -- )  space cpu-temperature .d  ;
+
 : get-hex#  ( -- n )
    safe-parse-word
    push-hex $number pop-base  " Bad number" ?nand-abort
@@ -63,9 +66,20 @@
 
 0 value last-eblock#
 : erase-eblock  ( eblock# -- )
-   drop \ XXX
+   \ XXX
+   to last-eblock#
 ;
 
+: ?all-written  ( -- )
+   last-eblock# 1+ #image-eblocks <>  if
+      cr
+      red-letters
+      ." WARNING: The file specified " #image-eblocks .d
+      ." chunks but wrote only " last-eblock# 1+ .d ." chunks" cr
+      black-letters
+   then
+;
+
 0 value secure-fsupdate?
 d# 128 constant /spec-maxline
 
@@ -77,6 +91,15 @@
    then
 ;
 
+\ We simultaneously DMA one data buffer onto NAND while unpacking the
+\ next block of data into another. The buffers exchange roles after
+\ each block.
+
+0 value dma-buffer
+0 value data-buffer
+
+: swap-buffers  ( -- )  data-buffer dma-buffer  to data-buffer to dma-buffer  ;
+
 vocabulary nand-commands
 also nand-commands definitions
 
@@ -101,6 +124,9 @@
    open-nand
    #image-eblocks  show-init
    get-inflater
+   load-base to dma-buffer
+   load-base /nand-block + to data-buffer
+   /nand-block /nand-page / to nand-pages/block
 ;
 
 : zblocks-end:  ( -- )
@@ -121,14 +147,6 @@
    #image-eblocks show-writing
 ;
 
-\ We simultaneously DMA one data buffer onto NAND while unpacking the
-\ next block of data into another. The buffers exchange roles after
-\ each block.
-load-base                   value dma-buffer
-load-base /nand-block 4 * + value data-buffer
-
-: swap-buffers  ( -- )  data-buffer dma-buffer  to data-buffer to dma-buffer  ;
-
 : get-zdata  ( comprlen -- )
    secure-fsupdate?  if
       data-buffer /spec-maxline  fileih read-line         ( len end? error? )
@@ -153,12 +171,16 @@
    /nand-block <>  " Wrong expanded data length" ?nand-abort  ( )
 ;
 
-false value check-hash?
+true value check-hash?
 
 : check-hash  ( -- )
    2>r                                ( eblock# hashname$ r: hash$ )
    data-buffer /nand-block 2swap      ( eblock# data$ hashname$ r: hash$ )
-   crypto-hash                        ( eblock# calc-hash$ r: hash$ )
+   2dup " sha256" $=  if              ( eblock# hashname$ r: hash$ )
+      2drop sha-256                   ( eblock# calc-hash$ r: hash$ )
+   else
+      crypto-hash                     ( eblock# calc-hash$ r: hash$ )
+   then
    2r>  $=  0=  if                    ( eblock# )
       ." Bad hash for eblock# " .x cr cr
       ." Your USB key may be bad.  Please try a different one." cr
@@ -167,14 +189,37 @@
    then                               ( eblock# )
 ;
 
+0 value have-crc?
+0 value my-crc
+
+: ?get-crc  ( -- )
+   parse-word  dup  if                   ( eblock# hashname$ crc$ r: comprlen )
+      push-hex $number pop-base  if      ( eblock# hashname$ crc$ r: comprlen )
+         false to have-crc?              ( eblock# hashname$ r: comprlen )
+      else                               ( eblock# hashname$ crc r: comprlen )
+         to my-crc                       ( eblock# hashname$ r: comprlen )
+         true to have-crc?               ( eblock# hashname$ r: comprlen )
+      then                               ( eblock# hashname$ r: comprlen )
+   else                                  ( eblock# hashname$ empty$ r: comprlen )
+      2drop                              ( eblock# hashname$ r: comprlen )
+      false to have-crc?                 ( eblock# hashname$ r: comprlen )
+   then                                  ( eblock# hashname$ r: comprlen )
+;
+: ?check-crc  ( -- )
+   have-crc?  if
+   then
+;
+
 : 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 )
-                                        
+
+   ?get-crc                              ( eblock# hashname$ hash$ r: comprlen )
    r> get-zdata                          ( eblock# hashname$ hash$ )
+   ?check-crc                            ( eblock# hashname$ hash$ )
 
    check-hash?  if                       ( eblock# hashname$ hash$ )
       check-hash                         ( eblock# )
@@ -190,6 +235,7 @@
 
    dup to last-eblock#                   ( eblock# )
    show-written                          ( )
+   show-temperature
 ;
 
 previous definitions
@@ -205,13 +251,14 @@
    over file !  linefeed line-delimiter c!  ( fd fd' )
    file !                              ( fd )
 
-   t(
-   also nand-commands   
-   ['] include-file catch  dup  if
+   t(                                  ( fd )
+   also nand-commands                  ( fd )
+   ['] include-file catch  ?dup  if    ( x error )
       nip .error
-   then
+   then                                ( )
    previous
    show-done
+   ?all-written
    close-nand-ihs
    )t-hms
 ;

Modified: cpu/x86/pc/olpc/via/padlock.fth
===================================================================
--- cpu/x86/pc/olpc/via/padlock.fth	2009-10-01 08:30:21 UTC (rev 1382)
+++ cpu/x86/pc/olpc/via/padlock.fth	2009-10-01 08:38:31 UTC (rev 1383)
@@ -51,7 +51,7 @@
    enable-padlock
    init-sha
    sha-buf do-sha
-   sha-buf h# 20
+   sha-buf h# 20  2dup lbflips
 ;
 
 \ LICENSE_BEGIN

Modified: dev/mmc/sdhci/sdhci.fth
===================================================================
--- dev/mmc/sdhci/sdhci.fth	2009-10-01 08:30:21 UTC (rev 1382)
+++ dev/mmc/sdhci/sdhci.fth	2009-10-01 08:38:31 UTC (rev 1383)
@@ -716,6 +716,21 @@
 
 external
 
+
+: dma-alloc   ( size -- vadr )  " dma-alloc"  $call-parent  ;
+: dma-free    ( vadr size -- )  " dma-free"   $call-parent  ;
+
+0 instance value dma?
+
+: wait-dma-done  ( -- )
+   dma?  if
+      2 wait
+      dma-release
+      intstat-off
+      false to dma?
+   then
+;
+
 : attach-card  ( -- okay? )
    setup-host
    power-up-card  if         ( retry? )
@@ -756,9 +771,8 @@
 ;
 
 : detach-card  ( -- )
-   intstat-on
-   wait-write-done
-   intstat-off
+   wait-dma-done
+   intstat-on  wait-write-done  intstat-off
    card-clock-off
    card-power-off
    unmap-regs
@@ -795,20 +809,6 @@
 : detach-sdio-card  ( -- )
 ;
 
-: dma-alloc   ( size -- vadr )  " dma-alloc"  $call-parent  ;
-: dma-free    ( vadr size -- )  " dma-free"   $call-parent  ;
-
-0 instance value dma?
-
-: wait-dma-done  ( -- )
-   dma?  if
-      2 wait
-      dma-release
-      intstat-off
-      false to dma?
-   then
-;
-
 : r/w-blocks-finish  ( -- actual )
    wait-dma-done
    dma-len /block /
@@ -862,7 +862,6 @@
 ;
 
 : close  ( -- )
-   wait-dma-done
    open-count  1 =  if
       scratch-buf d# 64 " dma-free" $call-parent
    then




More information about the openfirmware mailing list