filename | test/sh4/testutlb.s |
changeset | 1044:01e46b0aafaf |
prev | 976:e57a25d9eb7d |
author | nkeynes |
date | Sun Oct 24 13:10:53 2010 +1000 (13 years ago) |
permissions | -rw-r--r-- |
last change | Ensure stencil is disabled after use. |
view | annotate | diff | log | raw |
3 .global _install_utlb_test_handler
4 _install_utlb_test_handler:
5 mov.l utlb_old_vbr_k, r0
6 stc vbr, r1
7 mov.l r1, @r0
9 mov.l utlb_vbr_k, r0
10 ldc r0, vbr
11 rts
12 nop
14 .global _uninstall_utlb_test_handler
15 _uninstall_utlb_test_handler:
16 mov.l utlb_old_vbr_k, r0
17 mov.l @r0, r0
18 ldc r0, vbr
19 rts
20 nop
22 utlb_exc_handler:
23 mov.l utlb_exc_stack_k, r15
24 mov.l r0, @-r15
25 mov.l r1, @-r15
26 mov.l r2, @-r15
27 sts pr, r0
28 mov.l r0, @-r15
30 mov.l mmu_expevt_k, r2
31 mov.l @r2, r2
32 mov r2, r0
33 shlr2 r0
34 cmp/eq #0x58, r0
35 bt utlb_trap
37 mov.l utlb_exc_k_1, r0
38 mov.l @(16,r0), r1
39 tst r1, r1
40 bt utlb_exc_unexpected
42 mov.l @r0, r1
43 tst r1, r1
44 bf utlb_exc_set
45 mov.l r2, @r0
46 stc spc, r2
47 mov.l r2, @(8,r0)
49 utlb_exc_set:
50 mov.l @(4,r0), r2
51 add #1, r2
52 mov.l r2, @(4,r0)
54 mov.l @(12,r0), r2
55 stc spc, r1
56 add r2, r1
57 ldc r1, spc
59 utlb_exc_done:
60 mov.l @r15+, r0
61 lds r0, pr
62 mov.l @r15+, r2
63 mov.l @r15+, r1
64 mov.l @r15+, r0
65 rte
66 stc sgr, r15
68 utlb_trap:
69 mov.l mmu_tra_k, r2
70 mov.l @r2, r0
71 shlr2 r0
72 cmp/eq #42, r0
73 bt utlb_trap_priv
74 cmp/eq #41, r0
75 bt utlb_trap_printf
76 bra utlb_exc_done
77 nop
78 utlb_trap_priv:
79 stc ssr, r0
80 mov.l mmu_sr_md, r1
81 or r1, r0
82 ldc r0, ssr
83 bra utlb_exc_done
84 nop
85 utlb_trap_printf:
86 stc sr, r0
87 mov.l mmu_sr_rb_mask, r1
88 and r1, r0
89 ldc r0, sr
90 mov.l utlb_printf_k, r0
91 jsr @r0
92 nop
93 bra utlb_exc_done
94 nop
95 utlb_exc_unexpected: /* Report an unexpected exception. Save everything in case printf clobbers it */
96 mov.l r3, @-r15
97 mov.l r4, @-r15
98 mov.l r5, @-r15
99 mov.l r6, @-r15
100 mov.l r7, @-r15
101 mov.l r8, @-r15
102 mov.l r9, @-r15
103 mov.l r10, @-r15
104 mov.l r11, @-r15
105 mov.l r12, @-r15
106 mov.l r13, @-r15
107 mov.l r14, @-r15
108 sts fpscr, r0
109 mov.l r0, @-r15
111 stc spc, r6
112 mov r2, r5
113 mov.l utlb_unexpected_msg_k, r4
114 mov.l utlb_printf_k, r3
115 jsr @r3
116 nop
118 mov.l @r15+, r0
119 lds r0, fpscr
120 mov.l @r15+, r14
121 mov.l @r15+, r13
122 mov.l @r15+, r12
123 mov.l @r15+, r11
124 mov.l @r15+, r10
125 mov.l @r15+, r9
126 mov.l @r15+, r8
127 mov.l @r15+, r7
128 mov.l @r15+, r6
129 mov.l @r15+, r5
130 mov.l @r15+, r4
131 mov.l @r15+, r3
132 mov.l utlb_exc_k_1, r0
133 bra utlb_exc_set
134 nop
137 .align 4
138 utlb_vbr_k:
139 .long utlb_vbr
140 utlb_old_vbr_k:
141 .long utlb_old_vbr
142 utlb_exc_k_1:
143 .long utlb_exc
144 mmu_expevt_k:
145 .long 0xFF000024
146 mmu_tra_k:
147 .long 0xFF000020
148 mmu_sr_md:
149 .long 0x40000000
150 mmu_sr_rb_mask:
151 .long 0x50000000
152 utlb_exc_stack_k:
153 .long utlb_exc_stack
154 utlb_printf_k:
155 .long _printf
156 utlb_unexpected_msg_k:
157 .long utlb_unexpected_msg
159 .skip 0x1F00 /* 8K stack */
160 utlb_vbr:
161 .skip 0x100
162 utlb_exc_stack:
163 mov.l utlb_exc_handler_k1, r15
164 jmp @r15
165 nop
166 nop
167 utlb_exc_handler_k1:
168 .long utlb_exc_handler
170 .skip 0x2F4
171 mov.l utlb_exc_handler_k2, r15
172 jmp @r15
173 nop
174 nop
175 utlb_exc_handler_k2:
176 .long utlb_exc_handler
177 .skip 0x1F4
178 rte
179 stc sgr, r15
182 utlb_expect_exc:
183 mova utlb_exc, r0
184 xor r1, r1
185 mov.l r1, @r0
186 mov.l r1, @(4,r0)
187 mov.l r1, @(8,r0)
188 mov #1, r1
189 mov.l r1, @(16,r0)
190 mov #2, r1
191 mov.l r1, @(12,r0)
192 rts
193 nop
195 utlb_noexpect_exc:
196 mova utlb_exc, r0
197 xor r1, r1
198 mov.l r1, @r0
199 mov.l r1, @(4,r0)
200 mov.l r1, @(8,r0)
201 mov.l r1, @(16,r0)
202 mov #2, r1
203 mov.l r1, @(12,r0)
204 rts
205 nop
207 /* Check the result of a read test. Call with:
208 * r0 = expected spc
209 * r1 = value read (if any)
210 * r9 = (char *) testname
211 * r10 = test VMA
212 * r11 = test PMA
213 * r12 = expected exc
214 *
215 * Trashes r0..r7
216 */
217 utlb_check_read_exc:
218 mov.l utlb_exc_k, r3
219 mov.l addr_mask, r2
220 and r2, r3
222 mov.l @r3, r2
223 cmp/eq r2, r12
224 bf test_read_exc_bad
225 tst r12, r12
226 bt test_read_ok /* Expected no exception, and got none */
227 mov.l @(4,r3), r2
228 dt r2
229 bf test_read_count_bad
230 mov.l @(8,r3), r2
231 cmp/eq r0, r2
232 bt test_read_ok
233 test_read_pc_bad:
234 add #1, r14
235 mov r0, r6
236 mov.l err_read_pc_msg_k, r4
237 mov r2, r7
238 mov r9, r5
239 trapa #41
240 bra test_read_ok
241 nop
242 test_read_count_bad:
243 add #1, r14
244 add #2, r2
245 mov.l err_read_count_msg_k, r4
246 mov r2, r6
247 mov r9, r5
248 trapa #41
249 bra test_read_ok
250 nop
251 test_read_exc_bad:
252 add #1, r14
253 mov.l err_read_exc_msg_k, r4
254 mov r12, r6
255 mov r2, r7
256 mov r9, r5
257 trapa #41
258 bra test_read_ok
259 nop
260 test_read_ok:
261 bra utlb_expect_exc
262 nop
264 /* Check the result of a write test (and clears the exception). Call with:
265 * r0 = expected spc
266 * r1 = written value
267 * r9 = (char *) testname
268 * r10 = test VMA
269 * r11 = test PMA
270 * r13 = expected exc
271 * r14 = fail count (updated)
272 *
273 * Trashes r0..r7
274 */
275 utlb_check_write_exc:
276 mov.l utlb_exc_k, r3
277 mov.l addr_mask, r2
278 and r2, r3
280 mov.l @r3, r2
281 cmp/eq r2, r13
282 bf test_write_exc_bad
283 tst r13, r13
284 bt test_write_ok /* Expected no exception, and got none */
285 mov.l @(4,r3), r2
286 dt r2
287 bf test_write_count_bad
288 mov.l @(8,r3), r2
289 cmp/eq r0, r2
290 bt test_write_ok
291 test_write_pc_bad:
292 add #1, r14
293 mov r0, r6
294 mov.l err_write_pc_msg_k, r4
295 mov r2, r7
296 mov r9, r5
297 trapa #41
298 bra test_write_ok
299 nop
300 test_write_count_bad:
301 add #1, r14
302 add #1, r2
303 mov.l err_write_count_msg_k, r4
304 mov r2, r6
305 mov r9, r5
306 trapa #41
307 bra test_write_ok
308 nop
309 test_write_exc_bad:
310 add #1, r14
311 mov.l err_write_exc_msg_k, r4
312 mov r13, r6
313 mov r2, r7
314 mov r9, r5
315 trapa #41
316 bra test_write_ok
317 nop
318 test_write_ok:
319 bra utlb_expect_exc
320 nop
321 .align 4
322 utlb_exc_k:
323 .long utlb_exc
324 err_read_exc_msg_k:
325 .long err_read_exc_msg
326 err_read_count_msg_k:
327 .long err_read_count_msg
328 err_read_pc_msg_k:
329 .long err_read_pc_msg
330 err_write_exc_msg_k:
331 .long err_write_exc_msg
332 err_write_count_msg_k:
333 .long err_write_count_msg
334 err_write_pc_msg_k:
335 .long err_write_pc_msg
337 .align 4
338 utlb_old_vbr:
339 .long 0
340 utlb_exc:
341 .long 0
342 utlb_exc_count:
343 .long 0
344 utlb_exc_spc:
345 .long 0
346 utlb_rte_offset:
347 .long 2
348 utlb_expected:
349 .long 0
351 .global _run_utlb_priv_test
352 _run_utlb_priv_test:
353 mov.l r14, @-r15
354 sts pr, r0
355 mov.l r0, @-r15
356 mov.l r13, @-r15
357 mov.l r12, @-r15
358 mov.l r11, @-r15
359 mov.l r10, @-r15
360 mov.l r9, @-r15
361 mov.l r8, @-r15
363 mov.l @(0,r4), r9 /* Test name */
364 mov.l @(4,r4), r10 /* Test VMA */
365 mov.l @(8,r4), r11 /* Test PMA */
366 mov.l @(12,r4), r12 /* Read exception */
367 mov.l @(16,r4), r13 /* Write exception */
368 xor r14, r14 /* Fail count */
370 mov.l @r11, r0 /* Save original memory value */
371 ocbp @r11
372 mov.l r0, @-r15
374 tst r12, r12
375 bt utlb_read_test_noexc
377 /* Exception test cases - all should fail with the same exception */
378 utlb_read_test_exc:
379 mov r10, r8
380 bsr utlb_expect_exc
381 nop
383 /* Test mov.l Rm, Rn */
384 mova test_readl_1, r0
385 .align 4
386 test_readl_1:
387 mov.l @r10, r1
388 bsr utlb_check_read_exc
389 nop
391 /* Test mov.l @Rm+, Rn */
392 mova test_readl_2, r0
393 .align 4
394 test_readl_2:
395 mov.l @r8+, r1
396 bsr utlb_check_read_exc
397 nop
398 cmp/eq r8,r10
399 bt test_readl_2_ok
401 add #1, r14
402 mov.l err_readlp_bad_msg_k, r4
403 mov r9, r5
404 trapa #41
406 test_readl_2_ok:
407 /* Test mov.w @Rm, Rn */
408 mova test_readw_1, r0
409 .align 4
410 test_readw_1:
411 mov.w @r10, r1
412 bsr utlb_check_read_exc
413 nop
415 /* Test mov.w @Rm+, Rn */
416 mova test_readw_2, r0
417 .align 4
418 test_readw_2:
419 mov.w @r8+, r1
420 bsr utlb_check_read_exc
421 nop
422 cmp/eq r8, r10
423 bt test_readw_2_ok
425 add #1, r14
426 mov.l err_readwp_bad_msg_k, r4
427 mov r9, r5
428 trapa #41
430 test_readw_2_ok:
432 /* Test mov.b @Rm, Rn */
433 mova test_readb_1, r0
434 .align 4
435 test_readb_1:
436 mov.b @r10, r1
437 bsr utlb_check_read_exc
438 nop
440 /* Test mov.b @Rm+, Rn */
441 mova test_readb_2, r0
442 .align 4
443 test_readb_2:
444 mov.b @r8+, r1
445 bsr utlb_check_read_exc
446 nop
447 cmp/eq r8, r10
448 bt test_readb_2_ok
450 add #1, r14
451 mov.l err_readbp_bad_msg_k, r4
452 mov r9, r5
453 trapa #41
455 test_readb_2_ok:
457 bra utlb_read_test_done
458 nop
460 /* Non-exception read tests */
461 utlb_read_test_noexc:
462 mov.l utlb_exc_k_2, r8
463 mov.l addr_mask, r0
464 and r0, r8
465 bsr utlb_noexpect_exc
466 nop
468 mov.l @r10, r1
469 not r1, r2
470 mov.l r2, @r11
471 ocbp @r11
472 ocbi @r10
473 mov.l @r10, r1
474 ocbi @r10
475 cmp/eq r1, r2
476 bt noexc_readl_ok
479 add #1, r14
480 mov.l err_read_mismatch_msg_k, r4
481 mov r9, r5
482 trapa #41
484 noexc_readl_ok:
486 mov.l @(4,r8), r0
487 add r0, r14
488 utlb_read_test_done:
490 /*********************** Begin write tests *****************************/
491 tst r13, r13
492 bt utlb_write_test_noexc
494 /* Exception write tests */
495 utlb_write_test_exc:
496 bsr utlb_expect_exc
497 nop
499 mova test_writel_pc, r0
500 .align 4
501 test_writel_pc:
502 mov.l r1, @r10
503 bsr utlb_check_write_exc
504 nop
506 mova test_writelp_pc, r0
507 mov r10, r8
508 .align 4
509 test_writelp_pc:
510 mov.l r1, @-r8
511 bsr utlb_check_write_exc
512 nop
513 cmp/eq r8, r10
514 bt test_writelp_ok
515 add #1, r14
516 mov.l err_writelp_bad_msg_k, r4
517 mov r9, r5
518 trapa #41
519 test_writelp_ok:
521 mova test_writew_pc, r0
522 .align 4
523 test_writew_pc:
524 mov.w r1, @r10
525 bsr utlb_check_write_exc
526 nop
528 mova test_writewp_pc, r0
529 mov r10, r8
530 .align 4
531 test_writewp_pc:
532 mov.w r1, @-r8
533 bsr utlb_check_write_exc
534 nop
535 cmp/eq r8, r10
536 bt test_writewp_ok
537 add #1, r14
538 mov.l err_writewp_bad_msg_k, r4
539 mov r9, r5
540 trapa #41
541 test_writewp_ok:
543 mova test_writeb_pc, r0
544 .align 4
545 test_writeb_pc:
546 mov.b r1, @r10
547 bsr utlb_check_write_exc
548 nop
550 mova test_writebp_pc, r0
551 mov r10, r8
552 .align 4
553 test_writebp_pc:
554 mov.b r1, @-r8
555 bsr utlb_check_write_exc
556 nop
557 cmp/eq r8, r10
558 bt test_writebp_ok
559 add #1, r14
560 mov.l err_writelp_bad_msg_k, r4
561 mov r9, r5
562 trapa #41
563 test_writebp_ok:
565 bra utlb_write_test_done
566 nop
568 /* Non-exception write tests */
569 utlb_write_test_noexc:
570 mov.l utlb_exc_k_2, r8
571 mov.l addr_mask, r0
572 and r0, r8
573 bsr utlb_noexpect_exc
574 nop
576 mov.l @r11, r7
577 ocbp @r11
578 not r7, r1
580 mov.l r1, @r10
581 ocbp @r10
582 mov.l @r11, r6
583 cmp/eq r6, r1
584 bt test_writel_1_ok
586 add #1, r14
587 mov.l err_write_ignored_msg_k, r4
588 mov r9, r5
589 trapa #41
591 test_writel_1_ok:
593 mov.l @(4,r8), r0
594 add r0, r14
595 utlb_write_test_done:
597 xor r0, r0
598 mov.l r0, @(16,r8)
600 mov.l @r15+, r0
601 mov.l r0, @r11
602 mov.l @r15+, r8
603 mov.l @r15+, r9
604 mov.l @r15+, r10
605 mov.l @r15+, r11
606 mov.l @r15+, r12
607 mov.l @r15+, r13
608 mov.l @r15+, r1
609 lds r1, pr
610 mov r14, r0
611 mov.l @r15+, r14
612 rts
613 nop
615 .align 4
616 err_read_mismatch_msg_k:
617 .long err_read_mismatch_msg
618 err_write_ignored_msg_k:
619 .long err_write_ignored_msg
620 err_readlp_bad_msg_k:
621 .long err_readlp_bad_msg
622 err_readwp_bad_msg_k:
623 .long err_readwp_bad_msg
624 err_readbp_bad_msg_k:
625 .long err_readbp_bad_msg
626 err_writelp_bad_msg_k:
627 .long err_readlp_bad_msg
628 err_writewp_bad_msg_k:
629 .long err_readwp_bad_msg
630 err_writebp_bad_msg_k:
631 .long err_readbp_bad_msg
635 .global _run_utlb_user_test
636 _run_utlb_user_test:
637 sts pr, r0
638 mov.l r0, @-r15
639 stc sr, r2
640 mov.l sr_mask, r1
641 and r1, r2
643 mova user_entry_point, r0
644 mov.l addr_mask, r1
645 and r1, r0
647 mov.l r15, @-r15
649 jmp @r0
650 nop
652 nop
653 user_entry_point:
654 ldc r2, sr
656 /* In user mode */
658 mov.l main_test_k, r0
659 and r1, r0
660 and r1, r4
661 and r1, r15
662 jsr @r0
663 nop
665 /* Done, return to priv mode */
666 trapa #42
667 mov.l user_retaddr, r1
668 jmp @r1
669 nop
671 user_exit_point:
672 /* Back to priv mode */
673 mov.l @r15+, r15
674 mov.l @r15+, r1
675 lds r1, pr
676 rts
677 nop
678 .align 4
680 utlb_exc_k_2:
681 .long utlb_exc
682 main_test_k:
683 .long _run_utlb_priv_test
684 addr_mask:
685 .long 0x1FFFFFFF
686 sr_mask:
687 .long 0x3FFFFFFF
688 user_retaddr:
689 .long user_exit_point
691 err_read_exc_msg:
692 .string "%s: Read failed: Expected Exc %04X but got %04X\n"
693 err_read_count_msg:
694 .string "%s: Read bad exception: Exception 1 exception, but got %d\n"
695 err_read_pc_msg:
696 .string "%s: Read bad exception: Expected PC=%08X but was %08X\n"
697 err_read_mismatch_msg:
698 .string "%s: Read failed: Data mismatch!\n"
699 err_readlp_bad_msg:
700 .string "%s: Mov.l @Rm+, Rn failed: Rm changed!\n"
701 err_readwp_bad_msg:
702 .string "%s: Mov.w @Rm+, Rn failed: Rm changed!\n"
703 err_readbp_bad_msg:
704 .string "%s: Mov.b @Rm+, Rn failed: Rm changed!\n"
705 err_writelp_bad_msg:
706 .string "%s: Mov.l Rm, @-Rn failed: Rm changed!\n"
707 err_writewp_bad_msg:
708 .string "%s: Mov.w Rm, @-Rn failed: Rm changed!\n"
709 err_writebp_bad_msg:
710 .string "%s: Mov.b Rm, @-Rn failed: Rm changed!\n"
711 err_write_exc_msg:
712 .string "%s: Write failed: Expected Exc %04X but got %04X\n"
713 err_write_count_msg:
714 .string "%s: Write bad exception: Expected 1 exception, but got %d\n"
715 err_write_pc_msg:
716 .string "%s: Write bad exception: Expected PC=%08X but was %08X\n"
717 err_write_ignored_msg:
718 .string "%s: Write failed: write didn't happen!\n"
719 utlb_unexpected_msg:
720 .string "*** Unexpected exception %04X at %08X!\n"
.