[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