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