qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

test_mmu.S (15932B)


      1 #include "macros.inc"
      2 
      3 test_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
     19 1:
     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 
     46 test 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
     82 test_end
     83 
     84 test itlb_miss
     85     set_vector kernel, 1f
     86 
     87     movi    a3, BASE + 0x00100000
     88     jx      a3
     89     test_fail
     90 1:
     91     rsr     a2, excvaddr
     92     assert  eq, a2, a3
     93     rsr     a2, exccause
     94     movi    a3, 16
     95     assert  eq, a2, a3
     96 test_end
     97 
     98 test dtlb_miss
     99     set_vector kernel, 1f
    100 
    101     movi    a3, BASE + 0x00100000
    102     l8ui    a2, a3, 0
    103     test_fail
    104 1:
    105     rsr     a2, excvaddr
    106     assert  eq, a2, a3
    107     rsr     a2, exccause
    108     movi    a3, 24
    109     assert  eq, a2, a3
    110 test_end
    111 
    112 test 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
    121 1:
    122     rsr     a2, exccause
    123     movi    a3, 17
    124     assert  eq, a2, a3
    125 test_end
    126 
    127 test 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
    138 1:
    139     rsr     a2, exccause
    140     movi    a3, 25
    141     assert  eq, a2, a3
    142 test_end
    143 
    144 test inst_fetch_privilege
    145     set_vector kernel, 3f
    146 
    147     movi    a2, 0x4004f
    148     wsr     a2, ps
    149 1:
    150     isync
    151     nop
    152 2:
    153     test_fail
    154 3:
    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
    169 test_end
    170 
    171 test 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
    197 10:
    198     wsr     a2, ps
    199     isync
    200 1:
    201     l8ui    a2, a3, 0
    202     test_fail
    203 2:
    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
    218 test_end
    219 
    220 test 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 */
    232 1:
    233     l32e    a2, a3, -4     /* ring used */
    234     test_fail
    235 2:
    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
    248 test_end
    249 
    250 test 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
    273 10:
    274     nop
    275     test_fail
    276 2:
    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
    284 test_end
    285 
    286 test 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
    293 1:
    294     l8ui    a2, a3, 0
    295     test_fail
    296 2:
    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
    305 test_end
    306 
    307 test 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
    315 1:
    316     s8i     a2, a3, 0
    317     test_fail
    318 2:
    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
    327 test_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
    379 10:
    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 
    427 test 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
    439 test_end
    440 
    441 test 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
    452 1:
    453     l32e    a2, a3, -4     /* ring used */
    454     test_fail
    455 2:
    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
    463 test_end
    464 
    465 test 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
    470 1:
    471     l32i    a2, a3, 0
    472     test_fail
    473 2:
    474     rsr     a2, excvaddr
    475     assert  eq, a2, a3
    476 
    477     assert_auto_tlb
    478     assert_sr epc1, 1b
    479     assert_sr exccause, 28
    480 test_end
    481 
    482 test 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
    487 1:
    488     l32i    a2, a3, 0
    489     test_fail
    490 2:
    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
    497 test_end
    498 
    499 test 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
    505 1:
    506     syscall
    507 2:
    508     rsr     a2, excvaddr
    509     assert  eq, a2, a3
    510 
    511     assert_auto_tlb
    512     assert_epc1_1m 1b
    513     assert_sr exccause, 1
    514 test_end
    515 
    516 test 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
    520 1:
    521     l8ui    a2, a3, 0
    522     syscall
    523 2:
    524     rsr     a2, excvaddr
    525     assert  eq, a2, a3
    526 
    527     assert_auto_tlb
    528     assert_epc1_1m 1b
    529     assert_sr exccause, 26
    530 test_end
    531 
    532 test 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
    537 1:
    538     l8ui    a2, a3, 0
    539     syscall
    540 2:
    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
    547 test_end
    548 
    549 test 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
    569 1:
    570     movi    a2, BASE + 0x00007fff
    571     movi    a3, BASE + 0x00008000
    572     /* DTLB: OK, ITLB: OK */
    573     jx      a2
    574 
    575     .begin  no-transform
    576 20:
    577     l32i    a2, a3, 0
    578     syscall
    579 21:
    580     .end    no-transform
    581 
    582 2:
    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
    603 3:
    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
    626 4:
    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
    647 5:
    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
    657 test_end
    658 
    659 test 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
    679 1:
    680     movi    a2, BASE + 0x00007ffc
    681     movi    a3, BASE + 0x00008000
    682     /* DTLB: OK, ITLB: OK */
    683     jx      a2
    684 
    685     .begin  no-transform
    686 20:
    687     l32i    a2, a3, 0
    688     syscall
    689 21:
    690     .end    no-transform
    691 
    692 2:
    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
    713 3:
    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
    736 4:
    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
    757 5:
    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
    767 test_end
    768 
    769 #endif
    770 
    771 test_suite_end