xref: /qemu/tests/tcg/xtensa/test_interrupt.S (revision 4179575898fcc17c5e67306a357b8dfe64122e8e)
1a2e67072SMax Filippov#include "macros.inc"
27d890b40SMax Filippov
3*9c988226SMax Filippov#define LSBIT(v) ((v) & -(v))
4*9c988226SMax Filippov
5*9c988226SMax Filippov#define LEVEL_MASK(x) glue3(XCHAL_INTLEVEL, x, _MASK)
6*9c988226SMax Filippov#define LEVEL_SOFT_MASK(x) (LEVEL_MASK(x) & XCHAL_INTTYPE_MASK_SOFTWARE)
7*9c988226SMax Filippov
8*9c988226SMax Filippov#define L1_SOFT_MASK LEVEL_SOFT_MASK(1)
9*9c988226SMax Filippov#define L1_SOFT LSBIT(L1_SOFT_MASK)
10*9c988226SMax Filippov
11*9c988226SMax Filippov#if LEVEL_SOFT_MASK(2)
12*9c988226SMax Filippov#define HIGH_LEVEL_SOFT_MASK LEVEL_SOFT_MASK(2)
13*9c988226SMax Filippov#elif LEVEL_SOFT_MASK(3)
14*9c988226SMax Filippov#define HIGH_LEVEL_SOFT_MASK LEVEL_SOFT_MASK(3)
15*9c988226SMax Filippov#elif LEVEL_SOFT_MASK(4)
16*9c988226SMax Filippov#define HIGH_LEVEL_SOFT_MASK LEVEL_SOFT_MASK(4)
17*9c988226SMax Filippov#elif LEVEL_SOFT_MASK(5)
18*9c988226SMax Filippov#define HIGH_LEVEL_SOFT_MASK LEVEL_SOFT_MASK(5)
19*9c988226SMax Filippov#elif LEVEL_SOFT_MASK(6)
20*9c988226SMax Filippov#define HIGH_LEVEL_SOFT_MASK LEVEL_SOFT_MASK(6)
21*9c988226SMax Filippov#else
22*9c988226SMax Filippov#define HIGH_LEVEL_SOFT_MASK 0
23*9c988226SMax Filippov#endif
24*9c988226SMax Filippov
25*9c988226SMax Filippov#define HIGH_LEVEL_SOFT LSBIT(HIGH_LEVEL_SOFT_MASK)
26*9c988226SMax Filippov
27*9c988226SMax Filippov#if LEVEL_SOFT_MASK(2)
28*9c988226SMax Filippov#define HIGH_LEVEL_SOFT_LEVEL 2
29*9c988226SMax Filippov#elif LEVEL_SOFT_MASK(3)
30*9c988226SMax Filippov#define HIGH_LEVEL_SOFT_LEVEL 3
31*9c988226SMax Filippov#elif LEVEL_SOFT_MASK(4)
32*9c988226SMax Filippov#define HIGH_LEVEL_SOFT_LEVEL 4
33*9c988226SMax Filippov#elif LEVEL_SOFT_MASK(5)
34*9c988226SMax Filippov#define HIGH_LEVEL_SOFT_LEVEL 5
35*9c988226SMax Filippov#elif LEVEL_SOFT_MASK(6)
36*9c988226SMax Filippov#define HIGH_LEVEL_SOFT_LEVEL 6
37*9c988226SMax Filippov#else
38*9c988226SMax Filippov#define HIGH_LEVEL_SOFT_LEVEL 0
39*9c988226SMax Filippov#endif
408b912ff0SMax Filippov
417d890b40SMax Filippovtest_suite interrupt
427d890b40SMax Filippov
43*9c988226SMax Filippov#if XCHAL_HAVE_INTERRUPTS
44*9c988226SMax Filippov
457d890b40SMax Filippov.macro clear_interrupts
467d890b40SMax Filippov    movi    a2, 0
477d890b40SMax Filippov    wsr     a2, intenable
48*9c988226SMax Filippov#if XCHAL_NUM_TIMERS
497d890b40SMax Filippov    wsr     a2, ccompare0
50*9c988226SMax Filippov#endif
51*9c988226SMax Filippov#if XCHAL_NUM_TIMERS > 1
527d890b40SMax Filippov    wsr     a2, ccompare1
53*9c988226SMax Filippov#endif
54*9c988226SMax Filippov#if XCHAL_NUM_TIMERS > 2
557d890b40SMax Filippov    wsr     a2, ccompare2
56*9c988226SMax Filippov#endif
577d890b40SMax Filippov    esync
587d890b40SMax Filippov    rsr     a2, interrupt
597d890b40SMax Filippov    wsr     a2, intclear
607d890b40SMax Filippov
617d890b40SMax Filippov    esync
627d890b40SMax Filippov    rsr     a2, interrupt
637d890b40SMax Filippov    assert  eqi, a2, 0
647d890b40SMax Filippov.endm
657d890b40SMax Filippov
667d890b40SMax Filippov.macro check_l1
677d890b40SMax Filippov    rsr     a2, ps
687d890b40SMax Filippov    movi    a3, 0x1f        /* EXCM | INTMASK */
697d890b40SMax Filippov    and     a2, a2, a3
707d890b40SMax Filippov    assert  eqi, a2, 0x10   /* only EXCM is set for level-1 interrupt */
717d890b40SMax Filippov    rsr     a2, exccause
727d890b40SMax Filippov    assert  eqi, a2, 4
737d890b40SMax Filippov.endm
747d890b40SMax Filippov
757d890b40SMax Filippovtest rsil
767d890b40SMax Filippov    clear_interrupts
777d890b40SMax Filippov
787d890b40SMax Filippov    rsr     a2, ps
797d890b40SMax Filippov    rsil    a3, 7
807d890b40SMax Filippov    rsr     a4, ps
817d890b40SMax Filippov    assert  eq, a2, a3
827d890b40SMax Filippov    movi    a2, 0xf
837d890b40SMax Filippov    and     a2, a4, a2
847d890b40SMax Filippov    assert  eqi, a2, 7
857d890b40SMax Filippov    xor     a3, a3, a4
867d890b40SMax Filippov    movi    a2, 0xfffffff0
877d890b40SMax Filippov    and     a2, a3, a2
887d890b40SMax Filippov    assert  eqi, a2, 0
897d890b40SMax Filippovtest_end
907d890b40SMax Filippov
91*9c988226SMax Filippov#if L1_SOFT
927d890b40SMax Filippovtest soft_disabled
937d890b40SMax Filippov    set_vector kernel, 1f
947d890b40SMax Filippov    clear_interrupts
957d890b40SMax Filippov
96*9c988226SMax Filippov    movi    a2, L1_SOFT
977d890b40SMax Filippov    wsr     a2, intset
987d890b40SMax Filippov    esync
997d890b40SMax Filippov    rsr     a3, interrupt
1008b912ff0SMax Filippov    movi    a4, ~XCHAL_INTTYPE_MASK_TIMER
1018b912ff0SMax Filippov    and     a3, a3, a4
1027d890b40SMax Filippov    assert  eq, a2, a3
1037d890b40SMax Filippov    wsr     a2, intclear
1047d890b40SMax Filippov    esync
1057d890b40SMax Filippov    rsr     a3, interrupt
1068b912ff0SMax Filippov    and     a3, a3, a4
1077d890b40SMax Filippov    assert  eqi, a3, 0
1087d890b40SMax Filippov    j       2f
1097d890b40SMax Filippov1:
1107d890b40SMax Filippov    test_fail
1117d890b40SMax Filippov2:
1127d890b40SMax Filippovtest_end
1137d890b40SMax Filippov
1147d890b40SMax Filippovtest soft_intenable
1157d890b40SMax Filippov    set_vector kernel, 1f
1167d890b40SMax Filippov    clear_interrupts
1177d890b40SMax Filippov
118*9c988226SMax Filippov    movi    a2, L1_SOFT
1197d890b40SMax Filippov    wsr     a2, intset
1207d890b40SMax Filippov    esync
1217d890b40SMax Filippov    rsr     a3, interrupt
1228b912ff0SMax Filippov    movi    a4, ~XCHAL_INTTYPE_MASK_TIMER
1238b912ff0SMax Filippov    and     a3, a3, a4
1247d890b40SMax Filippov    assert  eq, a2, a3
1257d890b40SMax Filippov    rsil    a3, 0
1267d890b40SMax Filippov    wsr     a2, intenable
1277d890b40SMax Filippov    esync
1287d890b40SMax Filippov    test_fail
1297d890b40SMax Filippov1:
1307d890b40SMax Filippov    check_l1
1317d890b40SMax Filippovtest_end
1327d890b40SMax Filippov
1337d890b40SMax Filippovtest soft_rsil
1347d890b40SMax Filippov    set_vector kernel, 1f
1357d890b40SMax Filippov    clear_interrupts
1367d890b40SMax Filippov
137*9c988226SMax Filippov    movi    a2, L1_SOFT
1387d890b40SMax Filippov    wsr     a2, intset
1397d890b40SMax Filippov    esync
1407d890b40SMax Filippov    rsr     a3, interrupt
1418b912ff0SMax Filippov    movi    a4, ~XCHAL_INTTYPE_MASK_TIMER
1428b912ff0SMax Filippov    and     a3, a3, a4
1437d890b40SMax Filippov    assert  eq, a2, a3
1447d890b40SMax Filippov    wsr     a2, intenable
1457d890b40SMax Filippov    rsil    a3, 0
1467d890b40SMax Filippov    esync
1477d890b40SMax Filippov    test_fail
1487d890b40SMax Filippov1:
1497d890b40SMax Filippov    check_l1
1507d890b40SMax Filippovtest_end
1517d890b40SMax Filippov
1527d890b40SMax Filippovtest soft_waiti
1537d890b40SMax Filippov    set_vector kernel, 1f
1547d890b40SMax Filippov    clear_interrupts
1557d890b40SMax Filippov
156*9c988226SMax Filippov    movi    a2, L1_SOFT
1577d890b40SMax Filippov    wsr     a2, intset
1587d890b40SMax Filippov    esync
1597d890b40SMax Filippov    rsr     a3, interrupt
1608b912ff0SMax Filippov    movi    a4, ~XCHAL_INTTYPE_MASK_TIMER
1618b912ff0SMax Filippov    and     a3, a3, a4
1627d890b40SMax Filippov    assert  eq, a2, a3
1637d890b40SMax Filippov    wsr     a2, intenable
1647d890b40SMax Filippov    waiti   0
1657d890b40SMax Filippov    test_fail
1667d890b40SMax Filippov1:
1677d890b40SMax Filippov    check_l1
1687d890b40SMax Filippovtest_end
1697d890b40SMax Filippov
1707d890b40SMax Filippovtest soft_user
1717d890b40SMax Filippov    set_vector kernel, 1f
1727d890b40SMax Filippov    set_vector user, 2f
1737d890b40SMax Filippov    clear_interrupts
1747d890b40SMax Filippov
175*9c988226SMax Filippov    movi    a2, L1_SOFT
1767d890b40SMax Filippov    wsr     a2, intset
1777d890b40SMax Filippov    esync
1787d890b40SMax Filippov    rsr     a3, interrupt
1798b912ff0SMax Filippov    movi    a4, ~XCHAL_INTTYPE_MASK_TIMER
1808b912ff0SMax Filippov    and     a3, a3, a4
1817d890b40SMax Filippov    assert  eq, a2, a3
1827d890b40SMax Filippov    wsr     a2, intenable
1837d890b40SMax Filippov
1847d890b40SMax Filippov    rsr     a2, ps
1857d890b40SMax Filippov    movi    a3, 0x20
1867d890b40SMax Filippov    or      a2, a2, a3
1877d890b40SMax Filippov    wsr     a2, ps
1887d890b40SMax Filippov    waiti   0
1897d890b40SMax Filippov1:
1907d890b40SMax Filippov    test_fail
1917d890b40SMax Filippov2:
1927d890b40SMax Filippov    check_l1
1937d890b40SMax Filippovtest_end
1947d890b40SMax Filippov
195*9c988226SMax Filippov#if HIGH_LEVEL_SOFT
1967d890b40SMax Filippovtest soft_priority
1977d890b40SMax Filippov    set_vector kernel, 1f
198*9c988226SMax Filippov    set_vector glue(level, HIGH_LEVEL_SOFT_LEVEL), 2f
1997d890b40SMax Filippov    clear_interrupts
2007d890b40SMax Filippov
201*9c988226SMax Filippov    movi    a2, L1_SOFT | HIGH_LEVEL_SOFT
2027d890b40SMax Filippov    wsr     a2, intenable
2037d890b40SMax Filippov    rsil    a3, 0
2047d890b40SMax Filippov    esync
2057d890b40SMax Filippov    wsr     a2, intset
2067d890b40SMax Filippov    esync
2077d890b40SMax Filippov1:
2087d890b40SMax Filippov    test_fail
2097d890b40SMax Filippov2:
2107d890b40SMax Filippov    rsr     a2, ps
2117d890b40SMax Filippov    movi    a3, 0x1f        /* EXCM | INTMASK */
2127d890b40SMax Filippov    and     a2, a2, a3
213*9c988226SMax Filippov    movi    a3, 0x10 | HIGH_LEVEL_SOFT_LEVEL
2147d890b40SMax Filippov    assert  eq, a2, a3      /* EXCM and INTMASK are set
2157d890b40SMax Filippov                               for high-priority interrupt */
2167d890b40SMax Filippovtest_end
217*9c988226SMax Filippov#endif
218*9c988226SMax Filippov#endif
2197d890b40SMax Filippov
220*9c988226SMax Filippov#if HIGH_LEVEL_SOFT
2217d890b40SMax Filippovtest eps_epc_rfi
222*9c988226SMax Filippov    set_vector glue(level, HIGH_LEVEL_SOFT_LEVEL), 3f
2237d890b40SMax Filippov    clear_interrupts
2247d890b40SMax Filippov    reset_ps
2257d890b40SMax Filippov
226*9c988226SMax Filippov    movi    a2, L1_SOFT_MASK | HIGH_LEVEL_SOFT_MASK
2277d890b40SMax Filippov    wsr     a2, intenable
2287d890b40SMax Filippov    rsil    a3, 0
2297d890b40SMax Filippov    rsr     a3, ps
2307d890b40SMax Filippov    esync
2317d890b40SMax Filippov    wsr     a2, intset
2327d890b40SMax Filippov1:
2337d890b40SMax Filippov    esync
2347d890b40SMax Filippov2:
2357d890b40SMax Filippov    test_fail
2367d890b40SMax Filippov3:
237*9c988226SMax Filippov    rsr     a2, glue(eps, HIGH_LEVEL_SOFT_LEVEL)
2387d890b40SMax Filippov    assert  eq, a2, a3
239*9c988226SMax Filippov    rsr     a2, glue(epc, HIGH_LEVEL_SOFT_LEVEL)
2407d890b40SMax Filippov    movi    a3, 1b
2417d890b40SMax Filippov    assert  ge, a2, a3
2427d890b40SMax Filippov    movi    a3, 2b
2437d890b40SMax Filippov    assert  ge, a3, a2
2447d890b40SMax Filippov    movi    a2, 4f
245*9c988226SMax Filippov    wsr     a2, glue(epc, HIGH_LEVEL_SOFT_LEVEL)
246*9c988226SMax Filippov    movi    a2, 0x40000 | HIGH_LEVEL_SOFT_LEVEL
247*9c988226SMax Filippov    wsr     a2, glue(eps, HIGH_LEVEL_SOFT_LEVEL)
248*9c988226SMax Filippov    rfi     HIGH_LEVEL_SOFT_LEVEL
2497d890b40SMax Filippov    test_fail
2507d890b40SMax Filippov4:
2517d890b40SMax Filippov    rsr     a2, ps
252*9c988226SMax Filippov    movi    a3, 0x40000 | HIGH_LEVEL_SOFT_LEVEL
2537d890b40SMax Filippov    assert  eq, a2, a3
2547d890b40SMax Filippovtest_end
255*9c988226SMax Filippov#endif
256*9c988226SMax Filippov
257*9c988226SMax Filippov#endif
2587d890b40SMax Filippov
2597d890b40SMax Filippovtest_suite_end
260