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