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