mirror of
https://gitlab.com/qemu-project/openbios.git
synced 2024-02-13 08:34:06 +08:00
This patch originally started as a fix for PPC, in that the NVRAM initialiser wasn't been run on startup (this is why printenv on PPC always showed much much less than on SPARC). However, it also showed up some inconsistent logic for boot device selection, which must also happen *before* boot is called in order for load to work correctly. With this patch applied, bootpath and bootargs are set from boot-device and boot-args respectively on startup for SPARC32, SPARC64 and PPC. Note: there is a small chance SPARC32 may break on some images - please let me know if it does. Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@siriusit.co.uk> git-svn-id: svn://coreboot.org/openbios/trunk/openbios-devel@805 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" 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" true" s" little-endian?" bool-config
|
|
[THEN]
|
|
|
|
[IFDEF] CONFIG_SPARC32
|
|
\ ---- SPARC32 ----
|
|
s" 4000" s" load-base" int-config
|
|
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" disk" s" boot-device" str-config \ 7.4.3.5
|
|
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
|
|
;
|