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