qemu/tests/tcg/xtensa/test_mmu.S
<<
>>
Prefs
   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