1a2e67072SMax Filippov#include "macros.inc" 2c09015ddSAnthony Liguori 3c09015ddSAnthony Liguoritest_suite mmu 4c09015ddSAnthony Liguori 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 10c09015ddSAnthony Liguori 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 28c09015ddSAnthony Liguori movi a2, 0x00000007 29c09015ddSAnthony Liguori 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 44c09015ddSAnthony Liguori.endm 45c09015ddSAnthony Liguori 46c09015ddSAnthony Liguoritest tlb_group 47c09015ddSAnthony Liguori movi a2, 0x04000002 /* PPN */ 48*da60ecd6SMax Filippov movi a3, BASE + 0x01200004 /* VPN */ 49c09015ddSAnthony Liguori wdtlb a2, a3 50c09015ddSAnthony Liguori witlb a2, a3 51c09015ddSAnthony Liguori movi a3, 0x00200004 52c09015ddSAnthony Liguori rdtlb0 a1, a3 53c09015ddSAnthony Liguori ritlb0 a2, a3 54*da60ecd6SMax Filippov movi a3, BASE + 0x01000001 55c09015ddSAnthony Liguori assert eq, a1, a3 56c09015ddSAnthony Liguori assert eq, a2, a3 57c09015ddSAnthony Liguori movi a3, 0x00200004 58c09015ddSAnthony Liguori rdtlb1 a1, a3 59c09015ddSAnthony Liguori ritlb1 a2, a3 60c09015ddSAnthony Liguori movi a3, 0x04000002 61c09015ddSAnthony Liguori assert eq, a1, a3 62c09015ddSAnthony Liguori assert eq, a2, a3 63*da60ecd6SMax Filippov movi a3, BASE + 0x01234567 64c09015ddSAnthony Liguori pdtlb a1, a3 65c09015ddSAnthony Liguori pitlb a2, a3 66*da60ecd6SMax Filippov movi a3, BASE + 0x01234014 67c09015ddSAnthony Liguori assert eq, a1, a3 68*da60ecd6SMax Filippov movi a3, BASE + 0x0123400c 69c09015ddSAnthony Liguori assert eq, a2, a3 70c09015ddSAnthony Liguori movi a3, 0x00200004 71c09015ddSAnthony Liguori idtlb a3 72c09015ddSAnthony Liguori iitlb a3 73*da60ecd6SMax Filippov movi a3, BASE + 0x01234567 74c09015ddSAnthony Liguori pdtlb a1, a3 75c09015ddSAnthony Liguori pitlb a2, a3 76c09015ddSAnthony Liguori movi a3, 0x00000010 77c09015ddSAnthony Liguori and a1, a1, a3 78c09015ddSAnthony Liguori assert eqi, a1, 0 79c09015ddSAnthony Liguori movi a3, 0x00000008 80c09015ddSAnthony Liguori and a2, a2, a3 81c09015ddSAnthony Liguori assert eqi, a2, 0 82c09015ddSAnthony Liguoritest_end 83c09015ddSAnthony Liguori 84c09015ddSAnthony Liguoritest itlb_miss 85c09015ddSAnthony Liguori set_vector kernel, 1f 86c09015ddSAnthony Liguori 87*da60ecd6SMax Filippov movi a3, BASE + 0x00100000 88c09015ddSAnthony Liguori jx a3 89c09015ddSAnthony Liguori test_fail 90c09015ddSAnthony Liguori1: 91c09015ddSAnthony Liguori rsr a2, excvaddr 92c09015ddSAnthony Liguori assert eq, a2, a3 93c09015ddSAnthony Liguori rsr a2, exccause 94c09015ddSAnthony Liguori movi a3, 16 95c09015ddSAnthony Liguori assert eq, a2, a3 96c09015ddSAnthony Liguoritest_end 97c09015ddSAnthony Liguori 98c09015ddSAnthony Liguoritest dtlb_miss 99c09015ddSAnthony Liguori set_vector kernel, 1f 100c09015ddSAnthony Liguori 101*da60ecd6SMax Filippov movi a3, BASE + 0x00100000 102c09015ddSAnthony Liguori l8ui a2, a3, 0 103c09015ddSAnthony Liguori test_fail 104c09015ddSAnthony Liguori1: 105c09015ddSAnthony Liguori rsr a2, excvaddr 106c09015ddSAnthony Liguori assert eq, a2, a3 107c09015ddSAnthony Liguori rsr a2, exccause 108c09015ddSAnthony Liguori movi a3, 24 109c09015ddSAnthony Liguori assert eq, a2, a3 110c09015ddSAnthony Liguoritest_end 111c09015ddSAnthony Liguori 112c09015ddSAnthony Liguoritest itlb_multi_hit 113c09015ddSAnthony Liguori set_vector kernel, 1f 114c09015ddSAnthony Liguori 115c09015ddSAnthony Liguori movi a2, 0x04000002 /* PPN */ 116c09015ddSAnthony Liguori movi a3, 0xf0000004 /* VPN */ 117c09015ddSAnthony Liguori witlb a2, a3 118c09015ddSAnthony Liguori movi a3, 0xf0000000 119c09015ddSAnthony Liguori pitlb a2, a3 120c09015ddSAnthony Liguori test_fail 121c09015ddSAnthony Liguori1: 122c09015ddSAnthony Liguori rsr a2, exccause 123c09015ddSAnthony Liguori movi a3, 17 124c09015ddSAnthony Liguori assert eq, a2, a3 125c09015ddSAnthony Liguoritest_end 126c09015ddSAnthony Liguori 127c09015ddSAnthony Liguoritest dtlb_multi_hit 128c09015ddSAnthony Liguori set_vector kernel, 1f 129c09015ddSAnthony Liguori 130c09015ddSAnthony Liguori movi a2, 0x04000002 /* PPN */ 131*da60ecd6SMax Filippov movi a3, BASE + 0x01200004 /* VPN */ 132c09015ddSAnthony Liguori wdtlb a2, a3 133*da60ecd6SMax Filippov movi a3, BASE + 0x01200007 /* VPN */ 134c09015ddSAnthony Liguori wdtlb a2, a3 135*da60ecd6SMax Filippov movi a3, BASE + 0x01200000 136c09015ddSAnthony Liguori pdtlb a2, a3 137c09015ddSAnthony Liguori test_fail 138c09015ddSAnthony Liguori1: 139c09015ddSAnthony Liguori rsr a2, exccause 140c09015ddSAnthony Liguori movi a3, 25 141c09015ddSAnthony Liguori assert eq, a2, a3 142c09015ddSAnthony Liguoritest_end 143c09015ddSAnthony Liguori 144c09015ddSAnthony Liguoritest inst_fetch_privilege 145c09015ddSAnthony Liguori set_vector kernel, 3f 146c09015ddSAnthony Liguori 147c09015ddSAnthony Liguori movi a2, 0x4004f 148c09015ddSAnthony Liguori wsr a2, ps 149c09015ddSAnthony Liguori1: 150c09015ddSAnthony Liguori isync 151c09015ddSAnthony Liguori nop 152c09015ddSAnthony Liguori2: 153c09015ddSAnthony Liguori test_fail 154c09015ddSAnthony Liguori3: 155c09015ddSAnthony Liguori movi a1, 1b 156c09015ddSAnthony Liguori rsr a2, excvaddr 157c09015ddSAnthony Liguori rsr a3, epc1 158c09015ddSAnthony Liguori assert ge, a2, a1 159c09015ddSAnthony Liguori assert ge, a3, a1 160c09015ddSAnthony Liguori movi a1, 2b 161c09015ddSAnthony Liguori assert lt, a2, a1 162c09015ddSAnthony Liguori assert lt, a3, a1 163c09015ddSAnthony Liguori rsr a2, exccause 164c09015ddSAnthony Liguori movi a3, 18 165c09015ddSAnthony Liguori assert eq, a2, a3 166c09015ddSAnthony Liguori rsr a2, ps 167c09015ddSAnthony Liguori movi a3, 0x4005f 168c09015ddSAnthony Liguori assert eq, a2, a3 169c09015ddSAnthony Liguoritest_end 170c09015ddSAnthony Liguori 171c09015ddSAnthony Liguoritest load_store_privilege 172c09015ddSAnthony Liguori set_vector kernel, 2f 173c09015ddSAnthony Liguori 174c09015ddSAnthony Liguori movi a3, 10f 175c09015ddSAnthony Liguori pitlb a3, a3 176c09015ddSAnthony Liguori ritlb1 a2, a3 177c09015ddSAnthony Liguori movi a1, 0x10 178c09015ddSAnthony Liguori or a2, a2, a1 179c09015ddSAnthony Liguori movi a1, 0x000ff000 180c09015ddSAnthony Liguori and a3, a3, a1 181c09015ddSAnthony Liguori movi a1, 4 182c09015ddSAnthony Liguori or a3, a3, a1 183*da60ecd6SMax Filippov movi a5, BASE 184*da60ecd6SMax Filippov add a3, a3, a5 185c09015ddSAnthony Liguori witlb a2, a3 186c09015ddSAnthony Liguori movi a3, 10f 187c09015ddSAnthony Liguori movi a1, 0x000fffff 188c09015ddSAnthony Liguori and a1, a3, a1 189*da60ecd6SMax Filippov add a1, a1, a5 190c09015ddSAnthony Liguori 191c09015ddSAnthony Liguori movi a2, 0x04000003 /* PPN */ 192*da60ecd6SMax Filippov movi a3, BASE + 0x01200004 /* VPN */ 193c09015ddSAnthony Liguori wdtlb a2, a3 194*da60ecd6SMax Filippov movi a3, BASE + 0x01200001 195c09015ddSAnthony Liguori movi a2, 0x4004f 196c09015ddSAnthony Liguori jx a1 197c09015ddSAnthony Liguori10: 198c09015ddSAnthony Liguori wsr a2, ps 199c09015ddSAnthony Liguori isync 200c09015ddSAnthony Liguori1: 201c09015ddSAnthony Liguori l8ui a2, a3, 0 202c09015ddSAnthony Liguori test_fail 203c09015ddSAnthony Liguori2: 204c09015ddSAnthony Liguori rsr a2, excvaddr 205c09015ddSAnthony Liguori assert eq, a2, a3 206c09015ddSAnthony Liguori rsr a2, epc1 207c09015ddSAnthony Liguori movi a3, 1b 208c09015ddSAnthony Liguori movi a1, 0x000fffff 209c09015ddSAnthony Liguori and a3, a3, a1 210*da60ecd6SMax Filippov add a3, a3, a5 211c09015ddSAnthony Liguori assert eq, a2, a3 212c09015ddSAnthony Liguori rsr a2, exccause 213c09015ddSAnthony Liguori movi a3, 26 214c09015ddSAnthony Liguori assert eq, a2, a3 215c09015ddSAnthony Liguori rsr a2, ps 216c09015ddSAnthony Liguori movi a3, 0x4005f 217c09015ddSAnthony Liguori assert eq, a2, a3 218c09015ddSAnthony Liguoritest_end 219c09015ddSAnthony Liguori 220c09015ddSAnthony Liguoritest cring_load_store_privilege 221c09015ddSAnthony Liguori set_vector kernel, 0 222c09015ddSAnthony Liguori set_vector double, 2f 223c09015ddSAnthony Liguori 224c09015ddSAnthony Liguori movi a2, 0x04000003 /* PPN */ 225*da60ecd6SMax Filippov movi a3, BASE + 0x01200004 /* VPN */ 226c09015ddSAnthony Liguori wdtlb a2, a3 227*da60ecd6SMax Filippov movi a3, BASE + 0x01200004 228c09015ddSAnthony Liguori movi a2, 0x4005f /* ring 1 + excm => cring == 0 */ 229c09015ddSAnthony Liguori wsr a2, ps 230c09015ddSAnthony Liguori isync 231c09015ddSAnthony Liguori l8ui a2, a3, 0 /* cring used */ 232c09015ddSAnthony Liguori1: 233c09015ddSAnthony Liguori l32e a2, a3, -4 /* ring used */ 234c09015ddSAnthony Liguori test_fail 235c09015ddSAnthony Liguori2: 236c09015ddSAnthony Liguori rsr a2, excvaddr 237c09015ddSAnthony Liguori addi a2, a2, 4 238c09015ddSAnthony Liguori assert eq, a2, a3 239c09015ddSAnthony Liguori rsr a2, depc 240c09015ddSAnthony Liguori movi a3, 1b 241c09015ddSAnthony Liguori assert eq, a2, a3 242c09015ddSAnthony Liguori rsr a2, exccause 243c09015ddSAnthony Liguori movi a3, 26 244c09015ddSAnthony Liguori assert eq, a2, a3 245c09015ddSAnthony Liguori rsr a2, ps 246c09015ddSAnthony Liguori movi a3, 0x4005f 247c09015ddSAnthony Liguori assert eq, a2, a3 248c09015ddSAnthony Liguoritest_end 249c09015ddSAnthony Liguori 250c09015ddSAnthony Liguoritest inst_fetch_prohibited 251c09015ddSAnthony Liguori set_vector kernel, 2f 252c09015ddSAnthony Liguori 253c09015ddSAnthony Liguori movi a3, 10f 254c09015ddSAnthony Liguori pitlb a3, a3 255c09015ddSAnthony Liguori ritlb1 a2, a3 256c09015ddSAnthony Liguori movi a1, 0xfffff000 257c09015ddSAnthony Liguori and a2, a2, a1 258c09015ddSAnthony Liguori movi a1, 0x4 259c09015ddSAnthony Liguori or a2, a2, a1 260c09015ddSAnthony Liguori movi a1, 0x000ff000 261c09015ddSAnthony Liguori and a3, a3, a1 262c09015ddSAnthony Liguori movi a1, 4 263c09015ddSAnthony Liguori or a3, a3, a1 264*da60ecd6SMax Filippov movi a5, BASE 265*da60ecd6SMax Filippov add a3, a3, a5 266c09015ddSAnthony Liguori witlb a2, a3 267c09015ddSAnthony Liguori movi a3, 10f 268c09015ddSAnthony Liguori movi a1, 0x000fffff 269c09015ddSAnthony Liguori and a1, a3, a1 270*da60ecd6SMax Filippov add a1, a1, a5 271c09015ddSAnthony Liguori jx a1 272c09015ddSAnthony Liguori .align 4 273c09015ddSAnthony Liguori10: 274c09015ddSAnthony Liguori nop 275c09015ddSAnthony Liguori test_fail 276c09015ddSAnthony Liguori2: 277c09015ddSAnthony Liguori rsr a2, excvaddr 278c09015ddSAnthony Liguori assert eq, a2, a1 279c09015ddSAnthony Liguori rsr a2, epc1 280c09015ddSAnthony Liguori assert eq, a2, a1 281c09015ddSAnthony Liguori rsr a2, exccause 282c09015ddSAnthony Liguori movi a3, 20 283c09015ddSAnthony Liguori assert eq, a2, a3 284c09015ddSAnthony Liguoritest_end 285c09015ddSAnthony Liguori 286c09015ddSAnthony Liguoritest load_prohibited 287c09015ddSAnthony Liguori set_vector kernel, 2f 288c09015ddSAnthony Liguori 289c09015ddSAnthony Liguori movi a2, 0x0400000c /* PPN */ 290*da60ecd6SMax Filippov movi a3, BASE + 0x01200004 /* VPN */ 291c09015ddSAnthony Liguori wdtlb a2, a3 292*da60ecd6SMax Filippov movi a3, BASE + 0x01200002 293c09015ddSAnthony Liguori1: 294c09015ddSAnthony Liguori l8ui a2, a3, 0 295c09015ddSAnthony Liguori test_fail 296c09015ddSAnthony Liguori2: 297c09015ddSAnthony Liguori rsr a2, excvaddr 298c09015ddSAnthony Liguori assert eq, a2, a3 299c09015ddSAnthony Liguori rsr a2, epc1 300c09015ddSAnthony Liguori movi a3, 1b 301c09015ddSAnthony Liguori assert eq, a2, a3 302c09015ddSAnthony Liguori rsr a2, exccause 303c09015ddSAnthony Liguori movi a3, 28 304c09015ddSAnthony Liguori assert eq, a2, a3 305c09015ddSAnthony Liguoritest_end 306c09015ddSAnthony Liguori 307c09015ddSAnthony Liguoritest store_prohibited 308c09015ddSAnthony Liguori set_vector kernel, 2f 309c09015ddSAnthony Liguori 310c09015ddSAnthony Liguori movi a2, 0x04000001 /* PPN */ 311*da60ecd6SMax Filippov movi a3, BASE + 0x01200004 /* VPN */ 312c09015ddSAnthony Liguori wdtlb a2, a3 313*da60ecd6SMax Filippov movi a3, BASE + 0x01200003 314c09015ddSAnthony Liguori l8ui a2, a3, 0 315c09015ddSAnthony Liguori1: 316c09015ddSAnthony Liguori s8i a2, a3, 0 317c09015ddSAnthony Liguori test_fail 318c09015ddSAnthony Liguori2: 319c09015ddSAnthony Liguori rsr a2, excvaddr 320c09015ddSAnthony Liguori assert eq, a2, a3 321c09015ddSAnthony Liguori rsr a2, epc1 322c09015ddSAnthony Liguori movi a3, 1b 323c09015ddSAnthony Liguori assert eq, a2, a3 324c09015ddSAnthony Liguori rsr a2, exccause 325c09015ddSAnthony Liguori movi a3, 29 326c09015ddSAnthony Liguori assert eq, a2, a3 327c09015ddSAnthony Liguoritest_end 328c09015ddSAnthony Liguori 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 334c09015ddSAnthony Liguori 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 405c09015ddSAnthony Liguori pdtlb a2, a3 406c09015ddSAnthony Liguori movi a1, 0x10 407c09015ddSAnthony Liguori and a1, a1, a2 408c09015ddSAnthony Liguori 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 433c09015ddSAnthony Liguori 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 547c09015ddSAnthony Liguoritest_end 548c09015ddSAnthony Liguori 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 771c09015ddSAnthony Liguoritest_suite_end 772