Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / openbios / forth / admin / nvram.fs
diff --git a/qemu/roms/openbios/forth/admin/nvram.fs b/qemu/roms/openbios/forth/admin/nvram.fs
new file mode 100644 (file)
index 0000000..20f6462
--- /dev/null
@@ -0,0 +1,385 @@
+\ 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
+;