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_windowed.S (6981B)


      1#include "macros.inc"
      2
      3test_suite windowed
      4
      5#if XCHAL_HAVE_WINDOWED
      6
      7.altmacro
      8
      9.macro reset_window start
     10    movi    a2, 0xffff
     11    wsr     a2, windowstart
     12    rsync
     13    movi    a2, 0
     14    wsr     a2, windowbase
     15    rsync
     16    movi    a2, \start
     17    wsr     a2, windowstart
     18    rsync
     19.endm
     20
     21.macro overflow_test shift, window, probe_ok, probe_ex
     22    set_vector window_overflow_4, 0
     23    set_vector window_overflow_8, 0
     24    set_vector window_overflow_12, 0
     25
     26    movi    a2, 1 | (((1 << ((\window) / 4)) | 1) << ((\shift) / 4))
     27    wsr     a2, windowstart
     28    reset_ps
     29
     30    mov     a2, a\probe_ok
     31    set_vector window_overflow_\window, 10f
     321:
     33    mov     a2, a\probe_ex
     34    test_fail
     3510:
     36    rsr     a2, epc1
     37    movi    a3, 1b
     38    assert  eq, a2, a3
     39    movi    a2, 2f
     40    wsr     a2, epc1
     41
     42    rsr     a2, windowbase
     43    movi    a3, (\shift) / 4
     44    assert  eq, a2, a3
     45    rsr     a2, ps
     46    movi    a3, 0x4001f
     47    assert  eq, a2, a3
     48    rfwo
     49    test_fail
     502:
     51    rsr     a2, windowbase
     52    assert  eqi, a2, 0
     53    rsr     a2, windowstart
     54    movi    a3, 1 | ((1 << ((\window) / 4)) << ((\shift) / 4))
     55    assert  eq, a2, a3
     56    rsr     a2, ps
     57    movi    a3, 0x4000f
     58    assert  eq, a2, a3
     59.endm
     60
     61.macro overflow_tests shift, window, probe
     62    .if \probe < 15
     63    overflow_test \shift, \window, %((\shift) - 1), \probe
     64    overflow_tests \shift, \window, %((\probe) + 1)
     65    .endif
     66.endm
     67
     68.macro all_overflow_tests
     69    .irp shift, 4, 8, 12
     70    .irp window, 4, 8, 12
     71    overflow_tests \shift, \window, \shift
     72    .endr
     73    .endr
     74.endm
     75
     76test overflow
     77    all_overflow_tests
     78test_end
     79
     80
     81.macro underflow_test window
     82    set_vector window_underflow_4, 0
     83    set_vector window_underflow_8, 0
     84    set_vector window_underflow_12, 0
     85
     86    set_vector window_underflow_\window, 10f
     87
     88    reset_window 1
     89    reset_ps
     90
     91    ssai    2
     92    movi    a2, 2f
     93    slli    a2, a2, 2
     94    movi    a3, (\window) / 4
     95    src     a0, a3, a2
     961:
     97    retw
     98    test_fail
     9910:
    100    rsr     a2, epc1
    101    movi    a3, 1b
    102    assert  eq, a2, a3
    103    movi    a2, 2f
    104    wsr     a2, epc1
    105
    106    rsr     a2, ps
    107    movi    a3, 0x4001f
    108    assert  eq, a2, a3
    109    rsr     a2, windowbase
    110    movi    a3, (XCHAL_NUM_AREGS - (\window)) / 4
    111    assert  eq, a2, a3
    112    rsr     a2, windowstart
    113    assert  eqi, a2, 1
    114    rfwu
    1152:
    116    rsr     a2, ps
    117    movi    a3, 0x4000f
    118    assert  eq, a2, a3
    119    rsr     a2, windowbase
    120    assert  eqi, a2, 0
    121    rsr     a2, windowstart
    122    assert  bsi.l, a2, 0
    123    assert  bsi.l, a2, (XCHAL_NUM_AREGS - (\window)) / 4
    124.endm
    125
    126test underflow
    127    set_vector window_overflow_4, 0
    128    set_vector window_overflow_8, 0
    129    set_vector window_overflow_12, 0
    130
    131    underflow_test 4
    132    underflow_test 8
    133    underflow_test 12
    134test_end
    135
    136
    137.macro retw_test window
    138    reset_window %(1 | (1 << ((XCHAL_NUM_AREGS - \window) / 4)))
    139    reset_ps
    140
    141    ssai    2
    142    movi    a2, 1f
    143    slli    a2, a2, 2
    144    movi    a3, (\window) / 4
    145    src     a0, a3, a2
    146    retw
    147    test_fail
    1481:
    149    rsr     a2, ps
    150    movi    a3, 0x4000f
    151    assert  eq, a2, a3
    152    rsr     a2, windowbase
    153    movi    a3, (XCHAL_NUM_AREGS - (\window)) / 4
    154    assert  eq, a2, a3
    155    rsr     a2, windowstart
    156    assert  bci.l, a2, 0
    157    assert  bsi.l, a2, (XCHAL_NUM_AREGS - (\window)) / 4
    158.endm
    159
    160test retw
    161    set_vector window_underflow_4, 0
    162    set_vector window_underflow_8, 0
    163    set_vector window_underflow_12, 0
    164
    165    retw_test 4
    166    retw_test 8
    167    retw_test 12
    168test_end
    169
    170test movsp
    171    set_vector kernel, 2f
    172
    173    reset_window 1
    174    reset_ps
    1751:
    176    movsp   a2, a3
    177    test_fail
    1782:
    179    rsr     a2, exccause
    180    assert  eqi, a2, 5
    181    rsr     a2, epc1
    182    movi    a3, 1b
    183    assert  eq, a2, a3
    184
    185    set_vector kernel, 0
    186
    187    reset_window %(0x1 | (1 << ((XCHAL_NUM_AREGS / 4) - 1)))
    188    reset_ps
    189
    190    movsp   a2, a3
    191test_end
    192
    193test rotw
    194    reset_window 0x4b
    195    reset_ps
    196
    197    movi    a3, 0x10
    198
    199    rotw    1
    200    rsr     a2, windowbase
    201    assert  eqi, a2, 1
    202    movi    a3, 0x11
    203    movi    a7, 0x12
    204
    205    rotw    2
    206    rsr     a2, windowbase
    207    assert  eqi, a2, 3
    208    movi    a3, 0x13
    209    movi    a7, 0x14
    210    movi    a11, 0x15
    211
    212    rotw    3
    213    rsr     a2, windowbase
    214    assert  eqi, a2, 6
    215    movi    a3, 0x16
    216    movi    a7, 0x17
    217
    218#if XCHAL_NUM_AREGS == 32
    219    movi    a2, 0x44
    220    wsr     a2, windowstart
    221#elif XCHAL_NUM_AREGS == 64
    222    movi    a2, 0x4004
    223    wsr     a2, windowstart
    224    rotw    -8
    225#else
    226#error XCHAL_NUM_AREGS unsupported
    227#endif
    228    rsync
    229
    230    movi    a2, 0x10
    231    assert  eq, a2, a11
    232    movi    a11, 0x18
    233    movi    a2, 0x11
    234    assert  eq, a2, a15
    235    movi    a15, 0x19
    236
    237    rotw    4
    238    movi    a2, 0x12
    239    assert  eq, a2, a3
    240    movi    a2, 0x13
    241    assert  eq, a2, a7
    242    movi    a2, 0x14
    243    assert  eq, a2, a11
    244    movi    a2, 0x15
    245    assert  eq, a2, a15
    246
    247    movi    a2, 0x5
    248    wsr     a2, windowstart
    249    rsync
    250
    251    rotw    -2
    252    movi    a2, 0x18
    253    assert  eq, a2, a3
    254    movi    a2, 0x19
    255    assert  eq, a2, a7
    256test_end
    257
    258.macro callw_test window
    259    call\window 2f
    2601:
    261    test_fail
    262    .align  4
    2632:
    264    rsr     a2, windowbase
    265    assert  eqi, a2, 0
    266    rsr     a2, ps
    267    movi    a3, 0x4000f | ((\window) << 14)
    268    assert  eq, a2, a3
    269    movi    a2, 1b
    270    slli    a2, a2, 2
    271    ssai    2
    272    movi    a3, (\window) / 4
    273    src     a2, a3, a2
    274    assert  eq, a2, a\window
    275.endm
    276
    277test callw
    278    reset_window 0x1
    279    reset_ps
    280
    281    callw_test 4
    282    callw_test 8
    283    callw_test 12
    284test_end
    285
    286
    287.macro entry_test window
    288    reset_window 0x1
    289    reset_ps
    290    movi    a2, 0x4000f | ((\window) << 14)
    291    wsr     a2, ps
    292    isync
    293    movi    a3, 0x12345678
    294    j       1f
    295    .align  4
    2961:
    297    entry   a3, 0x5678
    298    movi    a2, 0x12340000
    299    assert  eq, a2, a3
    300    rsr     a2, windowbase
    301    assert  eqi, a2, (\window) / 4
    302    rsr     a2, windowstart
    303    movi    a3, 1 | (1 << ((\window) / 4))
    304    assert  eq, a2, a3
    305    rotw    -(\window) / 4
    306.endm
    307
    308test entry
    309    entry_test 4
    310    entry_test 8
    311    entry_test 12
    312test_end
    313
    314.macro entry_overflow_test window, free, next_window
    315    set_vector window_overflow_4, 0
    316    set_vector window_overflow_8, 0
    317    set_vector window_overflow_12, 0
    318    set_vector window_overflow_\next_window, 10f
    319
    320    movi    a2, \window
    321    movi    a2, \free
    322    movi    a2, \next_window
    323    reset_window %(1 | ((1 | (1 << ((\next_window) / 4))) << ((\free) / 4)))
    324    reset_ps
    325    movi    a2, 0x4000f | ((\window) << 14)
    326    wsr     a2, ps
    327    isync
    328    movi    a3, 0x12345678
    329    j       1f
    330    .align  4
    3311:
    332    entry   a3, 0x5678
    333    test_fail
    334    .align  4
    33510:
    336    rsr     a2, epc1
    337    movi    a3, 1b
    338    assert  eq, a2, a3
    339    movi    a2, 2f
    340    wsr     a2, epc1
    341
    342    rsr     a2, windowbase
    343    movi    a3, (\free) / 4
    344    assert  eq, a2, a3
    345    rfwo
    3462:
    347.endm
    348
    349.macro all_entry_overflow_tests
    350    .irp window, 4, 8, 12
    351    .irp next_window, 4, 8, 12
    352    .irp free, 4, 8, 12
    353    .if \free <= \window
    354    entry_overflow_test \window, \free, \next_window
    355    .endif
    356    .endr
    357    .endr
    358    .endr
    359.endm
    360
    361test entry_overflow
    362    all_entry_overflow_tests
    363test_end
    364
    365#endif
    366
    367test_suite_end