Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / verif / diag / assembly / exu / exu_win_traps_8th_n2.s
CommitLineData
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
96main:
97th_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...
100th_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
113th_main_1:
114th_main_2:
115th_main_3:
116th_main_4:
117th_main_5:
118th_main_6:
119th_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
132th_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
155reg_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
178reg_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
196save1:
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
205save1_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
221save2:
222 save %o0,1,%i0 ! effectively x++
223 brlz %g6,save2_done
224 nop
225 add %i2,1,%i2
226 ba save2
227 nop
228save2_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
244save3:
245 save %o0,1,%i0 ! effectively x++
246 brlz %g6,save3_done
247 nop
248 add %i3,1,%i3
249 ba save3
250 nop
251save3_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
266save4:
267 save %o0,1,%i0 ! effectively x++
268 brlz %g6,save4_done
269 nop
270 add %i4,1,%i4
271 ba save4
272 nop
273save4_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
288save5:
289 save %o0,1,%i0 ! effectively x++
290 brlz %g6,save5_done
291 nop
292 add %i5,1,%i5
293 ba save5
294 nop
295save5_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
311save6:
312 save %o0,1,%i0 ! effectively x++
313 brlz %g6,save6_done
314 nop
315 add %i6,1,%i6
316 ba save6
317 nop
318save6_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
333save7:
334 save %o0,1,%i0 ! effectively x++
335 brlz %g6,save7_done
336 nop
337 add %i7,1,%i7
338 ba save7
339 nop
340save7_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
356save8:
357 save %o0,1,%i0 ! effectively x++
358 brlz %g6,save8_done
359 nop
360 add %i1,1,%i1
361 ba save8
362 nop
363save8_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
379save9:
380 save %o0,1,%i0 ! effectively x++
381 brlz %g6,save9_done
382 nop
383 add %i2,1,%i2
384 ba save9
385 nop
386save9_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
401save10:
402 save %o0,1,%i0 ! effectively x++
403 brlz %g6,save10_done
404 nop
405 add %i3,1,%i3
406 ba save10
407 nop
408save10_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
423save11:
424 save %o0,1,%i0 ! effectively x++
425 brlz %g6,save11_done
426 nop
427 add %i4,1,%i4
428 ba save11
429 nop
430save11_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
445save12:
446 save %o0,1,%i0 ! effectively x++
447 brlz %g6,save12_done
448 nop
449 add %i5,1,%i5
450 ba save12
451 nop
452save12_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
467save13:
468 save %o0,1,%i0 ! effectively x++
469 brlz %g6,save13_done
470 nop
471 add %i6,1,%i6
472 ba save13
473 nop
474save13_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
489save14:
490 save %o0,1,%i0 ! effectively x++
491 brlz %g6,save14_done
492 nop
493 add %i7,1,%i7
494 ba save14
495 nop
496save14_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
511save15:
512 save %o0,1,%i0 ! effectively x++
513 brlz %g6,save15_done
514 nop
515 add %i1,1,%i1
516 ba save15
517 nop
518save15_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
534save16:
535 save %o0,1,%i0 ! effectively x++
536 brlz %g6,save16_done
537 nop
538 add %i2,1,%i2
539 ba save16
540 nop
541save16_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
558rest0:
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
567rest0_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
582rest1:
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
591rest1_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
606rest2:
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
615rest2_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
630rest3:
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
639rest3_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
655rest4:
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
664rest4_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
680rest5:
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
689rest5_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
704rest6:
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
713rest6_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
728rest7:
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
737rest7_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
753rest8:
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
762rest8_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
777rest9:
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
786rest9_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
802rest10:
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
811rest10_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
826rest11:
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
835rest11_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
850rest12:
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
859rest12_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
874rest13:
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
883rest13_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
898rest14:
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
907rest14_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
922rest15:
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
931rest15_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
946clean1:
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
963clean2:
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
980clean3:
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
998clean4:
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
1010clean4_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
1028flush1:
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
1037flush1_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
1053flush2:
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
1062flush2_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
1078flush3:
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
1087flush3_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
1102flush4:
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
1111flush4_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
1177good_end:
1178 ta T_GOOD_TRAP
1179 nop
1180 nop
1181
1182
1183!==========================
1184.data
1185.align 0x1fff+1
1186
1187max_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
1221trap_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
1237clean_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
1245trap_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
1260spill_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
1267trap_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
1281fill_done:
1282 done
1283 nop
1284
1285
1286
1287.end