OpenSolaris_b135/psm/stand/bootblks/common/rd.fth

\
\ CDDL HEADER START
\
\ The contents of this file are subject to the terms of the
\ Common Development and Distribution License (the "License").
\ You may not use this file except in compliance with the License.
\
\ You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
\ or http://www.opensolaris.org/os/licensing.
\ See the License for the specific language governing permissions
\ and limitations under the License.
\
\ When distributing Covered Code, include this CDDL HEADER in each
\ file and include the License file at usr/src/OPENSOLARIS.LICENSE.
\ If applicable, add the following below this CDDL HEADER, with the
\ fields enclosed by brackets "[]" replaced with your own identifying
\ information: Portions Copyright [yyyy] [name of copyright owner]
\
\ CDDL HEADER END
\
\
\ ident	"%Z%%M%	%I%	%E% SMI"
\ Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
\ Use is subject to license terms.
\

id: %Z%%M%	%I%	%E% SMI
purpose: simplified ramdisk driver
copyright: Copyright 2007 Sun Microsystems, Inc. All Rights Reserved

headerless

" block"          device-type
" SUNW,ramdisk"   encode-string " compatible" property

0 instance value current-offset

0 value ramdisk-base-va
0 value ramdisk-size
0 value alloc-size

: set-props
   ramdisk-size     encode-int  " size"        property
   ramdisk-base-va  encode-int  " address"     property
   alloc-size       encode-int  " alloc-size"  property
;
set-props

: current-va  ( -- adr )  ramdisk-base-va current-offset +  ;

external

: open  ( -- okay? )
   true
;

: close  ( -- )
;

: seek  ( off.low off.high -- error? )
   drop  dup  ramdisk-size  >  if
      drop true  exit         ( failed )
   then
   to current-offset  false   ( succeeded )
;

: read  ( addr len -- actual-len )
   dup  current-offset  +            ( addr len new-off )
   dup  ramdisk-size  >  if
      ramdisk-size -  -              ( addr len' )
      ramdisk-size                   ( addr len new-off )
   then  -rot                        ( new-off addr len )
   tuck  current-va  -rot  move      ( new-off len )
   swap  to current-offset           ( len )
;

: create ( base size alloc-sz -- )
   to alloc-size
   to ramdisk-size
   to ramdisk-base-va
   set-props
;