Acceptance tests: show test report on GitLab CI
[qemu/ar7.git] / tests / tcg / xtensa / test_mmu.S
blob4cbd6ef4f9d831e5ade4be27bb4eef1be1eaa11c
1 #include "macros.inc"
3 test_suite mmu
5 #if XCHAL_HAVE_PTP_MMU && !XCHAL_HAVE_SPANNING_WAY
7 .purgem test_init
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
18 .endm
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
34 test tlb_group
35     movi    a2, 0x04000002 /* PPN */
36     movi    a3, 0x01200004 /* VPN */
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
70 test_end
72 test itlb_miss
73     set_vector kernel, 1f
75     movi    a3, 0x00100000
76     jx      a3
77     test_fail
79     rsr     a2, excvaddr
80     assert  eq, a2, a3
81     rsr     a2, exccause
82     movi    a3, 16
83     assert  eq, a2, a3
84 test_end
86 test dtlb_miss
87     set_vector kernel, 1f
89     movi    a3, 0x00100000
90     l8ui    a2, a3, 0
91     test_fail
93     rsr     a2, excvaddr
94     assert  eq, a2, a3
95     rsr     a2, exccause
96     movi    a3, 24
97     assert  eq, a2, a3
98 test_end
100 test itlb_multi_hit
101     set_vector kernel, 1f
103     movi    a2, 0x04000002 /* PPN */
104     movi    a3, 0xf0000004 /* VPN */
105     witlb   a2, a3
106     movi    a3, 0xf0000000
107     pitlb   a2, a3
108     test_fail
110     rsr     a2, exccause
111     movi    a3, 17
112     assert  eq, a2, a3
113 test_end
115 test dtlb_multi_hit
116     set_vector kernel, 1f
118     movi    a2, 0x04000002 /* PPN */
119     movi    a3, 0x01200004 /* VPN */
120     wdtlb   a2, a3
121     movi    a3, 0x01200007 /* VPN */
122     wdtlb   a2, a3
123     movi    a3, 0x01200000
124     pdtlb   a2, a3
125     test_fail
127     rsr     a2, exccause
128     movi    a3, 25
129     assert  eq, a2, a3
130 test_end
132 test inst_fetch_privilege
133     set_vector kernel, 3f
135     movi    a2, 0x4004f
136     wsr     a2, ps
138     isync
139     nop
141     test_fail
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
157 test_end
159 test load_store_privilege
160     set_vector kernel, 2f
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
176     movi    a2, 0x04000003 /* PPN */
177     movi    a3, 0x01200004 /* VPN */
178     wdtlb   a2, a3
179     movi    a3, 0x01200001
180     movi    a2, 0x4004f
181     jx      a1
183     wsr     a2, ps
184     isync
186     l8ui    a2, a3, 0
187     test_fail
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
202 test_end
204 test cring_load_store_privilege
205     set_vector kernel, 0
206     set_vector double, 2f
208     movi    a2, 0x04000003 /* PPN */
209     movi    a3, 0x01200004 /* VPN */
210     wdtlb   a2, a3
211     movi    a3, 0x01200004
212     movi    a2, 0x4005f    /* ring 1 + excm => cring == 0 */
213     wsr     a2, ps
214     isync
215     l8ui    a2, a3, 0      /* cring used */
217     l32e    a2, a3, -4     /* ring used */
218     test_fail
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
232 test_end
234 test inst_fetch_prohibited
235     set_vector kernel, 2f
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
255     nop
256     test_fail
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
265 test_end
267 test load_prohibited
268     set_vector kernel, 2f
270     movi    a2, 0x0400000c /* PPN */
271     movi    a3, 0x01200004 /* VPN */
272     wdtlb   a2, a3
273     movi    a3, 0x01200002
275     l8ui    a2, a3, 0
276     test_fail
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
286 test_end
288 test store_prohibited
289     set_vector kernel, 2f
291     movi    a2, 0x04000001 /* PPN */
292     movi    a3, 0x01200004 /* VPN */
293     wdtlb   a2, a3
294     movi    a3, 0x01200003
295     l8ui    a2, a3, 0
297     s8i     a2, a3, 0
298     test_fail
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
308 test_end
310 /* Set up page table entry vaddr->paddr, ring=pte_ring, attr=pte_attr
311  * and DTLB way 7 to cover this PTE, ring=pt_ring, attr=pt_attr
312  */
313 .macro pt_setup pt_ring, pt_attr, pte_ring, vaddr, paddr, pte_attr
314     movi    a2, 0x80000000
315     wsr     a2, ptevaddr
317     movi    a3, 0x80000007 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */
318     movi    a4, 0x04000003 | ((\pt_ring) << 4) /* PADDR 64M */
319     wdtlb   a4, a3
320     isync
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
327     movi    a3, 0x80000007 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */
328     movi    a4, 0x04000000 | ((\pt_ring) << 4) | (\pt_attr) /* PADDR 64M */
329     wdtlb   a4, a3
330     isync
332     movi    a3, (\vaddr)
333 .endm
335 /* out: PS.RING=ring, PS.EXCM=excm, a3=vaddr */
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
351     movi    a2, 0
352     wsr     a2, excvaddr
354     movi    a3, \vaddr
355     movi    a2, 0x4000f | ((\ring) << 6) | ((\excm) << 4)
356     jx      a1
358     wsr     a2, ps
359     isync
360 .endm
362 /* in: a3 -- virtual address to test */
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
378 /* in: a3 -- virtual address to test */
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
389 .macro assert_sr sr, v
390     rsr     a2, \sr
391     movi    a1, (\v)
392     assert  eq, a1, a2
393 .endm
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
403 test dtlb_autoload
404     set_vector kernel, 0
406     pt_setup    0, 3, 1, 0x1000, 0x1000, 3
407     assert_no_auto_tlb
409     l8ui    a1, a3, 0
411     rsr     a2, excvaddr
412     assert  eq, a2, a3
414     assert_auto_tlb
415 test_end
417 test autoload_load_store_privilege
418     set_vector kernel, 0
419     set_vector double, 2f
421     pt_setup    0, 3, 0, 0x2000, 0x2000, 3
422     movi    a3, 0x2004
423     assert_no_auto_tlb
425     movi    a2, 0x4005f    /* ring 1 + excm => cring == 0 */
426     wsr     a2, ps
427     isync
429     l32e    a2, a3, -4     /* ring used */
430     test_fail
432     rsr     a2, excvaddr
433     addi    a1, a3, -4
434     assert  eq, a1, a2
436     assert_auto_tlb
437     assert_sr depc, 1b
438     assert_sr exccause, 26
439 test_end
441 test autoload_pte_load_prohibited
442     set_vector kernel, 2f
444     pt_setup    0, 3, 0, 0x3000, 0, 0xc
445     assert_no_auto_tlb
447     l32i    a2, a3, 0
448     test_fail
450     rsr     a2, excvaddr
451     assert  eq, a2, a3
453     assert_auto_tlb
454     assert_sr epc1, 1b
455     assert_sr exccause, 28
456 test_end
458 test autoload_pt_load_prohibited
459     set_vector kernel, 2f
461     pt_setup    0, 0xc, 0, 0x4000, 0x4000, 3
462     assert_no_auto_tlb
464     l32i    a2, a3, 0
465     test_fail
467     rsr     a2, excvaddr
468     assert  eq, a2, a3
470     assert_no_auto_tlb
471     assert_sr epc1, 1b
472     assert_sr exccause, 24
473 test_end
475 test autoload_pt_privilege
476     set_vector  kernel, 2f
477     pt_setup    0, 3, 1, 0x5000, 0, 3
478     go_ring     1, 0, 0x5001
480     l8ui    a2, a3, 0
482     syscall
484     rsr     a2, excvaddr
485     assert  eq, a2, a3
487     assert_auto_tlb
488     assert_epc1_1m 1b
489     assert_sr exccause, 1
490 test_end
492 test autoload_pte_privilege
493     set_vector  kernel, 2f
494     pt_setup    0, 3, 0, 0x6000, 0, 3
495     go_ring     1, 0, 0x6001
497     l8ui    a2, a3, 0
498     syscall
500     rsr     a2, excvaddr
501     assert  eq, a2, a3
503     assert_auto_tlb
504     assert_epc1_1m 1b
505     assert_sr exccause, 26
506 test_end
508 test 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
514     l8ui    a2, a3, 0
515     syscall
517     rsr     a2, excvaddr
518     assert  eq, a2, a3
520     assert_no_auto_tlb
521     assert_epc1_1m 1b
522     assert_sr exccause, 24
523 test_end
525 test cross_page_insn
526     set_vector kernel, 2f
528     movi    a2, 0x04000003 /* PPN */
529     movi    a3, 0x00007000 /* VPN */
530     witlb   a2, a3
531     wdtlb   a2, a3
532     movi    a3, 0x00008000 /* VPN */
533     witlb   a2, a3
534     wdtlb   a2, a3
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
546     movi    a2, 0x00007fff
547     movi    a3, 0x00008000
548     /* DTLB: OK, ITLB: OK */
549     jx      a2
551     .begin  no-transform
553     l32i    a2, a3, 0
554     syscall
556     .end    no-transform
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
569     reset_ps
570     set_vector kernel, 3f
572     movi    a2, 0x0400000c /* PPN */
573     movi    a3, 0x00008000 /* VPN */
574     wdtlb   a2, a3
575     movi    a2, 0x00007fff
576     movi    a3, 0x00008000
577     /* DTLB: FAIL, ITLB: OK */
578     jx      a2
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
590     reset_ps
591     set_vector kernel, 4f
593     movi    a2, 0x0400000c /* PPN */
594     movi    a3, 0x00008000 /* VPN */
595     witlb   a2, a3
596     movi    a2, 0x04000003 /* PPN */
597     wdtlb   a2, a3
598     movi    a2, 0x00007fff
599     movi    a3, 0x00008000
600     /* DTLB: OK, ITLB: FAIL */
601     jx      a2
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
613     reset_ps
614     set_vector kernel, 5f
616     movi    a2, 0x0400000c /* PPN */
617     movi    a3, 0x00008000 /* VPN */
618     wdtlb   a2, a3
619     movi    a2, 0x00007fff
620     movi    a3, 0x00008000
621     /* DTLB: FAIL, ITLB: FAIL */
622     jx      a2
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
633 test_end
635 test cross_page_tb
636     set_vector kernel, 2f
638     movi    a2, 0x04000003 /* PPN */
639     movi    a3, 0x00007000 /* VPN */
640     witlb   a2, a3
641     wdtlb   a2, a3
642     movi    a3, 0x00008000 /* VPN */
643     witlb   a2, a3
644     wdtlb   a2, a3
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
656     movi    a2, 0x00007ffc
657     movi    a3, 0x00008000
658     /* DTLB: OK, ITLB: OK */
659     jx      a2
661     .begin  no-transform
663     l32i    a2, a3, 0
664     syscall
666     .end    no-transform
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
679     reset_ps
680     set_vector kernel, 3f
682     movi    a2, 0x0400000c /* PPN */
683     movi    a3, 0x00008000 /* VPN */
684     wdtlb   a2, a3
685     movi    a2, 0x00007ffc
686     movi    a3, 0x00008000
687     /* DTLB: FAIL, ITLB: OK */
688     jx      a2
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
700     reset_ps
701     set_vector kernel, 4f
703     movi    a2, 0x0400000c /* PPN */
704     movi    a3, 0x00008000 /* VPN */
705     witlb   a2, a3
706     movi    a2, 0x04000003 /* PPN */
707     wdtlb   a2, a3
708     movi    a2, 0x00007ffc
709     movi    a3, 0x00008000
710     /* DTLB: OK, ITLB: FAIL */
711     jx      a2
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
723     reset_ps
724     set_vector kernel, 5f
726     movi    a2, 0x0400000c /* PPN */
727     movi    a3, 0x00008000 /* VPN */
728     wdtlb   a2, a3
729     movi    a2, 0x00007ffc
730     movi    a3, 0x00008000
731     /* DTLB: FAIL, ITLB: FAIL */
732     jx      a2
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
743 test_end
745 #endif
747 test_suite_end