xref: /qemu/tests/tcg/xtensa/test_mmu.S (revision 11314643c35401b18c5374f4ec82ee7d3d5d2692)
1a2e67072SMax Filippov#include "macros.inc"
27d890b40SMax Filippov
37d890b40SMax Filippovtest_suite mmu
47d890b40SMax Filippov
5*da60ecd6SMax Filippov#if XCHAL_HAVE_PTP_MMU
6*da60ecd6SMax Filippov#define BASE 0x20000000
7*da60ecd6SMax Filippov#define TLB_BASE 0x80000000
83db8a95eSMax Filippov
9d0fa1f0dSMax Filippov.purgem test_init
107d890b40SMax Filippov
11ca3164dfSMax Filippov.macro clean_tlb_way way, page_size, n_entries
12ca3164dfSMax Filippov    movi    a2, \way
13ca3164dfSMax Filippov    movi    a3, \page_size
14ca3164dfSMax Filippov    movi    a4, \n_entries
15ca3164dfSMax Filippov    loop    a4, 1f
16ca3164dfSMax Filippov    idtlb   a2
17ca3164dfSMax Filippov    iitlb   a2
18ca3164dfSMax Filippov    add     a2, a2, a3
19ca3164dfSMax Filippov1:
20ca3164dfSMax Filippov.endm
21ca3164dfSMax Filippov
22d0fa1f0dSMax Filippov.macro test_init
23ca3164dfSMax Filippov    clean_tlb_way 0, 0x00001000, 4
24ca3164dfSMax Filippov    clean_tlb_way 1, 0x00001000, 4
25ca3164dfSMax Filippov    clean_tlb_way 2, 0x00001000, 4
26ca3164dfSMax Filippov    clean_tlb_way 3, 0x00001000, 4
27ca3164dfSMax Filippov    clean_tlb_way 4, 0x00100000, 4
287d890b40SMax Filippov    movi    a2, 0x00000007
297d890b40SMax Filippov    idtlb   a2
30ca3164dfSMax Filippov    movi    a2, 0x00000008
31ca3164dfSMax Filippov    idtlb   a2
32ca3164dfSMax Filippov    movi    a2, 0x00000009
33ca3164dfSMax Filippov    idtlb   a2
34*da60ecd6SMax Filippov#if XCHAL_HAVE_SPANNING_WAY
35*da60ecd6SMax Filippov    movi    a2, BASE | XCHAL_SPANNING_WAY
36*da60ecd6SMax Filippov    idtlb   a2
37*da60ecd6SMax Filippov    iitlb   a2
38*da60ecd6SMax Filippov    movi    a2, TLB_BASE | XCHAL_SPANNING_WAY
39*da60ecd6SMax Filippov    idtlb   a2
40*da60ecd6SMax Filippov    iitlb   a2
41*da60ecd6SMax Filippov    movi    a2, TLB_BASE
42*da60ecd6SMax Filippov    wsr     a2, ptevaddr
43*da60ecd6SMax Filippov#endif
447d890b40SMax Filippov.endm
457d890b40SMax Filippov
467d890b40SMax Filippovtest tlb_group
477d890b40SMax Filippov    movi    a2, 0x04000002 /* PPN */
48*da60ecd6SMax Filippov    movi    a3, BASE + 0x01200004 /* VPN */
497d890b40SMax Filippov    wdtlb   a2, a3
507d890b40SMax Filippov    witlb   a2, a3
517d890b40SMax Filippov    movi    a3, 0x00200004
527d890b40SMax Filippov    rdtlb0  a1, a3
537d890b40SMax Filippov    ritlb0  a2, a3
54*da60ecd6SMax Filippov    movi    a3, BASE + 0x01000001
557d890b40SMax Filippov    assert  eq, a1, a3
567d890b40SMax Filippov    assert  eq, a2, a3
577d890b40SMax Filippov    movi    a3, 0x00200004
587d890b40SMax Filippov    rdtlb1  a1, a3
597d890b40SMax Filippov    ritlb1  a2, a3
607d890b40SMax Filippov    movi    a3, 0x04000002
617d890b40SMax Filippov    assert  eq, a1, a3
627d890b40SMax Filippov    assert  eq, a2, a3
63*da60ecd6SMax Filippov    movi    a3, BASE + 0x01234567
647d890b40SMax Filippov    pdtlb   a1, a3
657d890b40SMax Filippov    pitlb   a2, a3
66*da60ecd6SMax Filippov    movi    a3, BASE + 0x01234014
677d890b40SMax Filippov    assert  eq, a1, a3
68*da60ecd6SMax Filippov    movi    a3, BASE + 0x0123400c
697d890b40SMax Filippov    assert  eq, a2, a3
707d890b40SMax Filippov    movi    a3, 0x00200004
717d890b40SMax Filippov    idtlb   a3
727d890b40SMax Filippov    iitlb   a3
73*da60ecd6SMax Filippov    movi    a3, BASE + 0x01234567
747d890b40SMax Filippov    pdtlb   a1, a3
757d890b40SMax Filippov    pitlb   a2, a3
767d890b40SMax Filippov    movi    a3, 0x00000010
777d890b40SMax Filippov    and     a1, a1, a3
787d890b40SMax Filippov    assert  eqi, a1, 0
797d890b40SMax Filippov    movi    a3, 0x00000008
807d890b40SMax Filippov    and     a2, a2, a3
817d890b40SMax Filippov    assert  eqi, a2, 0
827d890b40SMax Filippovtest_end
837d890b40SMax Filippov
847d890b40SMax Filippovtest itlb_miss
857d890b40SMax Filippov    set_vector kernel, 1f
867d890b40SMax Filippov
87*da60ecd6SMax Filippov    movi    a3, BASE + 0x00100000
887d890b40SMax Filippov    jx      a3
897d890b40SMax Filippov    test_fail
907d890b40SMax Filippov1:
917d890b40SMax Filippov    rsr     a2, excvaddr
927d890b40SMax Filippov    assert  eq, a2, a3
937d890b40SMax Filippov    rsr     a2, exccause
947d890b40SMax Filippov    movi    a3, 16
957d890b40SMax Filippov    assert  eq, a2, a3
967d890b40SMax Filippovtest_end
977d890b40SMax Filippov
987d890b40SMax Filippovtest dtlb_miss
997d890b40SMax Filippov    set_vector kernel, 1f
1007d890b40SMax Filippov
101*da60ecd6SMax Filippov    movi    a3, BASE + 0x00100000
1027d890b40SMax Filippov    l8ui    a2, a3, 0
1037d890b40SMax Filippov    test_fail
1047d890b40SMax Filippov1:
1057d890b40SMax Filippov    rsr     a2, excvaddr
1067d890b40SMax Filippov    assert  eq, a2, a3
1077d890b40SMax Filippov    rsr     a2, exccause
1087d890b40SMax Filippov    movi    a3, 24
1097d890b40SMax Filippov    assert  eq, a2, a3
1107d890b40SMax Filippovtest_end
1117d890b40SMax Filippov
1127d890b40SMax Filippovtest itlb_multi_hit
1137d890b40SMax Filippov    set_vector kernel, 1f
1147d890b40SMax Filippov
1157d890b40SMax Filippov    movi    a2, 0x04000002 /* PPN */
1167d890b40SMax Filippov    movi    a3, 0xf0000004 /* VPN */
1177d890b40SMax Filippov    witlb   a2, a3
1187d890b40SMax Filippov    movi    a3, 0xf0000000
1197d890b40SMax Filippov    pitlb   a2, a3
1207d890b40SMax Filippov    test_fail
1217d890b40SMax Filippov1:
1227d890b40SMax Filippov    rsr     a2, exccause
1237d890b40SMax Filippov    movi    a3, 17
1247d890b40SMax Filippov    assert  eq, a2, a3
1257d890b40SMax Filippovtest_end
1267d890b40SMax Filippov
1277d890b40SMax Filippovtest dtlb_multi_hit
1287d890b40SMax Filippov    set_vector kernel, 1f
1297d890b40SMax Filippov
1307d890b40SMax Filippov    movi    a2, 0x04000002 /* PPN */
131*da60ecd6SMax Filippov    movi    a3, BASE + 0x01200004 /* VPN */
1327d890b40SMax Filippov    wdtlb   a2, a3
133*da60ecd6SMax Filippov    movi    a3, BASE + 0x01200007 /* VPN */
1347d890b40SMax Filippov    wdtlb   a2, a3
135*da60ecd6SMax Filippov    movi    a3, BASE + 0x01200000
1367d890b40SMax Filippov    pdtlb   a2, a3
1377d890b40SMax Filippov    test_fail
1387d890b40SMax Filippov1:
1397d890b40SMax Filippov    rsr     a2, exccause
1407d890b40SMax Filippov    movi    a3, 25
1417d890b40SMax Filippov    assert  eq, a2, a3
1427d890b40SMax Filippovtest_end
1437d890b40SMax Filippov
1447d890b40SMax Filippovtest inst_fetch_privilege
1457d890b40SMax Filippov    set_vector kernel, 3f
1467d890b40SMax Filippov
1477d890b40SMax Filippov    movi    a2, 0x4004f
1487d890b40SMax Filippov    wsr     a2, ps
1497d890b40SMax Filippov1:
1507d890b40SMax Filippov    isync
1517d890b40SMax Filippov    nop
1527d890b40SMax Filippov2:
1537d890b40SMax Filippov    test_fail
1547d890b40SMax Filippov3:
1557d890b40SMax Filippov    movi    a1, 1b
1567d890b40SMax Filippov    rsr     a2, excvaddr
1577d890b40SMax Filippov    rsr     a3, epc1
1587d890b40SMax Filippov    assert  ge, a2, a1
1597d890b40SMax Filippov    assert  ge, a3, a1
1607d890b40SMax Filippov    movi    a1, 2b
1617d890b40SMax Filippov    assert  lt, a2, a1
1627d890b40SMax Filippov    assert  lt, a3, a1
1637d890b40SMax Filippov    rsr     a2, exccause
1647d890b40SMax Filippov    movi    a3, 18
1657d890b40SMax Filippov    assert  eq, a2, a3
1667d890b40SMax Filippov    rsr     a2, ps
1677d890b40SMax Filippov    movi    a3, 0x4005f
1687d890b40SMax Filippov    assert  eq, a2, a3
1697d890b40SMax Filippovtest_end
1707d890b40SMax Filippov
1717d890b40SMax Filippovtest load_store_privilege
1727d890b40SMax Filippov    set_vector kernel, 2f
1737d890b40SMax Filippov
1747d890b40SMax Filippov    movi    a3, 10f
1757d890b40SMax Filippov    pitlb   a3, a3
1767d890b40SMax Filippov    ritlb1  a2, a3
1777d890b40SMax Filippov    movi    a1, 0x10
1787d890b40SMax Filippov    or      a2, a2, a1
1797d890b40SMax Filippov    movi    a1, 0x000ff000
1807d890b40SMax Filippov    and     a3, a3, a1
1817d890b40SMax Filippov    movi    a1, 4
1827d890b40SMax Filippov    or      a3, a3, a1
183*da60ecd6SMax Filippov    movi    a5, BASE
184*da60ecd6SMax Filippov    add     a3, a3, a5
1857d890b40SMax Filippov    witlb   a2, a3
1867d890b40SMax Filippov    movi    a3, 10f
1877d890b40SMax Filippov    movi    a1, 0x000fffff
1887d890b40SMax Filippov    and     a1, a3, a1
189*da60ecd6SMax Filippov    add     a1, a1, a5
1907d890b40SMax Filippov
1917d890b40SMax Filippov    movi    a2, 0x04000003 /* PPN */
192*da60ecd6SMax Filippov    movi    a3, BASE + 0x01200004 /* VPN */
1937d890b40SMax Filippov    wdtlb   a2, a3
194*da60ecd6SMax Filippov    movi    a3, BASE + 0x01200001
1957d890b40SMax Filippov    movi    a2, 0x4004f
1967d890b40SMax Filippov    jx      a1
1977d890b40SMax Filippov10:
1987d890b40SMax Filippov    wsr     a2, ps
1997d890b40SMax Filippov    isync
2007d890b40SMax Filippov1:
2017d890b40SMax Filippov    l8ui    a2, a3, 0
2027d890b40SMax Filippov    test_fail
2037d890b40SMax Filippov2:
2047d890b40SMax Filippov    rsr     a2, excvaddr
2057d890b40SMax Filippov    assert  eq, a2, a3
2067d890b40SMax Filippov    rsr     a2, epc1
2077d890b40SMax Filippov    movi    a3, 1b
2087d890b40SMax Filippov    movi    a1, 0x000fffff
2097d890b40SMax Filippov    and     a3, a3, a1
210*da60ecd6SMax Filippov    add     a3, a3, a5
2117d890b40SMax Filippov    assert  eq, a2, a3
2127d890b40SMax Filippov    rsr     a2, exccause
2137d890b40SMax Filippov    movi    a3, 26
2147d890b40SMax Filippov    assert  eq, a2, a3
2157d890b40SMax Filippov    rsr     a2, ps
2167d890b40SMax Filippov    movi    a3, 0x4005f
2177d890b40SMax Filippov    assert  eq, a2, a3
2187d890b40SMax Filippovtest_end
2197d890b40SMax Filippov
2207d890b40SMax Filippovtest cring_load_store_privilege
2217d890b40SMax Filippov    set_vector kernel, 0
2227d890b40SMax Filippov    set_vector double, 2f
2237d890b40SMax Filippov
2247d890b40SMax Filippov    movi    a2, 0x04000003 /* PPN */
225*da60ecd6SMax Filippov    movi    a3, BASE + 0x01200004 /* VPN */
2267d890b40SMax Filippov    wdtlb   a2, a3
227*da60ecd6SMax Filippov    movi    a3, BASE + 0x01200004
2287d890b40SMax Filippov    movi    a2, 0x4005f    /* ring 1 + excm => cring == 0 */
2297d890b40SMax Filippov    wsr     a2, ps
2307d890b40SMax Filippov    isync
2317d890b40SMax Filippov    l8ui    a2, a3, 0      /* cring used */
2327d890b40SMax Filippov1:
2337d890b40SMax Filippov    l32e    a2, a3, -4     /* ring used */
2347d890b40SMax Filippov    test_fail
2357d890b40SMax Filippov2:
2367d890b40SMax Filippov    rsr     a2, excvaddr
2377d890b40SMax Filippov    addi    a2, a2, 4
2387d890b40SMax Filippov    assert  eq, a2, a3
2397d890b40SMax Filippov    rsr     a2, depc
2407d890b40SMax Filippov    movi    a3, 1b
2417d890b40SMax Filippov    assert  eq, a2, a3
2427d890b40SMax Filippov    rsr     a2, exccause
2437d890b40SMax Filippov    movi    a3, 26
2447d890b40SMax Filippov    assert  eq, a2, a3
2457d890b40SMax Filippov    rsr     a2, ps
2467d890b40SMax Filippov    movi    a3, 0x4005f
2477d890b40SMax Filippov    assert  eq, a2, a3
2487d890b40SMax Filippovtest_end
2497d890b40SMax Filippov
2507d890b40SMax Filippovtest inst_fetch_prohibited
2517d890b40SMax Filippov    set_vector kernel, 2f
2527d890b40SMax Filippov
2537d890b40SMax Filippov    movi    a3, 10f
2547d890b40SMax Filippov    pitlb   a3, a3
2557d890b40SMax Filippov    ritlb1  a2, a3
2567d890b40SMax Filippov    movi    a1, 0xfffff000
2577d890b40SMax Filippov    and     a2, a2, a1
2587d890b40SMax Filippov    movi    a1, 0x4
2597d890b40SMax Filippov    or      a2, a2, a1
2607d890b40SMax Filippov    movi    a1, 0x000ff000
2617d890b40SMax Filippov    and     a3, a3, a1
2627d890b40SMax Filippov    movi    a1, 4
2637d890b40SMax Filippov    or      a3, a3, a1
264*da60ecd6SMax Filippov    movi    a5, BASE
265*da60ecd6SMax Filippov    add     a3, a3, a5
2667d890b40SMax Filippov    witlb   a2, a3
2677d890b40SMax Filippov    movi    a3, 10f
2687d890b40SMax Filippov    movi    a1, 0x000fffff
2697d890b40SMax Filippov    and     a1, a3, a1
270*da60ecd6SMax Filippov    add     a1, a1, a5
2717d890b40SMax Filippov    jx      a1
2727d890b40SMax Filippov    .align  4
2737d890b40SMax Filippov10:
2747d890b40SMax Filippov    nop
2757d890b40SMax Filippov    test_fail
2767d890b40SMax Filippov2:
2777d890b40SMax Filippov    rsr     a2, excvaddr
2787d890b40SMax Filippov    assert  eq, a2, a1
2797d890b40SMax Filippov    rsr     a2, epc1
2807d890b40SMax Filippov    assert  eq, a2, a1
2817d890b40SMax Filippov    rsr     a2, exccause
2827d890b40SMax Filippov    movi    a3, 20
2837d890b40SMax Filippov    assert  eq, a2, a3
2847d890b40SMax Filippovtest_end
2857d890b40SMax Filippov
2867d890b40SMax Filippovtest load_prohibited
2877d890b40SMax Filippov    set_vector kernel, 2f
2887d890b40SMax Filippov
2897d890b40SMax Filippov    movi    a2, 0x0400000c /* PPN */
290*da60ecd6SMax Filippov    movi    a3, BASE + 0x01200004 /* VPN */
2917d890b40SMax Filippov    wdtlb   a2, a3
292*da60ecd6SMax Filippov    movi    a3, BASE + 0x01200002
2937d890b40SMax Filippov1:
2947d890b40SMax Filippov    l8ui    a2, a3, 0
2957d890b40SMax Filippov    test_fail
2967d890b40SMax Filippov2:
2977d890b40SMax Filippov    rsr     a2, excvaddr
2987d890b40SMax Filippov    assert  eq, a2, a3
2997d890b40SMax Filippov    rsr     a2, epc1
3007d890b40SMax Filippov    movi    a3, 1b
3017d890b40SMax Filippov    assert  eq, a2, a3
3027d890b40SMax Filippov    rsr     a2, exccause
3037d890b40SMax Filippov    movi    a3, 28
3047d890b40SMax Filippov    assert  eq, a2, a3
3057d890b40SMax Filippovtest_end
3067d890b40SMax Filippov
3077d890b40SMax Filippovtest store_prohibited
3087d890b40SMax Filippov    set_vector kernel, 2f
3097d890b40SMax Filippov
3107d890b40SMax Filippov    movi    a2, 0x04000001 /* PPN */
311*da60ecd6SMax Filippov    movi    a3, BASE + 0x01200004 /* VPN */
3127d890b40SMax Filippov    wdtlb   a2, a3
313*da60ecd6SMax Filippov    movi    a3, BASE + 0x01200003
3147d890b40SMax Filippov    l8ui    a2, a3, 0
3157d890b40SMax Filippov1:
3167d890b40SMax Filippov    s8i     a2, a3, 0
3177d890b40SMax Filippov    test_fail
3187d890b40SMax Filippov2:
3197d890b40SMax Filippov    rsr     a2, excvaddr
3207d890b40SMax Filippov    assert  eq, a2, a3
3217d890b40SMax Filippov    rsr     a2, epc1
3227d890b40SMax Filippov    movi    a3, 1b
3237d890b40SMax Filippov    assert  eq, a2, a3
3247d890b40SMax Filippov    rsr     a2, exccause
3257d890b40SMax Filippov    movi    a3, 29
3267d890b40SMax Filippov    assert  eq, a2, a3
3277d890b40SMax Filippovtest_end
3287d890b40SMax Filippov
329c305e32fSMax Filippov/* Set up page table entry vaddr->paddr, ring=pte_ring, attr=pte_attr
330c305e32fSMax Filippov * and DTLB way 7 to cover this PTE, ring=pt_ring, attr=pt_attr
331c305e32fSMax Filippov */
332c305e32fSMax Filippov.macro pt_setup pt_ring, pt_attr, pte_ring, vaddr, paddr, pte_attr
333*da60ecd6SMax Filippov    movi    a2, TLB_BASE
3347d890b40SMax Filippov    wsr     a2, ptevaddr
335c305e32fSMax Filippov
336*da60ecd6SMax Filippov    movi    a3, TLB_BASE | 7 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */
337c305e32fSMax Filippov    movi    a4, 0x04000003 | ((\pt_ring) << 4) /* PADDR 64M */
338c305e32fSMax Filippov    wdtlb   a4, a3
339c305e32fSMax Filippov    isync
340c305e32fSMax Filippov
341c305e32fSMax Filippov    movi    a3, ((\paddr) & 0xfffff000) | ((\pte_ring) << 4) | (\pte_attr)
342c305e32fSMax Filippov    movi    a1, ((\vaddr) >> 12) << 2
343c305e32fSMax Filippov    add     a2, a1, a2
344c305e32fSMax Filippov    s32i    a3, a2, 0
345c305e32fSMax Filippov
346*da60ecd6SMax Filippov    movi    a3, TLB_BASE | 7 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */
347c305e32fSMax Filippov    movi    a4, 0x04000000 | ((\pt_ring) << 4) | (\pt_attr) /* PADDR 64M */
348c305e32fSMax Filippov    wdtlb   a4, a3
349c305e32fSMax Filippov    isync
350c305e32fSMax Filippov
351c305e32fSMax Filippov    movi    a3, (\vaddr)
352c305e32fSMax Filippov.endm
353c305e32fSMax Filippov
354c305e32fSMax Filippov/* out: PS.RING=ring, PS.EXCM=excm, a3=vaddr */
355c305e32fSMax Filippov.macro go_ring ring, excm, vaddr
356c305e32fSMax Filippov    movi    a3, 10f
357c305e32fSMax Filippov    pitlb   a3, a3
358c305e32fSMax Filippov    ritlb1  a2, a3
359c305e32fSMax Filippov    movi    a1, 0x10
360c305e32fSMax Filippov    or      a2, a2, a1
361c305e32fSMax Filippov    movi    a1, 0x000ff000
362c305e32fSMax Filippov    and     a3, a3, a1
363c305e32fSMax Filippov    movi    a1, 4
364c305e32fSMax Filippov    or      a3, a3, a1
365*da60ecd6SMax Filippov    movi    a5, BASE
366*da60ecd6SMax Filippov    add     a3, a3, a5
367c305e32fSMax Filippov    witlb   a2, a3
368c305e32fSMax Filippov    movi    a3, 10f
369c305e32fSMax Filippov    movi    a1, 0x000fffff
370c305e32fSMax Filippov    and     a1, a3, a1
371*da60ecd6SMax Filippov    add     a1, a1, a5
372c305e32fSMax Filippov
373c305e32fSMax Filippov    movi    a2, 0
374c305e32fSMax Filippov    wsr     a2, excvaddr
375c305e32fSMax Filippov
376c305e32fSMax Filippov    movi    a3, \vaddr
377c305e32fSMax Filippov    movi    a2, 0x4000f | ((\ring) << 6) | ((\excm) << 4)
378c305e32fSMax Filippov    jx      a1
379c305e32fSMax Filippov10:
380c305e32fSMax Filippov    wsr     a2, ps
381c305e32fSMax Filippov    isync
382c305e32fSMax Filippov.endm
383c305e32fSMax Filippov
384c305e32fSMax Filippov/* in: a3 -- virtual address to test */
385c305e32fSMax Filippov.macro assert_auto_tlb
386c305e32fSMax Filippov    movi    a2, 0x4000f
387c305e32fSMax Filippov    wsr     a2, ps
388c305e32fSMax Filippov    isync
389c305e32fSMax Filippov    pdtlb   a2, a3
390c305e32fSMax Filippov    movi    a1, 0xfffff01f
391c305e32fSMax Filippov    and     a2, a2, a1
392c305e32fSMax Filippov    movi    a1, 0xfffff000
393c305e32fSMax Filippov    and     a1, a1, a3
394c305e32fSMax Filippov    xor     a1, a1, a2
395c305e32fSMax Filippov    assert  gei, a1, 0x10
396c305e32fSMax Filippov    movi    a2, 0x14
397c305e32fSMax Filippov    assert  lt, a1, a2
398c305e32fSMax Filippov.endm
399c305e32fSMax Filippov
400c305e32fSMax Filippov/* in: a3 -- virtual address to test */
401c305e32fSMax Filippov.macro assert_no_auto_tlb
402c305e32fSMax Filippov    movi    a2, 0x4000f
403c305e32fSMax Filippov    wsr     a2, ps
404c305e32fSMax Filippov    isync
4057d890b40SMax Filippov    pdtlb   a2, a3
4067d890b40SMax Filippov    movi    a1, 0x10
4077d890b40SMax Filippov    and     a1, a1, a2
4087d890b40SMax Filippov    assert  eqi, a1, 0
409c305e32fSMax Filippov.endm
410c305e32fSMax Filippov
411c305e32fSMax Filippov.macro assert_sr sr, v
412c305e32fSMax Filippov    rsr     a2, \sr
413c305e32fSMax Filippov    movi    a1, (\v)
414c305e32fSMax Filippov    assert  eq, a1, a2
415c305e32fSMax Filippov.endm
416c305e32fSMax Filippov
417c305e32fSMax Filippov.macro assert_epc1_1m vaddr
418c305e32fSMax Filippov    movi    a2, (\vaddr)
419c305e32fSMax Filippov    movi    a1, 0xfffff
420c305e32fSMax Filippov    and     a1, a1, a2
421*da60ecd6SMax Filippov    movi    a5, BASE
422*da60ecd6SMax Filippov    add     a1, a1, a5
423c305e32fSMax Filippov    rsr     a2, epc1
424c305e32fSMax Filippov    assert  eq, a1, a2
425c305e32fSMax Filippov.endm
426c305e32fSMax Filippov
427c305e32fSMax Filippovtest dtlb_autoload
428c305e32fSMax Filippov    set_vector kernel, 0
429c305e32fSMax Filippov
430*da60ecd6SMax Filippov    pt_setup    0, 3, 1, BASE + 0x1000, 0x1000, 3
431c305e32fSMax Filippov    assert_no_auto_tlb
432c305e32fSMax Filippov
4337d890b40SMax Filippov    l8ui    a1, a3, 0
434c305e32fSMax Filippov
435c305e32fSMax Filippov    rsr     a2, excvaddr
436c305e32fSMax Filippov    assert  eq, a2, a3
437c305e32fSMax Filippov
438c305e32fSMax Filippov    assert_auto_tlb
439c305e32fSMax Filippovtest_end
440c305e32fSMax Filippov
441c305e32fSMax Filippovtest autoload_load_store_privilege
442c305e32fSMax Filippov    set_vector kernel, 0
443c305e32fSMax Filippov    set_vector double, 2f
444c305e32fSMax Filippov
445*da60ecd6SMax Filippov    pt_setup    0, 3, 0, BASE + 0x2000, 0x2000, 3
446*da60ecd6SMax Filippov    movi    a3, BASE + 0x2004
447c305e32fSMax Filippov    assert_no_auto_tlb
448c305e32fSMax Filippov
449c305e32fSMax Filippov    movi    a2, 0x4005f    /* ring 1 + excm => cring == 0 */
450c305e32fSMax Filippov    wsr     a2, ps
451c305e32fSMax Filippov    isync
452c305e32fSMax Filippov1:
453c305e32fSMax Filippov    l32e    a2, a3, -4     /* ring used */
454c305e32fSMax Filippov    test_fail
455c305e32fSMax Filippov2:
456c305e32fSMax Filippov    rsr     a2, excvaddr
457c305e32fSMax Filippov    addi    a1, a3, -4
458c305e32fSMax Filippov    assert  eq, a1, a2
459c305e32fSMax Filippov
460c305e32fSMax Filippov    assert_auto_tlb
461c305e32fSMax Filippov    assert_sr depc, 1b
462c305e32fSMax Filippov    assert_sr exccause, 26
463c305e32fSMax Filippovtest_end
464c305e32fSMax Filippov
465c305e32fSMax Filippovtest autoload_pte_load_prohibited
466c305e32fSMax Filippov    set_vector kernel, 2f
467c305e32fSMax Filippov
468*da60ecd6SMax Filippov    pt_setup    0, 3, 0, BASE + 0x3000, 0, 0xc
469c305e32fSMax Filippov    assert_no_auto_tlb
470c305e32fSMax Filippov1:
471c305e32fSMax Filippov    l32i    a2, a3, 0
472c305e32fSMax Filippov    test_fail
473c305e32fSMax Filippov2:
474c305e32fSMax Filippov    rsr     a2, excvaddr
475c305e32fSMax Filippov    assert  eq, a2, a3
476c305e32fSMax Filippov
477c305e32fSMax Filippov    assert_auto_tlb
478c305e32fSMax Filippov    assert_sr epc1, 1b
479c305e32fSMax Filippov    assert_sr exccause, 28
480c305e32fSMax Filippovtest_end
481c305e32fSMax Filippov
482c305e32fSMax Filippovtest autoload_pt_load_prohibited
483c305e32fSMax Filippov    set_vector kernel, 2f
484c305e32fSMax Filippov
485*da60ecd6SMax Filippov    pt_setup    0, 0xc, 0, BASE + 0x4000, 0x4000, 3
486c305e32fSMax Filippov    assert_no_auto_tlb
487c305e32fSMax Filippov1:
488c305e32fSMax Filippov    l32i    a2, a3, 0
489c305e32fSMax Filippov    test_fail
490c305e32fSMax Filippov2:
491c305e32fSMax Filippov    rsr     a2, excvaddr
492c305e32fSMax Filippov    assert  eq, a2, a3
493c305e32fSMax Filippov
494c305e32fSMax Filippov    assert_no_auto_tlb
495c305e32fSMax Filippov    assert_sr epc1, 1b
496c305e32fSMax Filippov    assert_sr exccause, 24
497c305e32fSMax Filippovtest_end
498c305e32fSMax Filippov
499c305e32fSMax Filippovtest autoload_pt_privilege
500c305e32fSMax Filippov    set_vector  kernel, 2f
501*da60ecd6SMax Filippov    pt_setup    0, 3, 1, BASE + 0x5000, 0, 3
502*da60ecd6SMax Filippov    go_ring     1, 0, BASE + 0x5001
503c305e32fSMax Filippov
504c305e32fSMax Filippov    l8ui    a2, a3, 0
505c305e32fSMax Filippov1:
506c305e32fSMax Filippov    syscall
507c305e32fSMax Filippov2:
508c305e32fSMax Filippov    rsr     a2, excvaddr
509c305e32fSMax Filippov    assert  eq, a2, a3
510c305e32fSMax Filippov
511c305e32fSMax Filippov    assert_auto_tlb
512c305e32fSMax Filippov    assert_epc1_1m 1b
513c305e32fSMax Filippov    assert_sr exccause, 1
514c305e32fSMax Filippovtest_end
515c305e32fSMax Filippov
516c305e32fSMax Filippovtest autoload_pte_privilege
517c305e32fSMax Filippov    set_vector  kernel, 2f
518*da60ecd6SMax Filippov    pt_setup    0, 3, 0, BASE + 0x6000, 0, 3
519*da60ecd6SMax Filippov    go_ring     1, 0, BASE + 0x6001
520c305e32fSMax Filippov1:
521c305e32fSMax Filippov    l8ui    a2, a3, 0
522c305e32fSMax Filippov    syscall
523c305e32fSMax Filippov2:
524c305e32fSMax Filippov    rsr     a2, excvaddr
525c305e32fSMax Filippov    assert  eq, a2, a3
526c305e32fSMax Filippov
527c305e32fSMax Filippov    assert_auto_tlb
528c305e32fSMax Filippov    assert_epc1_1m 1b
529c305e32fSMax Filippov    assert_sr exccause, 26
530c305e32fSMax Filippovtest_end
531c305e32fSMax Filippov
532c305e32fSMax Filippovtest autoload_3_level_pt
533c305e32fSMax Filippov    set_vector  kernel, 2f
534*da60ecd6SMax Filippov    pt_setup    1, 3, 1, BASE + 0x00400000, 0, 3
535*da60ecd6SMax Filippov    pt_setup    1, 3, 1, TLB_BASE + ((BASE + 0x00400000) >> 10), 0x2000000, 3
536*da60ecd6SMax Filippov    go_ring     1, 0, BASE + 0x00400001
537c305e32fSMax Filippov1:
538c305e32fSMax Filippov    l8ui    a2, a3, 0
539c305e32fSMax Filippov    syscall
540c305e32fSMax Filippov2:
541c305e32fSMax Filippov    rsr     a2, excvaddr
542c305e32fSMax Filippov    assert  eq, a2, a3
543c305e32fSMax Filippov
544c305e32fSMax Filippov    assert_no_auto_tlb
545c305e32fSMax Filippov    assert_epc1_1m 1b
546c305e32fSMax Filippov    assert_sr exccause, 24
5477d890b40SMax Filippovtest_end
5487d890b40SMax Filippov
54957a74051SMax Filippovtest cross_page_insn
55057a74051SMax Filippov    set_vector kernel, 2f
55157a74051SMax Filippov
55257a74051SMax Filippov    movi    a2, 0x04000003 /* PPN */
553*da60ecd6SMax Filippov    movi    a3, BASE + 0x00007000 /* VPN */
55457a74051SMax Filippov    witlb   a2, a3
55557a74051SMax Filippov    wdtlb   a2, a3
556*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000 /* VPN */
55757a74051SMax Filippov    witlb   a2, a3
55857a74051SMax Filippov    wdtlb   a2, a3
55957a74051SMax Filippov
560*da60ecd6SMax Filippov    movi    a2, BASE + 0x00007fff
56157a74051SMax Filippov    movi    a3, 20f
56257a74051SMax Filippov    movi    a4, 21f
56357a74051SMax Filippov    sub     a4, a4, a3
56457a74051SMax Filippov    loop    a4, 1f
56557a74051SMax Filippov    l8ui    a5, a3, 0
56657a74051SMax Filippov    s8i     a5, a2, 0
56757a74051SMax Filippov    addi    a2, a2, 1
56857a74051SMax Filippov    addi    a3, a3, 1
56957a74051SMax Filippov1:
570*da60ecd6SMax Filippov    movi    a2, BASE + 0x00007fff
571*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000
57257a74051SMax Filippov    /* DTLB: OK, ITLB: OK */
57357a74051SMax Filippov    jx      a2
57457a74051SMax Filippov
57557a74051SMax Filippov    .begin  no-transform
57657a74051SMax Filippov20:
57757a74051SMax Filippov    l32i    a2, a3, 0
57857a74051SMax Filippov    syscall
57957a74051SMax Filippov21:
58057a74051SMax Filippov    .end    no-transform
58157a74051SMax Filippov
58257a74051SMax Filippov2:
58357a74051SMax Filippov    rsr     a2, exccause
58457a74051SMax Filippov    movi    a3, 1
58557a74051SMax Filippov    assert  eq, a2, a3
58657a74051SMax Filippov    rsr     a2, epc1
587*da60ecd6SMax Filippov    movi    a3, BASE + 0x8002
58857a74051SMax Filippov    assert  eq, a2, a3
58957a74051SMax Filippov    rsr     a2, excsave1
590*da60ecd6SMax Filippov    movi    a3, BASE + 0x00007fff
59157a74051SMax Filippov    assert  ne, a2, a3
59257a74051SMax Filippov
59357a74051SMax Filippov    reset_ps
59457a74051SMax Filippov    set_vector kernel, 3f
59557a74051SMax Filippov
59657a74051SMax Filippov    movi    a2, 0x0400000c /* PPN */
597*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000 /* VPN */
59857a74051SMax Filippov    wdtlb   a2, a3
599*da60ecd6SMax Filippov    movi    a2, BASE + 0x00007fff
600*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000
60157a74051SMax Filippov    /* DTLB: FAIL, ITLB: OK */
60257a74051SMax Filippov    jx      a2
60357a74051SMax Filippov3:
60457a74051SMax Filippov    rsr     a2, exccause
60557a74051SMax Filippov    movi    a3, 28
60657a74051SMax Filippov    assert  eq, a2, a3
60757a74051SMax Filippov    rsr     a2, epc1
608*da60ecd6SMax Filippov    movi    a3, BASE + 0x7fff
60957a74051SMax Filippov    assert  eq, a2, a3
61057a74051SMax Filippov    rsr     a2, excsave1
611*da60ecd6SMax Filippov    movi    a3, BASE + 0x00007fff
61257a74051SMax Filippov    assert  eq, a2, a3
61357a74051SMax Filippov
61457a74051SMax Filippov    reset_ps
61557a74051SMax Filippov    set_vector kernel, 4f
61657a74051SMax Filippov
61757a74051SMax Filippov    movi    a2, 0x0400000c /* PPN */
618*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000 /* VPN */
61957a74051SMax Filippov    witlb   a2, a3
62057a74051SMax Filippov    movi    a2, 0x04000003 /* PPN */
62157a74051SMax Filippov    wdtlb   a2, a3
622*da60ecd6SMax Filippov    movi    a2, BASE + 0x00007fff
623*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000
62457a74051SMax Filippov    /* DTLB: OK, ITLB: FAIL */
62557a74051SMax Filippov    jx      a2
62657a74051SMax Filippov4:
62757a74051SMax Filippov    rsr     a2, exccause
62857a74051SMax Filippov    movi    a3, 20
62957a74051SMax Filippov    assert  eq, a2, a3
63057a74051SMax Filippov    rsr     a2, epc1
631*da60ecd6SMax Filippov    movi    a3, BASE + 0x7fff
63257a74051SMax Filippov    assert  eq, a2, a3
63357a74051SMax Filippov    rsr     a2, excsave1
634*da60ecd6SMax Filippov    movi    a3, BASE + 0x00007fff
63557a74051SMax Filippov    assert  eq, a2, a3
63657a74051SMax Filippov
63757a74051SMax Filippov    reset_ps
63857a74051SMax Filippov    set_vector kernel, 5f
63957a74051SMax Filippov
64057a74051SMax Filippov    movi    a2, 0x0400000c /* PPN */
641*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000 /* VPN */
64257a74051SMax Filippov    wdtlb   a2, a3
643*da60ecd6SMax Filippov    movi    a2, BASE + 0x00007fff
644*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000
64557a74051SMax Filippov    /* DTLB: FAIL, ITLB: FAIL */
64657a74051SMax Filippov    jx      a2
64757a74051SMax Filippov5:
64857a74051SMax Filippov    rsr     a2, exccause
64957a74051SMax Filippov    movi    a3, 20
65057a74051SMax Filippov    assert  eq, a2, a3
65157a74051SMax Filippov    rsr     a2, epc1
652*da60ecd6SMax Filippov    movi    a3, BASE + 0x7fff
65357a74051SMax Filippov    assert  eq, a2, a3
65457a74051SMax Filippov    rsr     a2, excsave1
655*da60ecd6SMax Filippov    movi    a3, BASE + 0x00007fff
65657a74051SMax Filippov    assert  eq, a2, a3
65757a74051SMax Filippovtest_end
65857a74051SMax Filippov
65957a74051SMax Filippovtest cross_page_tb
66057a74051SMax Filippov    set_vector kernel, 2f
66157a74051SMax Filippov
66257a74051SMax Filippov    movi    a2, 0x04000003 /* PPN */
663*da60ecd6SMax Filippov    movi    a3, BASE + 0x00007000 /* VPN */
66457a74051SMax Filippov    witlb   a2, a3
66557a74051SMax Filippov    wdtlb   a2, a3
666*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000 /* VPN */
66757a74051SMax Filippov    witlb   a2, a3
66857a74051SMax Filippov    wdtlb   a2, a3
66957a74051SMax Filippov
670*da60ecd6SMax Filippov    movi    a2, BASE + 0x00007ffc
67157a74051SMax Filippov    movi    a3, 20f
67257a74051SMax Filippov    movi    a4, 21f
67357a74051SMax Filippov    sub     a4, a4, a3
67457a74051SMax Filippov    loop    a4, 1f
67557a74051SMax Filippov    l8ui    a5, a3, 0
67657a74051SMax Filippov    s8i     a5, a2, 0
67757a74051SMax Filippov    addi    a2, a2, 1
67857a74051SMax Filippov    addi    a3, a3, 1
67957a74051SMax Filippov1:
680*da60ecd6SMax Filippov    movi    a2, BASE + 0x00007ffc
681*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000
68257a74051SMax Filippov    /* DTLB: OK, ITLB: OK */
68357a74051SMax Filippov    jx      a2
68457a74051SMax Filippov
68557a74051SMax Filippov    .begin  no-transform
68657a74051SMax Filippov20:
68757a74051SMax Filippov    l32i    a2, a3, 0
68857a74051SMax Filippov    syscall
68957a74051SMax Filippov21:
69057a74051SMax Filippov    .end    no-transform
69157a74051SMax Filippov
69257a74051SMax Filippov2:
69357a74051SMax Filippov    rsr     a2, exccause
69457a74051SMax Filippov    movi    a3, 1
69557a74051SMax Filippov    assert  eq, a2, a3
69657a74051SMax Filippov    rsr     a2, epc1
697*da60ecd6SMax Filippov    movi    a3, BASE + 0x7fff
69857a74051SMax Filippov    assert  eq, a2, a3
69957a74051SMax Filippov    rsr     a2, excsave1
700*da60ecd6SMax Filippov    movi    a3, BASE + 0x00007ffc
70157a74051SMax Filippov    assert  ne, a2, a3
70257a74051SMax Filippov
70357a74051SMax Filippov    reset_ps
70457a74051SMax Filippov    set_vector kernel, 3f
70557a74051SMax Filippov
70657a74051SMax Filippov    movi    a2, 0x0400000c /* PPN */
707*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000 /* VPN */
70857a74051SMax Filippov    wdtlb   a2, a3
709*da60ecd6SMax Filippov    movi    a2, BASE + 0x00007ffc
710*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000
71157a74051SMax Filippov    /* DTLB: FAIL, ITLB: OK */
71257a74051SMax Filippov    jx      a2
71357a74051SMax Filippov3:
71457a74051SMax Filippov    rsr     a2, exccause
71557a74051SMax Filippov    movi    a3, 28
71657a74051SMax Filippov    assert  eq, a2, a3
71757a74051SMax Filippov    rsr     a2, epc1
718*da60ecd6SMax Filippov    movi    a3, BASE + 0x7ffc
71957a74051SMax Filippov    assert  eq, a2, a3
72057a74051SMax Filippov    rsr     a2, excsave1
721*da60ecd6SMax Filippov    movi    a3, BASE + 0x00007ffc
72257a74051SMax Filippov    assert  eq, a2, a3
72357a74051SMax Filippov
72457a74051SMax Filippov    reset_ps
72557a74051SMax Filippov    set_vector kernel, 4f
72657a74051SMax Filippov
72757a74051SMax Filippov    movi    a2, 0x0400000c /* PPN */
728*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000 /* VPN */
72957a74051SMax Filippov    witlb   a2, a3
73057a74051SMax Filippov    movi    a2, 0x04000003 /* PPN */
73157a74051SMax Filippov    wdtlb   a2, a3
732*da60ecd6SMax Filippov    movi    a2, BASE + 0x00007ffc
733*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000
73457a74051SMax Filippov    /* DTLB: OK, ITLB: FAIL */
73557a74051SMax Filippov    jx      a2
73657a74051SMax Filippov4:
73757a74051SMax Filippov    rsr     a2, exccause
73857a74051SMax Filippov    movi    a3, 20
73957a74051SMax Filippov    assert  eq, a2, a3
74057a74051SMax Filippov    rsr     a2, epc1
741*da60ecd6SMax Filippov    movi    a3, BASE + 0x7fff
74257a74051SMax Filippov    assert  eq, a2, a3
74357a74051SMax Filippov    rsr     a2, excsave1
744*da60ecd6SMax Filippov    movi    a3, BASE + 0x00007ffc
74557a74051SMax Filippov    assert  ne, a2, a3
74657a74051SMax Filippov
74757a74051SMax Filippov    reset_ps
74857a74051SMax Filippov    set_vector kernel, 5f
74957a74051SMax Filippov
75057a74051SMax Filippov    movi    a2, 0x0400000c /* PPN */
751*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000 /* VPN */
75257a74051SMax Filippov    wdtlb   a2, a3
753*da60ecd6SMax Filippov    movi    a2, BASE + 0x00007ffc
754*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000
75557a74051SMax Filippov    /* DTLB: FAIL, ITLB: FAIL */
75657a74051SMax Filippov    jx      a2
75757a74051SMax Filippov5:
75857a74051SMax Filippov    rsr     a2, exccause
75957a74051SMax Filippov    movi    a3, 28
76057a74051SMax Filippov    assert  eq, a2, a3
76157a74051SMax Filippov    rsr     a2, epc1
762*da60ecd6SMax Filippov    movi    a3, BASE + 0x7ffc
76357a74051SMax Filippov    assert  eq, a2, a3
76457a74051SMax Filippov    rsr     a2, excsave1
765*da60ecd6SMax Filippov    movi    a3, BASE + 0x00007ffc
76657a74051SMax Filippov    assert  eq, a2, a3
76757a74051SMax Filippovtest_end
76857a74051SMax Filippov
7693db8a95eSMax Filippov#endif
7703db8a95eSMax Filippov
7717d890b40SMax Filippovtest_suite_end
772