xref: /qemu/tests/tcg/xtensa/test_mmu.S (revision 57a740514d2f68330ae408894b4c5ab01cfb0a83)
1a2e67072SMax Filippov#include "macros.inc"
27d890b40SMax Filippov
37d890b40SMax Filippovtest_suite mmu
47d890b40SMax Filippov
5d0fa1f0dSMax Filippov.purgem test_init
67d890b40SMax Filippov
7ca3164dfSMax Filippov.macro clean_tlb_way way, page_size, n_entries
8ca3164dfSMax Filippov    movi    a2, \way
9ca3164dfSMax Filippov    movi    a3, \page_size
10ca3164dfSMax Filippov    movi    a4, \n_entries
11ca3164dfSMax Filippov    loop    a4, 1f
12ca3164dfSMax Filippov    idtlb   a2
13ca3164dfSMax Filippov    iitlb   a2
14ca3164dfSMax Filippov    add     a2, a2, a3
15ca3164dfSMax Filippov1:
16ca3164dfSMax Filippov.endm
17ca3164dfSMax Filippov
18d0fa1f0dSMax Filippov.macro test_init
19ca3164dfSMax Filippov    clean_tlb_way 0, 0x00001000, 4
20ca3164dfSMax Filippov    clean_tlb_way 1, 0x00001000, 4
21ca3164dfSMax Filippov    clean_tlb_way 2, 0x00001000, 4
22ca3164dfSMax Filippov    clean_tlb_way 3, 0x00001000, 4
23ca3164dfSMax Filippov    clean_tlb_way 4, 0x00100000, 4
247d890b40SMax Filippov    movi    a2, 0x00000007
257d890b40SMax Filippov    idtlb   a2
26ca3164dfSMax Filippov    movi    a2, 0x00000008
27ca3164dfSMax Filippov    idtlb   a2
28ca3164dfSMax Filippov    movi    a2, 0x00000009
29ca3164dfSMax Filippov    idtlb   a2
307d890b40SMax Filippov.endm
317d890b40SMax Filippov
327d890b40SMax Filippovtest tlb_group
337d890b40SMax Filippov    movi    a2, 0x04000002 /* PPN */
347d890b40SMax Filippov    movi    a3, 0x01200004 /* VPN */
357d890b40SMax Filippov    wdtlb   a2, a3
367d890b40SMax Filippov    witlb   a2, a3
377d890b40SMax Filippov    movi    a3, 0x00200004
387d890b40SMax Filippov    rdtlb0  a1, a3
397d890b40SMax Filippov    ritlb0  a2, a3
407d890b40SMax Filippov    movi    a3, 0x01000001
417d890b40SMax Filippov    assert  eq, a1, a3
427d890b40SMax Filippov    assert  eq, a2, a3
437d890b40SMax Filippov    movi    a3, 0x00200004
447d890b40SMax Filippov    rdtlb1  a1, a3
457d890b40SMax Filippov    ritlb1  a2, a3
467d890b40SMax Filippov    movi    a3, 0x04000002
477d890b40SMax Filippov    assert  eq, a1, a3
487d890b40SMax Filippov    assert  eq, a2, a3
497d890b40SMax Filippov    movi    a3, 0x01234567
507d890b40SMax Filippov    pdtlb   a1, a3
517d890b40SMax Filippov    pitlb   a2, a3
527d890b40SMax Filippov    movi    a3, 0x01234014
537d890b40SMax Filippov    assert  eq, a1, a3
547d890b40SMax Filippov    movi    a3, 0x0123400c
557d890b40SMax Filippov    assert  eq, a2, a3
567d890b40SMax Filippov    movi    a3, 0x00200004
577d890b40SMax Filippov    idtlb   a3
587d890b40SMax Filippov    iitlb   a3
597d890b40SMax Filippov    movi    a3, 0x01234567
607d890b40SMax Filippov    pdtlb   a1, a3
617d890b40SMax Filippov    pitlb   a2, a3
627d890b40SMax Filippov    movi    a3, 0x00000010
637d890b40SMax Filippov    and     a1, a1, a3
647d890b40SMax Filippov    assert  eqi, a1, 0
657d890b40SMax Filippov    movi    a3, 0x00000008
667d890b40SMax Filippov    and     a2, a2, a3
677d890b40SMax Filippov    assert  eqi, a2, 0
687d890b40SMax Filippovtest_end
697d890b40SMax Filippov
707d890b40SMax Filippovtest itlb_miss
717d890b40SMax Filippov    set_vector kernel, 1f
727d890b40SMax Filippov
737d890b40SMax Filippov    movi    a3, 0x00100000
747d890b40SMax Filippov    jx      a3
757d890b40SMax Filippov    test_fail
767d890b40SMax Filippov1:
777d890b40SMax Filippov    rsr     a2, excvaddr
787d890b40SMax Filippov    assert  eq, a2, a3
797d890b40SMax Filippov    rsr     a2, exccause
807d890b40SMax Filippov    movi    a3, 16
817d890b40SMax Filippov    assert  eq, a2, a3
827d890b40SMax Filippovtest_end
837d890b40SMax Filippov
847d890b40SMax Filippovtest dtlb_miss
857d890b40SMax Filippov    set_vector kernel, 1f
867d890b40SMax Filippov
877d890b40SMax Filippov    movi    a3, 0x00100000
887d890b40SMax Filippov    l8ui    a2, a3, 0
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, 24
957d890b40SMax Filippov    assert  eq, a2, a3
967d890b40SMax Filippovtest_end
977d890b40SMax Filippov
987d890b40SMax Filippovtest itlb_multi_hit
997d890b40SMax Filippov    set_vector kernel, 1f
1007d890b40SMax Filippov
1017d890b40SMax Filippov    movi    a2, 0x04000002 /* PPN */
1027d890b40SMax Filippov    movi    a3, 0xf0000004 /* VPN */
1037d890b40SMax Filippov    witlb   a2, a3
1047d890b40SMax Filippov    movi    a3, 0xf0000000
1057d890b40SMax Filippov    pitlb   a2, a3
1067d890b40SMax Filippov    test_fail
1077d890b40SMax Filippov1:
1087d890b40SMax Filippov    rsr     a2, exccause
1097d890b40SMax Filippov    movi    a3, 17
1107d890b40SMax Filippov    assert  eq, a2, a3
1117d890b40SMax Filippovtest_end
1127d890b40SMax Filippov
1137d890b40SMax Filippovtest dtlb_multi_hit
1147d890b40SMax Filippov    set_vector kernel, 1f
1157d890b40SMax Filippov
1167d890b40SMax Filippov    movi    a2, 0x04000002 /* PPN */
1177d890b40SMax Filippov    movi    a3, 0x01200004 /* VPN */
1187d890b40SMax Filippov    wdtlb   a2, a3
1197d890b40SMax Filippov    movi    a3, 0x01200007 /* VPN */
1207d890b40SMax Filippov    wdtlb   a2, a3
1217d890b40SMax Filippov    movi    a3, 0x01200000
1227d890b40SMax Filippov    pdtlb   a2, a3
1237d890b40SMax Filippov    test_fail
1247d890b40SMax Filippov1:
1257d890b40SMax Filippov    rsr     a2, exccause
1267d890b40SMax Filippov    movi    a3, 25
1277d890b40SMax Filippov    assert  eq, a2, a3
1287d890b40SMax Filippovtest_end
1297d890b40SMax Filippov
1307d890b40SMax Filippovtest inst_fetch_privilege
1317d890b40SMax Filippov    set_vector kernel, 3f
1327d890b40SMax Filippov
1337d890b40SMax Filippov    movi    a2, 0x4004f
1347d890b40SMax Filippov    wsr     a2, ps
1357d890b40SMax Filippov1:
1367d890b40SMax Filippov    isync
1377d890b40SMax Filippov    nop
1387d890b40SMax Filippov2:
1397d890b40SMax Filippov    test_fail
1407d890b40SMax Filippov3:
1417d890b40SMax Filippov    movi    a1, 1b
1427d890b40SMax Filippov    rsr     a2, excvaddr
1437d890b40SMax Filippov    rsr     a3, epc1
1447d890b40SMax Filippov    assert  ge, a2, a1
1457d890b40SMax Filippov    assert  ge, a3, a1
1467d890b40SMax Filippov    movi    a1, 2b
1477d890b40SMax Filippov    assert  lt, a2, a1
1487d890b40SMax Filippov    assert  lt, a3, a1
1497d890b40SMax Filippov    rsr     a2, exccause
1507d890b40SMax Filippov    movi    a3, 18
1517d890b40SMax Filippov    assert  eq, a2, a3
1527d890b40SMax Filippov    rsr     a2, ps
1537d890b40SMax Filippov    movi    a3, 0x4005f
1547d890b40SMax Filippov    assert  eq, a2, a3
1557d890b40SMax Filippovtest_end
1567d890b40SMax Filippov
1577d890b40SMax Filippovtest load_store_privilege
1587d890b40SMax Filippov    set_vector kernel, 2f
1597d890b40SMax Filippov
1607d890b40SMax Filippov    movi    a3, 10f
1617d890b40SMax Filippov    pitlb   a3, a3
1627d890b40SMax Filippov    ritlb1  a2, a3
1637d890b40SMax Filippov    movi    a1, 0x10
1647d890b40SMax Filippov    or      a2, a2, a1
1657d890b40SMax Filippov    movi    a1, 0x000ff000
1667d890b40SMax Filippov    and     a3, a3, a1
1677d890b40SMax Filippov    movi    a1, 4
1687d890b40SMax Filippov    or      a3, a3, a1
1697d890b40SMax Filippov    witlb   a2, a3
1707d890b40SMax Filippov    movi    a3, 10f
1717d890b40SMax Filippov    movi    a1, 0x000fffff
1727d890b40SMax Filippov    and     a1, a3, a1
1737d890b40SMax Filippov
1747d890b40SMax Filippov    movi    a2, 0x04000003 /* PPN */
1757d890b40SMax Filippov    movi    a3, 0x01200004 /* VPN */
1767d890b40SMax Filippov    wdtlb   a2, a3
1777d890b40SMax Filippov    movi    a3, 0x01200001
1787d890b40SMax Filippov    movi    a2, 0x4004f
1797d890b40SMax Filippov    jx      a1
1807d890b40SMax Filippov10:
1817d890b40SMax Filippov    wsr     a2, ps
1827d890b40SMax Filippov    isync
1837d890b40SMax Filippov1:
1847d890b40SMax Filippov    l8ui    a2, a3, 0
1857d890b40SMax Filippov    test_fail
1867d890b40SMax Filippov2:
1877d890b40SMax Filippov    rsr     a2, excvaddr
1887d890b40SMax Filippov    assert  eq, a2, a3
1897d890b40SMax Filippov    rsr     a2, epc1
1907d890b40SMax Filippov    movi    a3, 1b
1917d890b40SMax Filippov    movi    a1, 0x000fffff
1927d890b40SMax Filippov    and     a3, a3, a1
1937d890b40SMax Filippov    assert  eq, a2, a3
1947d890b40SMax Filippov    rsr     a2, exccause
1957d890b40SMax Filippov    movi    a3, 26
1967d890b40SMax Filippov    assert  eq, a2, a3
1977d890b40SMax Filippov    rsr     a2, ps
1987d890b40SMax Filippov    movi    a3, 0x4005f
1997d890b40SMax Filippov    assert  eq, a2, a3
2007d890b40SMax Filippovtest_end
2017d890b40SMax Filippov
2027d890b40SMax Filippovtest cring_load_store_privilege
2037d890b40SMax Filippov    set_vector kernel, 0
2047d890b40SMax Filippov    set_vector double, 2f
2057d890b40SMax Filippov
2067d890b40SMax Filippov    movi    a2, 0x04000003 /* PPN */
2077d890b40SMax Filippov    movi    a3, 0x01200004 /* VPN */
2087d890b40SMax Filippov    wdtlb   a2, a3
2097d890b40SMax Filippov    movi    a3, 0x01200004
2107d890b40SMax Filippov    movi    a2, 0x4005f    /* ring 1 + excm => cring == 0 */
2117d890b40SMax Filippov    wsr     a2, ps
2127d890b40SMax Filippov    isync
2137d890b40SMax Filippov    l8ui    a2, a3, 0      /* cring used */
2147d890b40SMax Filippov1:
2157d890b40SMax Filippov    l32e    a2, a3, -4     /* ring used */
2167d890b40SMax Filippov    test_fail
2177d890b40SMax Filippov2:
2187d890b40SMax Filippov    rsr     a2, excvaddr
2197d890b40SMax Filippov    addi    a2, a2, 4
2207d890b40SMax Filippov    assert  eq, a2, a3
2217d890b40SMax Filippov    rsr     a2, depc
2227d890b40SMax Filippov    movi    a3, 1b
2237d890b40SMax Filippov    assert  eq, a2, a3
2247d890b40SMax Filippov    rsr     a2, exccause
2257d890b40SMax Filippov    movi    a3, 26
2267d890b40SMax Filippov    assert  eq, a2, a3
2277d890b40SMax Filippov    rsr     a2, ps
2287d890b40SMax Filippov    movi    a3, 0x4005f
2297d890b40SMax Filippov    assert  eq, a2, a3
2307d890b40SMax Filippovtest_end
2317d890b40SMax Filippov
2327d890b40SMax Filippovtest inst_fetch_prohibited
2337d890b40SMax Filippov    set_vector kernel, 2f
2347d890b40SMax Filippov
2357d890b40SMax Filippov    movi    a3, 10f
2367d890b40SMax Filippov    pitlb   a3, a3
2377d890b40SMax Filippov    ritlb1  a2, a3
2387d890b40SMax Filippov    movi    a1, 0xfffff000
2397d890b40SMax Filippov    and     a2, a2, a1
2407d890b40SMax Filippov    movi    a1, 0x4
2417d890b40SMax Filippov    or      a2, a2, a1
2427d890b40SMax Filippov    movi    a1, 0x000ff000
2437d890b40SMax Filippov    and     a3, a3, a1
2447d890b40SMax Filippov    movi    a1, 4
2457d890b40SMax Filippov    or      a3, a3, a1
2467d890b40SMax Filippov    witlb   a2, a3
2477d890b40SMax Filippov    movi    a3, 10f
2487d890b40SMax Filippov    movi    a1, 0x000fffff
2497d890b40SMax Filippov    and     a1, a3, a1
2507d890b40SMax Filippov    jx      a1
2517d890b40SMax Filippov    .align  4
2527d890b40SMax Filippov10:
2537d890b40SMax Filippov    nop
2547d890b40SMax Filippov    test_fail
2557d890b40SMax Filippov2:
2567d890b40SMax Filippov    rsr     a2, excvaddr
2577d890b40SMax Filippov    assert  eq, a2, a1
2587d890b40SMax Filippov    rsr     a2, epc1
2597d890b40SMax Filippov    assert  eq, a2, a1
2607d890b40SMax Filippov    rsr     a2, exccause
2617d890b40SMax Filippov    movi    a3, 20
2627d890b40SMax Filippov    assert  eq, a2, a3
2637d890b40SMax Filippovtest_end
2647d890b40SMax Filippov
2657d890b40SMax Filippovtest load_prohibited
2667d890b40SMax Filippov    set_vector kernel, 2f
2677d890b40SMax Filippov
2687d890b40SMax Filippov    movi    a2, 0x0400000c /* PPN */
2697d890b40SMax Filippov    movi    a3, 0x01200004 /* VPN */
2707d890b40SMax Filippov    wdtlb   a2, a3
2717d890b40SMax Filippov    movi    a3, 0x01200002
2727d890b40SMax Filippov1:
2737d890b40SMax Filippov    l8ui    a2, a3, 0
2747d890b40SMax Filippov    test_fail
2757d890b40SMax Filippov2:
2767d890b40SMax Filippov    rsr     a2, excvaddr
2777d890b40SMax Filippov    assert  eq, a2, a3
2787d890b40SMax Filippov    rsr     a2, epc1
2797d890b40SMax Filippov    movi    a3, 1b
2807d890b40SMax Filippov    assert  eq, a2, a3
2817d890b40SMax Filippov    rsr     a2, exccause
2827d890b40SMax Filippov    movi    a3, 28
2837d890b40SMax Filippov    assert  eq, a2, a3
2847d890b40SMax Filippovtest_end
2857d890b40SMax Filippov
2867d890b40SMax Filippovtest store_prohibited
2877d890b40SMax Filippov    set_vector kernel, 2f
2887d890b40SMax Filippov
2897d890b40SMax Filippov    movi    a2, 0x04000001 /* PPN */
2907d890b40SMax Filippov    movi    a3, 0x01200004 /* VPN */
2917d890b40SMax Filippov    wdtlb   a2, a3
2927d890b40SMax Filippov    movi    a3, 0x01200003
2937d890b40SMax Filippov    l8ui    a2, a3, 0
2947d890b40SMax Filippov1:
2957d890b40SMax Filippov    s8i     a2, a3, 0
2967d890b40SMax Filippov    test_fail
2977d890b40SMax Filippov2:
2987d890b40SMax Filippov    rsr     a2, excvaddr
2997d890b40SMax Filippov    assert  eq, a2, a3
3007d890b40SMax Filippov    rsr     a2, epc1
3017d890b40SMax Filippov    movi    a3, 1b
3027d890b40SMax Filippov    assert  eq, a2, a3
3037d890b40SMax Filippov    rsr     a2, exccause
3047d890b40SMax Filippov    movi    a3, 29
3057d890b40SMax Filippov    assert  eq, a2, a3
3067d890b40SMax Filippovtest_end
3077d890b40SMax Filippov
308c305e32fSMax Filippov/* Set up page table entry vaddr->paddr, ring=pte_ring, attr=pte_attr
309c305e32fSMax Filippov * and DTLB way 7 to cover this PTE, ring=pt_ring, attr=pt_attr
310c305e32fSMax Filippov */
311c305e32fSMax Filippov.macro pt_setup pt_ring, pt_attr, pte_ring, vaddr, paddr, pte_attr
312c305e32fSMax Filippov    movi    a2, 0x80000000
3137d890b40SMax Filippov    wsr     a2, ptevaddr
314c305e32fSMax Filippov
315c305e32fSMax Filippov    movi    a3, 0x80000007 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */
316c305e32fSMax Filippov    movi    a4, 0x04000003 | ((\pt_ring) << 4) /* PADDR 64M */
317c305e32fSMax Filippov    wdtlb   a4, a3
318c305e32fSMax Filippov    isync
319c305e32fSMax Filippov
320c305e32fSMax Filippov    movi    a3, ((\paddr) & 0xfffff000) | ((\pte_ring) << 4) | (\pte_attr)
321c305e32fSMax Filippov    movi    a1, ((\vaddr) >> 12) << 2
322c305e32fSMax Filippov    add     a2, a1, a2
323c305e32fSMax Filippov    s32i    a3, a2, 0
324c305e32fSMax Filippov
325c305e32fSMax Filippov    movi    a3, 0x80000007 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */
326c305e32fSMax Filippov    movi    a4, 0x04000000 | ((\pt_ring) << 4) | (\pt_attr) /* PADDR 64M */
327c305e32fSMax Filippov    wdtlb   a4, a3
328c305e32fSMax Filippov    isync
329c305e32fSMax Filippov
330c305e32fSMax Filippov    movi    a3, (\vaddr)
331c305e32fSMax Filippov.endm
332c305e32fSMax Filippov
333c305e32fSMax Filippov/* out: PS.RING=ring, PS.EXCM=excm, a3=vaddr */
334c305e32fSMax Filippov.macro go_ring ring, excm, vaddr
335c305e32fSMax Filippov    movi    a3, 10f
336c305e32fSMax Filippov    pitlb   a3, a3
337c305e32fSMax Filippov    ritlb1  a2, a3
338c305e32fSMax Filippov    movi    a1, 0x10
339c305e32fSMax Filippov    or      a2, a2, a1
340c305e32fSMax Filippov    movi    a1, 0x000ff000
341c305e32fSMax Filippov    and     a3, a3, a1
342c305e32fSMax Filippov    movi    a1, 4
343c305e32fSMax Filippov    or      a3, a3, a1
344c305e32fSMax Filippov    witlb   a2, a3
345c305e32fSMax Filippov    movi    a3, 10f
346c305e32fSMax Filippov    movi    a1, 0x000fffff
347c305e32fSMax Filippov    and     a1, a3, a1
348c305e32fSMax Filippov
349c305e32fSMax Filippov    movi    a2, 0
350c305e32fSMax Filippov    wsr     a2, excvaddr
351c305e32fSMax Filippov
352c305e32fSMax Filippov    movi    a3, \vaddr
353c305e32fSMax Filippov    movi    a2, 0x4000f | ((\ring) << 6) | ((\excm) << 4)
354c305e32fSMax Filippov    jx      a1
355c305e32fSMax Filippov10:
356c305e32fSMax Filippov    wsr     a2, ps
357c305e32fSMax Filippov    isync
358c305e32fSMax Filippov.endm
359c305e32fSMax Filippov
360c305e32fSMax Filippov/* in: a3 -- virtual address to test */
361c305e32fSMax Filippov.macro assert_auto_tlb
362c305e32fSMax Filippov    movi    a2, 0x4000f
363c305e32fSMax Filippov    wsr     a2, ps
364c305e32fSMax Filippov    isync
365c305e32fSMax Filippov    pdtlb   a2, a3
366c305e32fSMax Filippov    movi    a1, 0xfffff01f
367c305e32fSMax Filippov    and     a2, a2, a1
368c305e32fSMax Filippov    movi    a1, 0xfffff000
369c305e32fSMax Filippov    and     a1, a1, a3
370c305e32fSMax Filippov    xor     a1, a1, a2
371c305e32fSMax Filippov    assert  gei, a1, 0x10
372c305e32fSMax Filippov    movi    a2, 0x14
373c305e32fSMax Filippov    assert  lt, a1, a2
374c305e32fSMax Filippov.endm
375c305e32fSMax Filippov
376c305e32fSMax Filippov/* in: a3 -- virtual address to test */
377c305e32fSMax Filippov.macro assert_no_auto_tlb
378c305e32fSMax Filippov    movi    a2, 0x4000f
379c305e32fSMax Filippov    wsr     a2, ps
380c305e32fSMax Filippov    isync
3817d890b40SMax Filippov    pdtlb   a2, a3
3827d890b40SMax Filippov    movi    a1, 0x10
3837d890b40SMax Filippov    and     a1, a1, a2
3847d890b40SMax Filippov    assert  eqi, a1, 0
385c305e32fSMax Filippov.endm
386c305e32fSMax Filippov
387c305e32fSMax Filippov.macro assert_sr sr, v
388c305e32fSMax Filippov    rsr     a2, \sr
389c305e32fSMax Filippov    movi    a1, (\v)
390c305e32fSMax Filippov    assert  eq, a1, a2
391c305e32fSMax Filippov.endm
392c305e32fSMax Filippov
393c305e32fSMax Filippov.macro assert_epc1_1m vaddr
394c305e32fSMax Filippov    movi    a2, (\vaddr)
395c305e32fSMax Filippov    movi    a1, 0xfffff
396c305e32fSMax Filippov    and     a1, a1, a2
397c305e32fSMax Filippov    rsr     a2, epc1
398c305e32fSMax Filippov    assert  eq, a1, a2
399c305e32fSMax Filippov.endm
400c305e32fSMax Filippov
401c305e32fSMax Filippovtest dtlb_autoload
402c305e32fSMax Filippov    set_vector kernel, 0
403c305e32fSMax Filippov
404c305e32fSMax Filippov    pt_setup    0, 3, 1, 0x1000, 0x1000, 3
405c305e32fSMax Filippov    assert_no_auto_tlb
406c305e32fSMax Filippov
4077d890b40SMax Filippov    l8ui    a1, a3, 0
408c305e32fSMax Filippov
409c305e32fSMax Filippov    rsr     a2, excvaddr
410c305e32fSMax Filippov    assert  eq, a2, a3
411c305e32fSMax Filippov
412c305e32fSMax Filippov    assert_auto_tlb
413c305e32fSMax Filippovtest_end
414c305e32fSMax Filippov
415c305e32fSMax Filippovtest autoload_load_store_privilege
416c305e32fSMax Filippov    set_vector kernel, 0
417c305e32fSMax Filippov    set_vector double, 2f
418c305e32fSMax Filippov
419c305e32fSMax Filippov    pt_setup    0, 3, 0, 0x2000, 0x2000, 3
420c305e32fSMax Filippov    movi    a3, 0x2004
421c305e32fSMax Filippov    assert_no_auto_tlb
422c305e32fSMax Filippov
423c305e32fSMax Filippov    movi    a2, 0x4005f    /* ring 1 + excm => cring == 0 */
424c305e32fSMax Filippov    wsr     a2, ps
425c305e32fSMax Filippov    isync
426c305e32fSMax Filippov1:
427c305e32fSMax Filippov    l32e    a2, a3, -4     /* ring used */
428c305e32fSMax Filippov    test_fail
429c305e32fSMax Filippov2:
430c305e32fSMax Filippov    rsr     a2, excvaddr
431c305e32fSMax Filippov    addi    a1, a3, -4
432c305e32fSMax Filippov    assert  eq, a1, a2
433c305e32fSMax Filippov
434c305e32fSMax Filippov    assert_auto_tlb
435c305e32fSMax Filippov    assert_sr depc, 1b
436c305e32fSMax Filippov    assert_sr exccause, 26
437c305e32fSMax Filippovtest_end
438c305e32fSMax Filippov
439c305e32fSMax Filippovtest autoload_pte_load_prohibited
440c305e32fSMax Filippov    set_vector kernel, 2f
441c305e32fSMax Filippov
442c305e32fSMax Filippov    pt_setup    0, 3, 0, 0x3000, 0, 0xc
443c305e32fSMax Filippov    assert_no_auto_tlb
444c305e32fSMax Filippov1:
445c305e32fSMax Filippov    l32i    a2, a3, 0
446c305e32fSMax Filippov    test_fail
447c305e32fSMax Filippov2:
448c305e32fSMax Filippov    rsr     a2, excvaddr
449c305e32fSMax Filippov    assert  eq, a2, a3
450c305e32fSMax Filippov
451c305e32fSMax Filippov    assert_auto_tlb
452c305e32fSMax Filippov    assert_sr epc1, 1b
453c305e32fSMax Filippov    assert_sr exccause, 28
454c305e32fSMax Filippovtest_end
455c305e32fSMax Filippov
456c305e32fSMax Filippovtest autoload_pt_load_prohibited
457c305e32fSMax Filippov    set_vector kernel, 2f
458c305e32fSMax Filippov
459c305e32fSMax Filippov    pt_setup    0, 0xc, 0, 0x4000, 0x4000, 3
460c305e32fSMax Filippov    assert_no_auto_tlb
461c305e32fSMax Filippov1:
462c305e32fSMax Filippov    l32i    a2, a3, 0
463c305e32fSMax Filippov    test_fail
464c305e32fSMax Filippov2:
465c305e32fSMax Filippov    rsr     a2, excvaddr
466c305e32fSMax Filippov    assert  eq, a2, a3
467c305e32fSMax Filippov
468c305e32fSMax Filippov    assert_no_auto_tlb
469c305e32fSMax Filippov    assert_sr epc1, 1b
470c305e32fSMax Filippov    assert_sr exccause, 24
471c305e32fSMax Filippovtest_end
472c305e32fSMax Filippov
473c305e32fSMax Filippovtest autoload_pt_privilege
474c305e32fSMax Filippov    set_vector  kernel, 2f
475c305e32fSMax Filippov    pt_setup    0, 3, 1, 0x5000, 0, 3
476c305e32fSMax Filippov    go_ring     1, 0, 0x5001
477c305e32fSMax Filippov
478c305e32fSMax Filippov    l8ui    a2, a3, 0
479c305e32fSMax Filippov1:
480c305e32fSMax Filippov    syscall
481c305e32fSMax Filippov2:
482c305e32fSMax Filippov    rsr     a2, excvaddr
483c305e32fSMax Filippov    assert  eq, a2, a3
484c305e32fSMax Filippov
485c305e32fSMax Filippov    assert_auto_tlb
486c305e32fSMax Filippov    assert_epc1_1m 1b
487c305e32fSMax Filippov    assert_sr exccause, 1
488c305e32fSMax Filippovtest_end
489c305e32fSMax Filippov
490c305e32fSMax Filippovtest autoload_pte_privilege
491c305e32fSMax Filippov    set_vector  kernel, 2f
492c305e32fSMax Filippov    pt_setup    0, 3, 0, 0x6000, 0, 3
493c305e32fSMax Filippov    go_ring     1, 0, 0x6001
494c305e32fSMax Filippov1:
495c305e32fSMax Filippov    l8ui    a2, a3, 0
496c305e32fSMax Filippov    syscall
497c305e32fSMax Filippov2:
498c305e32fSMax Filippov    rsr     a2, excvaddr
499c305e32fSMax Filippov    assert  eq, a2, a3
500c305e32fSMax Filippov
501c305e32fSMax Filippov    assert_auto_tlb
502c305e32fSMax Filippov    assert_epc1_1m 1b
503c305e32fSMax Filippov    assert_sr exccause, 26
504c305e32fSMax Filippovtest_end
505c305e32fSMax Filippov
506c305e32fSMax Filippovtest autoload_3_level_pt
507c305e32fSMax Filippov    set_vector  kernel, 2f
508c305e32fSMax Filippov    pt_setup    1, 3, 1, 0x00400000, 0, 3
509c305e32fSMax Filippov    pt_setup    1, 3, 1, 0x80001000, 0x2000000, 3
510c305e32fSMax Filippov    go_ring     1, 0, 0x00400001
511c305e32fSMax Filippov1:
512c305e32fSMax Filippov    l8ui    a2, a3, 0
513c305e32fSMax Filippov    syscall
514c305e32fSMax Filippov2:
515c305e32fSMax Filippov    rsr     a2, excvaddr
516c305e32fSMax Filippov    assert  eq, a2, a3
517c305e32fSMax Filippov
518c305e32fSMax Filippov    assert_no_auto_tlb
519c305e32fSMax Filippov    assert_epc1_1m 1b
520c305e32fSMax Filippov    assert_sr exccause, 24
5217d890b40SMax Filippovtest_end
5227d890b40SMax Filippov
523*57a74051SMax Filippovtest cross_page_insn
524*57a74051SMax Filippov    set_vector kernel, 2f
525*57a74051SMax Filippov
526*57a74051SMax Filippov    movi    a2, 0x04000003 /* PPN */
527*57a74051SMax Filippov    movi    a3, 0x00007000 /* VPN */
528*57a74051SMax Filippov    witlb   a2, a3
529*57a74051SMax Filippov    wdtlb   a2, a3
530*57a74051SMax Filippov    movi    a3, 0x00008000 /* VPN */
531*57a74051SMax Filippov    witlb   a2, a3
532*57a74051SMax Filippov    wdtlb   a2, a3
533*57a74051SMax Filippov
534*57a74051SMax Filippov    movi    a2, 0x00007fff
535*57a74051SMax Filippov    movi    a3, 20f
536*57a74051SMax Filippov    movi    a4, 21f
537*57a74051SMax Filippov    sub     a4, a4, a3
538*57a74051SMax Filippov    loop    a4, 1f
539*57a74051SMax Filippov    l8ui    a5, a3, 0
540*57a74051SMax Filippov    s8i     a5, a2, 0
541*57a74051SMax Filippov    addi    a2, a2, 1
542*57a74051SMax Filippov    addi    a3, a3, 1
543*57a74051SMax Filippov1:
544*57a74051SMax Filippov    movi    a2, 0x00007fff
545*57a74051SMax Filippov    movi    a3, 0x00008000
546*57a74051SMax Filippov    /* DTLB: OK, ITLB: OK */
547*57a74051SMax Filippov    jx      a2
548*57a74051SMax Filippov
549*57a74051SMax Filippov    .begin  no-transform
550*57a74051SMax Filippov20:
551*57a74051SMax Filippov    l32i    a2, a3, 0
552*57a74051SMax Filippov    syscall
553*57a74051SMax Filippov21:
554*57a74051SMax Filippov    .end    no-transform
555*57a74051SMax Filippov
556*57a74051SMax Filippov2:
557*57a74051SMax Filippov    rsr     a2, exccause
558*57a74051SMax Filippov    movi    a3, 1
559*57a74051SMax Filippov    assert  eq, a2, a3
560*57a74051SMax Filippov    rsr     a2, epc1
561*57a74051SMax Filippov    movi    a3, 0x8002
562*57a74051SMax Filippov    assert  eq, a2, a3
563*57a74051SMax Filippov    rsr     a2, excsave1
564*57a74051SMax Filippov    movi    a3, 0x00007fff
565*57a74051SMax Filippov    assert  ne, a2, a3
566*57a74051SMax Filippov
567*57a74051SMax Filippov    reset_ps
568*57a74051SMax Filippov    set_vector kernel, 3f
569*57a74051SMax Filippov
570*57a74051SMax Filippov    movi    a2, 0x0400000c /* PPN */
571*57a74051SMax Filippov    movi    a3, 0x00008000 /* VPN */
572*57a74051SMax Filippov    wdtlb   a2, a3
573*57a74051SMax Filippov    movi    a2, 0x00007fff
574*57a74051SMax Filippov    movi    a3, 0x00008000
575*57a74051SMax Filippov    /* DTLB: FAIL, ITLB: OK */
576*57a74051SMax Filippov    jx      a2
577*57a74051SMax Filippov3:
578*57a74051SMax Filippov    rsr     a2, exccause
579*57a74051SMax Filippov    movi    a3, 28
580*57a74051SMax Filippov    assert  eq, a2, a3
581*57a74051SMax Filippov    rsr     a2, epc1
582*57a74051SMax Filippov    movi    a3, 0x7fff
583*57a74051SMax Filippov    assert  eq, a2, a3
584*57a74051SMax Filippov    rsr     a2, excsave1
585*57a74051SMax Filippov    movi    a3, 0x00007fff
586*57a74051SMax Filippov    assert  eq, a2, a3
587*57a74051SMax Filippov
588*57a74051SMax Filippov    reset_ps
589*57a74051SMax Filippov    set_vector kernel, 4f
590*57a74051SMax Filippov
591*57a74051SMax Filippov    movi    a2, 0x0400000c /* PPN */
592*57a74051SMax Filippov    movi    a3, 0x00008000 /* VPN */
593*57a74051SMax Filippov    witlb   a2, a3
594*57a74051SMax Filippov    movi    a2, 0x04000003 /* PPN */
595*57a74051SMax Filippov    wdtlb   a2, a3
596*57a74051SMax Filippov    movi    a2, 0x00007fff
597*57a74051SMax Filippov    movi    a3, 0x00008000
598*57a74051SMax Filippov    /* DTLB: OK, ITLB: FAIL */
599*57a74051SMax Filippov    jx      a2
600*57a74051SMax Filippov4:
601*57a74051SMax Filippov    rsr     a2, exccause
602*57a74051SMax Filippov    movi    a3, 20
603*57a74051SMax Filippov    assert  eq, a2, a3
604*57a74051SMax Filippov    rsr     a2, epc1
605*57a74051SMax Filippov    movi    a3, 0x7fff
606*57a74051SMax Filippov    assert  eq, a2, a3
607*57a74051SMax Filippov    rsr     a2, excsave1
608*57a74051SMax Filippov    movi    a3, 0x00007fff
609*57a74051SMax Filippov    assert  eq, a2, a3
610*57a74051SMax Filippov
611*57a74051SMax Filippov    reset_ps
612*57a74051SMax Filippov    set_vector kernel, 5f
613*57a74051SMax Filippov
614*57a74051SMax Filippov    movi    a2, 0x0400000c /* PPN */
615*57a74051SMax Filippov    movi    a3, 0x00008000 /* VPN */
616*57a74051SMax Filippov    wdtlb   a2, a3
617*57a74051SMax Filippov    movi    a2, 0x00007fff
618*57a74051SMax Filippov    movi    a3, 0x00008000
619*57a74051SMax Filippov    /* DTLB: FAIL, ITLB: FAIL */
620*57a74051SMax Filippov    jx      a2
621*57a74051SMax Filippov5:
622*57a74051SMax Filippov    rsr     a2, exccause
623*57a74051SMax Filippov    movi    a3, 20
624*57a74051SMax Filippov    assert  eq, a2, a3
625*57a74051SMax Filippov    rsr     a2, epc1
626*57a74051SMax Filippov    movi    a3, 0x7fff
627*57a74051SMax Filippov    assert  eq, a2, a3
628*57a74051SMax Filippov    rsr     a2, excsave1
629*57a74051SMax Filippov    movi    a3, 0x00007fff
630*57a74051SMax Filippov    assert  eq, a2, a3
631*57a74051SMax Filippovtest_end
632*57a74051SMax Filippov
633*57a74051SMax Filippovtest cross_page_tb
634*57a74051SMax Filippov    set_vector kernel, 2f
635*57a74051SMax Filippov
636*57a74051SMax Filippov    movi    a2, 0x04000003 /* PPN */
637*57a74051SMax Filippov    movi    a3, 0x00007000 /* VPN */
638*57a74051SMax Filippov    witlb   a2, a3
639*57a74051SMax Filippov    wdtlb   a2, a3
640*57a74051SMax Filippov    movi    a3, 0x00008000 /* VPN */
641*57a74051SMax Filippov    witlb   a2, a3
642*57a74051SMax Filippov    wdtlb   a2, a3
643*57a74051SMax Filippov
644*57a74051SMax Filippov    movi    a2, 0x00007ffd
645*57a74051SMax Filippov    movi    a3, 20f
646*57a74051SMax Filippov    movi    a4, 21f
647*57a74051SMax Filippov    sub     a4, a4, a3
648*57a74051SMax Filippov    loop    a4, 1f
649*57a74051SMax Filippov    l8ui    a5, a3, 0
650*57a74051SMax Filippov    s8i     a5, a2, 0
651*57a74051SMax Filippov    addi    a2, a2, 1
652*57a74051SMax Filippov    addi    a3, a3, 1
653*57a74051SMax Filippov1:
654*57a74051SMax Filippov    movi    a2, 0x00007ffd
655*57a74051SMax Filippov    movi    a3, 0x00008000
656*57a74051SMax Filippov    /* DTLB: OK, ITLB: OK */
657*57a74051SMax Filippov    jx      a2
658*57a74051SMax Filippov
659*57a74051SMax Filippov    .begin  no-transform
660*57a74051SMax Filippov20:
661*57a74051SMax Filippov    l32i    a2, a3, 0
662*57a74051SMax Filippov    syscall
663*57a74051SMax Filippov21:
664*57a74051SMax Filippov    .end    no-transform
665*57a74051SMax Filippov
666*57a74051SMax Filippov2:
667*57a74051SMax Filippov    rsr     a2, exccause
668*57a74051SMax Filippov    movi    a3, 1
669*57a74051SMax Filippov    assert  eq, a2, a3
670*57a74051SMax Filippov    rsr     a2, epc1
671*57a74051SMax Filippov    movi    a3, 0x8000
672*57a74051SMax Filippov    assert  eq, a2, a3
673*57a74051SMax Filippov    rsr     a2, excsave1
674*57a74051SMax Filippov    movi    a3, 0x00007ffd
675*57a74051SMax Filippov    assert  ne, a2, a3
676*57a74051SMax Filippov
677*57a74051SMax Filippov    reset_ps
678*57a74051SMax Filippov    set_vector kernel, 3f
679*57a74051SMax Filippov
680*57a74051SMax Filippov    movi    a2, 0x0400000c /* PPN */
681*57a74051SMax Filippov    movi    a3, 0x00008000 /* VPN */
682*57a74051SMax Filippov    wdtlb   a2, a3
683*57a74051SMax Filippov    movi    a2, 0x00007ffd
684*57a74051SMax Filippov    movi    a3, 0x00008000
685*57a74051SMax Filippov    /* DTLB: FAIL, ITLB: OK */
686*57a74051SMax Filippov    jx      a2
687*57a74051SMax Filippov3:
688*57a74051SMax Filippov    rsr     a2, exccause
689*57a74051SMax Filippov    movi    a3, 28
690*57a74051SMax Filippov    assert  eq, a2, a3
691*57a74051SMax Filippov    rsr     a2, epc1
692*57a74051SMax Filippov    movi    a3, 0x7ffd
693*57a74051SMax Filippov    assert  eq, a2, a3
694*57a74051SMax Filippov    rsr     a2, excsave1
695*57a74051SMax Filippov    movi    a3, 0x00007ffd
696*57a74051SMax Filippov    assert  eq, a2, a3
697*57a74051SMax Filippov
698*57a74051SMax Filippov    reset_ps
699*57a74051SMax Filippov    set_vector kernel, 4f
700*57a74051SMax Filippov
701*57a74051SMax Filippov    movi    a2, 0x0400000c /* PPN */
702*57a74051SMax Filippov    movi    a3, 0x00008000 /* VPN */
703*57a74051SMax Filippov    witlb   a2, a3
704*57a74051SMax Filippov    movi    a2, 0x04000003 /* PPN */
705*57a74051SMax Filippov    wdtlb   a2, a3
706*57a74051SMax Filippov    movi    a2, 0x00007ffd
707*57a74051SMax Filippov    movi    a3, 0x00008000
708*57a74051SMax Filippov    /* DTLB: OK, ITLB: FAIL */
709*57a74051SMax Filippov    jx      a2
710*57a74051SMax Filippov4:
711*57a74051SMax Filippov    rsr     a2, exccause
712*57a74051SMax Filippov    movi    a3, 20
713*57a74051SMax Filippov    assert  eq, a2, a3
714*57a74051SMax Filippov    rsr     a2, epc1
715*57a74051SMax Filippov    movi    a3, 0x8000
716*57a74051SMax Filippov    assert  eq, a2, a3
717*57a74051SMax Filippov    rsr     a2, excsave1
718*57a74051SMax Filippov    movi    a3, 0x00007ffd
719*57a74051SMax Filippov    assert  ne, a2, a3
720*57a74051SMax Filippov
721*57a74051SMax Filippov    reset_ps
722*57a74051SMax Filippov    set_vector kernel, 5f
723*57a74051SMax Filippov
724*57a74051SMax Filippov    movi    a2, 0x0400000c /* PPN */
725*57a74051SMax Filippov    movi    a3, 0x00008000 /* VPN */
726*57a74051SMax Filippov    wdtlb   a2, a3
727*57a74051SMax Filippov    movi    a2, 0x00007ffd
728*57a74051SMax Filippov    movi    a3, 0x00008000
729*57a74051SMax Filippov    /* DTLB: FAIL, ITLB: FAIL */
730*57a74051SMax Filippov    jx      a2
731*57a74051SMax Filippov5:
732*57a74051SMax Filippov    rsr     a2, exccause
733*57a74051SMax Filippov    movi    a3, 28
734*57a74051SMax Filippov    assert  eq, a2, a3
735*57a74051SMax Filippov    rsr     a2, epc1
736*57a74051SMax Filippov    movi    a3, 0x7ffd
737*57a74051SMax Filippov    assert  eq, a2, a3
738*57a74051SMax Filippov    rsr     a2, excsave1
739*57a74051SMax Filippov    movi    a3, 0x00007ffd
740*57a74051SMax Filippov    assert  eq, a2, a3
741*57a74051SMax Filippovtest_end
742*57a74051SMax Filippov
7437d890b40SMax Filippovtest_suite_end
744