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
|
|
s" true" s" vga-ndrv?" bool-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
|
|
;
|