|  | .include "macros.inc" | 
|  |  | 
|  | test_suite interrupt | 
|  |  | 
|  | .macro clear_interrupts | 
|  | movi    a2, 0 | 
|  | wsr     a2, intenable | 
|  | wsr     a2, ccompare0 | 
|  | wsr     a2, ccompare1 | 
|  | wsr     a2, ccompare2 | 
|  | esync | 
|  | rsr     a2, interrupt | 
|  | wsr     a2, intclear | 
|  |  | 
|  | esync | 
|  | rsr     a2, interrupt | 
|  | assert  eqi, a2, 0 | 
|  | .endm | 
|  |  | 
|  | .macro check_l1 | 
|  | rsr     a2, ps | 
|  | movi    a3, 0x1f        /* EXCM | INTMASK */ | 
|  | and     a2, a2, a3 | 
|  | assert  eqi, a2, 0x10   /* only EXCM is set for level-1 interrupt */ | 
|  | rsr     a2, exccause | 
|  | assert  eqi, a2, 4 | 
|  | .endm | 
|  |  | 
|  | test rsil | 
|  | clear_interrupts | 
|  |  | 
|  | rsr     a2, ps | 
|  | rsil    a3, 7 | 
|  | rsr     a4, ps | 
|  | assert  eq, a2, a3 | 
|  | movi    a2, 0xf | 
|  | and     a2, a4, a2 | 
|  | assert  eqi, a2, 7 | 
|  | xor     a3, a3, a4 | 
|  | movi    a2, 0xfffffff0 | 
|  | and     a2, a3, a2 | 
|  | assert  eqi, a2, 0 | 
|  | test_end | 
|  |  | 
|  | test soft_disabled | 
|  | set_vector kernel, 1f | 
|  | clear_interrupts | 
|  |  | 
|  | movi    a2, 0x80 | 
|  | wsr     a2, intset | 
|  | esync | 
|  | rsr     a3, interrupt | 
|  | assert  eq, a2, a3 | 
|  | wsr     a2, intclear | 
|  | esync | 
|  | rsr     a3, interrupt | 
|  | assert  eqi, a3, 0 | 
|  | j       2f | 
|  | 1: | 
|  | test_fail | 
|  | 2: | 
|  | test_end | 
|  |  | 
|  | test soft_intenable | 
|  | set_vector kernel, 1f | 
|  | clear_interrupts | 
|  |  | 
|  | movi    a2, 0x80 | 
|  | wsr     a2, intset | 
|  | esync | 
|  | rsr     a3, interrupt | 
|  | assert  eq, a2, a3 | 
|  | rsil    a3, 0 | 
|  | wsr     a2, intenable | 
|  | esync | 
|  | test_fail | 
|  | 1: | 
|  | check_l1 | 
|  | test_end | 
|  |  | 
|  | test soft_rsil | 
|  | set_vector kernel, 1f | 
|  | clear_interrupts | 
|  |  | 
|  | movi    a2, 0x80 | 
|  | wsr     a2, intset | 
|  | esync | 
|  | rsr     a3, interrupt | 
|  | assert  eq, a2, a3 | 
|  | wsr     a2, intenable | 
|  | rsil    a3, 0 | 
|  | esync | 
|  | test_fail | 
|  | 1: | 
|  | check_l1 | 
|  | test_end | 
|  |  | 
|  | test soft_waiti | 
|  | set_vector kernel, 1f | 
|  | clear_interrupts | 
|  |  | 
|  | movi    a2, 0x80 | 
|  | wsr     a2, intset | 
|  | esync | 
|  | rsr     a3, interrupt | 
|  | assert  eq, a2, a3 | 
|  | wsr     a2, intenable | 
|  | waiti   0 | 
|  | test_fail | 
|  | 1: | 
|  | check_l1 | 
|  | test_end | 
|  |  | 
|  | test soft_user | 
|  | set_vector kernel, 1f | 
|  | set_vector user, 2f | 
|  | clear_interrupts | 
|  |  | 
|  | movi    a2, 0x80 | 
|  | wsr     a2, intset | 
|  | esync | 
|  | rsr     a3, interrupt | 
|  | assert  eq, a2, a3 | 
|  | wsr     a2, intenable | 
|  |  | 
|  | rsr     a2, ps | 
|  | movi    a3, 0x20 | 
|  | or      a2, a2, a3 | 
|  | wsr     a2, ps | 
|  | waiti   0 | 
|  | 1: | 
|  | test_fail | 
|  | 2: | 
|  | check_l1 | 
|  | test_end | 
|  |  | 
|  | test soft_priority | 
|  | set_vector kernel, 1f | 
|  | set_vector level3, 2f | 
|  | clear_interrupts | 
|  |  | 
|  | movi    a2, 0x880 | 
|  | wsr     a2, intenable | 
|  | rsil    a3, 0 | 
|  | esync | 
|  | wsr     a2, intset | 
|  | esync | 
|  | 1: | 
|  | test_fail | 
|  | 2: | 
|  | rsr     a2, ps | 
|  | movi    a3, 0x1f        /* EXCM | INTMASK */ | 
|  | and     a2, a2, a3 | 
|  | movi    a3, 0x13 | 
|  | assert  eq, a2, a3      /* EXCM and INTMASK are set | 
|  | for high-priority interrupt */ | 
|  | test_end | 
|  |  | 
|  | test eps_epc_rfi | 
|  | set_vector level3, 3f | 
|  | clear_interrupts | 
|  | reset_ps | 
|  |  | 
|  | movi    a2, 0x880 | 
|  | wsr     a2, intenable | 
|  | rsil    a3, 0 | 
|  | rsr     a3, ps | 
|  | esync | 
|  | wsr     a2, intset | 
|  | 1: | 
|  | esync | 
|  | 2: | 
|  | test_fail | 
|  | 3: | 
|  | rsr     a2, eps3 | 
|  | assert  eq, a2, a3 | 
|  | rsr     a2, epc3 | 
|  | movi    a3, 1b | 
|  | assert  ge, a2, a3 | 
|  | movi    a3, 2b | 
|  | assert  ge, a3, a2 | 
|  | movi    a2, 4f | 
|  | wsr     a2, epc3 | 
|  | movi    a2, 0x40003 | 
|  | wsr     a2, eps3 | 
|  | rfi     3 | 
|  | test_fail | 
|  | 4: | 
|  | rsr     a2, ps | 
|  | movi    a3, 0x40003 | 
|  | assert  eq, a2, a3 | 
|  | test_end | 
|  |  | 
|  | test_suite_end |