|
|
1.1 ! root 1: .include "macros.inc" ! 2: ! 3: test_suite mmu ! 4: ! 5: .purgem test ! 6: ! 7: .macro test name ! 8: movi a2, 0x00000004 ! 9: idtlb a2 ! 10: movi a2, 0x00100004 ! 11: idtlb a2 ! 12: movi a2, 0x00200004 ! 13: idtlb a2 ! 14: movi a2, 0x00300004 ! 15: idtlb a2 ! 16: movi a2, 0x00000007 ! 17: idtlb a2 ! 18: .endm ! 19: ! 20: test tlb_group ! 21: movi a2, 0x04000002 /* PPN */ ! 22: movi a3, 0x01200004 /* VPN */ ! 23: wdtlb a2, a3 ! 24: witlb a2, a3 ! 25: movi a3, 0x00200004 ! 26: rdtlb0 a1, a3 ! 27: ritlb0 a2, a3 ! 28: movi a3, 0x01000001 ! 29: assert eq, a1, a3 ! 30: assert eq, a2, a3 ! 31: movi a3, 0x00200004 ! 32: rdtlb1 a1, a3 ! 33: ritlb1 a2, a3 ! 34: movi a3, 0x04000002 ! 35: assert eq, a1, a3 ! 36: assert eq, a2, a3 ! 37: movi a3, 0x01234567 ! 38: pdtlb a1, a3 ! 39: pitlb a2, a3 ! 40: movi a3, 0x01234014 ! 41: assert eq, a1, a3 ! 42: movi a3, 0x0123400c ! 43: assert eq, a2, a3 ! 44: movi a3, 0x00200004 ! 45: idtlb a3 ! 46: iitlb a3 ! 47: movi a3, 0x01234567 ! 48: pdtlb a1, a3 ! 49: pitlb a2, a3 ! 50: movi a3, 0x00000010 ! 51: and a1, a1, a3 ! 52: assert eqi, a1, 0 ! 53: movi a3, 0x00000008 ! 54: and a2, a2, a3 ! 55: assert eqi, a2, 0 ! 56: test_end ! 57: ! 58: test itlb_miss ! 59: set_vector kernel, 1f ! 60: ! 61: movi a3, 0x00100000 ! 62: jx a3 ! 63: test_fail ! 64: 1: ! 65: rsr a2, excvaddr ! 66: assert eq, a2, a3 ! 67: rsr a2, exccause ! 68: movi a3, 16 ! 69: assert eq, a2, a3 ! 70: test_end ! 71: ! 72: test dtlb_miss ! 73: set_vector kernel, 1f ! 74: ! 75: movi a3, 0x00100000 ! 76: l8ui a2, a3, 0 ! 77: test_fail ! 78: 1: ! 79: rsr a2, excvaddr ! 80: assert eq, a2, a3 ! 81: rsr a2, exccause ! 82: movi a3, 24 ! 83: assert eq, a2, a3 ! 84: test_end ! 85: ! 86: test itlb_multi_hit ! 87: set_vector kernel, 1f ! 88: ! 89: movi a2, 0x04000002 /* PPN */ ! 90: movi a3, 0xf0000004 /* VPN */ ! 91: witlb a2, a3 ! 92: movi a3, 0xf0000000 ! 93: pitlb a2, a3 ! 94: test_fail ! 95: 1: ! 96: rsr a2, exccause ! 97: movi a3, 17 ! 98: assert eq, a2, a3 ! 99: test_end ! 100: ! 101: test dtlb_multi_hit ! 102: set_vector kernel, 1f ! 103: ! 104: movi a2, 0x04000002 /* PPN */ ! 105: movi a3, 0x01200004 /* VPN */ ! 106: wdtlb a2, a3 ! 107: movi a3, 0x01200007 /* VPN */ ! 108: wdtlb a2, a3 ! 109: movi a3, 0x01200000 ! 110: pdtlb a2, a3 ! 111: test_fail ! 112: 1: ! 113: rsr a2, exccause ! 114: movi a3, 25 ! 115: assert eq, a2, a3 ! 116: test_end ! 117: ! 118: test inst_fetch_privilege ! 119: set_vector kernel, 3f ! 120: ! 121: movi a2, 0x4004f ! 122: wsr a2, ps ! 123: 1: ! 124: isync ! 125: nop ! 126: 2: ! 127: test_fail ! 128: 3: ! 129: movi a1, 1b ! 130: rsr a2, excvaddr ! 131: rsr a3, epc1 ! 132: assert ge, a2, a1 ! 133: assert ge, a3, a1 ! 134: movi a1, 2b ! 135: assert lt, a2, a1 ! 136: assert lt, a3, a1 ! 137: rsr a2, exccause ! 138: movi a3, 18 ! 139: assert eq, a2, a3 ! 140: rsr a2, ps ! 141: movi a3, 0x4005f ! 142: assert eq, a2, a3 ! 143: test_end ! 144: ! 145: test load_store_privilege ! 146: set_vector kernel, 2f ! 147: ! 148: movi a3, 10f ! 149: pitlb a3, a3 ! 150: ritlb1 a2, a3 ! 151: movi a1, 0x10 ! 152: or a2, a2, a1 ! 153: movi a1, 0x000ff000 ! 154: and a3, a3, a1 ! 155: movi a1, 4 ! 156: or a3, a3, a1 ! 157: witlb a2, a3 ! 158: movi a3, 10f ! 159: movi a1, 0x000fffff ! 160: and a1, a3, a1 ! 161: ! 162: movi a2, 0x04000003 /* PPN */ ! 163: movi a3, 0x01200004 /* VPN */ ! 164: wdtlb a2, a3 ! 165: movi a3, 0x01200001 ! 166: movi a2, 0x4004f ! 167: jx a1 ! 168: 10: ! 169: wsr a2, ps ! 170: isync ! 171: 1: ! 172: l8ui a2, a3, 0 ! 173: test_fail ! 174: 2: ! 175: rsr a2, excvaddr ! 176: assert eq, a2, a3 ! 177: rsr a2, epc1 ! 178: movi a3, 1b ! 179: movi a1, 0x000fffff ! 180: and a3, a3, a1 ! 181: assert eq, a2, a3 ! 182: rsr a2, exccause ! 183: movi a3, 26 ! 184: assert eq, a2, a3 ! 185: rsr a2, ps ! 186: movi a3, 0x4005f ! 187: assert eq, a2, a3 ! 188: test_end ! 189: ! 190: test cring_load_store_privilege ! 191: set_vector kernel, 0 ! 192: set_vector double, 2f ! 193: ! 194: movi a2, 0x04000003 /* PPN */ ! 195: movi a3, 0x01200004 /* VPN */ ! 196: wdtlb a2, a3 ! 197: movi a3, 0x01200004 ! 198: movi a2, 0x4005f /* ring 1 + excm => cring == 0 */ ! 199: wsr a2, ps ! 200: isync ! 201: l8ui a2, a3, 0 /* cring used */ ! 202: 1: ! 203: l32e a2, a3, -4 /* ring used */ ! 204: test_fail ! 205: 2: ! 206: rsr a2, excvaddr ! 207: addi a2, a2, 4 ! 208: assert eq, a2, a3 ! 209: rsr a2, depc ! 210: movi a3, 1b ! 211: assert eq, a2, a3 ! 212: rsr a2, exccause ! 213: movi a3, 26 ! 214: assert eq, a2, a3 ! 215: rsr a2, ps ! 216: movi a3, 0x4005f ! 217: assert eq, a2, a3 ! 218: test_end ! 219: ! 220: test inst_fetch_prohibited ! 221: set_vector kernel, 2f ! 222: ! 223: movi a3, 10f ! 224: pitlb a3, a3 ! 225: ritlb1 a2, a3 ! 226: movi a1, 0xfffff000 ! 227: and a2, a2, a1 ! 228: movi a1, 0x4 ! 229: or a2, a2, a1 ! 230: movi a1, 0x000ff000 ! 231: and a3, a3, a1 ! 232: movi a1, 4 ! 233: or a3, a3, a1 ! 234: witlb a2, a3 ! 235: movi a3, 10f ! 236: movi a1, 0x000fffff ! 237: and a1, a3, a1 ! 238: jx a1 ! 239: .align 4 ! 240: 10: ! 241: nop ! 242: test_fail ! 243: 2: ! 244: rsr a2, excvaddr ! 245: assert eq, a2, a1 ! 246: rsr a2, epc1 ! 247: assert eq, a2, a1 ! 248: rsr a2, exccause ! 249: movi a3, 20 ! 250: assert eq, a2, a3 ! 251: test_end ! 252: ! 253: test load_prohibited ! 254: set_vector kernel, 2f ! 255: ! 256: movi a2, 0x0400000c /* PPN */ ! 257: movi a3, 0x01200004 /* VPN */ ! 258: wdtlb a2, a3 ! 259: movi a3, 0x01200002 ! 260: 1: ! 261: l8ui a2, a3, 0 ! 262: test_fail ! 263: 2: ! 264: rsr a2, excvaddr ! 265: assert eq, a2, a3 ! 266: rsr a2, epc1 ! 267: movi a3, 1b ! 268: assert eq, a2, a3 ! 269: rsr a2, exccause ! 270: movi a3, 28 ! 271: assert eq, a2, a3 ! 272: test_end ! 273: ! 274: test store_prohibited ! 275: set_vector kernel, 2f ! 276: ! 277: movi a2, 0x04000001 /* PPN */ ! 278: movi a3, 0x01200004 /* VPN */ ! 279: wdtlb a2, a3 ! 280: movi a3, 0x01200003 ! 281: l8ui a2, a3, 0 ! 282: 1: ! 283: s8i a2, a3, 0 ! 284: test_fail ! 285: 2: ! 286: rsr a2, excvaddr ! 287: assert eq, a2, a3 ! 288: rsr a2, epc1 ! 289: movi a3, 1b ! 290: assert eq, a2, a3 ! 291: rsr a2, exccause ! 292: movi a3, 29 ! 293: assert eq, a2, a3 ! 294: test_end ! 295: ! 296: /* Set up page table entry vaddr->paddr, ring=pte_ring, attr=pte_attr ! 297: * and DTLB way 7 to cover this PTE, ring=pt_ring, attr=pt_attr ! 298: */ ! 299: .macro pt_setup pt_ring, pt_attr, pte_ring, vaddr, paddr, pte_attr ! 300: movi a2, 0x80000000 ! 301: wsr a2, ptevaddr ! 302: ! 303: movi a3, 0x80000007 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */ ! 304: movi a4, 0x04000003 | ((\pt_ring) << 4) /* PADDR 64M */ ! 305: wdtlb a4, a3 ! 306: isync ! 307: ! 308: movi a3, ((\paddr) & 0xfffff000) | ((\pte_ring) << 4) | (\pte_attr) ! 309: movi a1, ((\vaddr) >> 12) << 2 ! 310: add a2, a1, a2 ! 311: s32i a3, a2, 0 ! 312: ! 313: movi a3, 0x80000007 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */ ! 314: movi a4, 0x04000000 | ((\pt_ring) << 4) | (\pt_attr) /* PADDR 64M */ ! 315: wdtlb a4, a3 ! 316: isync ! 317: ! 318: movi a3, (\vaddr) ! 319: .endm ! 320: ! 321: /* out: PS.RING=ring, PS.EXCM=excm, a3=vaddr */ ! 322: .macro go_ring ring, excm, vaddr ! 323: movi a3, 10f ! 324: pitlb a3, a3 ! 325: ritlb1 a2, a3 ! 326: movi a1, 0x10 ! 327: or a2, a2, a1 ! 328: movi a1, 0x000ff000 ! 329: and a3, a3, a1 ! 330: movi a1, 4 ! 331: or a3, a3, a1 ! 332: witlb a2, a3 ! 333: movi a3, 10f ! 334: movi a1, 0x000fffff ! 335: and a1, a3, a1 ! 336: ! 337: movi a2, 0 ! 338: wsr a2, excvaddr ! 339: ! 340: movi a3, \vaddr ! 341: movi a2, 0x4000f | ((\ring) << 6) | ((\excm) << 4) ! 342: jx a1 ! 343: 10: ! 344: wsr a2, ps ! 345: isync ! 346: .endm ! 347: ! 348: /* in: a3 -- virtual address to test */ ! 349: .macro assert_auto_tlb ! 350: movi a2, 0x4000f ! 351: wsr a2, ps ! 352: isync ! 353: pdtlb a2, a3 ! 354: movi a1, 0xfffff01f ! 355: and a2, a2, a1 ! 356: movi a1, 0xfffff000 ! 357: and a1, a1, a3 ! 358: xor a1, a1, a2 ! 359: assert gei, a1, 0x10 ! 360: movi a2, 0x14 ! 361: assert lt, a1, a2 ! 362: .endm ! 363: ! 364: /* in: a3 -- virtual address to test */ ! 365: .macro assert_no_auto_tlb ! 366: movi a2, 0x4000f ! 367: wsr a2, ps ! 368: isync ! 369: pdtlb a2, a3 ! 370: movi a1, 0x10 ! 371: and a1, a1, a2 ! 372: assert eqi, a1, 0 ! 373: .endm ! 374: ! 375: .macro assert_sr sr, v ! 376: rsr a2, \sr ! 377: movi a1, (\v) ! 378: assert eq, a1, a2 ! 379: .endm ! 380: ! 381: .macro assert_epc1_1m vaddr ! 382: movi a2, (\vaddr) ! 383: movi a1, 0xfffff ! 384: and a1, a1, a2 ! 385: rsr a2, epc1 ! 386: assert eq, a1, a2 ! 387: .endm ! 388: ! 389: test dtlb_autoload ! 390: set_vector kernel, 0 ! 391: ! 392: pt_setup 0, 3, 1, 0x1000, 0x1000, 3 ! 393: assert_no_auto_tlb ! 394: ! 395: l8ui a1, a3, 0 ! 396: ! 397: rsr a2, excvaddr ! 398: assert eq, a2, a3 ! 399: ! 400: assert_auto_tlb ! 401: test_end ! 402: ! 403: test autoload_load_store_privilege ! 404: set_vector kernel, 0 ! 405: set_vector double, 2f ! 406: ! 407: pt_setup 0, 3, 0, 0x2000, 0x2000, 3 ! 408: movi a3, 0x2004 ! 409: assert_no_auto_tlb ! 410: ! 411: movi a2, 0x4005f /* ring 1 + excm => cring == 0 */ ! 412: wsr a2, ps ! 413: isync ! 414: 1: ! 415: l32e a2, a3, -4 /* ring used */ ! 416: test_fail ! 417: 2: ! 418: rsr a2, excvaddr ! 419: addi a1, a3, -4 ! 420: assert eq, a1, a2 ! 421: ! 422: assert_auto_tlb ! 423: assert_sr depc, 1b ! 424: assert_sr exccause, 26 ! 425: test_end ! 426: ! 427: test autoload_pte_load_prohibited ! 428: set_vector kernel, 2f ! 429: ! 430: pt_setup 0, 3, 0, 0x3000, 0, 0xc ! 431: assert_no_auto_tlb ! 432: 1: ! 433: l32i a2, a3, 0 ! 434: test_fail ! 435: 2: ! 436: rsr a2, excvaddr ! 437: assert eq, a2, a3 ! 438: ! 439: assert_auto_tlb ! 440: assert_sr epc1, 1b ! 441: assert_sr exccause, 28 ! 442: test_end ! 443: ! 444: test autoload_pt_load_prohibited ! 445: set_vector kernel, 2f ! 446: ! 447: pt_setup 0, 0xc, 0, 0x4000, 0x4000, 3 ! 448: assert_no_auto_tlb ! 449: 1: ! 450: l32i a2, a3, 0 ! 451: test_fail ! 452: 2: ! 453: rsr a2, excvaddr ! 454: assert eq, a2, a3 ! 455: ! 456: assert_no_auto_tlb ! 457: assert_sr epc1, 1b ! 458: assert_sr exccause, 24 ! 459: test_end ! 460: ! 461: test autoload_pt_privilege ! 462: set_vector kernel, 2f ! 463: pt_setup 0, 3, 1, 0x5000, 0, 3 ! 464: go_ring 1, 0, 0x5001 ! 465: ! 466: l8ui a2, a3, 0 ! 467: 1: ! 468: syscall ! 469: 2: ! 470: rsr a2, excvaddr ! 471: assert eq, a2, a3 ! 472: ! 473: assert_auto_tlb ! 474: assert_epc1_1m 1b ! 475: assert_sr exccause, 1 ! 476: test_end ! 477: ! 478: test autoload_pte_privilege ! 479: set_vector kernel, 2f ! 480: pt_setup 0, 3, 0, 0x6000, 0, 3 ! 481: go_ring 1, 0, 0x6001 ! 482: 1: ! 483: l8ui a2, a3, 0 ! 484: syscall ! 485: 2: ! 486: rsr a2, excvaddr ! 487: assert eq, a2, a3 ! 488: ! 489: assert_auto_tlb ! 490: assert_epc1_1m 1b ! 491: assert_sr exccause, 26 ! 492: test_end ! 493: ! 494: test autoload_3_level_pt ! 495: set_vector kernel, 2f ! 496: pt_setup 1, 3, 1, 0x00400000, 0, 3 ! 497: pt_setup 1, 3, 1, 0x80001000, 0x2000000, 3 ! 498: go_ring 1, 0, 0x00400001 ! 499: 1: ! 500: l8ui a2, a3, 0 ! 501: syscall ! 502: 2: ! 503: rsr a2, excvaddr ! 504: assert eq, a2, a3 ! 505: ! 506: assert_no_auto_tlb ! 507: assert_epc1_1m 1b ! 508: assert_sr exccause, 24 ! 509: test_end ! 510: ! 511: test_suite_end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.