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

svn at openfirmware.info svn at openfirmware.info
Thu Oct 8 12:46:12 CEST 2009


Author: wmb
Date: 2009-10-08 12:46:12 +0200 (Thu, 08 Oct 2009)
New Revision: 1405

Modified:
   cpu/x86/pc/olpc/via/fsupdate.fth
   cpu/x86/pc/olpc/via/fw.bth
   dev/mmc/sdhci/sdhci.fth
Log:
OLPC trac 9474 - buffer conflict was causing fs-update to write bad filesystem data.


Modified: cpu/x86/pc/olpc/via/fsupdate.fth
===================================================================
--- cpu/x86/pc/olpc/via/fsupdate.fth	2009-10-08 05:18:17 UTC (rev 1404)
+++ cpu/x86/pc/olpc/via/fsupdate.fth	2009-10-08 10:46:12 UTC (rev 1405)
@@ -124,8 +124,11 @@
    open-nand
    #image-eblocks  show-init
    get-inflater
+   \ Separate the two buffers by enough space for both the compressed
+   \ and uncompressed copies of the data.  4x is overkill, but there
+   \ is plenty of space at load-base
    load-base to dma-buffer
-   load-base /nand-block + to data-buffer
+   load-base /nand-block 4 * + to data-buffer
    /nand-block /nand-page / to nand-pages/block
 ;
 
@@ -230,7 +233,8 @@
    ( eblock# )
 \ Asynchronous writes
    data-buffer over nand-pages/block *  nand-pages/block  " write-blocks-start" $call-nand  ( eblock# )
-\   data-buffer over nand-pages/block *  nand-pages/block  " write-blocks" $call-nand drop  ( eblock# )
+\   data-buffer over nand-pages/block *  nand-pages/block  " write-blocks" $call-nand  ( eblock# #written )
+\   nand-pages/block  <>  " Write error" ?nand-abort   ( eblock# )
    swap-buffers                          ( eblock# )
 
    dup to last-eblock#                   ( eblock# )
@@ -256,7 +260,7 @@
    ['] include-file catch  ?dup  if    ( x error )
       nip .error
    then                                ( )
-   previous
+   previous definitions
    show-done
    ?all-written
    close-nand-ihs

Modified: cpu/x86/pc/olpc/via/fw.bth
===================================================================
--- cpu/x86/pc/olpc/via/fw.bth	2009-10-08 05:18:17 UTC (rev 1404)
+++ cpu/x86/pc/olpc/via/fw.bth	2009-10-08 10:46:12 UTC (rev 1405)
@@ -480,6 +480,7 @@
 [then]
 fload ${BP}/cpu/x86/pc/olpc/via/padlock.fth   \ Via security engine
 fload ${BP}/cpu/x86/pc/olpc/via/fsupdate.fth
+fload ${BP}/cpu/x86/pc/olpc/via/fsverify.fth
 devalias fsdisk int:0
 
 fload ${BP}/ofw/inet/sntp.fth

Modified: dev/mmc/sdhci/sdhci.fth
===================================================================
--- dev/mmc/sdhci/sdhci.fth	2009-10-08 05:18:17 UTC (rev 1404)
+++ dev/mmc/sdhci/sdhci.fth	2009-10-08 10:46:12 UTC (rev 1405)
@@ -674,14 +674,21 @@
 : wait-write-done  ( -- )
    writing? 0=  if  exit  then                     ( limit )
 
-   get-msecs d# 1000 +                              ( limit )
-   begin  get-status 9 rshift h# f and  7 =  while  ( limit )
+   get-msecs d# 1000 +                             ( limit )
+   begin  get-status dup  9 rshift h# f and  7 =  while  ( limit status )
+      drop                                         ( limit )
       dup get-msecs - 0<  if
          ." SDHCI: wait-write-done timeout" cr
          abort
       then
-   repeat                                           ( limit )
-   drop                                             ( )
+   repeat                                           ( limit status )
+   nip                                              ( status )
+   dup h# fff9.8008 and  if                         ( status )
+      cr ." SD Error - status = " . cr
+      noop
+   else
+      drop
+   then
 
    false to writing?
 ;




More information about the openfirmware mailing list