Initial commit of OpenSPARC T2 architecture model.
[OpenSPARC-T2-SAM] / obp / obp / pkg / confvar / definitions / nvramrc.fth
\ ========== Copyright Header Begin ==========================================
\
\ Hypervisor Software File: nvramrc.fth
\
\ Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
\
\ - Do no alter or remove copyright notices
\
\ - Redistribution and use of this software in source and binary forms, with
\ or without modification, are permitted provided that the following
\ conditions are met:
\
\ - Redistribution of source code must retain the above copyright notice,
\ this list of conditions and the following disclaimer.
\
\ - Redistribution in binary form must reproduce the above copyright notice,
\ this list of conditions and the following disclaimer in the
\ documentation and/or other materials provided with the distribution.
\
\ Neither the name of Sun Microsystems, Inc. or the names of contributors
\ may be used to endorse or promote products derived from this software
\ without specific prior written permission.
\
\ This software is provided "AS IS," without a warranty of any kind.
\ ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
\ INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
\ PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
\ MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
\ ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
\ DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN
\ OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
\ FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
\ DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
\ ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
\ SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
\
\ You acknowledge that this software is not designed, licensed or
\ intended for use in the design, construction, operation or maintenance of
\ any nuclear facility.
\
\ ========== Copyright Header End ============================================
id: @(#)nvramrc.fth 1.3 06/11/22
purpose: Implements NVRAMRC
copyright: Copyright 2006 Sun Microsystems, Inc. All Rights Reserved
copyright: Use is subject to license terms.
\ Architecture document notes:
\ * It may not be reasonable to test the contents of nvramrc without
\ rebooting, because of temporal issues about probing (for instance,
\ the probing may have already taken place).
\ Some magic happens here..
\ The format of this option is different to the others.
\ /token acf of normal hash storage
\ /token acf of fallback storage
\ /w default length = 0
\ /w default data = 0
\
\ This format prevents using some of the other options common code
\ because the fields are in different positions. Be careful. This option
\ is also different because a set-default doesn't just free the storage
\ resource.
\ The 'old' storage will persist until garbage collection happens.
\ after that event nvrecover will do nothing.
\
" oldnvramrc" create-nvhash constant nvrecover#
0 2 ta+ /w + constant nvdata-offset
: getnvram-default ( apf -- ) nvdata-offset + 0 ;
: get-nvramrc ( apf -- )
options-open? if ( apf )
token@ execute exit ( adr,len )
then ( apf )
getnvram-default ( adr,len )
;
\
\ Most of the time we Joe.User to know about write failures to the device
\ However, for the nvramrc it is acceptable to lose the ability to
\ nvrecover if space in the device is low, unfortunately the data->file
\ tracking is handled entirely by the hash objects and by default they
\ complain when write fail. So we have a silent flag.
\
: strset ( adr len acf error? -- )
write-errors? @ >r write-errors? !
over if set else 3 perform-action 2drop then
r> write-errors? !
;
\ like the 'C' library counterpart.
: strdup ( adr len -- adr' len' )
tuck dup alloc-mem tuck >r ( len adr mem len )
move r> swap ( adr len )
;
\ Watch Out with this code.
\ The trick here is to release as much resource as possible
\ before starting to write anything. We release the various buffers
\ first because a triggered garbage collection will not write any hash
\ keys that have no data.
\
: set-nvramrc ( new$,len apf -- )
dup /token + token@ dup >r ( new$,len apf h2-acf )
4 perform-action ( new$,len apf )
token@ >r r@ get strdup ( new$,len old$,len )
r@ 4 perform-action ( new$,len old$,len )
2swap r> true strset ( old$,len )
2dup r> false strset ( old$,len )
free-mem ( -- )
;
7 actions
action: get-nvramrc ; ( apf -- adr len )
action: set-nvramrc ; ( adr len apf -- )
action: config-adr ; ( apf -- adr )
action: drop ; ( adr len acf -- adr len )
action: drop ; ( adr len acf -- adr len )
action: drop false ;
action: getnvram-default ; ( apf -- adr,len )
exported-headers transient
0 value nvramrc-created?
: nvramrc-bytes \ name ( -- )
[ifdef] SUN4V
\ 1024 bytes is the maximum size of an LDOM variable.. (FWARC 2006/055)
0 0 d# 1024 config-long-string exit
[then]
nvramrc-created? abort" Only One NVRAMRC file is permitted"
['] $header behavior >r ( -- )
['] ($header) to $header ( -- )
parse-word ( adr,len )
nvrecover# create-config-hash -rot ( h2-acf adr,len )
2dup create-nvhash ( h2-acf adr,len hash )
create-config-hash -rot ( h2-acf h1-acf adr,len )
also options definitions ( h2-acf h1-acf adr,len )
$create ( h2-acf h1-acf )
r> to $header ( h2-acf h1-acf )
previous definitions ( h2-acf h1-acf )
lastacf >r ( h2-acf h1-acf )
dup token, ( h2-acf h1-acf )
>body r> swap token! ( h2-acf )
token, ( -- )
\ the next three lines are useful for debugging..
\ as the keep the association between oldnvramrc and nvramrc
\ >body r@ swap token! ( h2-acf )
\ dup token, ( h2-acf )
\ >body r> swap token! ( -- )
0 l, ( -- )
use-actions
true to nvramrc-created?
;
unexported-words resident