cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

test_mmu.S (14859B)


      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