Files
openbios/forth/admin/nvram.fs
Mark Cave-Ayland 3d7832bba9 Implement a basic C loader function in load.c that tries to load each supported executable file format. Now that the ihandle
hierarchy is correct, we can simply pass an ihandle into the loader and it will work correctly regardless of whether it is being 
invoked on an entire disk, partition or individual file.

In order to test the new code, start by switching the Fcode loader over to the new infrastructure for testing on SPARC64. Note 
this patch also contains a correction to load-base on SPARC which was being set to a value other than 0x4000 which is the 
documented default.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@siriusit.co.uk>


git-svn-id: svn://coreboot.org/openbios/trunk/openbios-devel@798 f158a5a8-5612-0410-a976-696ce0be7e32
2010-06-25 20:42:00 +00:00

386 lines
9.6 KiB
Forth

\ tag: nvram config handling
\
\ this code implements IEEE 1275-1994
\
\ Copyright (C) 2003, 2004 Samuel Rydh
\
\ See the file "COPYING" for further information about
\ the copyright and warranty status of this work.
\
struct ( config )
2 cells field >cf.name
2 cells field >cf.default \ 0 -1 if no default
/n field >cf.check-xt
/n field >cf.exec-xt
/n field >cf.next
constant config-info.size
0 value config-root
\ --------------------------------------------------------
\ config handling
\ --------------------------------------------------------
: find-config ( name-str len -- 0|configptr )
config-root
begin ?dup while
-rot
2dup 4 pick >cf.name 2@
strcmp 0= if
2drop exit
then
rot >cf.next @
repeat
2drop 0
;
: is-config-word ( configp -- )
dup >cf.name 2@ $create ,
does> @
dup >cf.name 2@
s" /options" find-dev if
get-package-property if 0 -1 then
( configp prop-str prop-len )
\ drop trailing zero
?dup if 1- then
else
2drop 0 -1
then
\ use default value if property is missing
dup 0< if 2drop dup >cf.default 2@ then
\ no default value, use empty string
dup 0< if 2drop 0 0 then
rot >cf.exec-xt @ execute
;
: new-config ( name-str name-len -- configp )
2dup find-config ?dup if
nip nip
0 0 2 pick >cf.default 2!
else
dict-strdup
here config-info.size allot
dup config-info.size 0 fill
config-root over >cf.next !
dup to config-root
dup >r >cf.name 2! r>
dup is-config-word
then
( configp )
;
: config-default ( str len configp -- )
-rot
dup 0> if dict-strdup then
rot >cf.default 2!
;
: no-conf-def ( configp -- )
0 -1
;
\ --------------------------------------------------------
\ config types
\ --------------------------------------------------------
: exec-str-conf ( str len -- str len )
\ trivial
;
: check-str-conf ( str len -- str len valid? )
\ nothing
true
;
: str-config ( def-str len name len -- configp )
new-config >r
['] exec-str-conf r@ >cf.exec-xt !
['] check-str-conf r@ >cf.check-xt !
r> config-default
;
\ ------------------------------------------------------------
: exec-int-conf ( str len -- value )
\ fixme
parse-hex
;
: check-int-conf ( str len -- str len valid? )
true
;
: int-config ( def-str len name len -- configp )
new-config >r
['] exec-int-conf r@ >cf.exec-xt !
['] check-int-conf r@ >cf.check-xt !
r> config-default
;
\ ------------------------------------------------------------
: exec-secmode-conf ( str len -- n )
2dup s" command" strcmp 0= if 2drop 1 exit then
2dup s" full" strcmp 0= if 2drop 2 exit then
2drop 0
;
: check-secmode-conf ( str len -- str len valid? )
2dup s" none" strcmp 0= if true exit then
2dup s" command" strcmp 0= if true exit then
2dup s" full" strcmp 0= if true exit then
false
;
: secmode-config ( def-str len name len -- configp )
new-config >r
['] exec-secmode-conf r@ >cf.exec-xt !
['] check-secmode-conf r@ >cf.check-xt !
r> config-default
;
\ ------------------------------------------------------------
: exec-bool-conf ( str len -- value )
2dup s" true" strcmp 0= if 2drop true exit then
2dup s" false" strcmp 0= if 2drop false exit then
2dup s" TRUE" strcmp 0= if 2drop false exit then
2dup s" FALSE" strcmp 0= if 2drop false exit then
parse-hex 0<>
;
: check-bool-conf ( name len -- str len valid? )
2dup s" true" strcmp 0= if true exit then
2dup s" false" strcmp 0= if true exit then
2dup s" TRUE" strcmp 0= if 2drop s" true" true exit then
2dup s" FALSE" strcmp 0= if 2drop s" false" true exit then
false
;
: bool-config ( configp -- configp )
new-config >r
['] exec-bool-conf r@ >cf.exec-xt !
['] check-bool-conf r@ >cf.check-xt !
r> config-default
;
\ --------------------------------------------------------
\ 7.4.4 Nonvolatile memory
\ --------------------------------------------------------
: $setenv ( data-addr data-len name-str name-len -- )
2dup find-config ?dup if
>r 2swap r>
( name len data len configptr )
>cf.check-xt @ execute
0= abort" Invalid value."
2swap
else
\ create string config type
2dup no-conf-def 2swap str-config
then
2swap encode-string 2swap
s" /options" find-package drop
encode-property
;
: setenv ( "nv-param< >new-value<eol>" -- )
parse-word
\ XXX drop blanks
dup if linefeed parse else 0 0 then
dup 0= abort" Invalid value."
2swap $setenv
;
: printenv ( "{param-name}<eol>" -- )
\ XXX temporary implementation
linefeed parse 2drop
active-package
s" /options" find-device
.properties
active-package!
;
: (set-default) ( configptr -- )
dup >cf.default 2@ dup 0>= if
rot >cf.name 2@ $setenv
else
\ no default value
3drop
then
;
: set-default ( "param-name<eol>" -- )
linefeed parse
find-config ?dup if
(set-default)
else
." No such parameter." -2 throw
then
;
: set-defaults ( -- )
config-root
begin ?dup while
dup (set-default)
>cf.next @
repeat
;
( maxlen "new-name< >" -- ) ( E: -- addr len )
: nodefault-bytes
;
\ --------------------------------------------------------
\ initialize config from nvram
\ --------------------------------------------------------
\ CHRP format (array of null-terminated strings, "variable=value")
: nvram-load-configs ( data len -- )
\ XXX: no len checking performed...
drop
begin dup c@ while
( data )
dup cstrlen 2dup + 1+ -rot
( next str len )
ascii = left-split ( next val len name str )
['] $setenv catch if
2drop 2drop
then
repeat drop
;
: (nvram-store-one) ( buf len str len -- buf len success? )
swap >r
2dup < if r> 2drop 2drop false exit then
( buf len strlen R: str )
swap over - r> swap >r -rot
( str buf strlen R: res_len )
2dup + >r move r> r> true
;
: (make-configstr) ( configptr ph -- str len )
>r
>cf.name 2@
2dup r> get-package-property if
2drop 0 0 exit
else
dup if 1- then
then
( name len value-str len )
2swap s" =" 2swap
pocket tmpstrcat tmpstrcat drop
2dup + 0 swap c!
1+
;
: nvram-store-configs ( data len -- )
2 - \ make room for two trailing zeros
s" /options" find-dev 0= if 2drop exit then
>r
config-root
( data len configptr R: phandle )
begin ?dup while
r@ over >r (make-configstr)
( buf len val len R: configptr phandle )
(nvram-store-one) drop
r> >cf.next @
repeat
\ null terminate
2 + 0 fill
r> drop
;
\ --------------------------------------------------------
\ NVRAM variables
\ --------------------------------------------------------
\ fcode-debug? input-device output-device
s" true" s" auto-boot?" bool-config \ 7.4.3.5
s" boot" s" boot-command" str-config \ 7.4.3.5
s" " s" boot-file" str-config \ 7.4.3.5
s" false" s" diag-switch?" bool-config \ 7.4.3.5
no-conf-def s" diag-device" str-config \ 7.4.3.5
no-conf-def s" diag-file" str-config \ 7.4.3.5
s" false" s" fcode-debug?" bool-config \ 7.7
s" " s" nvramrc" str-config \ 7.4.4.2
s" false" s" oem-banner?" bool-config
s" " s" oem-banner" str-config
s" false" s" oem-logo?" bool-config
no-conf-def s" oem-logo" str-config
s" false" s" use-nvramrc?" bool-config \ 7.4.4.2
s" keyboard" s" input-device" str-config \ 7.4.5
s" screen" s" output-device" str-config \ 7.4.5
s" 80" s" screen-#columns" int-config \ 7.4.5
s" 24" s" screen-#rows" int-config \ 7.4.5
s" 0" s" selftest-#megs" int-config
no-conf-def s" security-mode" secmode-config
\ --- devices ---
s" -1" s" pci-probe-mask" int-config
s" false" s" default-mac-address" bool-config
s" false" s" skip-netboot?" bool-config
s" true" s" scroll-lock" bool-config
[IFDEF] CONFIG_PPC
\ ---- PPC ----
s" disk" s" boot-device" str-config \ 7.4.3.5
s" false" s" little-endian?" bool-config
s" false" s" real-mode?" bool-config
s" -1" s" real-base" int-config
s" -1" s" real-size" int-config
s" 4000000" s" load-base" int-config
s" -1" s" virt-base" int-config
s" -1" s" virt-size" int-config
[THEN]
[IFDEF] CONFIG_X86
\ ---- X86 ----
s" disk" s" boot-device" str-config \ 7.4.3.5
s" true" s" little-endian?" bool-config
[THEN]
[IFDEF] CONFIG_SPARC32
\ ---- SPARC32 ----
s" true" s" tpe-link-test?" bool-config
s" 9600,8,n,1,-" s" ttya-mode" str-config
s" true" s" ttya-ignore-cd" bool-config
s" false" s" ttya-rts-dtr-off" bool-config
s" 9600,8,n,1,-" s" ttyb-mode" str-config
s" true" s" ttyb-ignore-cd" bool-config
s" false" s" ttyb-rts-dtr-off" bool-config
[THEN]
[IFDEF] CONFIG_SPARC64
\ ---- SPARC64 ----
s" 4000" s" load-base" int-config
s" false" s" little-endian?" bool-config
[THEN]
\ --- ??? ---
s" " s" boot-screen" str-config
s" " s" boot-script" str-config
s" false" s" use-generic?" bool-config
s" " s" boot-args" str-config \ ???
\ defers
['] fcode-debug? to _fcode-debug?
['] diag-switch? to _diag-switch?
\ Hack for load-base: it seems that some Sun bootloaders try
\ and execute "<value> to load-base" which will only work if
\ load-base is value. Hence we redefine load-base here as a
\ value using its normal default.
[IFDEF] CONFIG_SPARC64
load-base value load-base
[THEN]
: release-load-area
drop
;