mirror of
https://gitlab.com/qemu-project/openbios.git
synced 2024-02-13 08:34:06 +08:00
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
386 lines
9.6 KiB
Forth
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
|
|
;
|