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