Annotation of qemu/roms/openbios/forth/admin/nvram.fs, revision 1.1

1.1     ! root        1: \ tag: nvram config handling
        !             2: \ 
        !             3: \ this code implements IEEE 1275-1994 
        !             4: \ 
        !             5: \ Copyright (C) 2003, 2004 Samuel Rydh
        !             6: \ 
        !             7: \ See the file "COPYING" for further information about
        !             8: \ the copyright and warranty status of this work.
        !             9: \ 
        !            10: 
        !            11: struct ( config )
        !            12:   2 cells field >cf.name
        !            13:   2 cells field >cf.default            \ 0 -1 if no default
        !            14:   /n field >cf.check-xt
        !            15:   /n field >cf.exec-xt
        !            16:   /n field >cf.next
        !            17: constant config-info.size
        !            18: 
        !            19: 0 value config-root 
        !            20: 
        !            21: \ --------------------------------------------------------
        !            22: \ config handling
        !            23: \ --------------------------------------------------------
        !            24: 
        !            25: : find-config ( name-str len -- 0|configptr )
        !            26:   config-root
        !            27:   begin ?dup while
        !            28:     -rot
        !            29:     2dup 4 pick >cf.name 2@
        !            30:     strcmp 0= if
        !            31:       2drop exit
        !            32:     then
        !            33:     rot  >cf.next @
        !            34:   repeat
        !            35:   2drop 0
        !            36: ;
        !            37: 
        !            38: : is-config-word ( configp -- )
        !            39:   dup >cf.name 2@ $create ,
        !            40:   does> @
        !            41:     dup >cf.name 2@
        !            42:     s" /options" find-dev if
        !            43:       get-package-property if 0 -1 then
        !            44:       ( configp prop-str prop-len )
        !            45:       \ drop trailing zero
        !            46:       ?dup if 1- then
        !            47:     else
        !            48:       2drop 0 -1
        !            49:     then
        !            50:     \ use default value if property is missing
        !            51:     dup 0< if 2drop dup >cf.default 2@ then
        !            52:     \ no default value, use empty string
        !            53:     dup 0< if 2drop 0 0 then
        !            54:     
        !            55:     rot >cf.exec-xt @ execute
        !            56: ;
        !            57: 
        !            58: : new-config ( name-str name-len -- configp )
        !            59:   2dup find-config ?dup if
        !            60:     nip nip
        !            61:     0 0 2 pick >cf.default 2!
        !            62:   else
        !            63:     dict-strdup
        !            64:     here config-info.size allot
        !            65:     dup config-info.size 0 fill
        !            66:     config-root over >cf.next !
        !            67:     dup to config-root
        !            68:     dup >r >cf.name 2! r>
        !            69:     dup is-config-word
        !            70:   then
        !            71:   ( configp )
        !            72: ;
        !            73: 
        !            74: : config-default ( str len configp --  )
        !            75:   -rot
        !            76:   dup 0> if dict-strdup then
        !            77:   rot >cf.default 2!
        !            78: ;
        !            79: 
        !            80: : no-conf-def ( configp --  )
        !            81:   0 -1
        !            82: ;
        !            83: 
        !            84: \ --------------------------------------------------------
        !            85: \ config types
        !            86: \ --------------------------------------------------------
        !            87: 
        !            88: : exec-str-conf ( str len -- str len )
        !            89:   \ trivial
        !            90: ;
        !            91: : check-str-conf ( str len -- str len valid? )
        !            92:   \ nothing
        !            93:   true
        !            94: ;
        !            95: 
        !            96: : str-config ( def-str len name len -- configp )
        !            97:   new-config >r
        !            98:   ['] exec-str-conf r@ >cf.exec-xt !
        !            99:   ['] check-str-conf r@ >cf.check-xt !
        !           100:   r> config-default
        !           101: ;
        !           102: 
        !           103: \ ------------------------------------------------------------
        !           104: 
        !           105: : exec-int-conf ( str len -- value )
        !           106:   \ fixme
        !           107:   parse-hex
        !           108: ;
        !           109: : check-int-conf ( str len -- str len valid? )
        !           110:   true
        !           111: ;
        !           112: 
        !           113: : int-config ( def-str len name len -- configp )
        !           114:   new-config >r
        !           115:   ['] exec-int-conf r@ >cf.exec-xt !
        !           116:   ['] check-int-conf r@ >cf.check-xt !
        !           117:   r> config-default
        !           118: ;
        !           119: 
        !           120: \ ------------------------------------------------------------
        !           121: 
        !           122: : exec-secmode-conf ( str len -- n )
        !           123:   2dup s" command" strcmp 0= if 2drop 1 exit then
        !           124:   2dup s" full" strcmp 0= if 2drop 2 exit then
        !           125:   2drop 0
        !           126: ;
        !           127: : check-secmode-conf ( str len -- str len valid? )
        !           128:   2dup s" none" strcmp 0= if true exit then
        !           129:   2dup s" command" strcmp 0= if true exit then
        !           130:   2dup s" full" strcmp 0= if true exit then
        !           131:   false
        !           132: ;
        !           133: 
        !           134: : secmode-config ( def-str len name len -- configp )
        !           135:   new-config >r
        !           136:   ['] exec-secmode-conf r@ >cf.exec-xt !
        !           137:   ['] check-secmode-conf r@ >cf.check-xt !
        !           138:   r> config-default
        !           139: ;
        !           140: 
        !           141: \ ------------------------------------------------------------
        !           142: 
        !           143: : exec-bool-conf ( str len -- value )
        !           144:   2dup s" true" strcmp 0= if 2drop true exit then
        !           145:   2dup s" false" strcmp 0= if 2drop false exit then
        !           146:   2dup s" TRUE" strcmp 0= if 2drop false exit then
        !           147:   2dup s" FALSE" strcmp 0= if 2drop false exit then
        !           148:   parse-hex 0<>
        !           149: ;
        !           150: 
        !           151: : check-bool-conf ( name len -- str len valid? )
        !           152:   2dup s" true" strcmp 0= if true exit then
        !           153:   2dup s" false" strcmp 0= if true exit then
        !           154:   2dup s" TRUE" strcmp 0= if 2drop s" true" true exit then
        !           155:   2dup s" FALSE" strcmp 0= if 2drop s" false" true exit then
        !           156:   false
        !           157: ;
        !           158: 
        !           159: : bool-config ( configp -- configp )
        !           160:   new-config >r
        !           161:   ['] exec-bool-conf r@ >cf.exec-xt !
        !           162:   ['] check-bool-conf r@ >cf.check-xt !
        !           163:   r> config-default
        !           164: ;
        !           165: 
        !           166: 
        !           167: \ --------------------------------------------------------
        !           168: \ 7.4.4    Nonvolatile memory
        !           169: \ --------------------------------------------------------
        !           170: 
        !           171: : $setenv    ( data-addr data-len name-str name-len -- )
        !           172:   2dup find-config ?dup if
        !           173:     >r 2swap r>
        !           174:     ( name len data len configptr )
        !           175:     >cf.check-xt @ execute
        !           176:     0= abort" Invalid value."
        !           177:     2swap
        !           178:   else
        !           179:     \ create string config type
        !           180:     2dup no-conf-def 2swap str-config
        !           181:   then
        !           182:   
        !           183:   2swap encode-string 2swap
        !           184:   s" /options" find-package drop
        !           185:   encode-property
        !           186: ;
        !           187: 
        !           188: : setenv    ( "nv-param< >new-value<eol>" -- )
        !           189:   parse-word
        !           190:    \ XXX drop blanks
        !           191:   dup if linefeed parse else 0 0 then
        !           192: 
        !           193:   dup 0= abort" Invalid value."
        !           194:   2swap $setenv
        !           195: ;
        !           196:   
        !           197: : printenv    ( "{param-name}<eol>" -- )
        !           198:   \ XXX temporary implementation
        !           199:   linefeed parse 2drop
        !           200: 
        !           201:   active-package
        !           202:   s" /options" find-device
        !           203:   .properties
        !           204:   active-package!
        !           205: ;
        !           206: 
        !           207: : (set-default) ( configptr -- )
        !           208:     dup >cf.default 2@ dup 0>= if
        !           209:       rot >cf.name 2@ $setenv
        !           210:     else
        !           211:       \ no default value
        !           212:       3drop
        !           213:     then
        !           214: ;
        !           215: 
        !           216: : set-default    ( "param-name<eol>" -- )
        !           217:   linefeed parse
        !           218:   find-config ?dup if
        !           219:     (set-default)
        !           220:   else
        !           221:     ." No such parameter." -2 throw
        !           222:   then
        !           223: ;
        !           224:   
        !           225: : set-defaults    ( -- )
        !           226:   config-root
        !           227:   begin ?dup while
        !           228:     dup (set-default)
        !           229:     >cf.next @
        !           230:   repeat
        !           231: ;
        !           232: 
        !           233: ( maxlen "new-name< >" -- ) ( E: -- addr len )
        !           234: : nodefault-bytes
        !           235:   ;
        !           236: 
        !           237: 
        !           238: \ --------------------------------------------------------
        !           239: \ initialize config from nvram
        !           240: \ --------------------------------------------------------
        !           241: 
        !           242: \ CHRP format (array of null-terminated strings, "variable=value")
        !           243: : nvram-load-configs ( data len -- )
        !           244:   \ XXX: no len checking performed...
        !           245:   drop
        !           246:   begin dup c@ while
        !           247:     ( data )
        !           248:     dup cstrlen 2dup + 1+ -rot
        !           249:     ( next str len )
        !           250:     ascii = left-split ( next val len name str )
        !           251:     ['] $setenv catch if
        !           252:       2drop 2drop
        !           253:     then
        !           254:   repeat drop
        !           255: ;
        !           256: 
        !           257: : (nvram-store-one) ( buf len str len -- buf len success? )
        !           258:   swap >r
        !           259:   2dup < if r> 2drop 2drop false exit then
        !           260:   ( buf len strlen R: str )
        !           261:   swap over - r> swap >r -rot
        !           262:   ( str buf strlen R: res_len )
        !           263:   2dup + >r move r> r> true
        !           264: ;
        !           265: 
        !           266: : (make-configstr) ( configptr ph -- str len )
        !           267:   >r
        !           268:   >cf.name 2@
        !           269:   2dup r> get-package-property if
        !           270:     2drop 0 0 exit
        !           271:   else
        !           272:     dup if 1- then
        !           273:   then
        !           274:   ( name len value-str len )
        !           275:   2swap s" =" 2swap
        !           276:   pocket tmpstrcat tmpstrcat drop
        !           277:   2dup + 0 swap c!
        !           278:   1+
        !           279: ;
        !           280: 
        !           281: : nvram-store-configs ( data len -- )
        !           282:   2 - \ make room for two trailing zeros
        !           283: 
        !           284:   s" /options" find-dev 0= if 2drop exit then
        !           285:   >r
        !           286:   config-root
        !           287:   ( data len configptr R: phandle )
        !           288:   begin ?dup while
        !           289:     r@ over >r (make-configstr)
        !           290:     ( buf len val len R: configptr phandle )
        !           291:     (nvram-store-one) drop
        !           292:     r> >cf.next @
        !           293:   repeat
        !           294:   \ null terminate
        !           295:   2 + 0 fill
        !           296:   r> drop
        !           297: ;
        !           298: 
        !           299: 
        !           300: \ --------------------------------------------------------
        !           301: \ NVRAM variables
        !           302: \ --------------------------------------------------------
        !           303: \ fcode-debug? input-device output-device
        !           304: s" true"     s" auto-boot?"           bool-config   \ 7.4.3.5
        !           305: s" boot"     s" boot-command"         str-config    \ 7.4.3.5
        !           306: s" "         s" boot-file"            str-config    \ 7.4.3.5
        !           307: s" false"    s" diag-switch?"         bool-config   \ 7.4.3.5
        !           308: no-conf-def  s" diag-device"          str-config    \ 7.4.3.5
        !           309: no-conf-def  s" diag-file"            str-config    \ 7.4.3.5
        !           310: s" false"    s" fcode-debug?"         bool-config   \ 7.7
        !           311: s" "         s" nvramrc"              str-config    \ 7.4.4.2
        !           312: s" false"    s" oem-banner?"          bool-config
        !           313: s" "         s" oem-banner"           str-config  
        !           314: s" false"    s" oem-logo?"            bool-config
        !           315: no-conf-def  s" oem-logo"             str-config
        !           316: s" false"    s" use-nvramrc?"         bool-config   \ 7.4.4.2
        !           317: s" keyboard" s" input-device"         str-config    \ 7.4.5
        !           318: s" screen"   s" output-device"        str-config    \ 7.4.5
        !           319: s" 80"       s" screen-#columns"      int-config    \ 7.4.5
        !           320: s" 24"       s" screen-#rows"         int-config    \ 7.4.5
        !           321: s" 0"        s" selftest-#megs"       int-config
        !           322: no-conf-def  s" security-mode"        secmode-config
        !           323: 
        !           324: \ --- devices ---
        !           325: s" -1"       s" pci-probe-mask"       int-config
        !           326: s" false"    s" default-mac-address"  bool-config
        !           327: s" false"    s" skip-netboot?"        bool-config
        !           328: s" true"     s" scroll-lock"          bool-config
        !           329: 
        !           330: [IFDEF] CONFIG_PPC
        !           331: \ ---- PPC ----
        !           332: s" false"    s" little-endian?"       bool-config
        !           333: s" false"    s" real-mode?"           bool-config
        !           334: s" -1"       s" real-base"            int-config
        !           335: s" -1"       s" real-size"            int-config
        !           336: s" 4000000"  s" load-base"          int-config
        !           337: s" -1"       s" virt-base"            int-config
        !           338: s" -1"       s" virt-size"            int-config
        !           339: [THEN]
        !           340: 
        !           341: [IFDEF] CONFIG_X86
        !           342: \ ---- X86 ----
        !           343: s" true"     s" little-endian?"       bool-config
        !           344: [THEN]
        !           345: 
        !           346: [IFDEF] CONFIG_SPARC32
        !           347: \ ---- SPARC32 ----
        !           348: s" 4000"     s" load-base"             int-config
        !           349: s" true"     s" tpe-link-test?"        bool-config
        !           350: s" 9600,8,n,1,-" s" ttya-mode"         str-config
        !           351: s" true"     s" ttya-ignore-cd"        bool-config
        !           352: s" false"    s" ttya-rts-dtr-off"      bool-config
        !           353: s" 9600,8,n,1,-" s" ttyb-mode"         str-config
        !           354: s" true"     s" ttyb-ignore-cd"        bool-config
        !           355: s" false"    s" ttyb-rts-dtr-off"      bool-config
        !           356: [THEN]
        !           357: 
        !           358: [IFDEF] CONFIG_SPARC64
        !           359: \ ---- SPARC64 ----
        !           360: s" 4000"     s" load-base"          int-config
        !           361: s" false"    s" little-endian?"       bool-config
        !           362: [THEN]
        !           363: 
        !           364: \ --- ??? ---
        !           365: s" "         s" boot-screen"          str-config
        !           366: s" "         s" boot-script"          str-config
        !           367: s" false"    s" use-generic?"         bool-config
        !           368: s" disk"     s" boot-device"          str-config    \ 7.4.3.5
        !           369: s" "         s" boot-args"            str-config    \ ???
        !           370: 
        !           371: \ defers
        !           372: ['] fcode-debug? to _fcode-debug?
        !           373: ['] diag-switch? to _diag-switch?
        !           374: 
        !           375: \ Hack for load-base: it seems that some Sun bootloaders try
        !           376: \ and execute "<value> to load-base" which will only work if
        !           377: \ load-base is value. Hence we redefine load-base here as a
        !           378: \ value using its normal default.
        !           379: [IFDEF] CONFIG_SPARC64
        !           380: load-base value load-base
        !           381: [THEN]
        !           382: 
        !           383: : release-load-area
        !           384:     drop
        !           385: ;

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.