xref: /openbmc/qemu/tests/tcg/xtensa/test_mmu.S (revision 4a09d0bb)
1#include "macros.inc"
2
3test_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
151:
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
32test 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
68test_end
69
70test itlb_miss
71    set_vector kernel, 1f
72
73    movi    a3, 0x00100000
74    jx      a3
75    test_fail
761:
77    rsr     a2, excvaddr
78    assert  eq, a2, a3
79    rsr     a2, exccause
80    movi    a3, 16
81    assert  eq, a2, a3
82test_end
83
84test dtlb_miss
85    set_vector kernel, 1f
86
87    movi    a3, 0x00100000
88    l8ui    a2, a3, 0
89    test_fail
901:
91    rsr     a2, excvaddr
92    assert  eq, a2, a3
93    rsr     a2, exccause
94    movi    a3, 24
95    assert  eq, a2, a3
96test_end
97
98test 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
1071:
108    rsr     a2, exccause
109    movi    a3, 17
110    assert  eq, a2, a3
111test_end
112
113test 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
1241:
125    rsr     a2, exccause
126    movi    a3, 25
127    assert  eq, a2, a3
128test_end
129
130test inst_fetch_privilege
131    set_vector kernel, 3f
132
133    movi    a2, 0x4004f
134    wsr     a2, ps
1351:
136    isync
137    nop
1382:
139    test_fail
1403:
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
155test_end
156
157test 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
18010:
181    wsr     a2, ps
182    isync
1831:
184    l8ui    a2, a3, 0
185    test_fail
1862:
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
200test_end
201
202test 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 */
2141:
215    l32e    a2, a3, -4     /* ring used */
216    test_fail
2172:
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
230test_end
231
232test 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
25210:
253    nop
254    test_fail
2552:
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
263test_end
264
265test 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
2721:
273    l8ui    a2, a3, 0
274    test_fail
2752:
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
284test_end
285
286test 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
2941:
295    s8i     a2, a3, 0
296    test_fail
2972:
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
306test_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
35510:
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
401test 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
413test_end
414
415test 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
4261:
427    l32e    a2, a3, -4     /* ring used */
428    test_fail
4292:
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
437test_end
438
439test autoload_pte_load_prohibited
440    set_vector kernel, 2f
441
442    pt_setup    0, 3, 0, 0x3000, 0, 0xc
443    assert_no_auto_tlb
4441:
445    l32i    a2, a3, 0
446    test_fail
4472:
448    rsr     a2, excvaddr
449    assert  eq, a2, a3
450
451    assert_auto_tlb
452    assert_sr epc1, 1b
453    assert_sr exccause, 28
454test_end
455
456test autoload_pt_load_prohibited
457    set_vector kernel, 2f
458
459    pt_setup    0, 0xc, 0, 0x4000, 0x4000, 3
460    assert_no_auto_tlb
4611:
462    l32i    a2, a3, 0
463    test_fail
4642:
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
471test_end
472
473test 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
4791:
480    syscall
4812:
482    rsr     a2, excvaddr
483    assert  eq, a2, a3
484
485    assert_auto_tlb
486    assert_epc1_1m 1b
487    assert_sr exccause, 1
488test_end
489
490test autoload_pte_privilege
491    set_vector  kernel, 2f
492    pt_setup    0, 3, 0, 0x6000, 0, 3
493    go_ring     1, 0, 0x6001
4941:
495    l8ui    a2, a3, 0
496    syscall
4972:
498    rsr     a2, excvaddr
499    assert  eq, a2, a3
500
501    assert_auto_tlb
502    assert_epc1_1m 1b
503    assert_sr exccause, 26
504test_end
505
506test 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
5111:
512    l8ui    a2, a3, 0
513    syscall
5142:
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
521test_end
522
523test 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
5431:
544    movi    a2, 0x00007fff
545    movi    a3, 0x00008000
546    /* DTLB: OK, ITLB: OK */
547    jx      a2
548
549    .begin  no-transform
55020:
551    l32i    a2, a3, 0
552    syscall
55321:
554    .end    no-transform
555
5562:
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
5773:
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
6004:
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
6215:
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
631test_end
632
633test 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
6531:
654    movi    a2, 0x00007ffc
655    movi    a3, 0x00008000
656    /* DTLB: OK, ITLB: OK */
657    jx      a2
658
659    .begin  no-transform
66020:
661    l32i    a2, a3, 0
662    syscall
66321:
664    .end    no-transform
665
6662:
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
6873:
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
7104:
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
7315:
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
741test_end
742
743test_suite_end
744