master
s 771 lines 15.6 KB
Raw
1 #include "macros.inc"
2
3 test_suite mmu
4
5 #if XCHAL_HAVE_PTP_MMU
6 #define BASE 0x20000000
7 #define TLB_BASE 0x80000000
8
9 .purgem test_init
10
11 .macro clean_tlb_way way, page_size, n_entries
12 movi a2, \way
13 movi a3, \page_size
14 movi a4, \n_entries
15 loop a4, 1f
16 idtlb a2
17 iitlb a2
18 add a2, a2, a3
19 1:
20 .endm
21
22 .macro test_init
23 clean_tlb_way 0, 0x00001000, 4
24 clean_tlb_way 1, 0x00001000, 4
25 clean_tlb_way 2, 0x00001000, 4
26 clean_tlb_way 3, 0x00001000, 4
27 clean_tlb_way 4, 0x00100000, 4
28 movi a2, 0x00000007
29 idtlb a2
30 movi a2, 0x00000008
31 idtlb a2
32 movi a2, 0x00000009
33 idtlb a2
34 #if XCHAL_HAVE_SPANNING_WAY
35 movi a2, BASE | XCHAL_SPANNING_WAY
36 idtlb a2
37 iitlb a2
38 movi a2, TLB_BASE | XCHAL_SPANNING_WAY
39 idtlb a2
40 iitlb a2
41 movi a2, TLB_BASE
42 wsr a2, ptevaddr
43 #endif
44 .endm
45
46 test tlb_group
47 movi a2, 0x04000002 /* PPN */
48 movi a3, BASE + 0x01200004 /* VPN */
49 wdtlb a2, a3
50 witlb a2, a3
51 movi a3, 0x00200004
52 rdtlb0 a1, a3
53 ritlb0 a2, a3
54 movi a3, BASE + 0x01000001
55 assert eq, a1, a3
56 assert eq, a2, a3
57 movi a3, 0x00200004
58 rdtlb1 a1, a3
59 ritlb1 a2, a3
60 movi a3, 0x04000002
61 assert eq, a1, a3
62 assert eq, a2, a3
63 movi a3, BASE + 0x01234567
64 pdtlb a1, a3
65 pitlb a2, a3
66 movi a3, BASE + 0x01234014
67 assert eq, a1, a3
68 movi a3, BASE + 0x0123400c
69 assert eq, a2, a3
70 movi a3, 0x00200004
71 idtlb a3
72 iitlb a3
73 movi a3, BASE + 0x01234567
74 pdtlb a1, a3
75 pitlb a2, a3
76 movi a3, 0x00000010
77 and a1, a1, a3
78 assert eqi, a1, 0
79 movi a3, 0x00000008
80 and a2, a2, a3
81 assert eqi, a2, 0
82 test_end
83
84 test itlb_miss
85 set_vector kernel, 1f
86
87 movi a3, BASE + 0x00100000
88 jx a3
89 test_fail
90 1:
91 rsr a2, excvaddr
92 assert eq, a2, a3
93 rsr a2, exccause
94 movi a3, 16
95 assert eq, a2, a3
96 test_end
97
98 test dtlb_miss
99 set_vector kernel, 1f
100
101 movi a3, BASE + 0x00100000
102 l8ui a2, a3, 0
103 test_fail
104 1:
105 rsr a2, excvaddr
106 assert eq, a2, a3
107 rsr a2, exccause
108 movi a3, 24
109 assert eq, a2, a3
110 test_end
111
112 test itlb_multi_hit
113 set_vector kernel, 1f
114
115 movi a2, 0x04000002 /* PPN */
116 movi a3, 0xf0000004 /* VPN */
117 witlb a2, a3
118 movi a3, 0xf0000000
119 pitlb a2, a3
120 test_fail
121 1:
122 rsr a2, exccause
123 movi a3, 17
124 assert eq, a2, a3
125 test_end
126
127 test dtlb_multi_hit
128 set_vector kernel, 1f
129
130 movi a2, 0x04000002 /* PPN */
131 movi a3, BASE + 0x01200004 /* VPN */
132 wdtlb a2, a3
133 movi a3, BASE + 0x01200007 /* VPN */
134 wdtlb a2, a3
135 movi a3, BASE + 0x01200000
136 pdtlb a2, a3
137 test_fail
138 1:
139 rsr a2, exccause
140 movi a3, 25
141 assert eq, a2, a3
142 test_end
143
144 test inst_fetch_privilege
145 set_vector kernel, 3f
146
147 movi a2, 0x4004f
148 wsr a2, ps
149 1:
150 isync
151 nop
152 2:
153 test_fail
154 3:
155 movi a1, 1b
156 rsr a2, excvaddr
157 rsr a3, epc1
158 assert ge, a2, a1
159 assert ge, a3, a1
160 movi a1, 2b
161 assert lt, a2, a1
162 assert lt, a3, a1
163 rsr a2, exccause
164 movi a3, 18
165 assert eq, a2, a3
166 rsr a2, ps
167 movi a3, 0x4005f
168 assert eq, a2, a3
169 test_end
170
171 test load_store_privilege
172 set_vector kernel, 2f
173
174 movi a3, 10f
175 pitlb a3, a3
176 ritlb1 a2, a3
177 movi a1, 0x10
178 or a2, a2, a1
179 movi a1, 0x000ff000
180 and a3, a3, a1
181 movi a1, 4
182 or a3, a3, a1
183 movi a5, BASE
184 add a3, a3, a5
185 witlb a2, a3
186 movi a3, 10f
187 movi a1, 0x000fffff
188 and a1, a3, a1
189 add a1, a1, a5
190
191 movi a2, 0x04000003 /* PPN */
192 movi a3, BASE + 0x01200004 /* VPN */
193 wdtlb a2, a3
194 movi a3, BASE + 0x01200001
195 movi a2, 0x4004f
196 jx a1
197 10:
198 wsr a2, ps
199 isync
200 1:
201 l8ui a2, a3, 0
202 test_fail
203 2:
204 rsr a2, excvaddr
205 assert eq, a2, a3
206 rsr a2, epc1
207 movi a3, 1b
208 movi a1, 0x000fffff
209 and a3, a3, a1
210 add a3, a3, a5
211 assert eq, a2, a3
212 rsr a2, exccause
213 movi a3, 26
214 assert eq, a2, a3
215 rsr a2, ps
216 movi a3, 0x4005f
217 assert eq, a2, a3
218 test_end
219
220 test cring_load_store_privilege
221 set_vector kernel, 0
222 set_vector double, 2f
223
224 movi a2, 0x04000003 /* PPN */
225 movi a3, BASE + 0x01200004 /* VPN */
226 wdtlb a2, a3
227 movi a3, BASE + 0x01200004
228 movi a2, 0x4005f /* ring 1 + excm => cring == 0 */
229 wsr a2, ps
230 isync
231 l8ui a2, a3, 0 /* cring used */
232 1:
233 l32e a2, a3, -4 /* ring used */
234 test_fail
235 2:
236 rsr a2, excvaddr
237 addi a2, a2, 4
238 assert eq, a2, a3
239 rsr a2, depc
240 movi a3, 1b
241 assert eq, a2, a3
242 rsr a2, exccause
243 movi a3, 26
244 assert eq, a2, a3
245 rsr a2, ps
246 movi a3, 0x4005f
247 assert eq, a2, a3
248 test_end
249
250 test inst_fetch_prohibited
251 set_vector kernel, 2f
252
253 movi a3, 10f
254 pitlb a3, a3
255 ritlb1 a2, a3
256 movi a1, 0xfffff000
257 and a2, a2, a1
258 movi a1, 0x4
259 or a2, a2, a1
260 movi a1, 0x000ff000
261 and a3, a3, a1
262 movi a1, 4
263 or a3, a3, a1
264 movi a5, BASE
265 add a3, a3, a5
266 witlb a2, a3
267 movi a3, 10f
268 movi a1, 0x000fffff
269 and a1, a3, a1
270 add a1, a1, a5
271 jx a1
272 .align 4
273 10:
274 nop
275 test_fail
276 2:
277 rsr a2, excvaddr
278 assert eq, a2, a1
279 rsr a2, epc1
280 assert eq, a2, a1
281 rsr a2, exccause
282 movi a3, 20
283 assert eq, a2, a3
284 test_end
285
286 test load_prohibited
287 set_vector kernel, 2f
288
289 movi a2, 0x0400000c /* PPN */
290 movi a3, BASE + 0x01200004 /* VPN */
291 wdtlb a2, a3
292 movi a3, BASE + 0x01200002
293 1:
294 l8ui a2, a3, 0
295 test_fail
296 2:
297 rsr a2, excvaddr
298 assert eq, a2, a3
299 rsr a2, epc1
300 movi a3, 1b
301 assert eq, a2, a3
302 rsr a2, exccause
303 movi a3, 28
304 assert eq, a2, a3
305 test_end
306
307 test store_prohibited
308 set_vector kernel, 2f
309
310 movi a2, 0x04000001 /* PPN */
311 movi a3, BASE + 0x01200004 /* VPN */
312 wdtlb a2, a3
313 movi a3, BASE + 0x01200003
314 l8ui a2, a3, 0
315 1:
316 s8i a2, a3, 0
317 test_fail
318 2:
319 rsr a2, excvaddr
320 assert eq, a2, a3
321 rsr a2, epc1
322 movi a3, 1b
323 assert eq, a2, a3
324 rsr a2, exccause
325 movi a3, 29
326 assert eq, a2, a3
327 test_end
328
329 /* Set up page table entry vaddr->paddr, ring=pte_ring, attr=pte_attr
330 * and DTLB way 7 to cover this PTE, ring=pt_ring, attr=pt_attr
331 */
332 .macro pt_setup pt_ring, pt_attr, pte_ring, vaddr, paddr, pte_attr
333 movi a2, TLB_BASE
334 wsr a2, ptevaddr
335
336 movi a3, TLB_BASE | 7 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */
337 movi a4, 0x04000003 | ((\pt_ring) << 4) /* PADDR 64M */
338 wdtlb a4, a3
339 isync
340
341 movi a3, ((\paddr) & 0xfffff000) | ((\pte_ring) << 4) | (\pte_attr)
342 movi a1, ((\vaddr) >> 12) << 2
343 add a2, a1, a2
344 s32i a3, a2, 0
345
346 movi a3, TLB_BASE | 7 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */
347 movi a4, 0x04000000 | ((\pt_ring) << 4) | (\pt_attr) /* PADDR 64M */
348 wdtlb a4, a3
349 isync
350
351 movi a3, (\vaddr)
352 .endm
353
354 /* out: PS.RING=ring, PS.EXCM=excm, a3=vaddr */
355 .macro go_ring ring, excm, vaddr
356 movi a3, 10f
357 pitlb a3, a3
358 ritlb1 a2, a3
359 movi a1, 0x10
360 or a2, a2, a1
361 movi a1, 0x000ff000
362 and a3, a3, a1
363 movi a1, 4
364 or a3, a3, a1
365 movi a5, BASE
366 add a3, a3, a5
367 witlb a2, a3
368 movi a3, 10f
369 movi a1, 0x000fffff
370 and a1, a3, a1
371 add a1, a1, a5
372
373 movi a2, 0
374 wsr a2, excvaddr
375
376 movi a3, \vaddr
377 movi a2, 0x4000f | ((\ring) << 6) | ((\excm) << 4)
378 jx a1
379 10:
380 wsr a2, ps
381 isync
382 .endm
383
384 /* in: a3 -- virtual address to test */
385 .macro assert_auto_tlb
386 movi a2, 0x4000f
387 wsr a2, ps
388 isync
389 pdtlb a2, a3
390 movi a1, 0xfffff01f
391 and a2, a2, a1
392 movi a1, 0xfffff000
393 and a1, a1, a3
394 xor a1, a1, a2
395 assert gei, a1, 0x10
396 movi a2, 0x14
397 assert lt, a1, a2
398 .endm
399
400 /* in: a3 -- virtual address to test */
401 .macro assert_no_auto_tlb
402 movi a2, 0x4000f
403 wsr a2, ps
404 isync
405 pdtlb a2, a3
406 movi a1, 0x10
407 and a1, a1, a2
408 assert eqi, a1, 0
409 .endm
410
411 .macro assert_sr sr, v
412 rsr a2, \sr
413 movi a1, (\v)
414 assert eq, a1, a2
415 .endm
416
417 .macro assert_epc1_1m vaddr
418 movi a2, (\vaddr)
419 movi a1, 0xfffff
420 and a1, a1, a2
421 movi a5, BASE
422 add a1, a1, a5
423 rsr a2, epc1
424 assert eq, a1, a2
425 .endm
426
427 test dtlb_autoload
428 set_vector kernel, 0
429
430 pt_setup 0, 3, 1, BASE + 0x1000, 0x1000, 3
431 assert_no_auto_tlb
432
433 l8ui a1, a3, 0
434
435 rsr a2, excvaddr
436 assert eq, a2, a3
437
438 assert_auto_tlb
439 test_end
440
441 test autoload_load_store_privilege
442 set_vector kernel, 0
443 set_vector double, 2f
444
445 pt_setup 0, 3, 0, BASE + 0x2000, 0x2000, 3
446 movi a3, BASE + 0x2004
447 assert_no_auto_tlb
448
449 movi a2, 0x4005f /* ring 1 + excm => cring == 0 */
450 wsr a2, ps
451 isync
452 1:
453 l32e a2, a3, -4 /* ring used */
454 test_fail
455 2:
456 rsr a2, excvaddr
457 addi a1, a3, -4
458 assert eq, a1, a2
459
460 assert_auto_tlb
461 assert_sr depc, 1b
462 assert_sr exccause, 26
463 test_end
464
465 test autoload_pte_load_prohibited
466 set_vector kernel, 2f
467
468 pt_setup 0, 3, 0, BASE + 0x3000, 0, 0xc
469 assert_no_auto_tlb
470 1:
471 l32i a2, a3, 0
472 test_fail
473 2:
474 rsr a2, excvaddr
475 assert eq, a2, a3
476
477 assert_auto_tlb
478 assert_sr epc1, 1b
479 assert_sr exccause, 28
480 test_end
481
482 test autoload_pt_load_prohibited
483 set_vector kernel, 2f
484
485 pt_setup 0, 0xc, 0, BASE + 0x4000, 0x4000, 3
486 assert_no_auto_tlb
487 1:
488 l32i a2, a3, 0
489 test_fail
490 2:
491 rsr a2, excvaddr
492 assert eq, a2, a3
493
494 assert_no_auto_tlb
495 assert_sr epc1, 1b
496 assert_sr exccause, 24
497 test_end
498
499 test autoload_pt_privilege
500 set_vector kernel, 2f
501 pt_setup 0, 3, 1, BASE + 0x5000, 0, 3
502 go_ring 1, 0, BASE + 0x5001
503
504 l8ui a2, a3, 0
505 1:
506 syscall
507 2:
508 rsr a2, excvaddr
509 assert eq, a2, a3
510
511 assert_auto_tlb
512 assert_epc1_1m 1b
513 assert_sr exccause, 1
514 test_end
515
516 test autoload_pte_privilege
517 set_vector kernel, 2f
518 pt_setup 0, 3, 0, BASE + 0x6000, 0, 3
519 go_ring 1, 0, BASE + 0x6001
520 1:
521 l8ui a2, a3, 0
522 syscall
523 2:
524 rsr a2, excvaddr
525 assert eq, a2, a3
526
527 assert_auto_tlb
528 assert_epc1_1m 1b
529 assert_sr exccause, 26
530 test_end
531
532 test autoload_3_level_pt
533 set_vector kernel, 2f
534 pt_setup 1, 3, 1, BASE + 0x00400000, 0, 3
535 pt_setup 1, 3, 1, TLB_BASE + ((BASE + 0x00400000) >> 10), 0x2000000, 3
536 go_ring 1, 0, BASE + 0x00400001
537 1:
538 l8ui a2, a3, 0
539 syscall
540 2:
541 rsr a2, excvaddr
542 assert eq, a2, a3
543
544 assert_no_auto_tlb
545 assert_epc1_1m 1b
546 assert_sr exccause, 24
547 test_end
548
549 test cross_page_insn
550 set_vector kernel, 2f
551
552 movi a2, 0x04000003 /* PPN */
553 movi a3, BASE + 0x00007000 /* VPN */
554 witlb a2, a3
555 wdtlb a2, a3
556 movi a3, BASE + 0x00008000 /* VPN */
557 witlb a2, a3
558 wdtlb a2, a3
559
560 movi a2, BASE + 0x00007fff
561 movi a3, 20f
562 movi a4, 21f
563 sub a4, a4, a3
564 loop a4, 1f
565 l8ui a5, a3, 0
566 s8i a5, a2, 0
567 addi a2, a2, 1
568 addi a3, a3, 1
569 1:
570 movi a2, BASE + 0x00007fff
571 movi a3, BASE + 0x00008000
572 /* DTLB: OK, ITLB: OK */
573 jx a2
574
575 .begin no-transform
576 20:
577 l32i a2, a3, 0
578 syscall
579 21:
580 .end no-transform
581
582 2:
583 rsr a2, exccause
584 movi a3, 1
585 assert eq, a2, a3
586 rsr a2, epc1
587 movi a3, BASE + 0x8002
588 assert eq, a2, a3
589 rsr a2, excsave1
590 movi a3, BASE + 0x00007fff
591 assert ne, a2, a3
592
593 reset_ps
594 set_vector kernel, 3f
595
596 movi a2, 0x0400000c /* PPN */
597 movi a3, BASE + 0x00008000 /* VPN */
598 wdtlb a2, a3
599 movi a2, BASE + 0x00007fff
600 movi a3, BASE + 0x00008000
601 /* DTLB: FAIL, ITLB: OK */
602 jx a2
603 3:
604 rsr a2, exccause
605 movi a3, 28
606 assert eq, a2, a3
607 rsr a2, epc1
608 movi a3, BASE + 0x7fff
609 assert eq, a2, a3
610 rsr a2, excsave1
611 movi a3, BASE + 0x00007fff
612 assert eq, a2, a3
613
614 reset_ps
615 set_vector kernel, 4f
616
617 movi a2, 0x0400000c /* PPN */
618 movi a3, BASE + 0x00008000 /* VPN */
619 witlb a2, a3
620 movi a2, 0x04000003 /* PPN */
621 wdtlb a2, a3
622 movi a2, BASE + 0x00007fff
623 movi a3, BASE + 0x00008000
624 /* DTLB: OK, ITLB: FAIL */
625 jx a2
626 4:
627 rsr a2, exccause
628 movi a3, 20
629 assert eq, a2, a3
630 rsr a2, epc1
631 movi a3, BASE + 0x7fff
632 assert eq, a2, a3
633 rsr a2, excsave1
634 movi a3, BASE + 0x00007fff
635 assert eq, a2, a3
636
637 reset_ps
638 set_vector kernel, 5f
639
640 movi a2, 0x0400000c /* PPN */
641 movi a3, BASE + 0x00008000 /* VPN */
642 wdtlb a2, a3
643 movi a2, BASE + 0x00007fff
644 movi a3, BASE + 0x00008000
645 /* DTLB: FAIL, ITLB: FAIL */
646 jx a2
647 5:
648 rsr a2, exccause
649 movi a3, 20
650 assert eq, a2, a3
651 rsr a2, epc1
652 movi a3, BASE + 0x7fff
653 assert eq, a2, a3
654 rsr a2, excsave1
655 movi a3, BASE + 0x00007fff
656 assert eq, a2, a3
657 test_end
658
659 test cross_page_tb
660 set_vector kernel, 2f
661
662 movi a2, 0x04000003 /* PPN */
663 movi a3, BASE + 0x00007000 /* VPN */
664 witlb a2, a3
665 wdtlb a2, a3
666 movi a3, BASE + 0x00008000 /* VPN */
667 witlb a2, a3
668 wdtlb a2, a3
669
670 movi a2, BASE + 0x00007ffc
671 movi a3, 20f
672 movi a4, 21f
673 sub a4, a4, a3
674 loop a4, 1f
675 l8ui a5, a3, 0
676 s8i a5, a2, 0
677 addi a2, a2, 1
678 addi a3, a3, 1
679 1:
680 movi a2, BASE + 0x00007ffc
681 movi a3, BASE + 0x00008000
682 /* DTLB: OK, ITLB: OK */
683 jx a2
684
685 .begin no-transform
686 20:
687 l32i a2, a3, 0
688 syscall
689 21:
690 .end no-transform
691
692 2:
693 rsr a2, exccause
694 movi a3, 1
695 assert eq, a2, a3
696 rsr a2, epc1
697 movi a3, BASE + 0x7fff
698 assert eq, a2, a3
699 rsr a2, excsave1
700 movi a3, BASE + 0x00007ffc
701 assert ne, a2, a3
702
703 reset_ps
704 set_vector kernel, 3f
705
706 movi a2, 0x0400000c /* PPN */
707 movi a3, BASE + 0x00008000 /* VPN */
708 wdtlb a2, a3
709 movi a2, BASE + 0x00007ffc
710 movi a3, BASE + 0x00008000
711 /* DTLB: FAIL, ITLB: OK */
712 jx a2
713 3:
714 rsr a2, exccause
715 movi a3, 28
716 assert eq, a2, a3
717 rsr a2, epc1
718 movi a3, BASE + 0x7ffc
719 assert eq, a2, a3
720 rsr a2, excsave1
721 movi a3, BASE + 0x00007ffc
722 assert eq, a2, a3
723
724 reset_ps
725 set_vector kernel, 4f
726
727 movi a2, 0x0400000c /* PPN */
728 movi a3, BASE + 0x00008000 /* VPN */
729 witlb a2, a3
730 movi a2, 0x04000003 /* PPN */
731 wdtlb a2, a3
732 movi a2, BASE + 0x00007ffc
733 movi a3, BASE + 0x00008000
734 /* DTLB: OK, ITLB: FAIL */
735 jx a2
736 4:
737 rsr a2, exccause
738 movi a3, 20
739 assert eq, a2, a3
740 rsr a2, epc1
741 movi a3, BASE + 0x7fff
742 assert eq, a2, a3
743 rsr a2, excsave1
744 movi a3, BASE + 0x00007ffc
745 assert ne, a2, a3
746
747 reset_ps
748 set_vector kernel, 5f
749
750 movi a2, 0x0400000c /* PPN */
751 movi a3, BASE + 0x00008000 /* VPN */
752 wdtlb a2, a3
753 movi a2, BASE + 0x00007ffc
754 movi a3, BASE + 0x00008000
755 /* DTLB: FAIL, ITLB: FAIL */
756 jx a2
757 5:
758 rsr a2, exccause
759 movi a3, 28
760 assert eq, a2, a3
761 rsr a2, epc1
762 movi a3, BASE + 0x7ffc
763 assert eq, a2, a3
764 rsr a2, excsave1
765 movi a3, BASE + 0x00007ffc
766 assert eq, a2, a3
767 test_end
768
769 #endif
770
771 test_suite_end