xref: /openbmc/qemu/tests/tcg/xtensa/test_mmu.S (revision da60ecd6)
1#include "macros.inc"
2
3test_suite mmu
4
5#if XCHAL_HAVE_PTP_MMU
6#define BASE 0x20000000
7#define TLB_BASE 0x80000000
8
9.purgem test_init
10
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
191:
20.endm
21
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
45
46test 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
82test_end
83
84test itlb_miss
85    set_vector kernel, 1f
86
87    movi    a3, BASE + 0x00100000
88    jx      a3
89    test_fail
901:
91    rsr     a2, excvaddr
92    assert  eq, a2, a3
93    rsr     a2, exccause
94    movi    a3, 16
95    assert  eq, a2, a3
96test_end
97
98test dtlb_miss
99    set_vector kernel, 1f
100
101    movi    a3, BASE + 0x00100000
102    l8ui    a2, a3, 0
103    test_fail
1041:
105    rsr     a2, excvaddr
106    assert  eq, a2, a3
107    rsr     a2, exccause
108    movi    a3, 24
109    assert  eq, a2, a3
110test_end
111
112test itlb_multi_hit
113    set_vector kernel, 1f
114
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
1211:
122    rsr     a2, exccause
123    movi    a3, 17
124    assert  eq, a2, a3
125test_end
126
127test dtlb_multi_hit
128    set_vector kernel, 1f
129
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
1381:
139    rsr     a2, exccause
140    movi    a3, 25
141    assert  eq, a2, a3
142test_end
143
144test inst_fetch_privilege
145    set_vector kernel, 3f
146
147    movi    a2, 0x4004f
148    wsr     a2, ps
1491:
150    isync
151    nop
1522:
153    test_fail
1543:
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
169test_end
170
171test load_store_privilege
172    set_vector kernel, 2f
173
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
190
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
19710:
198    wsr     a2, ps
199    isync
2001:
201    l8ui    a2, a3, 0
202    test_fail
2032:
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
218test_end
219
220test cring_load_store_privilege
221    set_vector kernel, 0
222    set_vector double, 2f
223
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 */
2321:
233    l32e    a2, a3, -4     /* ring used */
234    test_fail
2352:
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
248test_end
249
250test inst_fetch_prohibited
251    set_vector kernel, 2f
252
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
27310:
274    nop
275    test_fail
2762:
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
284test_end
285
286test load_prohibited
287    set_vector kernel, 2f
288
289    movi    a2, 0x0400000c /* PPN */
290    movi    a3, BASE + 0x01200004 /* VPN */
291    wdtlb   a2, a3
292    movi    a3, BASE + 0x01200002
2931:
294    l8ui    a2, a3, 0
295    test_fail
2962:
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
305test_end
306
307test store_prohibited
308    set_vector kernel, 2f
309
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
3151:
316    s8i     a2, a3, 0
317    test_fail
3182:
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
327test_end
328
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
335
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
340
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
345
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
350
351    movi    a3, (\vaddr)
352.endm
353
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
372
373    movi    a2, 0
374    wsr     a2, excvaddr
375
376    movi    a3, \vaddr
377    movi    a2, 0x4000f | ((\ring) << 6) | ((\excm) << 4)
378    jx      a1
37910:
380    wsr     a2, ps
381    isync
382.endm
383
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
399
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
410
411.macro assert_sr sr, v
412    rsr     a2, \sr
413    movi    a1, (\v)
414    assert  eq, a1, a2
415.endm
416
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
426
427test dtlb_autoload
428    set_vector kernel, 0
429
430    pt_setup    0, 3, 1, BASE + 0x1000, 0x1000, 3
431    assert_no_auto_tlb
432
433    l8ui    a1, a3, 0
434
435    rsr     a2, excvaddr
436    assert  eq, a2, a3
437
438    assert_auto_tlb
439test_end
440
441test autoload_load_store_privilege
442    set_vector kernel, 0
443    set_vector double, 2f
444
445    pt_setup    0, 3, 0, BASE + 0x2000, 0x2000, 3
446    movi    a3, BASE + 0x2004
447    assert_no_auto_tlb
448
449    movi    a2, 0x4005f    /* ring 1 + excm => cring == 0 */
450    wsr     a2, ps
451    isync
4521:
453    l32e    a2, a3, -4     /* ring used */
454    test_fail
4552:
456    rsr     a2, excvaddr
457    addi    a1, a3, -4
458    assert  eq, a1, a2
459
460    assert_auto_tlb
461    assert_sr depc, 1b
462    assert_sr exccause, 26
463test_end
464
465test autoload_pte_load_prohibited
466    set_vector kernel, 2f
467
468    pt_setup    0, 3, 0, BASE + 0x3000, 0, 0xc
469    assert_no_auto_tlb
4701:
471    l32i    a2, a3, 0
472    test_fail
4732:
474    rsr     a2, excvaddr
475    assert  eq, a2, a3
476
477    assert_auto_tlb
478    assert_sr epc1, 1b
479    assert_sr exccause, 28
480test_end
481
482test autoload_pt_load_prohibited
483    set_vector kernel, 2f
484
485    pt_setup    0, 0xc, 0, BASE + 0x4000, 0x4000, 3
486    assert_no_auto_tlb
4871:
488    l32i    a2, a3, 0
489    test_fail
4902:
491    rsr     a2, excvaddr
492    assert  eq, a2, a3
493
494    assert_no_auto_tlb
495    assert_sr epc1, 1b
496    assert_sr exccause, 24
497test_end
498
499test 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
503
504    l8ui    a2, a3, 0
5051:
506    syscall
5072:
508    rsr     a2, excvaddr
509    assert  eq, a2, a3
510
511    assert_auto_tlb
512    assert_epc1_1m 1b
513    assert_sr exccause, 1
514test_end
515
516test 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
5201:
521    l8ui    a2, a3, 0
522    syscall
5232:
524    rsr     a2, excvaddr
525    assert  eq, a2, a3
526
527    assert_auto_tlb
528    assert_epc1_1m 1b
529    assert_sr exccause, 26
530test_end
531
532test 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
5371:
538    l8ui    a2, a3, 0
539    syscall
5402:
541    rsr     a2, excvaddr
542    assert  eq, a2, a3
543
544    assert_no_auto_tlb
545    assert_epc1_1m 1b
546    assert_sr exccause, 24
547test_end
548
549test cross_page_insn
550    set_vector kernel, 2f
551
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
559
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
5691:
570    movi    a2, BASE + 0x00007fff
571    movi    a3, BASE + 0x00008000
572    /* DTLB: OK, ITLB: OK */
573    jx      a2
574
575    .begin  no-transform
57620:
577    l32i    a2, a3, 0
578    syscall
57921:
580    .end    no-transform
581
5822:
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
592
593    reset_ps
594    set_vector kernel, 3f
595
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
6033:
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
613
614    reset_ps
615    set_vector kernel, 4f
616
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
6264:
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
636
637    reset_ps
638    set_vector kernel, 5f
639
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
6475:
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
657test_end
658
659test cross_page_tb
660    set_vector kernel, 2f
661
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
669
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
6791:
680    movi    a2, BASE + 0x00007ffc
681    movi    a3, BASE + 0x00008000
682    /* DTLB: OK, ITLB: OK */
683    jx      a2
684
685    .begin  no-transform
68620:
687    l32i    a2, a3, 0
688    syscall
68921:
690    .end    no-transform
691
6922:
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
702
703    reset_ps
704    set_vector kernel, 3f
705
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
7133:
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
723
724    reset_ps
725    set_vector kernel, 4f
726
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
7364:
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
746
747    reset_ps
748    set_vector kernel, 5f
749
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
7575:
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
767test_end
768
769#endif
770
771test_suite_end
772