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