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