Initial commit of OpenSPARC T2 architecture model.
[OpenSPARC-T2-SAM] / obp / obp / arch / sun4u / retained.fth
CommitLineData
920dae64
AT
1\ ========== Copyright Header Begin ==========================================
2\
3\ Hypervisor Software File: retained.fth
4\
5\ Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
6\
7\ - Do no alter or remove copyright notices
8\
9\ - Redistribution and use of this software in source and binary forms, with
10\ or without modification, are permitted provided that the following
11\ conditions are met:
12\
13\ - Redistribution of source code must retain the above copyright notice,
14\ this list of conditions and the following disclaimer.
15\
16\ - Redistribution in binary form must reproduce the above copyright notice,
17\ this list of conditions and the following disclaimer in the
18\ documentation and/or other materials provided with the distribution.
19\
20\ Neither the name of Sun Microsystems, Inc. or the names of contributors
21\ may be used to endorse or promote products derived from this software
22\ without specific prior written permission.
23\
24\ This software is provided "AS IS," without a warranty of any kind.
25\ ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
26\ INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
27\ PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
28\ MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
29\ ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
30\ DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN
31\ OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
32\ FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
33\ DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
34\ ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
35\ SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
36\
37\ You acknowledge that this software is not designed, licensed or
38\ intended for use in the design, construction, operation or maintenance of
39\ any nuclear facility.
40\
41\ ========== Copyright Header End ============================================
42id: @(#)retained.fth 1.20 06/02/16
43purpose:
44copyright: Copyright 2006 Sun Microsystems, Inc. All Rights Reserved
45copyright: Use is subject to license terms.
46
47headerless
480 value retained
49
50\ R E T A I N E D
51h# 52.45.54.41.49.4e.45.44 constant retained-magic0
52h# 64.65.6e.69.61.74.65.72 constant retained-magic1
53
54\ Following deferred words are needed to support platforms which have
55\ system controllers and for platforms which needs to do some extra
56\ work outside of OBP in order to retain memory pages over reboots.
57defer new-retained-hook ( name$ size pa.lo -- name$ size pa.lo )
58' noop is new-retained-hook
59
60defer release-retained-hook ( pa.lo pa.hi size -- pa.lo pa.hi size )
61' noop is release-retained-hook
62
63defer retained-phys-hook ( pa.lo pa.hi size -- pa.lo' pa.hi' size' )
64' noop is retained-phys-hook
65
66pagesize constant /retained
6716meg constant retained-min-align
68
69: retained-phys ( -- pa.lo pa.hi size )
70 hi-memory-base @
71 hi-memory-size @ + pageshift lshift 1- ( pa.lo )
72 retained-min-align round-down
73 /retained pagesize round-up - ( pa.lo )
74 obmem /retained ( pa.lo pa.hi size )
75 \ Call platform hook to inform system controller, etc..
76 retained-phys-hook ( pa.lo pa.hi size )
77;
78
79: map-in-retained ( mem-acf -- vadr )
80 >r ( )
81 retained-phys 0 mem-claim ( pa.lo pa.hi )
82 /retained dup 1 mmu-claim ( pa.lo pa.hi len vadr )
83 tuck >r -1 mmu-map ( )
84 r> dup /retained r> execute ( vadr )
85;
86: retained@ ( offset -- n ) retained + x@ ;
87: retained! ( n offset -- ) retained + x! ;
88
89struct
90h# 20 field >retained-name
91h# 08 field >retained-base-pa
92h# 08 field >retained-size
93h# 08 field >retained-count
94h# 08 field >retained-align
95constant /retained-struct
96
97: retained-base-pa@ ( adr -- pa.lo ) >retained-base-pa x@ ;
98: retained-base-pa! ( pa.lo adr -- ) >retained-base-pa x! ;
99
100: retained-size@ ( adr -- size ) >retained-size x@ ;
101: retained-size! ( size adr -- ) >retained-size x! ;
102
103: retained-count@ ( adr -- count ) >retained-count x@ ;
104: retained-count! ( count adr -- ) >retained-count x! ;
105
106: retained-align@ ( adr -- align ) >retained-align x@ ;
107: retained-align! ( align adr -- ) >retained-align x! ;
108
109: free-retained-slot ( offset -- )
110 0 swap >retained-name x!
111;
112
113: retained-bounds ( -- end,start )
114 retained /retained /retained-struct /string bounds
115;
116: find-free-retained-slot ( -- offset true | false )
117 retained-bounds ?do
118 i >retained-name cstrlen 0= if
119 i unloop true exit
120 then
121 /retained-struct +loop false
122;
123
124\
125\ do not call this routine unless you are sure that physical memory
126\ has been 'touched'.
127\
128: retained-commit-store ( -- )
129 retained-phys ( pa.lo pa.hi size )
130 >r retained-min-align s>d d- r> ( pa.lo pa.hi size )
131 touch-memory ( )
132;
133
134: claim-retained ( -- )
135 retained-bounds ?do ( )
136 i retained-count@ if ( )
137 i retained-base-pa@ obmem ( pa.lo pa.hi )
138 i retained-size@ ( pa.lo pa.hi size )
139 3dup touch-memory ( pa.lo pa.hi size )
140 0 mem-claim 2drop ( )
141 else ( )
142 i free-retained-slot ( )
143 then ( )
144 /retained-struct +loop ( )
145;
146
147: mark-retained ( -- )
148 retained-magic0 dup h# 20 retained!
149 -1 xor h# 18 retained!
150 retained-magic1 dup h# 28 retained!
151 -1 xor h# 10 retained!
152;
153
154: init-retained ( por? -- )
155 cpu-error-enable@ >r disable-cpu-errors ( )
156 if ( )
157 ['] bzero-region map-in-retained to retained ( )
158 mark-retained ( )
159 else ( )
160 ['] btouch-region map-in-retained to retained ( )
161 h# 20 retained@ retained-magic0 = ( flag? )
162 h# 28 retained@ retained-magic1 = and ( flag? )
163 h# 20 retained@ -1 xor h# 18 retained@ = and ( flag? )
164 h# 10 retained@ -1 xor h# 28 retained@ = and if ( )
165 claim-retained ( )
166 else ( )
167 retained /retained bzero-region ( )
168 mark-retained ( )
169 then ( )
170 then ( )
171 cpu-afsr@ cpu-afsr! r> cpu-error-enable! ( )
172;
173
174: $find-retained ( name$ -- offset true | false )
175 retained-bounds ?do
176 2dup i >retained-name cscount $= if ( name$ )
177 2drop i unloop true exit
178 then
179 /retained-struct +loop 2drop false
180;
181: $release-retained ( name$ -- )
182 $find-retained if ( offset )
183 >r ( ) ( r: offset )
184 r@ retained-base-pa@ obmem ( pa.lo pa.hi )
185 r@ retained-size@ ( pa.lo pa.hi size )
186 \ Call platform hook to inform system controller, etc..
187 release-retained-hook ( pa.lo pa.hi size )
188 mem-release ( )
189 r> free-retained-slot ( )
190 then
191;
192
193: $new-retained ( name$ size align -- )
194 2dup 2>r mem-claim 2r> 2swap ( name$ size align pa.lo pa.hi )
195 find-free-retained-slot if ( name$ size align pa.lo pa.hi offset )
196 >r drop ( name$ size align pa.lo ) ( r: offset )
197 \ Call platform hook to inform system controller, etc..
198 new-retained-hook ( name$ size align pa.lo ) ( r: offset )
199 r@ retained-base-pa! ( name$ size align ) ( r: offset )
200 r@ retained-align! ( name$ size ) ( r: offset )
201 r@ retained-size! ( name$ ) ( r: offset )
202 true r@ retained-count! ( name$ ) ( r: offset )
203 r> >retained-name swap cmove ( )
204 else ( name$ size align pa.lo pa.hi )
205 2>r drop 2r> rot mem-release ( name$ )
206 2drop ( )
207 then ( )
208;
209
210: alloc-retained ( name$ size align -- pa.lo pa.hi false | true )
211 retained-min-align round-up swap ( name$ align' size )
212 mmu-pagesize round-up swap ( name$ size' align' )
213
214 2>r 2dup $find-retained if ( name$ offset ) ( r: size align )
215 dup retained-size@ ( name$ offset osize ) ( r: size align )
216 over retained-align@ ( name$ offset osize oalign ) ( r: size align )
217 2r@ d= if ( name$ offset ) ( r: size align )
218 \ prev size/align are same
219 true over retained-count! ( name$ offset ) ( r: size align )
220 r> over retained-align! ( name$ offset ) ( r: size )
221 r> swap retained-size! ( name$ )
222 else ( name$ offset ) ( r: size align )
223 \ prev size/align were different
224 drop 2dup $release-retained ( name$ ) ( r: size align )
225 2dup 2r> $new-retained ( name$ )
226 then ( name$ )
227 else ( name$ ) ( r: size align )
228 \ This is the first time for this name
229 2dup 2r> $new-retained ( name$ )
230 then ( name$ )
231 $find-retained if ( offset )
232 retained-base-pa@ obmem false ( ok )
233 else ( )
234 true ( failed )
235 then retained-commit-store ( pa.lo pa.hi false | true )
236;
237
238\ Touch all of the retained memory regions so that pages are flushed
239\ out of caches, done on reset-all
240: btouch-retained-pages ( -- true | false )
241 lock[ fpu-enable
242 retained-bounds ?do
243 i >retained-name cstrlen 0<> if
244 i retained-size@ ( size )
245 i retained-align@ ( align )
246 mmu-claim dup ( va va )
247 i retained-base-pa@ 0 ( va va pa.lo pa.hi )
248 rot i retained-size@ -1 ( va pa.lo pa.hi va size -1 )
249 mmu-map ( va )
250 i retained-size@ 2dup ( va size va size )
251 \ Try touching the retained region using block commit
252 ['] btouch-region catch if ( va size va size )
253 \ Retained region inaccessible, invalidate it
254 ?cr ." ERROR: Failed to block commit Retain memory region " cr
255 ." ERROR: "
256 i >retained-name cscount type ( va size va size )
257 ." retained page is invalidated" cr ( va size va size )
258 0 i retained-size! ( va size va size )
259 nip i retained-base-pa@ 0 rot ( va size pa.lo pa.hi size )
260 \ Call platform hook to inform system controller, etc..
261 release-retained-hook ( va size pa.lo pa.hi size )
262 3drop ( va size )
263 then ( va size )
264 2dup mmu-unmap mmu-release ( )
265 then
266 /retained-struct +loop
267
268 \ Now btouch the retained OBP page itself
269 retained /retained ['] btouch-region catch if
270 \ Retained page used by OBP is inaccessible, invalidate it
271 ?cr ." ERROR: Failed to block commit Retain page used by OpenBoot " cr
272 ." ERROR: Retained pages will not be retained" cr ( va size )
273 \ Invalidate all of the retained structures by corrupting the retain magic
274 0 h# 20 retained! ( va size )
275 2drop ( )
276 false ( false )
277 else
278 true ( true )
279 then ( r: tba )
280 ]unlock
281;
282
283headers
284
285" /memory" find-device
286 caps @ caps off
287 : SUNW,retain ( cname size align -- pa.lo pa.hi )
288 ?dup if ( cname size align )
289 rot cscount 2swap ( name$ size align )
290 alloc-retained ( pa.lo pa.hi false | true )
291 else ( cname pa.lo pa.hi size )
292 \ Deprecate align=0 support
293 true ( true )
294 then throw ( pa.lo pa.hi )
295 ;
296 : SUNW,free-retain ( cname -- )
297 cscount $release-retained retained-commit-store
298 ;
299 caps !
300device-end
301
302stand-init: Init Retained memory
303 disable-cpu-errors
304 power-on-reset? init-retained
305 enable-cpu-errors
306;