[OpenBIOS] r629 - cpu/x86/pc/olpc

svn at openbios.org svn at openbios.org
Thu Sep 20 00:17:59 CEST 2007


Author: wmb
Date: 2007-09-20 00:17:59 +0200 (Thu, 20 Sep 2007)
New Revision: 629

Modified:
   cpu/x86/pc/olpc/setwp.fth
Log:
OLPC manufacturing data - new "change-tag" and "add-tag" commands.













Modified: cpu/x86/pc/olpc/setwp.fth
===================================================================
--- cpu/x86/pc/olpc/setwp.fth	2007-09-19 22:17:16 UTC (rev 628)
+++ cpu/x86/pc/olpc/setwp.fth	2007-09-19 22:17:59 UTC (rev 629)
@@ -32,10 +32,10 @@
 
 \ Find RAM address of tag, given FLASH address
 : tag>ram-adr  ( adr len -- ram-adr )
-   drop 2+                      ( adr' )   \ Address of  "ww" tag
+   drop                         ( adr' )   \ Address of  "ww" tag
    rom-pa mfg-data-offset +  -  ( offset )
 
-   dup /flash-block u>= abort" Bad ww offset"        \ Sanity check
+   dup /flash-block u>= abort" Bad tag offset"        \ Sanity check
 
    mfg-data-buf +               ( ram-adr )
 ;
@@ -44,7 +44,8 @@
 : mfg-data-setup  ( tag$ -- ram-adr )
    get-mfg-data
    2dup  find-tag  0=  if  ." No " type ."  tag" cr  abort  then  ( tag$ adr len )
-   tag>ram-adr  >r                            ( tag$ r: ram-adr )
+   \ The 2+ below skips the length bytes to the tagname field
+   tag>ram-adr  2+ >r                         ( tag$ r: ram-adr )
    r@ 2 $=  0= abort" Tag mismatch in RAM"    ( r: ram-adr )
    r>
 ;
@@ -69,3 +70,66 @@
    board-revision  h# b48 <  abort" Only supported on B4 and later"
    set-wp
 ;
+
+: ?tagname-valid  ( tagname$ -- tagname$ )
+   dup 2 <> abort" Tag name must be 2 characters long"
+;
+: tag-setup  ( tagname$ -- ram-value$ )
+   ?tagname-valid
+   get-mfg-data
+   2dup  find-tag  0=  if  ." No " type ."  tag" cr  abort  then  ( tagname$ value$ )
+   2nip                    ( value$ )
+   tuck tag>ram-adr swap   ( ram-value$ )
+;
+
+: value-mismatch?  ( new-value$ old-value$ -- flag )
+   dup  if
+      \ non-empty old value string
+      2dup + 1- c@  0=  if         ( new-value$ old-value$ )
+         \ Old value ends in null character; subtract that from the count
+         1-                        ( new-value$ old-value$' )
+      then                         ( new-value$ old-value$ )
+      rot <>                       ( new-adr old-adr flag )
+      nip nip                      ( old-len new-value$ )
+   else                            ( new-value$ old-value$ )
+      \ empty old value string; new one had better be empty too
+      2drop  0<>  nip              ( flag )
+   then
+;
+
+: $change-tag  ( value$ tagname$ -- )
+   tag-setup  ( new-value$ old-value$ )
+   2over 2over  value-mismatch?  abort" New value and old value have different lengths"
+   drop swap move   ( )
+   put-mfg-data
+;
+
+: change-tag  ( "tagname" "new-value" -- )
+   safe-parse-word  ( tagname$ )
+   0 parse          ( tagname$ new-value$ )
+   2swap $change-tag
+;
+
+: ram-last-mfg-data  ( -- adr )
+   mfg-data-buf /flash-block +  last-mfg-data
+;
+
+: $add-tag  ( value$ name$ -- )
+   ?tagname-valid                                 ( value$ name$ )
+   2dup find-tag  abort" Tagname already exists"  ( value$ name$ )
+   get-mfg-data
+   ram-last-mfg-data  >r                          ( value$ name$ r: adr )
+   2 pick 1+  over +  3 +                         ( value$ name$ record-len r: adr )
+   r@ over -  mfg-data-buf u<=  abort" Not enough space for new tag"
+   r@ over -  swap  ?erased                       ( value$ name$ r: adr )
+   r@ 2- swap move                                ( value$ r: adr )
+   dup 1+  dup r@ 3 - c!  invert r@ 4 - c!        ( value$ r: adr )
+   0  r@ 5 - c!                                   ( value$ r: adr )
+   r> 5 -  over -                                 ( value$ data-adr )
+   swap move
+   put-mfg-data
+;
+
+: add-tag  ( "name$" "value$" -- )
+   safe-parse-word  0 parse  2swap $add-tag
+;




More information about the OpenBIOS mailing list