tests/qemu-iotests: Restrict tests using "--blockdev file" to the file protocol
[qemu/kevin.git] / tests / tcg / xtensa / test_mmu.S
blob1006c8cf77b2b6455911339916d790273c0e9488
1 #include "macros.inc"
3 test_suite mmu
5 #if XCHAL_HAVE_PTP_MMU
6 #define BASE 0x20000000
7 #define TLB_BASE 0x80000000
9 .purgem test_init
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
20 .endm
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
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
84 test itlb_miss
85     set_vector kernel, 1f
87     movi    a3, BASE + 0x00100000
88     jx      a3
89     test_fail
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
98 test dtlb_miss
99     set_vector kernel, 1f
101     movi    a3, BASE + 0x00100000
102     l8ui    a2, a3, 0
103     test_fail
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
112 test itlb_multi_hit
113     set_vector kernel, 1f
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
122     rsr     a2, exccause
123     movi    a3, 17
124     assert  eq, a2, a3
125 test_end
127 test dtlb_multi_hit
128     set_vector kernel, 1f
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
139     rsr     a2, exccause
140     movi    a3, 25
141     assert  eq, a2, a3
142 test_end
144 test inst_fetch_privilege
145     set_vector kernel, 3f
147     movi    a2, 0x4004f
148     wsr     a2, ps
150     isync
151     nop
153     test_fail
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
171 test load_store_privilege
172     set_vector kernel, 2f
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
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
198     wsr     a2, ps
199     isync
201     l8ui    a2, a3, 0
202     test_fail
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
220 test cring_load_store_privilege
221     set_vector kernel, 0
222     set_vector double, 2f
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 */
233     l32e    a2, a3, -4     /* ring used */
234     test_fail
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
250 test inst_fetch_prohibited
251     set_vector kernel, 2f
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
274     nop
275     test_fail
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
286 test load_prohibited
287     set_vector kernel, 2f
289     movi    a2, 0x0400000c /* PPN */
290     movi    a3, BASE + 0x01200004 /* VPN */
291     wdtlb   a2, a3
292     movi    a3, BASE + 0x01200002
294     l8ui    a2, a3, 0
295     test_fail
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
307 test store_prohibited
308     set_vector kernel, 2f
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
316     s8i     a2, a3, 0
317     test_fail
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
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
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
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
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
351     movi    a3, (\vaddr)
352 .endm
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
373     movi    a2, 0
374     wsr     a2, excvaddr
376     movi    a3, \vaddr
377     movi    a2, 0x4000f | ((\ring) << 6) | ((\excm) << 4)
378     jx      a1
380     wsr     a2, ps
381     isync
382 .endm
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
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
411 .macro assert_sr sr, v
412     rsr     a2, \sr
413     movi    a1, (\v)
414     assert  eq, a1, a2
415 .endm
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
427 test dtlb_autoload
428     set_vector kernel, 0
430     pt_setup    0, 3, 1, BASE + 0x1000, 0x1000, 3
431     assert_no_auto_tlb
433     l8ui    a1, a3, 0
435     rsr     a2, excvaddr
436     assert  eq, a2, a3
438     assert_auto_tlb
439 test_end
441 test autoload_load_store_privilege
442     set_vector kernel, 0
443     set_vector double, 2f
445     pt_setup    0, 3, 0, BASE + 0x2000, 0x2000, 3
446     movi    a3, BASE + 0x2004
447     assert_no_auto_tlb
449     movi    a2, 0x4005f    /* ring 1 + excm => cring == 0 */
450     wsr     a2, ps
451     isync
453     l32e    a2, a3, -4     /* ring used */
454     test_fail
456     rsr     a2, excvaddr
457     addi    a1, a3, -4
458     assert  eq, a1, a2
460     assert_auto_tlb
461     assert_sr depc, 1b
462     assert_sr exccause, 26
463 test_end
465 test autoload_pte_load_prohibited
466     set_vector kernel, 2f
468     pt_setup    0, 3, 0, BASE + 0x3000, 0, 0xc
469     assert_no_auto_tlb
471     l32i    a2, a3, 0
472     test_fail
474     rsr     a2, excvaddr
475     assert  eq, a2, a3
477     assert_auto_tlb
478     assert_sr epc1, 1b
479     assert_sr exccause, 28
480 test_end
482 test autoload_pt_load_prohibited
483     set_vector kernel, 2f
485     pt_setup    0, 0xc, 0, BASE + 0x4000, 0x4000, 3
486     assert_no_auto_tlb
488     l32i    a2, a3, 0
489     test_fail
491     rsr     a2, excvaddr
492     assert  eq, a2, a3
494     assert_no_auto_tlb
495     assert_sr epc1, 1b
496     assert_sr exccause, 24
497 test_end
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
504     l8ui    a2, a3, 0
506     syscall
508     rsr     a2, excvaddr
509     assert  eq, a2, a3
511     assert_auto_tlb
512     assert_epc1_1m 1b
513     assert_sr exccause, 1
514 test_end
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
521     l8ui    a2, a3, 0
522     syscall
524     rsr     a2, excvaddr
525     assert  eq, a2, a3
527     assert_auto_tlb
528     assert_epc1_1m 1b
529     assert_sr exccause, 26
530 test_end
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
538     l8ui    a2, a3, 0
539     syscall
541     rsr     a2, excvaddr
542     assert  eq, a2, a3
544     assert_no_auto_tlb
545     assert_epc1_1m 1b
546     assert_sr exccause, 24
547 test_end
549 test cross_page_insn
550     set_vector kernel, 2f
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
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
570     movi    a2, BASE + 0x00007fff
571     movi    a3, BASE + 0x00008000
572     /* DTLB: OK, ITLB: OK */
573     jx      a2
575     .begin  no-transform
577     l32i    a2, a3, 0
578     syscall
580     .end    no-transform
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
593     reset_ps
594     set_vector kernel, 3f
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
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
614     reset_ps
615     set_vector kernel, 4f
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
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
637     reset_ps
638     set_vector kernel, 5f
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
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
659 test cross_page_tb
660     set_vector kernel, 2f
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
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
680     movi    a2, BASE + 0x00007ffc
681     movi    a3, BASE + 0x00008000
682     /* DTLB: OK, ITLB: OK */
683     jx      a2
685     .begin  no-transform
687     l32i    a2, a3, 0
688     syscall
690     .end    no-transform
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
703     reset_ps
704     set_vector kernel, 3f
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
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
724     reset_ps
725     set_vector kernel, 4f
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
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
747     reset_ps
748     set_vector kernel, 5f
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
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
769 #endif
771 test_suite_end