986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ CDDL HEADER START
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ The contents of this file are subject to the terms of the
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ Common Development and Distribution License (the "License").
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ You may not use this file except in compliance with the License.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ or http://www.opensolaris.org/os/licensing.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ See the License for the specific language governing permissions
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ and limitations under the License.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ When distributing Covered Code, include this CDDL HEADER in each
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ file and include the License file at usr/src/OPENSOLARIS.LICENSE.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ If applicable, add the following below this CDDL HEADER, with the
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ fields enclosed by brackets "[]" replaced with your own identifying
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ information: Portions Copyright [yyyy] [name of copyright owner]
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ CDDL HEADER END
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\
c713350eb0c205161e2a4ab06cd996300721ac78John Johnson\ Copyright 2009 Sun Microsystems, Inc. All rights reserved.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ Use is subject to license terms.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setjepurpose: utility words
c713350eb0c205161e2a4ab06cd996300721ac78John Johnsoncopyright: Copyright 2009 Sun Microsystems, Inc. All Rights Reserved
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setjed# 256 constant /buf-len
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ useful counting words
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje: roundup ( x y -- x' ) 1- tuck + swap invert and ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ various useful string manipulation words
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje: cstrlen ( cstr -- len )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup begin
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup c@
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje while
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje char+
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje repeat swap -
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje: cscount ( cstr -- adr,len ) dup cstrlen ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ Append str1 to the end of str2
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje: $append ( adr,len1 adr,len2 -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 2over 2over ca+ swap move ( adr,len1 adr,len2 )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje rot + ca+ 0 swap c! drop ( )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje: $= ( str1$ str2$ -- same? )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje rot tuck <> if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 3drop false exit
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then comp 0=
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ advance str by 1
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje: str++ ( adr len -- adr' len' )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje swap 1+ swap 1-
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw: die ( str -- )
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw cr type cr abort
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw;
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje: diag-cr? ( -- ) diagnostic-mode? if cr then ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje: find-abort ( name$ -- )
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw cr ." Can't find " type cr abort
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje: get-package ( pkg$ -- ph )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 2dup find-package 0= if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje find-abort
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( pkg$ ph )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje nip nip ( ph )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ CIF words for I/O and memory
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje" /openprom/client-services" get-package constant cif-ph
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setjeinstance defer cif-open ( dev$ -- ihandle|0 )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setjeinstance defer cif-close ( ihandle -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setjeinstance defer cif-read ( len adr ihandle -- #read )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setjeinstance defer cif-seek ( low high ihandle -- -1|0|1 )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setjeinstance defer cif-release ( size virt -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje: find-cif-method ( adr,len -- acf )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 2dup cif-ph find-method 0= if ( adr,len )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje find-abort
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( adr,len acf )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje nip nip ( acf )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje" open" find-cif-method to cif-open
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje" close" find-cif-method to cif-close
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje" read" find-cif-method to cif-read
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje" seek" find-cif-method to cif-seek
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje" release" find-cif-method to cif-release
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje" /chosen" get-package constant chosen-ph
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje: get-property ( name$ ph -- prop$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje >r 2dup r> get-package-property if ( name$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje find-abort
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( name$ prop$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 2swap 2drop ( prop$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje: get-string-prop ( name$ ph -- val$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje get-property decode-string ( prop$' val$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 2swap 2drop ( val$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje: get-int-prop ( name$ ph -- n )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje get-property decode-int ( prop$' n )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje nip nip ( n )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ memory allocation
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ we bypass cif claim so we can do large page
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ allocations like promif can
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje" mmu" chosen-ph get-int-prop constant mmu-ih
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje" memory" chosen-ph get-int-prop constant mem-ih
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje: mmu-claim ( [ virt ] size align -- base )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje " claim" mmu-ih $call-method
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje: mmu-map ( phys.lo phys.hi virt size -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje -1 " map" mmu-ih $call-method
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje: mem-claim ( size align -- phys.lo phys.hi )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje " claim" mem-ih $call-method
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje: (mem-alloc) ( size virt align -- virt )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ claim memory first since it may throw if fragmented
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje rot 2dup swap mem-claim ( virt align size phys.lo phys.hi )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje >r >r rot ?dup if ( align size virt r: phys.lo phys.hi )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ we picked virt - zero alignment
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje over 0 mmu-claim ( align size virt r: phys.lo phys.hi )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje else ( align size r: phys.lo phys.hi )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ OBP picks virt - pass alignment
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 2dup swap mmu-claim ( align size virt r: phys.lo phys.hi )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( align size virt r: phys.lo phys.hi )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje r> r> 2over swap mmu-map ( align size virt )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje nip nip ( virt )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje: vmem-alloc ( size virt -- virt )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje swap h# 2000 roundup swap
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 1 (mem-alloc)
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje: mem-alloc ( size -- virt )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje h# 2000 roundup
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 1 (mem-alloc)
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje: mem-free ( virt size -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje h# 2000 roundup
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje swap cif-release ( )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ put ramdisk fcode 256 bytes from end of bootblk
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ (currently 244 bytes in size)
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setjed# 256 constant /rd-fcode
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setjed# 8192 /rd-fcode - constant rd-offset
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje: open-abort ( file$ -- )
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw cr ." Can't open " type cr abort
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje/buf-len buffer: open-cstr
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje: dev-open ( dev$ -- ih | 0 )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ copy to C string for open
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 over open-cstr + c!
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje open-cstr swap move
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje open-cstr cif-open
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje: dev-close ( ih -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje cif-close
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje: read-disk ( adr len off ih -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup >r 0 swap cif-seek if ( adr len r: ih )
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw " seek failed" die
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje tuck swap r> cif-read <> if ( )
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw " read failed" die
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje;