Add qemu 2.4.0
[kvmfornfv.git] / qemu / tests / tcg / xtensa / test_mmu.S
1 #include "macros.inc"
2
3 test_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
15 1:
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
32 test tlb_group
33     movi    a2, 0x04000002 /* PPN */
34     movi    a3, 0x01200004 /* VPN */
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
68 test_end
69
70 test itlb_miss
71     set_vector kernel, 1f
72
73     movi    a3, 0x00100000
74     jx      a3
75     test_fail
76 1:
77     rsr     a2, excvaddr
78     assert  eq, a2, a3
79     rsr     a2, exccause
80     movi    a3, 16
81     assert  eq, a2, a3
82 test_end
83
84 test dtlb_miss
85     set_vector kernel, 1f
86
87     movi    a3, 0x00100000
88     l8ui    a2, a3, 0
89     test_fail
90 1:
91     rsr     a2, excvaddr
92     assert  eq, a2, a3
93     rsr     a2, exccause
94     movi    a3, 24
95     assert  eq, a2, a3
96 test_end
97
98 test itlb_multi_hit
99     set_vector kernel, 1f
100
101     movi    a2, 0x04000002 /* PPN */
102     movi    a3, 0xf0000004 /* VPN */
103     witlb   a2, a3
104     movi    a3, 0xf0000000
105     pitlb   a2, a3
106     test_fail
107 1:
108     rsr     a2, exccause
109     movi    a3, 17
110     assert  eq, a2, a3
111 test_end
112
113 test dtlb_multi_hit
114     set_vector kernel, 1f
115
116     movi    a2, 0x04000002 /* PPN */
117     movi    a3, 0x01200004 /* VPN */
118     wdtlb   a2, a3
119     movi    a3, 0x01200007 /* VPN */
120     wdtlb   a2, a3
121     movi    a3, 0x01200000
122     pdtlb   a2, a3
123     test_fail
124 1:
125     rsr     a2, exccause
126     movi    a3, 25
127     assert  eq, a2, a3
128 test_end
129
130 test inst_fetch_privilege
131     set_vector kernel, 3f
132
133     movi    a2, 0x4004f
134     wsr     a2, ps
135 1:
136     isync
137     nop
138 2:
139     test_fail
140 3:
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
155 test_end
156
157 test 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 /* PPN */
175     movi    a3, 0x01200004 /* VPN */
176     wdtlb   a2, a3
177     movi    a3, 0x01200001
178     movi    a2, 0x4004f
179     jx      a1
180 10:
181     wsr     a2, ps
182     isync
183 1:
184     l8ui    a2, a3, 0
185     test_fail
186 2:
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
200 test_end
201
202 test cring_load_store_privilege
203     set_vector kernel, 0
204     set_vector double, 2f
205
206     movi    a2, 0x04000003 /* PPN */
207     movi    a3, 0x01200004 /* VPN */
208     wdtlb   a2, a3
209     movi    a3, 0x01200004
210     movi    a2, 0x4005f    /* ring 1 + excm => cring == 0 */
211     wsr     a2, ps
212     isync
213     l8ui    a2, a3, 0      /* cring used */
214 1:
215     l32e    a2, a3, -4     /* ring used */
216     test_fail
217 2:
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
230 test_end
231
232 test 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
252 10:
253     nop
254     test_fail
255 2:
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
263 test_end
264
265 test load_prohibited
266     set_vector kernel, 2f
267
268     movi    a2, 0x0400000c /* PPN */
269     movi    a3, 0x01200004 /* VPN */
270     wdtlb   a2, a3
271     movi    a3, 0x01200002
272 1:
273     l8ui    a2, a3, 0
274     test_fail
275 2:
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
284 test_end
285
286 test store_prohibited
287     set_vector kernel, 2f
288
289     movi    a2, 0x04000001 /* PPN */
290     movi    a3, 0x01200004 /* VPN */
291     wdtlb   a2, a3
292     movi    a3, 0x01200003
293     l8ui    a2, a3, 0
294 1:
295     s8i     a2, a3, 0
296     test_fail
297 2:
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
306 test_end
307
308 /* Set up page table entry vaddr->paddr, ring=pte_ring, attr=pte_attr
309  * and DTLB way 7 to cover this PTE, ring=pt_ring, attr=pt_attr
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) /* way 7 */
316     movi    a4, 0x04000003 | ((\pt_ring) << 4) /* PADDR 64M */
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) /* way 7 */
326     movi    a4, 0x04000000 | ((\pt_ring) << 4) | (\pt_attr) /* PADDR 64M */
327     wdtlb   a4, a3
328     isync
329
330     movi    a3, (\vaddr)
331 .endm
332
333 /* out: PS.RING=ring, PS.EXCM=excm, a3=vaddr */
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
355 10:
356     wsr     a2, ps
357     isync
358 .endm
359
360 /* in: a3 -- virtual address to test */
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 /* in: a3 -- virtual address to test */
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
401 test 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
413 test_end
414
415 test 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    /* ring 1 + excm => cring == 0 */
424     wsr     a2, ps
425     isync
426 1:
427     l32e    a2, a3, -4     /* ring used */
428     test_fail
429 2:
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
437 test_end
438
439 test autoload_pte_load_prohibited
440     set_vector kernel, 2f
441
442     pt_setup    0, 3, 0, 0x3000, 0, 0xc
443     assert_no_auto_tlb
444 1:
445     l32i    a2, a3, 0
446     test_fail
447 2:
448     rsr     a2, excvaddr
449     assert  eq, a2, a3
450
451     assert_auto_tlb
452     assert_sr epc1, 1b
453     assert_sr exccause, 28
454 test_end
455
456 test autoload_pt_load_prohibited
457     set_vector kernel, 2f
458
459     pt_setup    0, 0xc, 0, 0x4000, 0x4000, 3
460     assert_no_auto_tlb
461 1:
462     l32i    a2, a3, 0
463     test_fail
464 2:
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
471 test_end
472
473 test 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
479 1:
480     syscall
481 2:
482     rsr     a2, excvaddr
483     assert  eq, a2, a3
484
485     assert_auto_tlb
486     assert_epc1_1m 1b
487     assert_sr exccause, 1
488 test_end
489
490 test autoload_pte_privilege
491     set_vector  kernel, 2f
492     pt_setup    0, 3, 0, 0x6000, 0, 3
493     go_ring     1, 0, 0x6001
494 1:
495     l8ui    a2, a3, 0
496     syscall
497 2:
498     rsr     a2, excvaddr
499     assert  eq, a2, a3
500
501     assert_auto_tlb
502     assert_epc1_1m 1b
503     assert_sr exccause, 26
504 test_end
505
506 test 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
511 1:
512     l8ui    a2, a3, 0
513     syscall
514 2:
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
521 test_end
522
523 test cross_page_insn
524     set_vector kernel, 2f
525
526     movi    a2, 0x04000003 /* PPN */
527     movi    a3, 0x00007000 /* VPN */
528     witlb   a2, a3
529     wdtlb   a2, a3
530     movi    a3, 0x00008000 /* VPN */
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
543 1:
544     movi    a2, 0x00007fff
545     movi    a3, 0x00008000
546     /* DTLB: OK, ITLB: OK */
547     jx      a2
548
549     .begin  no-transform
550 20:
551     l32i    a2, a3, 0
552     syscall
553 21:
554     .end    no-transform
555
556 2:
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 /* PPN */
571     movi    a3, 0x00008000 /* VPN */
572     wdtlb   a2, a3
573     movi    a2, 0x00007fff
574     movi    a3, 0x00008000
575     /* DTLB: FAIL, ITLB: OK */
576     jx      a2
577 3:
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 /* PPN */
592     movi    a3, 0x00008000 /* VPN */
593     witlb   a2, a3
594     movi    a2, 0x04000003 /* PPN */
595     wdtlb   a2, a3
596     movi    a2, 0x00007fff
597     movi    a3, 0x00008000
598     /* DTLB: OK, ITLB: FAIL */
599     jx      a2
600 4:
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 /* PPN */
615     movi    a3, 0x00008000 /* VPN */
616     wdtlb   a2, a3
617     movi    a2, 0x00007fff
618     movi    a3, 0x00008000
619     /* DTLB: FAIL, ITLB: FAIL */
620     jx      a2
621 5:
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
631 test_end
632
633 test cross_page_tb
634     set_vector kernel, 2f
635
636     movi    a2, 0x04000003 /* PPN */
637     movi    a3, 0x00007000 /* VPN */
638     witlb   a2, a3
639     wdtlb   a2, a3
640     movi    a3, 0x00008000 /* VPN */
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
653 1:
654     movi    a2, 0x00007ffc
655     movi    a3, 0x00008000
656     /* DTLB: OK, ITLB: OK */
657     jx      a2
658
659     .begin  no-transform
660 20:
661     l32i    a2, a3, 0
662     syscall
663 21:
664     .end    no-transform
665
666 2:
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 /* PPN */
681     movi    a3, 0x00008000 /* VPN */
682     wdtlb   a2, a3
683     movi    a2, 0x00007ffc
684     movi    a3, 0x00008000
685     /* DTLB: FAIL, ITLB: OK */
686     jx      a2
687 3:
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 /* PPN */
702     movi    a3, 0x00008000 /* VPN */
703     witlb   a2, a3
704     movi    a2, 0x04000003 /* PPN */
705     wdtlb   a2, a3
706     movi    a2, 0x00007ffc
707     movi    a3, 0x00008000
708     /* DTLB: OK, ITLB: FAIL */
709     jx      a2
710 4:
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 /* PPN */
725     movi    a3, 0x00008000 /* VPN */
726     wdtlb   a2, a3
727     movi    a2, 0x00007ffc
728     movi    a3, 0x00008000
729     /* DTLB: FAIL, ITLB: FAIL */
730     jx      a2
731 5:
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
741 test_end
742
743 test_suite_end