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