1#include "macros.inc" 2 3test_suite mmu 4 5.purgem test_init 6 7.macro clean_tlb_way way, page_size, n_entries 8 movi a2, \way 9 movi a3, \page_size 10 movi a4, \n_entries 11 loop a4, 1f 12 idtlb a2 13 iitlb a2 14 add a2, a2, a3 151: 16.endm 17 18.macro test_init 19 clean_tlb_way 0, 0x00001000, 4 20 clean_tlb_way 1, 0x00001000, 4 21 clean_tlb_way 2, 0x00001000, 4 22 clean_tlb_way 3, 0x00001000, 4 23 clean_tlb_way 4, 0x00100000, 4 24 movi a2, 0x00000007 25 idtlb a2 26 movi a2, 0x00000008 27 idtlb a2 28 movi a2, 0x00000009 29 idtlb a2 30.endm 31 32test tlb_group 33 movi a2, 0x04000002 /* PPN */ 34 movi a3, 0x01200004 /* VPN */ 35 wdtlb a2, a3 36 witlb a2, a3 37 movi a3, 0x00200004 38 rdtlb0 a1, a3 39 ritlb0 a2, a3 40 movi a3, 0x01000001 41 assert eq, a1, a3 42 assert eq, a2, a3 43 movi a3, 0x00200004 44 rdtlb1 a1, a3 45 ritlb1 a2, a3 46 movi a3, 0x04000002 47 assert eq, a1, a3 48 assert eq, a2, a3 49 movi a3, 0x01234567 50 pdtlb a1, a3 51 pitlb a2, a3 52 movi a3, 0x01234014 53 assert eq, a1, a3 54 movi a3, 0x0123400c 55 assert eq, a2, a3 56 movi a3, 0x00200004 57 idtlb a3 58 iitlb a3 59 movi a3, 0x01234567 60 pdtlb a1, a3 61 pitlb a2, a3 62 movi a3, 0x00000010 63 and a1, a1, a3 64 assert eqi, a1, 0 65 movi a3, 0x00000008 66 and a2, a2, a3 67 assert eqi, a2, 0 68test_end 69 70test itlb_miss 71 set_vector kernel, 1f 72 73 movi a3, 0x00100000 74 jx a3 75 test_fail 761: 77 rsr a2, excvaddr 78 assert eq, a2, a3 79 rsr a2, exccause 80 movi a3, 16 81 assert eq, a2, a3 82test_end 83 84test dtlb_miss 85 set_vector kernel, 1f 86 87 movi a3, 0x00100000 88 l8ui a2, a3, 0 89 test_fail 901: 91 rsr a2, excvaddr 92 assert eq, a2, a3 93 rsr a2, exccause 94 movi a3, 24 95 assert eq, a2, a3 96test_end 97 98test itlb_multi_hit 99 set_vector kernel, 1f 100 101 movi a2, 0x04000002 /* PPN */ 102 movi a3, 0xf0000004 /* VPN */ 103 witlb a2, a3 104 movi a3, 0xf0000000 105 pitlb a2, a3 106 test_fail 1071: 108 rsr a2, exccause 109 movi a3, 17 110 assert eq, a2, a3 111test_end 112 113test dtlb_multi_hit 114 set_vector kernel, 1f 115 116 movi a2, 0x04000002 /* PPN */ 117 movi a3, 0x01200004 /* VPN */ 118 wdtlb a2, a3 119 movi a3, 0x01200007 /* VPN */ 120 wdtlb a2, a3 121 movi a3, 0x01200000 122 pdtlb a2, a3 123 test_fail 1241: 125 rsr a2, exccause 126 movi a3, 25 127 assert eq, a2, a3 128test_end 129 130test inst_fetch_privilege 131 set_vector kernel, 3f 132 133 movi a2, 0x4004f 134 wsr a2, ps 1351: 136 isync 137 nop 1382: 139 test_fail 1403: 141 movi a1, 1b 142 rsr a2, excvaddr 143 rsr a3, epc1 144 assert ge, a2, a1 145 assert ge, a3, a1 146 movi a1, 2b 147 assert lt, a2, a1 148 assert lt, a3, a1 149 rsr a2, exccause 150 movi a3, 18 151 assert eq, a2, a3 152 rsr a2, ps 153 movi a3, 0x4005f 154 assert eq, a2, a3 155test_end 156 157test load_store_privilege 158 set_vector kernel, 2f 159 160 movi a3, 10f 161 pitlb a3, a3 162 ritlb1 a2, a3 163 movi a1, 0x10 164 or a2, a2, a1 165 movi a1, 0x000ff000 166 and a3, a3, a1 167 movi a1, 4 168 or a3, a3, a1 169 witlb a2, a3 170 movi a3, 10f 171 movi a1, 0x000fffff 172 and a1, a3, a1 173 174 movi a2, 0x04000003 /* PPN */ 175 movi a3, 0x01200004 /* VPN */ 176 wdtlb a2, a3 177 movi a3, 0x01200001 178 movi a2, 0x4004f 179 jx a1 18010: 181 wsr a2, ps 182 isync 1831: 184 l8ui a2, a3, 0 185 test_fail 1862: 187 rsr a2, excvaddr 188 assert eq, a2, a3 189 rsr a2, epc1 190 movi a3, 1b 191 movi a1, 0x000fffff 192 and a3, a3, a1 193 assert eq, a2, a3 194 rsr a2, exccause 195 movi a3, 26 196 assert eq, a2, a3 197 rsr a2, ps 198 movi a3, 0x4005f 199 assert eq, a2, a3 200test_end 201 202test cring_load_store_privilege 203 set_vector kernel, 0 204 set_vector double, 2f 205 206 movi a2, 0x04000003 /* PPN */ 207 movi a3, 0x01200004 /* VPN */ 208 wdtlb a2, a3 209 movi a3, 0x01200004 210 movi a2, 0x4005f /* ring 1 + excm => cring == 0 */ 211 wsr a2, ps 212 isync 213 l8ui a2, a3, 0 /* cring used */ 2141: 215 l32e a2, a3, -4 /* ring used */ 216 test_fail 2172: 218 rsr a2, excvaddr 219 addi a2, a2, 4 220 assert eq, a2, a3 221 rsr a2, depc 222 movi a3, 1b 223 assert eq, a2, a3 224 rsr a2, exccause 225 movi a3, 26 226 assert eq, a2, a3 227 rsr a2, ps 228 movi a3, 0x4005f 229 assert eq, a2, a3 230test_end 231 232test inst_fetch_prohibited 233 set_vector kernel, 2f 234 235 movi a3, 10f 236 pitlb a3, a3 237 ritlb1 a2, a3 238 movi a1, 0xfffff000 239 and a2, a2, a1 240 movi a1, 0x4 241 or a2, a2, a1 242 movi a1, 0x000ff000 243 and a3, a3, a1 244 movi a1, 4 245 or a3, a3, a1 246 witlb a2, a3 247 movi a3, 10f 248 movi a1, 0x000fffff 249 and a1, a3, a1 250 jx a1 251 .align 4 25210: 253 nop 254 test_fail 2552: 256 rsr a2, excvaddr 257 assert eq, a2, a1 258 rsr a2, epc1 259 assert eq, a2, a1 260 rsr a2, exccause 261 movi a3, 20 262 assert eq, a2, a3 263test_end 264 265test load_prohibited 266 set_vector kernel, 2f 267 268 movi a2, 0x0400000c /* PPN */ 269 movi a3, 0x01200004 /* VPN */ 270 wdtlb a2, a3 271 movi a3, 0x01200002 2721: 273 l8ui a2, a3, 0 274 test_fail 2752: 276 rsr a2, excvaddr 277 assert eq, a2, a3 278 rsr a2, epc1 279 movi a3, 1b 280 assert eq, a2, a3 281 rsr a2, exccause 282 movi a3, 28 283 assert eq, a2, a3 284test_end 285 286test store_prohibited 287 set_vector kernel, 2f 288 289 movi a2, 0x04000001 /* PPN */ 290 movi a3, 0x01200004 /* VPN */ 291 wdtlb a2, a3 292 movi a3, 0x01200003 293 l8ui a2, a3, 0 2941: 295 s8i a2, a3, 0 296 test_fail 2972: 298 rsr a2, excvaddr 299 assert eq, a2, a3 300 rsr a2, epc1 301 movi a3, 1b 302 assert eq, a2, a3 303 rsr a2, exccause 304 movi a3, 29 305 assert eq, a2, a3 306test_end 307 308/* Set up page table entry vaddr->paddr, ring=pte_ring, attr=pte_attr 309 * and DTLB way 7 to cover this PTE, ring=pt_ring, attr=pt_attr 310 */ 311.macro pt_setup pt_ring, pt_attr, pte_ring, vaddr, paddr, pte_attr 312 movi a2, 0x80000000 313 wsr a2, ptevaddr 314 315 movi a3, 0x80000007 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */ 316 movi a4, 0x04000003 | ((\pt_ring) << 4) /* PADDR 64M */ 317 wdtlb a4, a3 318 isync 319 320 movi a3, ((\paddr) & 0xfffff000) | ((\pte_ring) << 4) | (\pte_attr) 321 movi a1, ((\vaddr) >> 12) << 2 322 add a2, a1, a2 323 s32i a3, a2, 0 324 325 movi a3, 0x80000007 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */ 326 movi a4, 0x04000000 | ((\pt_ring) << 4) | (\pt_attr) /* PADDR 64M */ 327 wdtlb a4, a3 328 isync 329 330 movi a3, (\vaddr) 331.endm 332 333/* out: PS.RING=ring, PS.EXCM=excm, a3=vaddr */ 334.macro go_ring ring, excm, vaddr 335 movi a3, 10f 336 pitlb a3, a3 337 ritlb1 a2, a3 338 movi a1, 0x10 339 or a2, a2, a1 340 movi a1, 0x000ff000 341 and a3, a3, a1 342 movi a1, 4 343 or a3, a3, a1 344 witlb a2, a3 345 movi a3, 10f 346 movi a1, 0x000fffff 347 and a1, a3, a1 348 349 movi a2, 0 350 wsr a2, excvaddr 351 352 movi a3, \vaddr 353 movi a2, 0x4000f | ((\ring) << 6) | ((\excm) << 4) 354 jx a1 35510: 356 wsr a2, ps 357 isync 358.endm 359 360/* in: a3 -- virtual address to test */ 361.macro assert_auto_tlb 362 movi a2, 0x4000f 363 wsr a2, ps 364 isync 365 pdtlb a2, a3 366 movi a1, 0xfffff01f 367 and a2, a2, a1 368 movi a1, 0xfffff000 369 and a1, a1, a3 370 xor a1, a1, a2 371 assert gei, a1, 0x10 372 movi a2, 0x14 373 assert lt, a1, a2 374.endm 375 376/* in: a3 -- virtual address to test */ 377.macro assert_no_auto_tlb 378 movi a2, 0x4000f 379 wsr a2, ps 380 isync 381 pdtlb a2, a3 382 movi a1, 0x10 383 and a1, a1, a2 384 assert eqi, a1, 0 385.endm 386 387.macro assert_sr sr, v 388 rsr a2, \sr 389 movi a1, (\v) 390 assert eq, a1, a2 391.endm 392 393.macro assert_epc1_1m vaddr 394 movi a2, (\vaddr) 395 movi a1, 0xfffff 396 and a1, a1, a2 397 rsr a2, epc1 398 assert eq, a1, a2 399.endm 400 401test dtlb_autoload 402 set_vector kernel, 0 403 404 pt_setup 0, 3, 1, 0x1000, 0x1000, 3 405 assert_no_auto_tlb 406 407 l8ui a1, a3, 0 408 409 rsr a2, excvaddr 410 assert eq, a2, a3 411 412 assert_auto_tlb 413test_end 414 415test autoload_load_store_privilege 416 set_vector kernel, 0 417 set_vector double, 2f 418 419 pt_setup 0, 3, 0, 0x2000, 0x2000, 3 420 movi a3, 0x2004 421 assert_no_auto_tlb 422 423 movi a2, 0x4005f /* ring 1 + excm => cring == 0 */ 424 wsr a2, ps 425 isync 4261: 427 l32e a2, a3, -4 /* ring used */ 428 test_fail 4292: 430 rsr a2, excvaddr 431 addi a1, a3, -4 432 assert eq, a1, a2 433 434 assert_auto_tlb 435 assert_sr depc, 1b 436 assert_sr exccause, 26 437test_end 438 439test autoload_pte_load_prohibited 440 set_vector kernel, 2f 441 442 pt_setup 0, 3, 0, 0x3000, 0, 0xc 443 assert_no_auto_tlb 4441: 445 l32i a2, a3, 0 446 test_fail 4472: 448 rsr a2, excvaddr 449 assert eq, a2, a3 450 451 assert_auto_tlb 452 assert_sr epc1, 1b 453 assert_sr exccause, 28 454test_end 455 456test autoload_pt_load_prohibited 457 set_vector kernel, 2f 458 459 pt_setup 0, 0xc, 0, 0x4000, 0x4000, 3 460 assert_no_auto_tlb 4611: 462 l32i a2, a3, 0 463 test_fail 4642: 465 rsr a2, excvaddr 466 assert eq, a2, a3 467 468 assert_no_auto_tlb 469 assert_sr epc1, 1b 470 assert_sr exccause, 24 471test_end 472 473test autoload_pt_privilege 474 set_vector kernel, 2f 475 pt_setup 0, 3, 1, 0x5000, 0, 3 476 go_ring 1, 0, 0x5001 477 478 l8ui a2, a3, 0 4791: 480 syscall 4812: 482 rsr a2, excvaddr 483 assert eq, a2, a3 484 485 assert_auto_tlb 486 assert_epc1_1m 1b 487 assert_sr exccause, 1 488test_end 489 490test autoload_pte_privilege 491 set_vector kernel, 2f 492 pt_setup 0, 3, 0, 0x6000, 0, 3 493 go_ring 1, 0, 0x6001 4941: 495 l8ui a2, a3, 0 496 syscall 4972: 498 rsr a2, excvaddr 499 assert eq, a2, a3 500 501 assert_auto_tlb 502 assert_epc1_1m 1b 503 assert_sr exccause, 26 504test_end 505 506test autoload_3_level_pt 507 set_vector kernel, 2f 508 pt_setup 1, 3, 1, 0x00400000, 0, 3 509 pt_setup 1, 3, 1, 0x80001000, 0x2000000, 3 510 go_ring 1, 0, 0x00400001 5111: 512 l8ui a2, a3, 0 513 syscall 5142: 515 rsr a2, excvaddr 516 assert eq, a2, a3 517 518 assert_no_auto_tlb 519 assert_epc1_1m 1b 520 assert_sr exccause, 24 521test_end 522 523test cross_page_insn 524 set_vector kernel, 2f 525 526 movi a2, 0x04000003 /* PPN */ 527 movi a3, 0x00007000 /* VPN */ 528 witlb a2, a3 529 wdtlb a2, a3 530 movi a3, 0x00008000 /* VPN */ 531 witlb a2, a3 532 wdtlb a2, a3 533 534 movi a2, 0x00007fff 535 movi a3, 20f 536 movi a4, 21f 537 sub a4, a4, a3 538 loop a4, 1f 539 l8ui a5, a3, 0 540 s8i a5, a2, 0 541 addi a2, a2, 1 542 addi a3, a3, 1 5431: 544 movi a2, 0x00007fff 545 movi a3, 0x00008000 546 /* DTLB: OK, ITLB: OK */ 547 jx a2 548 549 .begin no-transform 55020: 551 l32i a2, a3, 0 552 syscall 55321: 554 .end no-transform 555 5562: 557 rsr a2, exccause 558 movi a3, 1 559 assert eq, a2, a3 560 rsr a2, epc1 561 movi a3, 0x8002 562 assert eq, a2, a3 563 rsr a2, excsave1 564 movi a3, 0x00007fff 565 assert ne, a2, a3 566 567 reset_ps 568 set_vector kernel, 3f 569 570 movi a2, 0x0400000c /* PPN */ 571 movi a3, 0x00008000 /* VPN */ 572 wdtlb a2, a3 573 movi a2, 0x00007fff 574 movi a3, 0x00008000 575 /* DTLB: FAIL, ITLB: OK */ 576 jx a2 5773: 578 rsr a2, exccause 579 movi a3, 28 580 assert eq, a2, a3 581 rsr a2, epc1 582 movi a3, 0x7fff 583 assert eq, a2, a3 584 rsr a2, excsave1 585 movi a3, 0x00007fff 586 assert eq, a2, a3 587 588 reset_ps 589 set_vector kernel, 4f 590 591 movi a2, 0x0400000c /* PPN */ 592 movi a3, 0x00008000 /* VPN */ 593 witlb a2, a3 594 movi a2, 0x04000003 /* PPN */ 595 wdtlb a2, a3 596 movi a2, 0x00007fff 597 movi a3, 0x00008000 598 /* DTLB: OK, ITLB: FAIL */ 599 jx a2 6004: 601 rsr a2, exccause 602 movi a3, 20 603 assert eq, a2, a3 604 rsr a2, epc1 605 movi a3, 0x7fff 606 assert eq, a2, a3 607 rsr a2, excsave1 608 movi a3, 0x00007fff 609 assert eq, a2, a3 610 611 reset_ps 612 set_vector kernel, 5f 613 614 movi a2, 0x0400000c /* PPN */ 615 movi a3, 0x00008000 /* VPN */ 616 wdtlb a2, a3 617 movi a2, 0x00007fff 618 movi a3, 0x00008000 619 /* DTLB: FAIL, ITLB: FAIL */ 620 jx a2 6215: 622 rsr a2, exccause 623 movi a3, 20 624 assert eq, a2, a3 625 rsr a2, epc1 626 movi a3, 0x7fff 627 assert eq, a2, a3 628 rsr a2, excsave1 629 movi a3, 0x00007fff 630 assert eq, a2, a3 631test_end 632 633test cross_page_tb 634 set_vector kernel, 2f 635 636 movi a2, 0x04000003 /* PPN */ 637 movi a3, 0x00007000 /* VPN */ 638 witlb a2, a3 639 wdtlb a2, a3 640 movi a3, 0x00008000 /* VPN */ 641 witlb a2, a3 642 wdtlb a2, a3 643 644 movi a2, 0x00007ffc 645 movi a3, 20f 646 movi a4, 21f 647 sub a4, a4, a3 648 loop a4, 1f 649 l8ui a5, a3, 0 650 s8i a5, a2, 0 651 addi a2, a2, 1 652 addi a3, a3, 1 6531: 654 movi a2, 0x00007ffc 655 movi a3, 0x00008000 656 /* DTLB: OK, ITLB: OK */ 657 jx a2 658 659 .begin no-transform 66020: 661 l32i a2, a3, 0 662 syscall 66321: 664 .end no-transform 665 6662: 667 rsr a2, exccause 668 movi a3, 1 669 assert eq, a2, a3 670 rsr a2, epc1 671 movi a3, 0x7fff 672 assert eq, a2, a3 673 rsr a2, excsave1 674 movi a3, 0x00007ffc 675 assert ne, a2, a3 676 677 reset_ps 678 set_vector kernel, 3f 679 680 movi a2, 0x0400000c /* PPN */ 681 movi a3, 0x00008000 /* VPN */ 682 wdtlb a2, a3 683 movi a2, 0x00007ffc 684 movi a3, 0x00008000 685 /* DTLB: FAIL, ITLB: OK */ 686 jx a2 6873: 688 rsr a2, exccause 689 movi a3, 28 690 assert eq, a2, a3 691 rsr a2, epc1 692 movi a3, 0x7ffc 693 assert eq, a2, a3 694 rsr a2, excsave1 695 movi a3, 0x00007ffc 696 assert eq, a2, a3 697 698 reset_ps 699 set_vector kernel, 4f 700 701 movi a2, 0x0400000c /* PPN */ 702 movi a3, 0x00008000 /* VPN */ 703 witlb a2, a3 704 movi a2, 0x04000003 /* PPN */ 705 wdtlb a2, a3 706 movi a2, 0x00007ffc 707 movi a3, 0x00008000 708 /* DTLB: OK, ITLB: FAIL */ 709 jx a2 7104: 711 rsr a2, exccause 712 movi a3, 20 713 assert eq, a2, a3 714 rsr a2, epc1 715 movi a3, 0x7fff 716 assert eq, a2, a3 717 rsr a2, excsave1 718 movi a3, 0x00007ffc 719 assert ne, a2, a3 720 721 reset_ps 722 set_vector kernel, 5f 723 724 movi a2, 0x0400000c /* PPN */ 725 movi a3, 0x00008000 /* VPN */ 726 wdtlb a2, a3 727 movi a2, 0x00007ffc 728 movi a3, 0x00008000 729 /* DTLB: FAIL, ITLB: FAIL */ 730 jx a2 7315: 732 rsr a2, exccause 733 movi a3, 28 734 assert eq, a2, a3 735 rsr a2, epc1 736 movi a3, 0x7ffc 737 assert eq, a2, a3 738 rsr a2, excsave1 739 movi a3, 0x00007ffc 740 assert eq, a2, a3 741test_end 742 743test_suite_end 744