master
s 367 lines 6.82 KB
Raw
1 #include "macros.inc"
2
3 test_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
32 1:
33 mov a2, a\probe_ex
34 test_fail
35 10:
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
50 2:
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
76 test overflow
77 all_overflow_tests
78 test_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
96 1:
97 retw
98 test_fail
99 10:
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
115 2:
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
126 test 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
134 test_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
148 1:
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
160 test 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
168 test_end
169
170 test movsp
171 set_vector kernel, 2f
172
173 reset_window 1
174 reset_ps
175 1:
176 movsp a2, a3
177 test_fail
178 2:
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
191 test_end
192
193 test 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
256 test_end
257
258 .macro callw_test window
259 call\window 2f
260 1:
261 test_fail
262 .align 4
263 2:
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
277 test callw
278 reset_window 0x1
279 reset_ps
280
281 callw_test 4
282 callw_test 8
283 callw_test 12
284 test_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
296 1:
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
308 test entry
309 entry_test 4
310 entry_test 8
311 entry_test 12
312 test_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
331 1:
332 entry a3, 0x5678
333 test_fail
334 .align 4
335 10:
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
346 2:
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
361 test entry_overflow
362 all_entry_overflow_tests
363 test_end
364
365 #endif
366
367 test_suite_end