|
|
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: ;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.