Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / verif / diag / assembly / exu / exu_win_traps_n2.s
CommitLineData
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
94main:
95th_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...
98th_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
111th_main_1:
112th_main_2:
113th_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
120th_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
143reg_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
166reg_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
184save1:
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
193save1_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
209save2:
210 save %o0,1,%i0 ! effectively x++
211 brlz %g6,save2_done
212 nop
213 add %i2,1,%i2
214 ba save2
215 nop
216save2_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
232save3:
233 save %o0,1,%i0 ! effectively x++
234 brlz %g6,save3_done
235 nop
236 add %i3,1,%i3
237 ba save3
238 nop
239save3_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
254save4:
255 save %o0,1,%i0 ! effectively x++
256 brlz %g6,save4_done
257 nop
258 add %i4,1,%i4
259 ba save4
260 nop
261save4_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
276save5:
277 save %o0,1,%i0 ! effectively x++
278 brlz %g6,save5_done
279 nop
280 add %i5,1,%i5
281 ba save5
282 nop
283save5_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
299save6:
300 save %o0,1,%i0 ! effectively x++
301 brlz %g6,save6_done
302 nop
303 add %i6,1,%i6
304 ba save6
305 nop
306save6_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
321save7:
322 save %o0,1,%i0 ! effectively x++
323 brlz %g6,save7_done
324 nop
325 add %i7,1,%i7
326 ba save7
327 nop
328save7_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
344save8:
345 save %o0,1,%i0 ! effectively x++
346 brlz %g6,save8_done
347 nop
348 add %i1,1,%i1
349 ba save8
350 nop
351save8_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
367save9:
368 save %o0,1,%i0 ! effectively x++
369 brlz %g6,save9_done
370 nop
371 add %i2,1,%i2
372 ba save9
373 nop
374save9_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
389save10:
390 save %o0,1,%i0 ! effectively x++
391 brlz %g6,save10_done
392 nop
393 add %i3,1,%i3
394 ba save10
395 nop
396save10_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
411save11:
412 save %o0,1,%i0 ! effectively x++
413 brlz %g6,save11_done
414 nop
415 add %i4,1,%i4
416 ba save11
417 nop
418save11_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
433save12:
434 save %o0,1,%i0 ! effectively x++
435 brlz %g6,save12_done
436 nop
437 add %i5,1,%i5
438 ba save12
439 nop
440save12_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
455save13:
456 save %o0,1,%i0 ! effectively x++
457 brlz %g6,save13_done
458 nop
459 add %i6,1,%i6
460 ba save13
461 nop
462save13_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
477save14:
478 save %o0,1,%i0 ! effectively x++
479 brlz %g6,save14_done
480 nop
481 add %i7,1,%i7
482 ba save14
483 nop
484save14_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
499save15:
500 save %o0,1,%i0 ! effectively x++
501 brlz %g6,save15_done
502 nop
503 add %i1,1,%i1
504 ba save15
505 nop
506save15_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
522save16:
523 save %o0,1,%i0 ! effectively x++
524 brlz %g6,save16_done
525 nop
526 add %i2,1,%i2
527 ba save16
528 nop
529save16_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
546rest0:
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
555rest0_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
570rest1:
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
579rest1_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
594rest2:
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
603rest2_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
618rest3:
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
627rest3_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
643rest4:
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
652rest4_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
668rest5:
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
677rest5_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
692rest6:
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
701rest6_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
716rest7:
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
725rest7_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
741rest8:
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
750rest8_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
765rest9:
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
774rest9_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
790rest10:
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
799rest10_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
814rest11:
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
823rest11_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
838rest12:
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
847rest12_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
862rest13:
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
871rest13_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
886rest14:
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
895rest14_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
910rest15:
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
919rest15_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
934clean1:
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
951clean2:
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
968clean3:
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
986clean4:
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
998clean4_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
1016flush1:
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
1025flush1_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
1041flush2:
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
1050flush2_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
1066flush3:
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
1075flush3_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
1090flush4:
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
1099flush4_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
1165good_end:
1166 ta T_GOOD_TRAP
1167 nop
1168 nop
1169
1170
1171!==========================
1172.data
1173.align 0x1fff+1
1174
1175max_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
1209trap_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
1225clean_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
1233trap_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
1248spill_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
1255trap_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
1269fill_done:
1270 done
1271 nop
1272
1273
1274
1275.end