Commit | Line | Data |
---|---|---|
86530b38 AT |
1 | /* |
2 | * ========== Copyright Header Begin ========================================== | |
3 | * | |
4 | * OpenSPARC T2 Processor File: exu_win_traps_n2.s | |
5 | * Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved | |
6 | * 4150 Network Circle, Santa Clara, California 95054, U.S.A. | |
7 | * | |
8 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
9 | * | |
10 | * This program is free software; you can redistribute it and/or modify | |
11 | * it under the terms of the GNU General Public License as published by | |
12 | * the Free Software Foundation; version 2 of the License. | |
13 | * | |
14 | * This program is distributed in the hope that it will be useful, | |
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 | * GNU General Public License for more details. | |
18 | * | |
19 | * You should have received a copy of the GNU General Public License | |
20 | * along with this program; if not, write to the Free Software | |
21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
22 | * | |
23 | * For the avoidance of doubt, and except that if any non-GPL license | |
24 | * choice is available it will apply instead, Sun elects to use only | |
25 | * the General Public License version 2 (GPLv2) at this time for any | |
26 | * software where a choice of GPL license versions is made | |
27 | * available with the language indicating that GPLv2 or any later version | |
28 | * may be used, or where a choice of which version of the GPL is applied is | |
29 | * otherwise unspecified. | |
30 | * | |
31 | * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, | |
32 | * CA 95054 USA or visit www.sun.com if you need additional information or | |
33 | * have any questions. | |
34 | * | |
35 | * | |
36 | * ========== Copyright Header End ============================================ | |
37 | */ | |
38 | #define H_VERSION_MAXWIN_MASK 0x1f | |
39 | ||
40 | ! communication betweent the test loop and the trap handlers. | |
41 | #define FINISH_DONE 1 | |
42 | #define FINISH_RETRY 2 | |
43 | #define TRAP_NOT_TAKEN 1 | |
44 | #define TRAP_TAKEN 0x1fff | |
45 | ||
46 | ||
47 | ||
48 | #define H_T0_Clean_Window trap_clean | |
49 | ||
50 | #define H_T0_Window_Spill_0_Normal_Trap trap_spill | |
51 | #define H_T0_Window_Spill_1_Normal_Trap trap_spill | |
52 | #define H_T0_Window_Spill_2_Normal_Trap trap_spill | |
53 | #define H_T0_Window_Spill_3_Normal_Trap trap_spill | |
54 | #define H_T0_Window_Spill_4_Normal_Trap trap_spill | |
55 | #define H_T0_Window_Spill_5_Normal_Trap trap_spill | |
56 | #define H_T0_Window_Spill_6_Normal_Trap trap_spill | |
57 | #define H_T0_Window_Spill_7_Normal_Trap trap_spill | |
58 | ||
59 | #define H_T0_Window_Spill_0_Other_Trap trap_spill | |
60 | #define H_T0_Window_Spill_1_Other_Trap trap_spill | |
61 | #define H_T0_Window_Spill_2_Other_Trap trap_spill | |
62 | #define H_T0_Window_Spill_3_Other_Trap trap_spill | |
63 | #define H_T0_Window_Spill_4_Other_Trap trap_spill | |
64 | #define H_T0_Window_Spill_5_Other_Trap trap_spill | |
65 | #define H_T0_Window_Spill_6_Other_Trap trap_spill | |
66 | #define H_T0_Window_Spill_7_Other_Trap trap_spill | |
67 | ||
68 | #define H_T0_Window_Fill_0_Normal_Trap trap_fill | |
69 | #define H_T0_Window_Fill_1_Normal_Trap trap_fill | |
70 | #define H_T0_Window_Fill_2_Normal_Trap trap_fill | |
71 | #define H_T0_Window_Fill_3_Normal_Trap trap_fill | |
72 | #define H_T0_Window_Fill_4_Normal_Trap trap_fill | |
73 | #define H_T0_Window_Fill_5_Normal_Trap trap_fill | |
74 | #define H_T0_Window_Fill_6_Normal_Trap trap_fill | |
75 | #define H_T0_Window_Fill_7_Normal_Trap trap_fill | |
76 | ||
77 | #define H_T0_Window_Fill_0_Other_Trap trap_fill | |
78 | #define H_T0_Window_Fill_1_Other_Trap trap_fill | |
79 | #define H_T0_Window_Fill_2_Other_Trap trap_fill | |
80 | #define H_T0_Window_Fill_3_Other_Trap trap_fill | |
81 | #define H_T0_Window_Fill_4_Other_Trap trap_fill | |
82 | #define H_T0_Window_Fill_5_Other_Trap trap_fill | |
83 | #define H_T0_Window_Fill_6_Other_Trap trap_fill | |
84 | #define H_T0_Window_Fill_7_Other_Trap trap_fill | |
85 | ||
86 | ||
87 | ||
88 | /***********************************************************************/ | |
89 | #define MAIN_PAGE_HV_ALSO | |
90 | #define MAIN_PAGE_NUCLEUS_ALSO | |
91 | #include "hboot.s" | |
92 | ||
93 | .global main | |
94 | main: | |
95 | th_fork(th_main,%l0) ! start up to four threads. | |
96 | ! No need to run more than one core. | |
97 | ! All threads do the same thing, except for this one bit of setup... | |
98 | th_main_0: | |
99 | ! SAS mismatches on version reg...grumble grumble | |
100 | mov 7,%g4 | |
101 | ! ta T_CHANGE_HPRIV | |
102 | !rdhpr %ver,%g4 ! get VERSION (NWINDOWS-1) | |
103 | !ta T_CHANGE_NONHPRIV | |
104 | !and %g4,H_VERSION_MAXWIN_MASK,%g4 | |
105 | ||
106 | set max_win,%l1 | |
107 | stx %g4,[%l1] ! save max_win value for later | |
108 | ba th_main_all | |
109 | nop | |
110 | ||
111 | th_main_1: | |
112 | th_main_2: | |
113 | th_main_3: | |
114 | mov 7,%g4 | |
115 | ! ta T_CHANGE_HPRIV | |
116 | !rdhpr %ver,%g4 ! get VERSION (NWINDOWS-1) | |
117 | !ta T_CHANGE_NONHPRIV | |
118 | and %g4,H_VERSION_MAXWIN_MASK,%g4 | |
119 | ||
120 | th_main_all: | |
121 | ! place the window number, tid, and register number (r8-r23) in the local | |
122 | ! and out registers of each register window. | |
123 | ! Values in the form 00ttwwrr 00000000, ensure each register | |
124 | ! has a unique value. Lower half of register will be used as a counter. | |
125 | sethi %hi(0x80000000),%g1 | |
126 | sllx %g1,4,%g1 ! base reg number in bits 39 to 32 | |
127 | sllx %l0,48,%l0 | |
128 | or %l0,%g1,%g1 ! thread id in bits 55 to 48 | |
129 | sethi %hi(0x10000000),%g2 | |
130 | sllx %g2,4,%g2 ! reg increment | |
131 | add %g0,1,%g3 | |
132 | sllx %g3,40,%g3 ! window increment in bit 40 | |
133 | ||
134 | ! read current CWP, CANRESTORE, just fyi. | |
135 | ! add one to CANSAVE to allow init of last window's regs | |
136 | ta T_CHANGE_PRIV | |
137 | rdpr %cwp,%g5 | |
138 | rdpr %cansave,%g6 | |
139 | wrpr %g4,0,%cansave ! set CANSAVE = maxwin | |
140 | rdpr %canrestore,%g7 | |
141 | ta T_CHANGE_NONPRIV | |
142 | ||
143 | reg_init: | |
144 | add %g0,%g1,%r8 | |
145 | add %r8,%g2,%r9 | |
146 | add %r9,%g2,%r10 | |
147 | add %r10,%g2,%r11 | |
148 | add %r11,%g2,%r12 | |
149 | add %r12,%g2,%r13 | |
150 | add %r13,%g2,%r14 | |
151 | add %r14,%g2,%r15 | |
152 | add %r15,%g2,%r16 | |
153 | add %r16,%g2,%r17 | |
154 | add %r17,%g2,%r18 | |
155 | add %r18,%g2,%r19 | |
156 | add %r19,%g2,%r20 | |
157 | add %r20,%g2,%r21 | |
158 | add %r21,%g2,%r22 | |
159 | add %r22,%g2,%r23 | |
160 | brz %g4,reg_init_done | |
161 | sub %g4,1,%g4 | |
162 | save %g3,%g1,%g1 ! increment window field of g1, next window | |
163 | ba reg_init | |
164 | nop | |
165 | ||
166 | reg_init_done: | |
167 | set max_win,%g1 | |
168 | ldx [%g1],%g4 | |
169 | ||
170 | !!********************************************************************* | |
171 | !! save 1: OTHERWIN = 0, WSTATE.NORMAL=0 | |
172 | !!********************************************************************* | |
173 | sub %g4,1,%g5 | |
174 | ta T_CHANGE_PRIV | |
175 | wrpr %g0,0,%cwp ! CWP = 0 | |
176 | wrpr %g5,0,%cansave ! CANSAVE = maxwin-1 | |
177 | wrpr %g0,0,%canrestore ! CANRESTORE = 0 | |
178 | wrpr %g4,0,%cleanwin ! CLEANWIN = maxwin | |
179 | wrpr %g0,0,%otherwin | |
180 | wrpr %g0,0,%wstate | |
181 | ta T_CHANGE_NONPRIV | |
182 | add %g0,FINISH_DONE,%g7 | |
183 | add %g0,TRAP_NOT_TAKEN,%g6 | |
184 | save1: | |
185 | save %o0,1,%i0 ! effectively x++ | |
186 | brlz %g6,save1_done | |
187 | nop | |
188 | add %i1,1,%i1 | |
189 | ! add %l1,1,%l1 ! l1 and o1 are unpredictable for SAVE, so do not | |
190 | ! add %o1,1,%o1 ! mess with them. SAS will pick up rtl mismatch | |
191 | ba save1 | |
192 | nop | |
193 | save1_done: | |
194 | ||
195 | !!********************************************************************* | |
196 | !! save 2: OTHERWIN = 0, WSTATE.NORMAL=1 | |
197 | !!********************************************************************* | |
198 | sub %g4,2,%g5 | |
199 | ta T_CHANGE_PRIV | |
200 | wrpr %g4,0,%cwp ! CWP = maxwin | |
201 | wrpr %g0,3,%cansave ! CANSAVE = 3 | |
202 | wrpr %g0,1,%canrestore ! CANRESTORE = 1 | |
203 | wrpr %g5,0,%cleanwin ! CLEANWIN = maxwin-2 | |
204 | wrpr %g0,0,%otherwin | |
205 | wrpr %g0,1,%wstate | |
206 | ta T_CHANGE_NONPRIV | |
207 | add %g0,FINISH_DONE,%g7 | |
208 | add %g0,TRAP_NOT_TAKEN,%g6 | |
209 | save2: | |
210 | save %o0,1,%i0 ! effectively x++ | |
211 | brlz %g6,save2_done | |
212 | nop | |
213 | add %i2,1,%i2 | |
214 | ba save2 | |
215 | nop | |
216 | save2_done: | |
217 | ||
218 | !!********************************************************************* | |
219 | !! save 3: OTHERWIN = 0, WSTATE.NORMAL=2 | |
220 | !!********************************************************************* | |
221 | sub %g4,2,%g5 | |
222 | ta T_CHANGE_PRIV | |
223 | wrpr %g5,0,%cwp ! CWP = maxwin-2 | |
224 | wrpr %g0,4,%cansave ! CANSAVE = 4 | |
225 | wrpr %g0,2,%canrestore ! CANRESTORE = 2 | |
226 | wrpr %g4,0,%cleanwin ! CLEANWIN = maxwin | |
227 | wrpr %g0,0,%otherwin | |
228 | wrpr %g0,2,%wstate | |
229 | ta T_CHANGE_NONPRIV | |
230 | add %g0,FINISH_DONE,%g7 | |
231 | add %g0,TRAP_NOT_TAKEN,%g6 | |
232 | save3: | |
233 | save %o0,1,%i0 ! effectively x++ | |
234 | brlz %g6,save3_done | |
235 | nop | |
236 | add %i3,1,%i3 | |
237 | ba save3 | |
238 | nop | |
239 | save3_done: | |
240 | ||
241 | !!********************************************************************* | |
242 | !! save 4: OTHERWIN = 0, WSTATE.NORMAL=3 | |
243 | !!********************************************************************* | |
244 | ta T_CHANGE_PRIV | |
245 | wrpr %g0,1,%cwp ! CWP = 1 | |
246 | wrpr %g0,1,%cansave ! CANSAVE = 1 | |
247 | wrpr %g0,0,%canrestore ! CANRESTORE = 0 | |
248 | wrpr %g0,2,%cleanwin ! CLEANWIN = 2 | |
249 | wrpr %g0,0,%otherwin | |
250 | wrpr %g0,3,%wstate | |
251 | ta T_CHANGE_NONPRIV | |
252 | add %g0,FINISH_DONE,%g7 | |
253 | add %g0,TRAP_NOT_TAKEN,%g6 | |
254 | save4: | |
255 | save %o0,1,%i0 ! effectively x++ | |
256 | brlz %g6,save4_done | |
257 | nop | |
258 | add %i4,1,%i4 | |
259 | ba save4 | |
260 | nop | |
261 | save4_done: | |
262 | ||
263 | !!********************************************************************* | |
264 | !! save 5: OTHERWIN = 0, WSTATE.NORMAL=4 | |
265 | !!********************************************************************* | |
266 | ta T_CHANGE_PRIV | |
267 | wrpr %g0,1,%cwp ! CWP = 1 | |
268 | wrpr %g0,0,%cansave ! CANSAVE = 0 | |
269 | wrpr %g0,1,%canrestore ! CANRESTORE = 1 | |
270 | wrpr %g0,2,%cleanwin ! CLEANWIN = 2 | |
271 | wrpr %g0,0,%otherwin | |
272 | wrpr %g0,0x34,%wstate | |
273 | ta T_CHANGE_NONPRIV | |
274 | add %g0,FINISH_DONE,%g7 | |
275 | add %g0,TRAP_NOT_TAKEN,%g6 | |
276 | save5: | |
277 | save %o0,1,%i0 ! effectively x++ | |
278 | brlz %g6,save5_done | |
279 | nop | |
280 | add %i5,1,%i5 | |
281 | ba save5 | |
282 | nop | |
283 | save5_done: | |
284 | ||
285 | !!********************************************************************* | |
286 | !! save 6: OTHERWIN = 0, WSTATE.NORMAL=5 | |
287 | !!********************************************************************* | |
288 | sub %g4,2,%g5 | |
289 | ta T_CHANGE_PRIV | |
290 | wrpr %g5,0,%cwp ! CWP = maxwin-2 | |
291 | wrpr %g0,2,%cansave ! CANSAVE = 2 | |
292 | wrpr %g0,0,%canrestore ! CANRESTORE = 0 | |
293 | wrpr %g0,4,%cleanwin ! CLEANWIN = 4 | |
294 | wrpr %g0,0,%otherwin | |
295 | wrpr %g0,0x3b,%wstate | |
296 | ta T_CHANGE_NONPRIV | |
297 | add %g0,FINISH_DONE,%g7 | |
298 | add %g0,TRAP_NOT_TAKEN,%g6 | |
299 | save6: | |
300 | save %o0,1,%i0 ! effectively x++ | |
301 | brlz %g6,save6_done | |
302 | nop | |
303 | add %i6,1,%i6 | |
304 | ba save6 | |
305 | nop | |
306 | save6_done: | |
307 | ||
308 | !!********************************************************************* | |
309 | !! save 7: OTHERWIN = 0, WSTATE.NORMAL=6 | |
310 | !!********************************************************************* | |
311 | ta T_CHANGE_PRIV | |
312 | wrpr %g0,1,%cwp ! CWP = 1 | |
313 | wrpr %g0,2,%cansave ! CANSAVE = 2 | |
314 | wrpr %g0,4,%canrestore ! CANRESTORE = 0 | |
315 | wrpr %g0,7,%cleanwin ! CLEANWIN = 7 | |
316 | wrpr %g0,0,%otherwin | |
317 | wrpr %g0,6,%wstate | |
318 | ta T_CHANGE_NONPRIV | |
319 | add %g0,FINISH_DONE,%g7 | |
320 | add %g0,TRAP_NOT_TAKEN,%g6 | |
321 | save7: | |
322 | save %o0,1,%i0 ! effectively x++ | |
323 | brlz %g6,save7_done | |
324 | nop | |
325 | add %i7,1,%i7 | |
326 | ba save7 | |
327 | nop | |
328 | save7_done: | |
329 | ||
330 | !!********************************************************************* | |
331 | !! save 8: OTHERWIN = 0, WSTATE.NORMAL=7 | |
332 | !!********************************************************************* | |
333 | sub %g4,2,%g5 | |
334 | ta T_CHANGE_PRIV | |
335 | wrpr %g4,0,%cwp ! CWP = maxwin | |
336 | wrpr %g0,0,%cansave ! CANSAVE = 0 | |
337 | wrpr %g0,1,%canrestore ! CANRESTORE = 1 | |
338 | wrpr %g5,0,%cleanwin ! CLEANWIN = maxwin-2 | |
339 | wrpr %g0,0,%otherwin | |
340 | wrpr %g0,7,%wstate | |
341 | ta T_CHANGE_NONPRIV | |
342 | add %g0,FINISH_DONE,%g7 | |
343 | add %g0,TRAP_NOT_TAKEN,%g6 | |
344 | save8: | |
345 | save %o0,1,%i0 ! effectively x++ | |
346 | brlz %g6,save8_done | |
347 | nop | |
348 | add %i1,1,%i1 | |
349 | ba save8 | |
350 | nop | |
351 | save8_done: | |
352 | ||
353 | !!********************************************************************* | |
354 | !! save 9: OTHERWIN = 1, WSTATE.OTHER=0 | |
355 | !!********************************************************************* | |
356 | sub %g4,2,%g5 | |
357 | ta T_CHANGE_PRIV | |
358 | wrpr %g5,0,%cwp ! CWP = maxwin-2 | |
359 | wrpr %g5,0,%cansave ! CANSAVE = maxwin-2 | |
360 | wrpr %g0,0,%canrestore ! CANRESTORE = 0 | |
361 | wrpr %g4,0,%cleanwin ! CLEANWIN = maxwin | |
362 | wrpr %g0,1,%otherwin | |
363 | wrpr %g0,0,%wstate | |
364 | ta T_CHANGE_NONPRIV | |
365 | add %g0,FINISH_DONE,%g7 | |
366 | add %g0,TRAP_NOT_TAKEN,%g6 | |
367 | save9: | |
368 | save %o0,1,%i0 ! effectively x++ | |
369 | brlz %g6,save9_done | |
370 | nop | |
371 | add %i2,1,%i2 | |
372 | ba save9 | |
373 | nop | |
374 | save9_done: | |
375 | ||
376 | !!********************************************************************* | |
377 | !! save 10: OTHERWIN = 1, WSTATE.OTHER=1 | |
378 | !!********************************************************************* | |
379 | ta T_CHANGE_PRIV | |
380 | wrpr %g0,2,%cwp ! CWP = 2 | |
381 | wrpr %g0,3,%cansave ! CANSAVE = 3 | |
382 | wrpr %g0,1,%canrestore ! CANRESTORE = 1 | |
383 | wrpr %g0,5,%cleanwin ! CLEANWIN = 5 | |
384 | wrpr %g0,1,%otherwin | |
385 | wrpr %g0,8,%wstate | |
386 | ta T_CHANGE_NONPRIV | |
387 | add %g0,FINISH_DONE,%g7 | |
388 | add %g0,TRAP_NOT_TAKEN,%g6 | |
389 | save10: | |
390 | save %o0,1,%i0 ! effectively x++ | |
391 | brlz %g6,save10_done | |
392 | nop | |
393 | add %i3,1,%i3 | |
394 | ba save10 | |
395 | nop | |
396 | save10_done: | |
397 | ||
398 | !!********************************************************************* | |
399 | !! save 11: OTHERWIN = 1, WSTATE.OTHER=2 | |
400 | !!********************************************************************* | |
401 | ta T_CHANGE_PRIV | |
402 | wrpr %g0,3,%cwp ! CWP = 3 | |
403 | wrpr %g0,1,%cansave ! CANSAVE = 1 | |
404 | wrpr %g0,2,%canrestore ! CANRESTORE = 2 | |
405 | wrpr %g0,4,%cleanwin ! CLEANWIN = 4 | |
406 | wrpr %g0,1,%otherwin | |
407 | wrpr %g0,0x10,%wstate | |
408 | ta T_CHANGE_NONPRIV | |
409 | add %g0,FINISH_DONE,%g7 | |
410 | add %g0,TRAP_NOT_TAKEN,%g6 | |
411 | save11: | |
412 | save %o0,1,%i0 ! effectively x++ | |
413 | brlz %g6,save11_done | |
414 | nop | |
415 | add %i4,1,%i4 | |
416 | ba save11 | |
417 | nop | |
418 | save11_done: | |
419 | ||
420 | !!********************************************************************* | |
421 | !! save 12: OTHERWIN = 1, WSTATE.OTHER=3 | |
422 | !!********************************************************************* | |
423 | ta T_CHANGE_PRIV | |
424 | wrpr %g0,4,%cwp ! CWP = 4 | |
425 | wrpr %g0,1,%cansave ! CANSAVE = 1 | |
426 | wrpr %g0,0,%canrestore ! CANRESTORE = 0 | |
427 | wrpr %g0,3,%cleanwin ! CLEANWIN = 3 | |
428 | wrpr %g0,1,%otherwin | |
429 | wrpr %g0,0x18,%wstate | |
430 | ta T_CHANGE_NONPRIV | |
431 | add %g0,FINISH_DONE,%g7 | |
432 | add %g0,TRAP_NOT_TAKEN,%g6 | |
433 | save12: | |
434 | save %o0,1,%i0 ! effectively x++ | |
435 | brlz %g6,save12_done | |
436 | nop | |
437 | add %i5,1,%i5 | |
438 | ba save12 | |
439 | nop | |
440 | save12_done: | |
441 | ||
442 | !!********************************************************************* | |
443 | !! save 12: OTHERWIN = 1, WSTATE.OTHER=4 | |
444 | !!********************************************************************* | |
445 | ta T_CHANGE_PRIV | |
446 | wrpr %g0,5,%cwp ! CWP = 5 | |
447 | wrpr %g0,1,%cansave ! CANSAVE = 1 | |
448 | wrpr %g0,3,%canrestore ! CANRESTORE = 3 | |
449 | wrpr %g0,7,%cleanwin ! CLEANWIN = 7 | |
450 | wrpr %g0,1,%otherwin | |
451 | wrpr %g0,0x20,%wstate | |
452 | ta T_CHANGE_NONPRIV | |
453 | add %g0,FINISH_DONE,%g7 | |
454 | add %g0,TRAP_NOT_TAKEN,%g6 | |
455 | save13: | |
456 | save %o0,1,%i0 ! effectively x++ | |
457 | brlz %g6,save13_done | |
458 | nop | |
459 | add %i6,1,%i6 | |
460 | ba save13 | |
461 | nop | |
462 | save13_done: | |
463 | ||
464 | !!********************************************************************* | |
465 | !! save 14: OTHERWIN = 1, WSTATE.OTHER=5 | |
466 | !!********************************************************************* | |
467 | ta T_CHANGE_PRIV | |
468 | wrpr %g0,6,%cwp ! CWP = 6 | |
469 | wrpr %g0,1,%cansave ! CANSAVE = 1 | |
470 | wrpr %g0,0,%canrestore ! CANRESTORE = 0 | |
471 | wrpr %g0,4,%cleanwin ! CLEANWIN = 4 | |
472 | wrpr %g0,1,%otherwin | |
473 | wrpr %g0,0x29,%wstate | |
474 | ta T_CHANGE_NONPRIV | |
475 | add %g0,FINISH_DONE,%g7 | |
476 | add %g0,TRAP_NOT_TAKEN,%g6 | |
477 | save14: | |
478 | save %o0,1,%i0 ! effectively x++ | |
479 | brlz %g6,save14_done | |
480 | nop | |
481 | add %i7,1,%i7 | |
482 | ba save14 | |
483 | nop | |
484 | save14_done: | |
485 | ||
486 | !!********************************************************************* | |
487 | !! save 15: OTHERWIN = 1, WSTATE.OTHER=6 | |
488 | !!********************************************************************* | |
489 | ta T_CHANGE_PRIV | |
490 | wrpr %g0,0,%cwp ! CWP = 0 | |
491 | wrpr %g0,0,%cansave ! CANSAVE = 0 | |
492 | wrpr %g0,0,%canrestore ! CANRESTORE = 0 | |
493 | wrpr %g0,1,%cleanwin ! CLEANWIN = 1 | |
494 | wrpr %g0,1,%otherwin | |
495 | wrpr %g0,0x30,%wstate | |
496 | ta T_CHANGE_NONPRIV | |
497 | add %g0,FINISH_DONE,%g7 | |
498 | add %g0,TRAP_NOT_TAKEN,%g6 | |
499 | save15: | |
500 | save %o0,1,%i0 ! effectively x++ | |
501 | brlz %g6,save15_done | |
502 | nop | |
503 | add %i1,1,%i1 | |
504 | ba save15 | |
505 | nop | |
506 | save15_done: | |
507 | ||
508 | !!********************************************************************* | |
509 | !! save 16: OTHERWIN = 1, WSTATE.OTHER=7 | |
510 | !!********************************************************************* | |
511 | sub %g4,1,%g5 | |
512 | ta T_CHANGE_PRIV | |
513 | wrpr %g4,0,%cwp ! CWP = maxwin | |
514 | wrpr %g0,0,%cansave ! CANSAVE = 0 | |
515 | wrpr %g5,0,%canrestore ! CANRESTORE = maxwin-1 | |
516 | wrpr %g4,0,%cleanwin ! CLEANWIN = maxwin | |
517 | wrpr %g0,1,%otherwin | |
518 | wrpr %g0,0x3e,%wstate | |
519 | ta T_CHANGE_NONPRIV | |
520 | add %g0,FINISH_DONE,%g7 | |
521 | add %g0,TRAP_NOT_TAKEN,%g6 | |
522 | save16: | |
523 | save %o0,1,%i0 ! effectively x++ | |
524 | brlz %g6,save16_done | |
525 | nop | |
526 | add %i2,1,%i2 | |
527 | ba save16 | |
528 | nop | |
529 | save16_done: | |
530 | ||
531 | !!********************************************************************* | |
532 | !!********************************************************************* | |
533 | !! restore 0: OTHERWIN = 0, WSTATE.NORMAL=0 | |
534 | !!********************************************************************* | |
535 | sub %g4,1,%g5 | |
536 | ta T_CHANGE_PRIV | |
537 | wrpr %g0,0,%cwp ! CWP = 0 | |
538 | wrpr %g0,0,%cansave ! CANSAVE = 0 | |
539 | wrpr %g5,0,%canrestore ! CANRESTORE = maxwin-1 | |
540 | wrpr %g4,0,%cleanwin ! CLEANWIN = maxwin | |
541 | wrpr %g0,0,%otherwin | |
542 | wrpr %g0,0,%wstate | |
543 | ta T_CHANGE_NONPRIV | |
544 | add %g0,FINISH_DONE,%g7 | |
545 | add %g0,TRAP_NOT_TAKEN,%g6 | |
546 | rest0: | |
547 | restore %i0,1,%o0 ! effectively x++ | |
548 | brlz %g6,rest0_done | |
549 | nop | |
550 | add %i3,1,%i3 ! restore, all three regs blocks must match | |
551 | add %l3,1,%l3 | |
552 | add %o3,1,%o3 | |
553 | ba rest0 | |
554 | nop | |
555 | rest0_done: | |
556 | ||
557 | !!********************************************************************* | |
558 | !! restore 1: OTHERWIN = 0, WSTATE.NORMAL=1 | |
559 | !!********************************************************************* | |
560 | ta T_CHANGE_PRIV | |
561 | wrpr %g4,0,%cwp ! CWP = maxwin | |
562 | wrpr %g0,1,%cansave ! CANSAVE = 1 | |
563 | wrpr %g0,1,%canrestore ! CANRESTORE = 1 | |
564 | wrpr %g0,0,%cleanwin ! CLEANWIN = 0 | |
565 | wrpr %g0,0,%otherwin | |
566 | wrpr %g0,0,%wstate | |
567 | ta T_CHANGE_NONPRIV | |
568 | add %g0,FINISH_DONE,%g7 | |
569 | add %g0,TRAP_NOT_TAKEN,%g6 | |
570 | rest1: | |
571 | restore %i0,1,%o0 ! effectively x++ | |
572 | brlz %g6,rest1_done | |
573 | nop | |
574 | add %i3,1,%i3 ! restore, all three regs blocks must match | |
575 | add %l3,1,%l3 | |
576 | add %o3,1,%o3 | |
577 | ba rest1 | |
578 | nop | |
579 | rest1_done: | |
580 | ||
581 | !!********************************************************************* | |
582 | !! restore 2: OTHERWIN = 0, WSTATE.NORMAL=2 | |
583 | !!********************************************************************* | |
584 | ta T_CHANGE_PRIV | |
585 | wrpr %g0,0,%cwp ! CWP = 0 | |
586 | wrpr %g0,0,%cansave ! CANSAVE = 0 | |
587 | wrpr %g0,0,%canrestore ! CANRESTORE = 0 | |
588 | wrpr %g0,3,%cleanwin ! CLEANWIN = 3 | |
589 | wrpr %g0,0,%otherwin | |
590 | wrpr %g0,1,%wstate | |
591 | ta T_CHANGE_NONPRIV | |
592 | add %g0,FINISH_DONE,%g7 | |
593 | add %g0,TRAP_NOT_TAKEN,%g6 | |
594 | rest2: | |
595 | restore %i0,1,%o0 ! effectively x++ | |
596 | brlz %g6,rest2_done | |
597 | nop | |
598 | add %i3,1,%i3 ! restore, all three regs blocks must match | |
599 | add %l3,1,%l3 | |
600 | add %o3,1,%o3 | |
601 | ba rest2 | |
602 | nop | |
603 | rest2_done: | |
604 | ||
605 | !!********************************************************************* | |
606 | !! restore 3: OTHERWIN = 0, WSTATE.NORMAL=3 | |
607 | !!********************************************************************* | |
608 | ta T_CHANGE_PRIV | |
609 | wrpr %g0,2,%cwp ! CWP = 2 | |
610 | wrpr %g0,3,%cansave ! CANSAVE = 3 | |
611 | wrpr %g0,1,%canrestore ! CANRESTORE = 1 | |
612 | wrpr %g4,0,%cleanwin ! CLEANWIN = maxwin | |
613 | wrpr %g0,0,%otherwin | |
614 | wrpr %g0,3,%wstate | |
615 | ta T_CHANGE_NONPRIV | |
616 | add %g0,FINISH_DONE,%g7 | |
617 | add %g0,TRAP_NOT_TAKEN,%g6 | |
618 | rest3: | |
619 | restore %i0,1,%o0 ! effectively x++ | |
620 | brlz %g6,rest3_done | |
621 | nop | |
622 | add %i3,1,%i3 ! restore, all three regs blocks must match | |
623 | add %l3,1,%l3 | |
624 | add %o3,1,%o3 | |
625 | ba rest3 | |
626 | nop | |
627 | rest3_done: | |
628 | ||
629 | !!********************************************************************* | |
630 | !! restore 4: OTHERWIN = 0, WSTATE.NORMAL=4 | |
631 | !!********************************************************************* | |
632 | sub %g4,1,%g5 | |
633 | ta T_CHANGE_PRIV | |
634 | wrpr %g0,1,%cwp ! CWP = 1 | |
635 | wrpr %g0,0,%cansave ! CANSAVE = 0 | |
636 | wrpr %g0,3,%canrestore ! CANRESTORE = 3 | |
637 | wrpr %g4,0,%cleanwin ! CLEANWIN = maxwin | |
638 | wrpr %g0,0,%otherwin | |
639 | wrpr %g0,4,%wstate | |
640 | ta T_CHANGE_NONPRIV | |
641 | add %g0,FINISH_DONE,%g7 | |
642 | add %g0,TRAP_NOT_TAKEN,%g6 | |
643 | rest4: | |
644 | restore %i0,1,%o0 ! effectively x++ | |
645 | brlz %g6,rest4_done | |
646 | nop | |
647 | add %i3,1,%i3 ! restore, all three regs blocks must match | |
648 | add %l3,1,%l3 | |
649 | add %o3,1,%o3 | |
650 | ba rest4 | |
651 | nop | |
652 | rest4_done: | |
653 | ||
654 | !!********************************************************************* | |
655 | !! restore 5: OTHERWIN = 0, WSTATE.NORMAL=5 | |
656 | !!********************************************************************* | |
657 | sub %g4,1,%g5 | |
658 | ta T_CHANGE_PRIV | |
659 | wrpr %g5,0,%cwp ! CWP = maxwin-1 | |
660 | wrpr %g0,0,%cansave ! CANSAVE = 0 | |
661 | wrpr %g0,3,%canrestore ! CANRESTORE = 3 | |
662 | wrpr %g0,0,%cleanwin ! CLEANWIN = 0, not checked on restore | |
663 | wrpr %g0,0,%otherwin | |
664 | wrpr %g0,5,%wstate | |
665 | ta T_CHANGE_NONPRIV | |
666 | add %g0,FINISH_DONE,%g7 | |
667 | add %g0,TRAP_NOT_TAKEN,%g6 | |
668 | rest5: | |
669 | restore %i0,1,%o0 ! effectively x++ | |
670 | brlz %g6,rest5_done | |
671 | nop | |
672 | add %i3,1,%i3 ! restore, all three regs blocks must match | |
673 | add %l3,1,%l3 | |
674 | add %o3,1,%o3 | |
675 | ba rest5 | |
676 | nop | |
677 | rest5_done: | |
678 | ||
679 | !!********************************************************************* | |
680 | !! restore 6: OTHERWIN = 0, WSTATE.NORMAL=6 | |
681 | !!********************************************************************* | |
682 | ta T_CHANGE_PRIV | |
683 | wrpr %g4,0,%cwp ! CWP = maxwin | |
684 | wrpr %g0,1,%cansave ! CANSAVE = 1 | |
685 | wrpr %g0,0,%canrestore ! CANRESTORE = 0 | |
686 | wrpr %g4,0,%cleanwin ! CLEANWIN = maxwin | |
687 | wrpr %g0,0,%otherwin | |
688 | wrpr %g0,6,%wstate | |
689 | ta T_CHANGE_NONPRIV | |
690 | add %g0,FINISH_DONE,%g7 | |
691 | add %g0,TRAP_NOT_TAKEN,%g6 | |
692 | rest6: | |
693 | restore %i0,1,%o0 ! effectively x++ | |
694 | brlz %g6,rest6_done | |
695 | nop | |
696 | add %i3,1,%i3 ! restore, all three regs blocks must match | |
697 | add %l3,1,%l3 | |
698 | add %o3,1,%o3 | |
699 | ba rest6 | |
700 | nop | |
701 | rest6_done: | |
702 | ||
703 | !!********************************************************************* | |
704 | !! restore 7: OTHERWIN = 0, WSTATE.NORMAL=7 | |
705 | !!********************************************************************* | |
706 | ta T_CHANGE_PRIV | |
707 | wrpr %g4,0,%cwp ! CWP = maxwin | |
708 | wrpr %g0,0,%cansave ! CANSAVE = 0 | |
709 | wrpr %g0,1,%canrestore ! CANRESTORE = 1 | |
710 | wrpr %g4,0,%cleanwin ! CLEANWIN = maxwin | |
711 | wrpr %g0,0,%otherwin | |
712 | wrpr %g0,7,%wstate | |
713 | ta T_CHANGE_NONPRIV | |
714 | add %g0,FINISH_DONE,%g7 | |
715 | add %g0,TRAP_NOT_TAKEN,%g6 | |
716 | rest7: | |
717 | restore %i0,1,%o0 ! effectively x++ | |
718 | brlz %g6,rest7_done | |
719 | nop | |
720 | add %i3,1,%i3 ! restore, all three regs blocks must match | |
721 | add %l3,1,%l3 | |
722 | add %o3,1,%o3 | |
723 | ba rest7 | |
724 | nop | |
725 | rest7_done: | |
726 | ||
727 | !!********************************************************************* | |
728 | !! restore 8: OTHERWIN = 1, WSTATE.OTHER=0 | |
729 | !!********************************************************************* | |
730 | sub %g4,1,%g5 | |
731 | ta T_CHANGE_PRIV | |
732 | wrpr %g5,0,%cwp ! CWP = maxwin-1 | |
733 | wrpr %g0,0,%cansave ! CANSAVE = 0 | |
734 | wrpr %g0,1,%canrestore ! CANRESTORE = 1 | |
735 | wrpr %g4,0,%cleanwin ! CLEANWIN = maxwin | |
736 | wrpr %g0,1,%otherwin | |
737 | wrpr %g0,0,%wstate | |
738 | ta T_CHANGE_NONPRIV | |
739 | add %g0,FINISH_DONE,%g7 | |
740 | add %g0,TRAP_NOT_TAKEN,%g6 | |
741 | rest8: | |
742 | restore %i0,1,%o0 ! effectively x++ | |
743 | brlz %g6,rest8_done | |
744 | nop | |
745 | add %i3,1,%i3 ! restore, all three regs blocks must match | |
746 | add %l3,1,%l3 | |
747 | add %o3,1,%o3 | |
748 | ba rest8 | |
749 | nop | |
750 | rest8_done: | |
751 | ||
752 | !!********************************************************************* | |
753 | !! restore 9: OTHERWIN = 1, WSTATE.OTHER=1 | |
754 | !!********************************************************************* | |
755 | ta T_CHANGE_PRIV | |
756 | wrpr %g0,3,%cwp ! CWP = 3 | |
757 | wrpr %g0,1,%cansave ! CANSAVE = 1 | |
758 | wrpr %g0,1,%canrestore ! CANRESTORE = 1 | |
759 | wrpr %g4,0,%cleanwin ! CLEANWIN = maxwin | |
760 | wrpr %g0,1,%otherwin | |
761 | wrpr %g0,8,%wstate | |
762 | ta T_CHANGE_NONPRIV | |
763 | add %g0,FINISH_DONE,%g7 | |
764 | add %g0,TRAP_NOT_TAKEN,%g6 | |
765 | rest9: | |
766 | restore %i0,1,%o0 ! effectively x++ | |
767 | brlz %g6,rest9_done | |
768 | nop | |
769 | add %i3,1,%i3 ! restore, all three regs blocks must match | |
770 | add %l3,1,%l3 | |
771 | add %o3,1,%o3 | |
772 | ba rest9 | |
773 | nop | |
774 | rest9_done: | |
775 | ||
776 | !!********************************************************************* | |
777 | !! restore 10: OTHERWIN = 1, WSTATE.OTHER=2 | |
778 | !!********************************************************************* | |
779 | sub %g4,1,%g5 | |
780 | ta T_CHANGE_PRIV | |
781 | wrpr %g5,0,%cwp ! CWP = maxwin-1 | |
782 | wrpr %g0,0,%cansave ! CANSAVE = 0 | |
783 | wrpr %g0,2,%canrestore ! CANRESTORE = 2 | |
784 | wrpr %g4,0,%cleanwin ! CLEANWIN = maxwin | |
785 | wrpr %g0,1,%otherwin | |
786 | wrpr %g0,0x10,%wstate | |
787 | ta T_CHANGE_NONPRIV | |
788 | add %g0,FINISH_DONE,%g7 | |
789 | add %g0,TRAP_NOT_TAKEN,%g6 | |
790 | rest10: | |
791 | restore %i0,1,%o0 ! effectively x++ | |
792 | brlz %g6,rest10_done | |
793 | nop | |
794 | add %i3,1,%i3 ! restore, all three regs blocks must match | |
795 | add %l3,1,%l3 | |
796 | add %o3,1,%o3 | |
797 | ba rest10 | |
798 | nop | |
799 | rest10_done: | |
800 | ||
801 | !!********************************************************************* | |
802 | !! restore 11: OTHERWIN = 1, WSTATE.OTHER=3 | |
803 | !!********************************************************************* | |
804 | ta T_CHANGE_PRIV | |
805 | wrpr %g0,0,%cwp ! CWP = 0 | |
806 | wrpr %g0,0,%cansave ! CANSAVE = 0 | |
807 | wrpr %g0,2,%canrestore ! CANRESTORE = 2 | |
808 | wrpr %g4,0,%cleanwin ! CLEANWIN = maxwin | |
809 | wrpr %g0,1,%otherwin | |
810 | wrpr %g0,18,%wstate | |
811 | ta T_CHANGE_NONPRIV | |
812 | add %g0,FINISH_DONE,%g7 | |
813 | add %g0,TRAP_NOT_TAKEN,%g6 | |
814 | rest11: | |
815 | restore %i0,1,%o0 ! effectively x++ | |
816 | brlz %g6,rest11_done | |
817 | nop | |
818 | add %i3,1,%i3 ! restore, all three regs blocks must match | |
819 | add %l3,1,%l3 | |
820 | add %o3,1,%o3 | |
821 | ba rest11 | |
822 | nop | |
823 | rest11_done: | |
824 | ||
825 | !!********************************************************************* | |
826 | !! restore 12: OTHERWIN = 1, WSTATE.OTHER=4 | |
827 | !!********************************************************************* | |
828 | ta T_CHANGE_PRIV | |
829 | wrpr %g0,2,%cwp ! CWP = 2 | |
830 | wrpr %g0,0,%cansave ! CANSAVE = 0 | |
831 | wrpr %g0,2,%canrestore ! CANRESTORE = 2 | |
832 | wrpr %g0,3,%cleanwin ! CLEANWIN = 3 | |
833 | wrpr %g0,1,%otherwin | |
834 | wrpr %g0,0x25,%wstate | |
835 | ta T_CHANGE_NONPRIV | |
836 | add %g0,FINISH_DONE,%g7 | |
837 | add %g0,TRAP_NOT_TAKEN,%g6 | |
838 | rest12: | |
839 | restore %i0,1,%o0 ! effectively x++ | |
840 | brlz %g6,rest12_done | |
841 | nop | |
842 | add %i3,1,%i3 ! restore, all three regs blocks must match | |
843 | add %l3,1,%l3 | |
844 | add %o3,1,%o3 | |
845 | ba rest12 | |
846 | nop | |
847 | rest12_done: | |
848 | ||
849 | !!********************************************************************* | |
850 | !! restore 13: OTHERWIN = 1, WSTATE.OTHER=5 | |
851 | !!********************************************************************* | |
852 | ta T_CHANGE_PRIV | |
853 | wrpr %g0,4,%cwp ! CWP = 4 | |
854 | wrpr %g0,3,%cansave ! CANSAVE = 3 | |
855 | wrpr %g0,3,%canrestore ! CANRESTORE = 3 | |
856 | wrpr %g4,0,%cleanwin ! CLEANWIN = maxwin | |
857 | wrpr %g0,1,%otherwin | |
858 | wrpr %g0,0x28,%wstate | |
859 | ta T_CHANGE_NONPRIV | |
860 | add %g0,FINISH_DONE,%g7 | |
861 | add %g0,TRAP_NOT_TAKEN,%g6 | |
862 | rest13: | |
863 | restore %i0,1,%o0 ! effectively x++ | |
864 | brlz %g6,rest13_done | |
865 | nop | |
866 | add %i3,1,%i3 ! restore, all three regs blocks must match | |
867 | add %l3,1,%l3 | |
868 | add %o3,1,%o3 | |
869 | ba rest13 | |
870 | nop | |
871 | rest13_done: | |
872 | ||
873 | !!********************************************************************* | |
874 | !! restore 14: OTHERWIN = 1, WSTATE.OTHER=6 | |
875 | !!********************************************************************* | |
876 | ta T_CHANGE_PRIV | |
877 | wrpr %g0,0,%cwp ! CWP = 0 | |
878 | wrpr %g0,1,%cansave ! CANSAVE = 1 | |
879 | wrpr %g0,1,%canrestore ! CANRESTORE = 1 | |
880 | wrpr %g4,0,%cleanwin ! CLEANWIN = maxwin | |
881 | wrpr %g0,1,%otherwin | |
882 | wrpr %g0,0x30,%wstate | |
883 | ta T_CHANGE_NONPRIV | |
884 | add %g0,FINISH_DONE,%g7 | |
885 | add %g0,TRAP_NOT_TAKEN,%g6 | |
886 | rest14: | |
887 | restore %i0,1,%o0 ! effectively x++ | |
888 | brlz %g6,rest14_done | |
889 | nop | |
890 | add %i3,1,%i3 ! restore, all three regs blocks must match | |
891 | add %l3,1,%l3 | |
892 | add %o3,1,%o3 | |
893 | ba rest14 | |
894 | nop | |
895 | rest14_done: | |
896 | ||
897 | !!********************************************************************* | |
898 | !! restore 15: OTHERWIN = 1, WSTATE.OTHER=7 | |
899 | !!********************************************************************* | |
900 | ta T_CHANGE_PRIV | |
901 | wrpr %g0,3,%cwp ! CWP = 3 | |
902 | wrpr %g0,0,%cansave ! CANSAVE = 0 | |
903 | wrpr %g0,0,%canrestore ! CANRESTORE = 0 | |
904 | wrpr %g4,0,%cleanwin ! CLEANWIN = maxwin | |
905 | wrpr %g0,1,%otherwin | |
906 | wrpr %g0,0x38,%wstate | |
907 | ta T_CHANGE_NONPRIV | |
908 | add %g0,FINISH_DONE,%g7 | |
909 | add %g0,TRAP_NOT_TAKEN,%g6 | |
910 | rest15: | |
911 | restore %i0,1,%o0 ! effectively x++ | |
912 | brlz %g6,rest15_done | |
913 | nop | |
914 | add %i3,1,%i3 ! restore, all three regs blocks must match | |
915 | add %l3,1,%l3 | |
916 | add %o3,1,%o3 | |
917 | ba rest15 | |
918 | nop | |
919 | rest15_done: | |
920 | ||
921 | !!********************************************************************* | |
922 | !!********************************************************************* | |
923 | !! clean1: cleanwin exception when cleanwin = canrestore = 0 | |
924 | !!********************************************************************* | |
925 | ta T_CHANGE_PRIV | |
926 | wrpr %g0,0,%cwp ! CWP = 0 | |
927 | wrpr %g0,3,%cansave ! CANSAVE = 3 | |
928 | wrpr %g0,0,%canrestore ! CANRESTORE = 0 | |
929 | wrpr %g0,0,%cleanwin ! CLEANWIN = 0 | |
930 | wrpr %g0,0,%otherwin | |
931 | wrpr %g0,0,%wstate | |
932 | ta T_CHANGE_NONPRIV | |
933 | add %g0,FINISH_RETRY,%g7 | |
934 | clean1: | |
935 | save %o0,1,%i0 ! effectively x++ | |
936 | add %i2,1,%i2 | |
937 | ||
938 | ||
939 | !!********************************************************************* | |
940 | !! clean2: cleanwin exception when cleanwin = canrestore = 1 | |
941 | !!********************************************************************* | |
942 | ta T_CHANGE_PRIV | |
943 | wrpr %g0,0,%cwp ! CWP = 0 | |
944 | wrpr %g0,3,%cansave ! CANSAVE = 3 | |
945 | wrpr %g0,1,%canrestore ! CANRESTORE = 1 | |
946 | wrpr %g0,1,%cleanwin ! CLEANWIN = 1 | |
947 | wrpr %g0,1,%otherwin | |
948 | wrpr %g0,0,%wstate | |
949 | ta T_CHANGE_NONPRIV | |
950 | add %g0,FINISH_RETRY,%g7 | |
951 | clean2: | |
952 | save %o0,1,%i0 ! effectively x++ | |
953 | add %i2,1,%i2 | |
954 | ||
955 | !!********************************************************************* | |
956 | !! clean3: save when cleanwin < canrestore. This is not architecturally | |
957 | !! specified. Niagara will not trap. | |
958 | !!********************************************************************* | |
959 | ta T_CHANGE_PRIV | |
960 | wrpr %g0,0,%cwp ! CWP = 0 | |
961 | wrpr %g0,3,%cansave ! CANSAVE = 3 | |
962 | wrpr %g0,2,%canrestore ! CANRESTORE = 2 | |
963 | wrpr %g0,1,%cleanwin ! CLEANWIN = 1 | |
964 | wrpr %g0,0,%otherwin | |
965 | wrpr %g0,0,%wstate | |
966 | ta T_CHANGE_NONPRIV | |
967 | add %g0,FINISH_RETRY,%g7 | |
968 | clean3: | |
969 | save %o0,1,%i0 ! effectively x++ | |
970 | add %i2,1,%i2 | |
971 | ||
972 | !!********************************************************************* | |
973 | !! clean4: save when cleanwin = canrestore, and cansave = 0. | |
974 | !! the spill trap has priority over the cleanwin trap | |
975 | !!********************************************************************* | |
976 | ta T_CHANGE_PRIV | |
977 | wrpr %g0,0,%cwp ! CWP = 0 | |
978 | wrpr %g0,0,%cansave ! CANSAVE = 0 | |
979 | wrpr %g0,3,%canrestore ! CANRESTORE = 3 | |
980 | wrpr %g0,3,%cleanwin ! CLEANWIN = 3 | |
981 | wrpr %g0,0,%otherwin | |
982 | wrpr %g0,0,%wstate | |
983 | ta T_CHANGE_NONPRIV | |
984 | add %g0,TRAP_NOT_TAKEN,%g6 | |
985 | add %g0,FINISH_DONE,%g7 | |
986 | clean4: | |
987 | save %o0,1,%i0 ! effectively x++ | |
988 | add %i2,1,%i2 | |
989 | !! trap clean does not use g6, so if g6 has changed, the correct trap | |
990 | !! was taken. (Yeah, I know, this is not advertised as a self-checking | |
991 | !! test...) | |
992 | cmp %g6,TRAP_NOT_TAKEN | |
993 | bne clean4_ok | |
994 | nop | |
995 | ta T_BAD_TRAP | |
996 | nop | |
997 | nop | |
998 | clean4_ok: | |
999 | ||
1000 | ||
1001 | !!********************************************************************* | |
1002 | !!********************************************************************* | |
1003 | !! flush1: flush with NWINDOWS-2 = CANSAVE, should be a NOP | |
1004 | !!********************************************************************* | |
1005 | sub %g4,1,%g5 | |
1006 | ta T_CHANGE_PRIV | |
1007 | wrpr %g0,0,%cwp ! CWP = 0 | |
1008 | wrpr %g5,0,%cansave ! CANSAVE = maxwin-1 (NWINDOWS-2) | |
1009 | wrpr %g0,3,%canrestore ! CANRESTORE = 3 | |
1010 | wrpr %g0,3,%cleanwin ! CLEANWIN = 3 | |
1011 | wrpr %g0,0,%otherwin | |
1012 | wrpr %g0,0,%wstate | |
1013 | ta T_CHANGE_NONPRIV | |
1014 | add %g0,TRAP_NOT_TAKEN,%g6 | |
1015 | add %g0,FINISH_DONE,%g7 | |
1016 | flush1: | |
1017 | flushw | |
1018 | add %i3,1,%i3 | |
1019 | cmp %g6,TRAP_NOT_TAKEN | |
1020 | be flush1_ok | |
1021 | nop | |
1022 | ta T_BAD_TRAP | |
1023 | nop | |
1024 | nop | |
1025 | flush1_ok: | |
1026 | ||
1027 | !!********************************************************************* | |
1028 | !! flush2: flush with NWINDOWS-2-CANSAVE>0, should take a spill trap | |
1029 | !!********************************************************************* | |
1030 | sub %g4,3,%g5 | |
1031 | ta T_CHANGE_PRIV | |
1032 | wrpr %g0,0,%cwp ! CWP = 0 | |
1033 | wrpr %g5,0,%cansave ! CANSAVE = maxwin-3 | |
1034 | wrpr %g0,1,%canrestore ! CANRESTORE = 1 | |
1035 | wrpr %g4,0,%cleanwin ! CLEANWIN = maxwin | |
1036 | wrpr %g0,0,%otherwin ! OTHERWIN = 0 | |
1037 | wrpr %g0,0,%wstate | |
1038 | ta T_CHANGE_NONPRIV | |
1039 | add %g0,TRAP_NOT_TAKEN,%g6 | |
1040 | add %g0,FINISH_RETRY,%g7 | |
1041 | flush2: | |
1042 | flushw | |
1043 | add %i3,1,%i3 | |
1044 | cmp %g6,TRAP_TAKEN | |
1045 | be flush2_ok | |
1046 | nop | |
1047 | ta T_BAD_TRAP | |
1048 | nop | |
1049 | nop | |
1050 | flush2_ok: | |
1051 | ||
1052 | !!********************************************************************* | |
1053 | !! flush3: flush with NWINDOWS-2<>CANSAVE, should take a spill trap | |
1054 | !!********************************************************************* | |
1055 | sub %g4,3,%g5 | |
1056 | ta T_CHANGE_PRIV | |
1057 | wrpr %g0,0,%cwp ! CWP = 0 | |
1058 | wrpr %g5,0,%cansave ! CANSAVE = maxwin-3 | |
1059 | wrpr %g0,1,%canrestore ! CANRESTORE = 1 | |
1060 | wrpr %g4,0,%cleanwin ! CLEANWIN = maxwin | |
1061 | wrpr %g0,1,%otherwin ! OTHERWIN = 1 | |
1062 | wrpr %g0,0,%wstate | |
1063 | ta T_CHANGE_NONPRIV | |
1064 | add %g0,TRAP_NOT_TAKEN,%g6 | |
1065 | add %g0,FINISH_RETRY,%g7 | |
1066 | flush3: | |
1067 | flushw | |
1068 | add %i3,1,%i3 | |
1069 | cmp %g6,TRAP_TAKEN | |
1070 | be flush3_ok | |
1071 | nop | |
1072 | ta T_BAD_TRAP | |
1073 | nop | |
1074 | nop | |
1075 | flush3_ok: | |
1076 | ||
1077 | !!********************************************************************* | |
1078 | !! flush4: flush with NWINDOWS-2<>CANSAVE, should take a spill trap | |
1079 | !!********************************************************************* | |
1080 | ta T_CHANGE_PRIV | |
1081 | wrpr %g4,0,%cwp ! CWP = maxwin | |
1082 | wrpr %g0,4,%cansave ! CANSAVE = 4 | |
1083 | wrpr %g0,1,%canrestore ! CANRESTORE = 1 | |
1084 | wrpr %g4,0,%cleanwin ! CLEANWIN = maxwin | |
1085 | wrpr %g0,0,%otherwin ! OTHERWIN = 0 | |
1086 | wrpr %g0,0,%wstate | |
1087 | ta T_CHANGE_NONPRIV | |
1088 | add %g0,TRAP_NOT_TAKEN,%g6 | |
1089 | add %g0,FINISH_RETRY,%g7 | |
1090 | flush4: | |
1091 | flushw | |
1092 | add %i3,1,%i3 | |
1093 | cmp %g6,TRAP_TAKEN | |
1094 | be flush4_ok | |
1095 | nop | |
1096 | ta T_BAD_TRAP | |
1097 | nop | |
1098 | nop | |
1099 | flush4_ok: | |
1100 | ||
1101 | ||
1102 | !!********************************************************************* | |
1103 | !!********************************************************************* | |
1104 | !! saved/restored cases: all these instructions do is manipulate | |
1105 | !! cansave, canrestore, otherwin, and cleanwin values. No need | |
1106 | !! to actually use them in a trap handler. | |
1107 | !!********************************************************************* | |
1108 | ta T_CHANGE_PRIV | |
1109 | wrpr %g0,0,%cwp ! CWP = 0 | |
1110 | wrpr %g0,0,%cansave ! CANSAVE = 0 | |
1111 | wrpr %g0,1,%canrestore ! CANRESTORE = 1 | |
1112 | wrpr %g0,0,%cleanwin ! CLEANWIN = 0 | |
1113 | wrpr %g0,0,%otherwin ! OTHERWIN = 0 | |
1114 | wrpr %g0,0,%wstate | |
1115 | ||
1116 | ! otherwin = 0 cases | |
1117 | saved | |
1118 | restored | |
1119 | saved | |
1120 | saved | |
1121 | saved | |
1122 | saved | |
1123 | saved | |
1124 | saved | |
1125 | saved | |
1126 | saved ! eight in a row | |
1127 | restored | |
1128 | restored | |
1129 | restored | |
1130 | restored | |
1131 | restored | |
1132 | restored | |
1133 | restored | |
1134 | restored ! eight in a row | |
1135 | ||
1136 | wrpr %g4,0,%cansave ! CANSAVE = maxwin | |
1137 | wrpr %g4,0,%canrestore ! CANRESTORE = maxwin | |
1138 | wrpr %g0,3,%cleanwin ! CLEANWIN = 3 | |
1139 | wrpr %g4,0,%otherwin ! OTHERWIN = maxwin | |
1140 | wrpr %g0,0,%wstate | |
1141 | ||
1142 | ! otherwin > 0 cases | |
1143 | saved | |
1144 | restored | |
1145 | saved | |
1146 | saved | |
1147 | saved | |
1148 | saved | |
1149 | saved | |
1150 | saved | |
1151 | saved | |
1152 | saved ! eight in a row | |
1153 | wrpr %g4,0,%otherwin ! OTHERWIN = maxwin | |
1154 | restored | |
1155 | restored | |
1156 | restored | |
1157 | restored | |
1158 | restored | |
1159 | restored | |
1160 | restored | |
1161 | restored ! eight in a row | |
1162 | ||
1163 | ta T_CHANGE_NONPRIV | |
1164 | ||
1165 | good_end: | |
1166 | ta T_GOOD_TRAP | |
1167 | nop | |
1168 | nop | |
1169 | ||
1170 | ||
1171 | !========================== | |
1172 | .data | |
1173 | .align 0x1fff+1 | |
1174 | ||
1175 | max_win: .word 0, 0 | |
1176 | ||
1177 | ||
1178 | ||
1179 | ||
1180 | ||
1181 | /***********************************************************************/ | |
1182 | ||
1183 | //SECTION .CUST_TRAPS TEXT_VA=0x40000000, DATA_VA=0x41000000 | |
1184 | ||
1185 | //attr_text { | |
1186 | // Name = .CUST_TRAPS, | |
1187 | // RA = 0x40000000, | |
1188 | // PA = ra2pa(0x40000000,0), | |
1189 | // part_0_i_ctx_zero_tsb_config_0, | |
1190 | // TTE_G=1, TTE_Context=0, TTE_V=1, TTE_Size=0, TTE_NFO=0, TTE_IE=0, | |
1191 | // TTE_Soft2=0, TTE_Diag=0, TTE_Soft=0, TTE_L=0, TTE_CP=1, TTE_CV=0, | |
1192 | // TTE_E=0, TTE_P=1, TTE_W=1 | |
1193 | // } | |
1194 | //attr_data { | |
1195 | // Name = .CUST_TRAPS, | |
1196 | // RA = 0x4100000, | |
1197 | // PA = ra2pa(0x41000000,0), | |
1198 | // part_0_d_ctx_zero_tsb_config_0, | |
1199 | // TTE_G=1, TTE_Context=0, TTE_V=1, TTE_Size=0, TTE_NFO=0, TTE_IE=0, | |
1200 | // TTE_Soft2=0, TTE_Diag=0, TTE_Soft=0, TTE_L=0, TTE_CP=1, TTE_CV=0, | |
1201 | // TTE_E=0, TTE_P=1, TTE_W=1 | |
1202 | // } | |
1203 | ||
1204 | .text | |
1205 | ||
1206 | // User %g7 is a parameter. if %g7=FINISH_DONE, use done, else use retry | |
1207 | // trap_clean DOES NOT modify the user %g6 | |
1208 | .global trap_clean | |
1209 | trap_clean: | |
1210 | rdpr %cwp,%g1 | |
1211 | rdpr %cansave,%g2 | |
1212 | rdpr %canrestore,%g3 | |
1213 | rdpr %otherwin,%g4 | |
1214 | rdpr %wstate,%g5 | |
1215 | rdpr %cleanwin,%g6 | |
1216 | wrpr %g0,0,%gl ! go back to GL=0, user global regs | |
1217 | cmp %g7,FINISH_DONE | |
1218 | be clean_done | |
1219 | nop | |
1220 | wrpr %g0,1,%gl ! restore trap global regs | |
1221 | add %g6,1,%g6 ! cleanwin++ | |
1222 | wrpr %g6,0,%cleanwin | |
1223 | retry | |
1224 | nop | |
1225 | clean_done: | |
1226 | done | |
1227 | nop | |
1228 | ||
1229 | ||
1230 | // User %g7 is a parameter. if %g7=FINISH_DONE, use done, else use retry | |
1231 | // User %g6 lets test loop know that the trap was hit. | |
1232 | .global trap_spill | |
1233 | trap_spill: | |
1234 | rdpr %cwp,%g1 | |
1235 | rdpr %cansave,%g2 | |
1236 | rdpr %canrestore,%g1 | |
1237 | rdpr %otherwin,%g2 | |
1238 | rdpr %wstate,%g1 | |
1239 | rdpr %cleanwin,%g2 | |
1240 | wrpr %g0,0,%gl ! go back to GL=0 | |
1241 | add %g0,TRAP_TAKEN,%g6 | |
1242 | cmp %g7,FINISH_DONE | |
1243 | be spill_done | |
1244 | nop | |
1245 | saved ! used by flushw test cases | |
1246 | retry | |
1247 | nop | |
1248 | spill_done: | |
1249 | done | |
1250 | nop | |
1251 | ||
1252 | // User %g7 is a parameter. if %g7=FINISH_DONE, use done, else use retry | |
1253 | // User %g6 lets test loop know that the trap was hit. | |
1254 | .global trap_fill | |
1255 | trap_fill: | |
1256 | rdpr %cwp,%g1 | |
1257 | rdpr %cansave,%g2 | |
1258 | rdpr %canrestore,%g1 | |
1259 | rdpr %otherwin,%g2 | |
1260 | rdpr %wstate,%g1 | |
1261 | rdpr %cleanwin,%g2 | |
1262 | wrpr %g0,0,%gl ! go back to GL=0 | |
1263 | add %g0,TRAP_TAKEN,%g6 | |
1264 | cmp %g7,FINISH_DONE | |
1265 | be fill_done | |
1266 | nop | |
1267 | retry | |
1268 | nop | |
1269 | fill_done: | |
1270 | done | |
1271 | nop | |
1272 | ||
1273 | ||
1274 | ||
1275 | .end |