xref: /qemu/tests/tcg/xtensa/test_mmu.S (revision 159c5d17)
1#include "macros.inc"
2
3test_suite mmu
4
5#if XCHAL_HAVE_PTP_MMU && !XCHAL_HAVE_SPANNING_WAY
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 /* 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
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 /* PPN */
104    movi    a3, 0xf0000004 /* VPN */
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 /* 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
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 /* PPN */
177    movi    a3, 0x01200004 /* VPN */
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 /* 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 */
2161:
217    l32e    a2, a3, -4     /* ring used */
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 /* PPN */
271    movi    a3, 0x01200004 /* VPN */
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 /* PPN */
292    movi    a3, 0x01200004 /* VPN */
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/* 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
316
317    movi    a3, 0x80000007 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */
318    movi    a4, 0x04000003 | ((\pt_ring) << 4) /* PADDR 64M */
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) /* way 7 */
328    movi    a4, 0x04000000 | ((\pt_ring) << 4) | (\pt_attr) /* PADDR 64M */
329    wdtlb   a4, a3
330    isync
331
332    movi    a3, (\vaddr)
333.endm
334
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
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/* 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
377
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
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    /* ring 1 + excm => cring == 0 */
426    wsr     a2, ps
427    isync
4281:
429    l32e    a2, a3, -4     /* ring used */
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 /* 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
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    /* DTLB: OK, ITLB: OK */
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 /* 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
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 /* 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
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 /* 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
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 /* 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
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    /* DTLB: OK, ITLB: OK */
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 /* 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
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 /* 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
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 /* 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
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