[openfirmware] [commit] r2417 - ofw/fs

repository service svn at openfirmware.info
Sat Aug 6 00:24:56 CEST 2011


Author: wmb
Date: Sat Aug  6 00:24:56 2011
New Revision: 2417
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2417

Log:
Added coreboot filesystem support package.

Added:
   ofw/fs/cbfs.fth

Added: ofw/fs/cbfs.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ ofw/fs/cbfs.fth	Sat Aug  6 00:24:56 2011	(r2417)
@@ -0,0 +1,249 @@
+purpose: Coreboot filesystem ("CBFS") package
+\ See license at end of file
+
+h# ffc0.0000 value flash-base
+: .cbfs-type  ( type -- )
+   case
+      h#  10 of  ."        stage"  endof
+      h#  20 of  ."      payload"  endof
+      h#  30 of  ."    optionrom"  endof
+      h#  40 of  ."   bootsplash"  endof
+      h#  50 of  ."          raw"  endof
+      h#  51 of  ."          vsa"  endof
+      h#  52 of  ."          mbi"  endof
+      h#  53 of  ."    microcode"  endof
+      h#  aa of  ." cmos_default"  endof
+      h# 1aa of  ."  cmos_layout"  endof
+      -1     of  ."       unused"  endof
+      ( default )  dup push-hex d# 12 u.r pop-base
+   endcase
+;
+\ 0,1 magic  2 length  3 type  4 checksum  5 offset  6+ name\0
+: .cbfs  ( -- )
+   ." Address    Length         Type Name" cr
+   flash-base
+   begin  dup be-l@  h# 4c415243 =  while   ( adr )
+      push-hex                              ( adr )
+      dup dup 5 la+ be-l@ +  8 u.r space    ( adr )
+      dup 2 la+ be-l@ 8 u.r space           ( adr ) 
+      pop-base                              ( adr )
+      dup 3 la+ be-l@ .cbfs-type space      ( adr )
+      dup 6 la+ cscount type  cr            ( adr )
+      dup 2 la+ be-l@                       ( adr len ) 
+      over 5 la+ be-l@                      ( adr len offset )
+      + + h# 40 round-up                    ( adr' )
+   repeat                                   ( adr )
+   drop
+;
+
+support-package: cbfs-file-system
+
+headerless
+0 instance value image-size
+0 value open-count
+0 instance value seek-ptr
+0 instance value offset
+
+: clip-size  ( adr len -- adr len' )
+   seek-ptr +   image-size umin  seek-ptr -
+;
+: update-ptr  ( len' -- len' )  dup seek-ptr +  to seek-ptr  ;
+
+d# 255 instance buffer: pathbuf
+: fix-delims  ( adr len -- adr' len' )
+   pathbuf pack count 2dup
+   bounds  ?do  ( adr len )
+      i c@  dup [char] | =  swap [char] \ =  or  if  [char] / i c!  then
+   loop
+;
+
+headers
+external
+: seek  ( d.offset -- status )
+   0<>  over image-size u>  or  if  drop true  exit  then \ Seek offset too big
+   to seek-ptr
+   seek-ptr offset +  0  " seek" $call-parent
+;
+: size  ( -- d.size )  image-size u>d  ;
+: read  ( adr len -- actual )
+   clip-size                     ( adr len' )
+   " read" $call-parent          ( len' )
+   update-ptr                    ( len' )
+;
+
+headers
+d# 24 d# 64 +  instance buffer: cbfs-hdr  \ should be large enough
+
+d# 64 instance buffer: saved-name
+
+: cbfield  \ name  ( offset -- adr )
+   create  over ,  +  does> @ cbfs-hdr +
+;
+
+struct
+   8  cbfield cb-magic	\ 4c415243 48495645
+   /l cbfield cb-length	\ Data length in bytes
+   /l cbfield cb-type	\ Image type
+   /l cbfield cb-sum	\ Checksum
+   /l cbfield cb-offset	\ Offset to data
+   0  cbfield cb-name	\ Name
+constant /cb-hdr	\ Size of header excluding name
+
+: cbfs-name$  ( -- adr len )  cb-name cscount  ;
+
+\ ID of the header that's currently in the buffer
+-1 instance value header-id
+
+external
+: load  ( adr -- len )
+   0. seek drop           ( adr )
+   image-size read        ( len )
+   \ XXX should verify the checksum
+;
+
+headers
+: file-header?  ( id -- id flag )
+   -1 to header-id                          ( id )
+   dup u>d seek drop                        ( id )
+   cb-magic  8 read drop                    ( id )
+   cb-magic " "(4c41524348495645)" comp 0=  ( id adr )
+;
+: read-file-header  ( -- )
+   cb-length  h# 10 read drop                    ( id )
+   cb-name  cb-offset be-l@ h# 18 -  read drop   ( id )
+;
+: get-file-header?  ( id' -- id flag )
+   dup  header-id =  if  true exit  then   ( id )
+   file-header?  if			   ( id )
+      dup to header-id                     ( id )
+      read-file-header                     ( id )
+      true                                 ( id true )
+   else                                    ( id )
+      false                                ( false )
+   then                                    ( id )
+;
+
+: +file  ( id -- id' )
+   cb-length be-l@ +   ( id' )
+   cb-offset be-l@ +   ( id' )
+   h# 40 round-up      ( id' )
+;
+
+: first-file-header  ( -- false | id true )
+   d# 2000  0  do
+      i get-file-header?  if  +file true unloop exit  else  drop  then  ( )
+   loop
+   0
+;
+
+: another-file?  ( id -- false  | id' true )
+   ?dup  if                     ( id )    \ Not the first call
+      get-file-header?  0=  if  ( )
+         false exit
+      then                      ( id )    \ Get the old header into the buffer
+      +file                     ( id' )   \ Skip the old header
+      get-file-header?          ( false | id true )  \ Get the new header
+   else                         ( )
+      first-file-header         ( false | id' true )
+   then                         ( false | id' true )
+;
+
+\ When found, cbfs-hdr contains the file header
+: find-file  ( name$ -- found? )
+   0                                      ( name$ id )
+   begin  another-file?  while            ( name$ id )
+      2 pick  2 pick                      ( name$ id name$ )
+      cbfs-name$ $=  if                   ( name$ id )
+         3drop  true                      ( true )
+         exit
+      then                                ( name$ id )
+   repeat                                 ( name$ )
+   2drop false                            ( false )
+;
+
+\ Called after find-file has located the file header.
+\ Adjusts offset and image-size so subsequent seeks and reads
+\ apply only to that file's data.
+: select-file-data  ( -- okay? )
+   header-id cb-offset be-l@ +  to offset  ( )
+   cb-length be-l@  to image-size          ( )
+   0. seek drop                            ( )
+   true                                    ( true )
+;
+
+: resolve-path
+   find-file  if                           ( )
+      select-file-data                     ( flag )
+   else                                    ( )
+      false                                ( false )
+   then                                    ( flag )
+;
+
+external
+: open  ( -- flag )
+   -1 to image-size  0 to offset
+   my-args  fix-delims  2dup  " /"  $=  if       ( adr len )
+      2drop                                      ( )
+      true exit                                  ( true )
+   else                                          ( adr len )
+      over c@  [char] /  =  if  1 /string  then  ( adr' len' )
+      resolve-path                               ( flag )
+      exit                                       ( flag )
+   then                                          ( adr len )
+   2drop false                                   ( false )
+;
+: close  ( -- )  ;
+
+: next-file-info  ( id -- false | id' s m h d m y len attributes name$ true )
+   begin  another-file?  while             ( id' )
+      cb-type be-l@ h# ffffffff <>  if     ( id )
+         " built-time-int" $find  if       ( id s m h xt )
+            execute                        ( id s m h packed-date )
+            d# 100 /mod  d# 100 /mod       ( id s m h d m y )
+         else                              ( id s m h adr len )
+            2drop  0 0 0                   ( id s m h d m y )
+         then                              ( id s m h d m y )
+         " built-date-int" $find  if       ( id s m h xt )
+            execute                        ( id s m h packed-date )
+            d# 100 /mod  d# 100 /mod       ( id s m h d m y )
+         else                              ( id s m h adr len )
+            2drop  0 0 0                   ( id s m h d m y )
+         then                              ( id s m h d m y )
+         cb-length be-l@                   ( id s m h d m y size )
+         o# 555 h# 8000 or  \ Ordinary,r-x ( id s m h d m y size attributes )
+         cbfs-name$ saved-name $save       ( id s m h d m y size attr name$ )
+         true                              ( id s m h d m y size attr name$ true )
+         exit
+      then                                 ( id )
+   repeat                                  ( id )
+   drop                                    ( )
+   false                                   ( false )
+;
+
+: free-bytes  ( -- d.#bytes )  0.  ;
+
+end-support-package
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 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