|
|
1.1 root 1: \ *****************************************************************************
2: \ * Copyright (c) 2004, 2008 IBM Corporation
3: \ * All rights reserved.
4: \ * This program and the accompanying materials
5: \ * are made available under the terms of the BSD License
6: \ * which accompanies this distribution, and is available at
7: \ * http://www.opensource.org/licenses/bsd-license.php
8: \ *
9: \ * Contributors:
10: \ * IBM Corporation - initial implementation
11: \ ****************************************************************************/
12:
13: #include <rtas/rtas-init.fs>
14: #include <rtas/rtas-cpu.fs>
15: #include <rtas/rtas-reboot.fs>
16: #include <rtas/rtas-flash.fs>
17: #include <rtas/rtas-vpd.fs>
18:
19: \ for update-flash
20: : (get-flashside) ( -- flashside ) rtas-get-flashside ;
21:
22: ' (get-flashside) to get-flashside
23:
24: \ remember the current flashside
25: get-flashside to flashside?
26:
27: \ for update-flash
28: : (set-flashside) ( flashside -- status )
29: dup rtas-set-flashside = IF 0 ELSE -1 THEN
30: ;
31:
32: ' (set-flashside) to set-flashside
33:
34: : rtas-ibm-read-pci-config ( size puid bus devfn off -- x )
35: [ s" ibm,read-pci-config" rtas-get-token ] LITERAL rtas-cb rtas>token l!
36: 4 rtas-cb rtas>nargs l!
37: 2 rtas-cb rtas>nret l!
38: swap 8 lshift or swap 10 lshift or rtas-cb rtas>args0 l!
39: dup 20 rshift rtas-cb rtas>args1 l!
40: ffffffff and rtas-cb rtas>args2 l!
41: rtas-cb rtas>args3 l!
42: enter-rtas
43: rtas-cb rtas>args5 l@
44: ;
45:
46: : rtas-fetch-cpus ( mask -- status )
47: [ s" rtas-fetch-slaves" rtas-get-token ] LITERAL rtas-cb rtas>token l!
48: 1 rtas-cb rtas>nargs l!
49: 1 rtas-cb rtas>nret l!
50: rtas-cb rtas>args0 l!
51: 0 rtas-cb rtas>args1 l!
52: enter-rtas
53: rtas-cb rtas>args1 l@
54: ;
55:
56: : rtas-stop-bootwatchdog ( -- status )
57: [ s" rtas-stop-bootwatchdog" rtas-get-token ] LITERAL rtas-cb rtas>token l!
58: 0 rtas-cb rtas>nargs l!
59: 1 rtas-cb rtas>nret l!
60: enter-rtas
61: rtas-cb rtas>args0 l@
62: ;
63:
64: : rtas-set-bootwatchdog ( seconds -- )
65: [ s" rtas-set-bootwatchdog" rtas-get-token ] LITERAL rtas-cb rtas>token l!
66: 1 rtas-cb rtas>nargs l!
67: 0 rtas-cb rtas>nret l!
68: rtas-cb rtas>args0 l!
69: enter-rtas
70: ;
71:
72: ' rtas-set-bootwatchdog to set-watchdog
73:
74: : rtas-dump-flash ( offset cnt -- )
75: [ s" rtas-dump-flash" rtas-get-token ] LITERAL rtas-cb rtas>token l!
76: 2 rtas-cb rtas>nargs l!
77: 0 rtas-cb rtas>nret l!
78: rtas-cb rtas>args0 l!
79: rtas-cb rtas>args1 l!
80: enter-rtas
81: ;
82:
83: \ load-base wird in slof/fs/base.fs gesetzt... nicht überschreiben
84: \ 2000000 CONSTANT load-base
85: create blist 50 allot
86: blist 50 erase
87:
88: : build-blocklist_old
89: \ set version
90: 1 blist c!
91: \ set length of block list
92: 50 blist 7 + c!
93: \ no more block list
94: 0000000000000000 blist 8 + !
95: \ first block
96: load-base 0 + blist 10 + !
97: 80000 blist 18 + !
98: load-base 80000 + blist 20 + !
99: 80000 blist 28 + !
100: load-base 100000 + blist 30 + !
101: 80000 blist 38 + !
102: load-base 180000 + blist 40 + !
103: 8006C blist 48 + !
104: ;
105:
106: 80000 constant _block_size
107:
108: : build-blocklist
109: \ set length of block list
110: \ length of flashfs at load-base is at offset 30... get it...
111: load-base 30 + @
112: \ calculate the number of blocks we need
113: _block_size / 1 +
114: \ total number of blocks is 2 (for header and block_list extension + (number of blocks for flashfs * 2 (1 for address 1 for length))
115: 2 * 2 + 8 * blist !
116: \ set version ( in first byte only )
117: 1 blist c!
118: \ no more block list
119: 0000000000000000 blist 8 + !
120: \ length of flashfs at load-base is at offset 30... get it...
121: load-base 30 + @
122: \ i define one block to be 64K, so calculate the number of blocks we need and loop over them
123: _block_size / 1 + 0 do
124: load-base _block_size i * + \ which position of load-base to store
125: blist 10 + \ at what offset of blist ( 0x8 + for header 0x8 + for extension )
126: i 10 * + \ for each loop we have done 0x10 +
127: ! \ store it
128: load-base 30 + @
129: _block_size i * - \ remaining length
130: dup _block_size >
131: IF \ is the remaining length > block size
132: drop _block_size \ then store the block size as length
133: ELSE
134: \ do nothing (store remaining length)
135: THEN
136: blist 10 + \ store the length at
137: i 10 * + \ correct blist offset
138: 8 + \ + 8 (we have stored address, now the length)
139: ! \ store it
140: loop
141: ;
142:
143:
144:
145: : build-blocklist-v0_old
146: \ set version
147: 0 blist c!
148: 48 blist 7 + c!
149: \ first block
150: load-base 0 + blist 8 + !
151: 80000 blist 10 + !
152: load-base 80000 + blist 18 + !
153: 80000 blist 20 + !
154: load-base 100000 + blist 28 + !
155: 80000 blist 30 + !
156: load-base 180000 + blist 38 + !
157: 8006C blist 40 + !
158: ;
159:
160: : build-blocklist-v0
161: \ set length of block list
162: \ length of flashfs at load-base is at offset 30... get it...
163: load-base 30 + @
164: \ calculate the number of blocks we need
165: _block_size / 1 +
166: \ total number of blocks is 1 (for header + (number of blocks for flashfs * 2 (1 for address 1 for length))
167: 2 * 1 + 8 * blist !
168: \ length of flashfs at load-base is at offset 30... get it...
169: load-base 30 + @
170: \ i define one block to be 64K, so calculate the number of blocks we need and loop over them
171: _block_size / 1 + 0 do
172: load-base _block_size i * + \ which position of load-base to store
173: blist 8 + \ at what offset of blist ( 0x8 + for header)
174: i 10 * + \ for each loop we have done 0x10 +
175: ! \ store it
176: load-base 30 + @
177: _block_size i * - \ remaining length
178: dup _block_size >
179: IF \ is the remaining length > block size
180: drop _block_size \ then store the block size as length
181: ELSE
182: \ do nothing (store remaining length)
183: THEN
184: blist 8 + \ store the length at
185: i 10 * + \ correct blist offset
186: 8 + \ + 8 (we have stored address, now the length)
187: ! \ store it
188: loop
189: ;
190:
191:
192: : yy
193: build-blocklist
194: blist rtas-ibm-update-flash-64-and-reboot
195: ;
196:
197: : yy0
198: build-blocklist-v0
199: blist rtas-ibm-update-flash-64-and-reboot
200: ;
201:
202: : rtas-ibm-update-flash-64 ( block-list -- status )
203: [ s" ibm,update-flash-64" rtas-get-token ] LITERAL rtas-cb rtas>token l!
204: 2 rtas-cb rtas>nargs l!
205: 1 rtas-cb rtas>nret l!
206: rtas-cb rtas>args0 l!
207: \ special unofficial parameter: if this is set to 1, the rtas function will not check, wether
208: \ we are on the perm side... this is needed for "update-flash -c" to work...
209: 1 rtas-cb rtas>args1 l!
210: enter-rtas
211: rtas-cb rtas>args2 l@
212: ;
213:
214: \ for update-flash
215: : flash-write ( image-address -- status)
216: load-base >r to load-base build-blocklist-v0
217: blist rtas-ibm-update-flash-64
218: r> to load-base 0= IF true ELSE false THEN
219: ;
220:
221: : commit 1 rtas-ibm-manage-flash-image ;
222: : reject 0 rtas-ibm-manage-flash-image ;
223:
224: : rtas-ibm-validate-flash-image ( image-to-commit -- status )
225: [ s" ibm,validate-flash-image" rtas-get-token ] LITERAL rtas-cb rtas>token l!
226: 2 rtas-cb rtas>nargs l!
227: 2 rtas-cb rtas>nret l!
228: rtas-cb rtas>args0 l!
229: enter-rtas
230: rtas-cb rtas>args1 l@
231: ;
232:
233: : rtas-get-blade-descr ( address size -- len status )
234: [ s" rtas-get-blade-descr" rtas-get-token ] LITERAL rtas-cb rtas>token l!
235: 2 rtas-cb rtas>nargs l!
236: 2 rtas-cb rtas>nret l!
237: rtas-cb rtas>args1 l!
238: rtas-cb rtas>args0 l!
239: enter-rtas
240: rtas-cb rtas>args2 l@
241: rtas-cb rtas>args3 l@
242: ;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.