xref: /openbmc/qemu/tests/tcg/xtensa/test_interrupt.S (revision 4179575898fcc17c5e67306a357b8dfe64122e8e)
1a2e67072SMax Filippov#include "macros.inc"
2c09015ddSAnthony Liguori
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
41c09015ddSAnthony Liguoritest_suite interrupt
42c09015ddSAnthony Liguori
43*9c988226SMax Filippov#if XCHAL_HAVE_INTERRUPTS
44*9c988226SMax Filippov
45c09015ddSAnthony Liguori.macro clear_interrupts
46c09015ddSAnthony Liguori    movi    a2, 0
47c09015ddSAnthony Liguori    wsr     a2, intenable
48*9c988226SMax Filippov#if XCHAL_NUM_TIMERS
49c09015ddSAnthony Liguori    wsr     a2, ccompare0
50*9c988226SMax Filippov#endif
51*9c988226SMax Filippov#if XCHAL_NUM_TIMERS > 1
52c09015ddSAnthony Liguori    wsr     a2, ccompare1
53*9c988226SMax Filippov#endif
54*9c988226SMax Filippov#if XCHAL_NUM_TIMERS > 2
55c09015ddSAnthony Liguori    wsr     a2, ccompare2
56*9c988226SMax Filippov#endif
57c09015ddSAnthony Liguori    esync
58c09015ddSAnthony Liguori    rsr     a2, interrupt
59c09015ddSAnthony Liguori    wsr     a2, intclear
60c09015ddSAnthony Liguori
61c09015ddSAnthony Liguori    esync
62c09015ddSAnthony Liguori    rsr     a2, interrupt
63c09015ddSAnthony Liguori    assert  eqi, a2, 0
64c09015ddSAnthony Liguori.endm
65c09015ddSAnthony Liguori
66c09015ddSAnthony Liguori.macro check_l1
67c09015ddSAnthony Liguori    rsr     a2, ps
68c09015ddSAnthony Liguori    movi    a3, 0x1f        /* EXCM | INTMASK */
69c09015ddSAnthony Liguori    and     a2, a2, a3
70c09015ddSAnthony Liguori    assert  eqi, a2, 0x10   /* only EXCM is set for level-1 interrupt */
71c09015ddSAnthony Liguori    rsr     a2, exccause
72c09015ddSAnthony Liguori    assert  eqi, a2, 4
73c09015ddSAnthony Liguori.endm
74c09015ddSAnthony Liguori
75c09015ddSAnthony Liguoritest rsil
76c09015ddSAnthony Liguori    clear_interrupts
77c09015ddSAnthony Liguori
78c09015ddSAnthony Liguori    rsr     a2, ps
79c09015ddSAnthony Liguori    rsil    a3, 7
80c09015ddSAnthony Liguori    rsr     a4, ps
81c09015ddSAnthony Liguori    assert  eq, a2, a3
82c09015ddSAnthony Liguori    movi    a2, 0xf
83c09015ddSAnthony Liguori    and     a2, a4, a2
84c09015ddSAnthony Liguori    assert  eqi, a2, 7
85c09015ddSAnthony Liguori    xor     a3, a3, a4
86c09015ddSAnthony Liguori    movi    a2, 0xfffffff0
87c09015ddSAnthony Liguori    and     a2, a3, a2
88c09015ddSAnthony Liguori    assert  eqi, a2, 0
89c09015ddSAnthony Liguoritest_end
90c09015ddSAnthony Liguori
91*9c988226SMax Filippov#if L1_SOFT
92c09015ddSAnthony Liguoritest soft_disabled
93c09015ddSAnthony Liguori    set_vector kernel, 1f
94c09015ddSAnthony Liguori    clear_interrupts
95c09015ddSAnthony Liguori
96*9c988226SMax Filippov    movi    a2, L1_SOFT
97c09015ddSAnthony Liguori    wsr     a2, intset
98c09015ddSAnthony Liguori    esync
99c09015ddSAnthony Liguori    rsr     a3, interrupt
1008b912ff0SMax Filippov    movi    a4, ~XCHAL_INTTYPE_MASK_TIMER
1018b912ff0SMax Filippov    and     a3, a3, a4
102c09015ddSAnthony Liguori    assert  eq, a2, a3
103c09015ddSAnthony Liguori    wsr     a2, intclear
104c09015ddSAnthony Liguori    esync
105c09015ddSAnthony Liguori    rsr     a3, interrupt
1068b912ff0SMax Filippov    and     a3, a3, a4
107c09015ddSAnthony Liguori    assert  eqi, a3, 0
108c09015ddSAnthony Liguori    j       2f
109c09015ddSAnthony Liguori1:
110c09015ddSAnthony Liguori    test_fail
111c09015ddSAnthony Liguori2:
112c09015ddSAnthony Liguoritest_end
113c09015ddSAnthony Liguori
114c09015ddSAnthony Liguoritest soft_intenable
115c09015ddSAnthony Liguori    set_vector kernel, 1f
116c09015ddSAnthony Liguori    clear_interrupts
117c09015ddSAnthony Liguori
118*9c988226SMax Filippov    movi    a2, L1_SOFT
119c09015ddSAnthony Liguori    wsr     a2, intset
120c09015ddSAnthony Liguori    esync
121c09015ddSAnthony Liguori    rsr     a3, interrupt
1228b912ff0SMax Filippov    movi    a4, ~XCHAL_INTTYPE_MASK_TIMER
1238b912ff0SMax Filippov    and     a3, a3, a4
124c09015ddSAnthony Liguori    assert  eq, a2, a3
125c09015ddSAnthony Liguori    rsil    a3, 0
126c09015ddSAnthony Liguori    wsr     a2, intenable
127c09015ddSAnthony Liguori    esync
128c09015ddSAnthony Liguori    test_fail
129c09015ddSAnthony Liguori1:
130c09015ddSAnthony Liguori    check_l1
131c09015ddSAnthony Liguoritest_end
132c09015ddSAnthony Liguori
133c09015ddSAnthony Liguoritest soft_rsil
134c09015ddSAnthony Liguori    set_vector kernel, 1f
135c09015ddSAnthony Liguori    clear_interrupts
136c09015ddSAnthony Liguori
137*9c988226SMax Filippov    movi    a2, L1_SOFT
138c09015ddSAnthony Liguori    wsr     a2, intset
139c09015ddSAnthony Liguori    esync
140c09015ddSAnthony Liguori    rsr     a3, interrupt
1418b912ff0SMax Filippov    movi    a4, ~XCHAL_INTTYPE_MASK_TIMER
1428b912ff0SMax Filippov    and     a3, a3, a4
143c09015ddSAnthony Liguori    assert  eq, a2, a3
144c09015ddSAnthony Liguori    wsr     a2, intenable
145c09015ddSAnthony Liguori    rsil    a3, 0
146c09015ddSAnthony Liguori    esync
147c09015ddSAnthony Liguori    test_fail
148c09015ddSAnthony Liguori1:
149c09015ddSAnthony Liguori    check_l1
150c09015ddSAnthony Liguoritest_end
151c09015ddSAnthony Liguori
152c09015ddSAnthony Liguoritest soft_waiti
153c09015ddSAnthony Liguori    set_vector kernel, 1f
154c09015ddSAnthony Liguori    clear_interrupts
155c09015ddSAnthony Liguori
156*9c988226SMax Filippov    movi    a2, L1_SOFT
157c09015ddSAnthony Liguori    wsr     a2, intset
158c09015ddSAnthony Liguori    esync
159c09015ddSAnthony Liguori    rsr     a3, interrupt
1608b912ff0SMax Filippov    movi    a4, ~XCHAL_INTTYPE_MASK_TIMER
1618b912ff0SMax Filippov    and     a3, a3, a4
162c09015ddSAnthony Liguori    assert  eq, a2, a3
163c09015ddSAnthony Liguori    wsr     a2, intenable
164c09015ddSAnthony Liguori    waiti   0
165c09015ddSAnthony Liguori    test_fail
166c09015ddSAnthony Liguori1:
167c09015ddSAnthony Liguori    check_l1
168c09015ddSAnthony Liguoritest_end
169c09015ddSAnthony Liguori
170c09015ddSAnthony Liguoritest soft_user
171c09015ddSAnthony Liguori    set_vector kernel, 1f
172c09015ddSAnthony Liguori    set_vector user, 2f
173c09015ddSAnthony Liguori    clear_interrupts
174c09015ddSAnthony Liguori
175*9c988226SMax Filippov    movi    a2, L1_SOFT
176c09015ddSAnthony Liguori    wsr     a2, intset
177c09015ddSAnthony Liguori    esync
178c09015ddSAnthony Liguori    rsr     a3, interrupt
1798b912ff0SMax Filippov    movi    a4, ~XCHAL_INTTYPE_MASK_TIMER
1808b912ff0SMax Filippov    and     a3, a3, a4
181c09015ddSAnthony Liguori    assert  eq, a2, a3
182c09015ddSAnthony Liguori    wsr     a2, intenable
183c09015ddSAnthony Liguori
184c09015ddSAnthony Liguori    rsr     a2, ps
185c09015ddSAnthony Liguori    movi    a3, 0x20
186c09015ddSAnthony Liguori    or      a2, a2, a3
187c09015ddSAnthony Liguori    wsr     a2, ps
188c09015ddSAnthony Liguori    waiti   0
189c09015ddSAnthony Liguori1:
190c09015ddSAnthony Liguori    test_fail
191c09015ddSAnthony Liguori2:
192c09015ddSAnthony Liguori    check_l1
193c09015ddSAnthony Liguoritest_end
194c09015ddSAnthony Liguori
195*9c988226SMax Filippov#if HIGH_LEVEL_SOFT
196c09015ddSAnthony Liguoritest soft_priority
197c09015ddSAnthony Liguori    set_vector kernel, 1f
198*9c988226SMax Filippov    set_vector glue(level, HIGH_LEVEL_SOFT_LEVEL), 2f
199c09015ddSAnthony Liguori    clear_interrupts
200c09015ddSAnthony Liguori
201*9c988226SMax Filippov    movi    a2, L1_SOFT | HIGH_LEVEL_SOFT
202c09015ddSAnthony Liguori    wsr     a2, intenable
203c09015ddSAnthony Liguori    rsil    a3, 0
204c09015ddSAnthony Liguori    esync
205c09015ddSAnthony Liguori    wsr     a2, intset
206c09015ddSAnthony Liguori    esync
207c09015ddSAnthony Liguori1:
208c09015ddSAnthony Liguori    test_fail
209c09015ddSAnthony Liguori2:
210c09015ddSAnthony Liguori    rsr     a2, ps
211c09015ddSAnthony Liguori    movi    a3, 0x1f        /* EXCM | INTMASK */
212c09015ddSAnthony Liguori    and     a2, a2, a3
213*9c988226SMax Filippov    movi    a3, 0x10 | HIGH_LEVEL_SOFT_LEVEL
214c09015ddSAnthony Liguori    assert  eq, a2, a3      /* EXCM and INTMASK are set
215c09015ddSAnthony Liguori                               for high-priority interrupt */
216c09015ddSAnthony Liguoritest_end
217*9c988226SMax Filippov#endif
218*9c988226SMax Filippov#endif
219c09015ddSAnthony Liguori
220*9c988226SMax Filippov#if HIGH_LEVEL_SOFT
221c09015ddSAnthony Liguoritest eps_epc_rfi
222*9c988226SMax Filippov    set_vector glue(level, HIGH_LEVEL_SOFT_LEVEL), 3f
223c09015ddSAnthony Liguori    clear_interrupts
224c09015ddSAnthony Liguori    reset_ps
225c09015ddSAnthony Liguori
226*9c988226SMax Filippov    movi    a2, L1_SOFT_MASK | HIGH_LEVEL_SOFT_MASK
227c09015ddSAnthony Liguori    wsr     a2, intenable
228c09015ddSAnthony Liguori    rsil    a3, 0
229c09015ddSAnthony Liguori    rsr     a3, ps
230c09015ddSAnthony Liguori    esync
231c09015ddSAnthony Liguori    wsr     a2, intset
232c09015ddSAnthony Liguori1:
233c09015ddSAnthony Liguori    esync
234c09015ddSAnthony Liguori2:
235c09015ddSAnthony Liguori    test_fail
236c09015ddSAnthony Liguori3:
237*9c988226SMax Filippov    rsr     a2, glue(eps, HIGH_LEVEL_SOFT_LEVEL)
238c09015ddSAnthony Liguori    assert  eq, a2, a3
239*9c988226SMax Filippov    rsr     a2, glue(epc, HIGH_LEVEL_SOFT_LEVEL)
240c09015ddSAnthony Liguori    movi    a3, 1b
241c09015ddSAnthony Liguori    assert  ge, a2, a3
242c09015ddSAnthony Liguori    movi    a3, 2b
243c09015ddSAnthony Liguori    assert  ge, a3, a2
244c09015ddSAnthony Liguori    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
249c09015ddSAnthony Liguori    test_fail
250c09015ddSAnthony Liguori4:
251c09015ddSAnthony Liguori    rsr     a2, ps
252*9c988226SMax Filippov    movi    a3, 0x40000 | HIGH_LEVEL_SOFT_LEVEL
253c09015ddSAnthony Liguori    assert  eq, a2, a3
254c09015ddSAnthony Liguoritest_end
255*9c988226SMax Filippov#endif
256*9c988226SMax Filippov
257*9c988226SMax Filippov#endif
258c09015ddSAnthony Liguori
259c09015ddSAnthony Liguoritest_suite_end
260