]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_R4F_RZ_T_GCC_IAR/src/Full_Demo/reg_test_IAR.asm
Update to MIT licensed FreeRTOS V10.0.0 - see https://www.freertos.org/History.txt
[freertos] / FreeRTOS / Demo / CORTEX_R4F_RZ_T_GCC_IAR / src / Full_Demo / reg_test_IAR.asm
1 /*\r
2  * FreeRTOS Kernel V10.0.0\r
3  * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
4  *\r
5  * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
6  * this software and associated documentation files (the "Software"), to deal in\r
7  * the Software without restriction, including without limitation the rights to\r
8  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
9  * the Software, and to permit persons to whom the Software is furnished to do so,\r
10  * subject to the following conditions:\r
11  *\r
12  * The above copyright notice and this permission notice shall be included in all\r
13  * copies or substantial portions of the Software. If you wish to use our Amazon\r
14  * FreeRTOS name, please do so in a fair use way that does not cause confusion.\r
15  *\r
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
18  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
19  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
20  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
21  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
22  *\r
23  * http://www.FreeRTOS.org\r
24  * http://aws.amazon.com/freertos\r
25  *\r
26  * 1 tab == 4 spaces!\r
27  */\r
28 \r
29         PUBLIC vRegTest1Implementation\r
30         PUBLIC vRegTest2Implementation\r
31         EXTERN ulRegTest1LoopCounter\r
32         EXTERN ulRegTest2LoopCounter\r
33 \r
34         SECTION intvec:CODE:ROOT(2)\r
35     ARM\r
36 \r
37         /* This function is explained in the comments at the top of main-full.c. */\r
38 vRegTest1Implementation:\r
39 \r
40         /* Fill each general purpose register with a known value. */\r
41         mov             r0,  #0xFF\r
42         mov             r1,  #0x11\r
43         mov             r2,  #0x22\r
44         mov             r3,  #0x33\r
45         mov     r4,  #0x44\r
46         mov     r5,  #0x55\r
47         mov     r6,  #0x66\r
48         mov     r7,  #0x77\r
49         mov     r8,  #0x88\r
50         mov     r9,  #0x99\r
51         mov     r10, #0xAA\r
52         mov     r11, #0xBB\r
53         mov     r12, #0xCC\r
54         mov             r14, #0xEE\r
55 \r
56 \r
57         /* Fill each FPU register with a known value. */\r
58         vmov    d0, r0, r1\r
59         vmov    d1, r2, r3\r
60         vmov    d2, r4, r5\r
61         vmov    d3, r6, r7\r
62         vmov    d4, r8, r9\r
63         vmov    d5, r10, r11\r
64         vmov    d6, r0, r1\r
65         vmov    d7, r2, r3\r
66         vmov    d8, r4, r5\r
67         vmov    d9, r6, r7\r
68         vmov    d10, r8, r9\r
69         vmov    d11, r10, r11\r
70         vmov    d12, r0, r1\r
71         vmov    d13, r2, r3\r
72         vmov    d14, r4, r5\r
73         vmov    d15, r6, r7\r
74 \r
75         /* Loop, checking each iteration that each register still contains the\r
76         expected value. */\r
77 reg1_loop:\r
78         /* Yield to increase test coverage */\r
79         svc 0\r
80 \r
81         /* Check all the VFP registers still contain the values set above.\r
82         First save registers that are clobbered by the test. */\r
83         push { r0-r1 }\r
84 \r
85         vmov    r0, r1, d0\r
86         cmp     r0, #0xFF\r
87         bne     reg1_error_loopf\r
88         cmp     r1, #0x11\r
89         bne     reg1_error_loopf\r
90         vmov    r0, r1, d1\r
91         cmp     r0, #0x22\r
92         bne     reg1_error_loopf\r
93         cmp     r1, #0x33\r
94         bne     reg1_error_loopf\r
95         vmov    r0, r1, d2\r
96         cmp     r0, #0x44\r
97         bne     reg1_error_loopf\r
98         cmp     r1, #0x55\r
99         bne     reg1_error_loopf\r
100         vmov    r0, r1, d3\r
101         cmp     r0, #0x66\r
102         bne     reg1_error_loopf\r
103         cmp     r1, #0x77\r
104         bne     reg1_error_loopf\r
105         vmov    r0, r1, d4\r
106         cmp     r0, #0x88\r
107         bne     reg1_error_loopf\r
108         cmp     r1, #0x99\r
109         bne     reg1_error_loopf\r
110         vmov    r0, r1, d5\r
111         cmp     r0, #0xAA\r
112         bne     reg1_error_loopf\r
113         cmp     r1, #0xBB\r
114         bne     reg1_error_loopf\r
115         vmov    r0, r1, d6\r
116         cmp     r0, #0xFF\r
117         bne     reg1_error_loopf\r
118         cmp     r1, #0x11\r
119         bne     reg1_error_loopf\r
120         vmov    r0, r1, d7\r
121         cmp     r0, #0x22\r
122         bne     reg1_error_loopf\r
123         cmp     r1, #0x33\r
124         bne     reg1_error_loopf\r
125         vmov    r0, r1, d8\r
126         cmp     r0, #0x44\r
127         bne     reg1_error_loopf\r
128         cmp     r1, #0x55\r
129         bne     reg1_error_loopf\r
130         vmov    r0, r1, d9\r
131         cmp     r0, #0x66\r
132         bne     reg1_error_loopf\r
133         cmp     r1, #0x77\r
134         bne     reg1_error_loopf\r
135         vmov    r0, r1, d10\r
136         cmp     r0, #0x88\r
137         bne     reg1_error_loopf\r
138         cmp     r1, #0x99\r
139         bne     reg1_error_loopf\r
140         vmov    r0, r1, d11\r
141         cmp     r0, #0xAA\r
142         bne     reg1_error_loopf\r
143         cmp     r1, #0xBB\r
144         bne     reg1_error_loopf\r
145         vmov    r0, r1, d12\r
146         cmp     r0, #0xFF\r
147         bne     reg1_error_loopf\r
148         cmp     r1, #0x11\r
149         bne     reg1_error_loopf\r
150         vmov    r0, r1, d13\r
151         cmp     r0, #0x22\r
152         bne     reg1_error_loopf\r
153         cmp     r1, #0x33\r
154         bne     reg1_error_loopf\r
155         vmov    r0, r1, d14\r
156         cmp     r0, #0x44\r
157         bne     reg1_error_loopf\r
158         cmp     r1, #0x55\r
159         bne     reg1_error_loopf\r
160         vmov    r0, r1, d15\r
161         cmp     r0, #0x66\r
162         bne     reg1_error_loopf\r
163         cmp     r1, #0x77\r
164         bne     reg1_error_loopf\r
165 \r
166 \r
167         /* Restore the registers that were clobbered by the test. */\r
168         pop     {r0-r1}\r
169 \r
170         /* VFP register test passed.  Jump to the core register test. */\r
171         b               reg1_loopf_pass\r
172 \r
173 reg1_error_loopf:\r
174         /* If this line is hit then a VFP register value was found to be\r
175         incorrect. */\r
176         b reg1_error_loopf\r
177 \r
178 reg1_loopf_pass:\r
179 \r
180         /* Test each general purpose register to check that it still contains the\r
181         expected known value, jumping to reg1_error_loop if any register contains\r
182         an unexpected value. */\r
183         cmp             r0, #0xFF\r
184         bne             reg1_error_loop\r
185         cmp             r1, #0x11\r
186         bne             reg1_error_loop\r
187         cmp             r2, #0x22\r
188         bne             reg1_error_loop\r
189         cmp             r3, #0x33\r
190         bne             reg1_error_loop\r
191         cmp             r4, #0x44\r
192         bne             reg1_error_loop\r
193         cmp             r5, #0x55\r
194         bne             reg1_error_loop\r
195         cmp             r6, #0x66\r
196         bne             reg1_error_loop\r
197         cmp             r7, #0x77\r
198         bne             reg1_error_loop\r
199         cmp             r8, #0x88\r
200         bne             reg1_error_loop\r
201         cmp             r9, #0x99\r
202         bne             reg1_error_loop\r
203         cmp             r10, #0xAA\r
204         bne             reg1_error_loop\r
205         cmp             r11, #0xBB\r
206         bne             reg1_error_loop\r
207         cmp             r12, #0xCC\r
208         bne             reg1_error_loop\r
209         cmp             r14, #0xEE\r
210         bne             reg1_error_loop\r
211 \r
212         /* Everything passed, increment the loop counter. */\r
213         push { r0-r1 }\r
214         ldr     r0, =ulRegTest1LoopCounter\r
215         ldr r1, [r0]\r
216         adds r1, r1, #1\r
217         str r1, [r0]\r
218         pop { r0-r1 }\r
219 \r
220         /* Start again. */\r
221         b reg1_loop\r
222 \r
223 reg1_error_loop:\r
224         /* If this line is hit then there was an error in a core register value.\r
225         The loop ensures the loop counter stops incrementing. */\r
226         b reg1_error_loop\r
227         nop\r
228 \r
229 /*-----------------------------------------------------------*/\r
230 \r
231 vRegTest2Implementation:\r
232 \r
233         /* Put a known value in each register. */\r
234         mov             r0,  #0xFF000000\r
235         mov             r1,  #0x11000000\r
236         mov             r2,  #0x22000000\r
237         mov             r3,  #0x33000000\r
238         mov     r4,  #0x44000000\r
239         mov     r5,  #0x55000000\r
240         mov     r6,  #0x66000000\r
241         mov     r7,  #0x77000000\r
242         mov     r8,  #0x88000000\r
243         mov     r9,  #0x99000000\r
244         mov     r10, #0xAA000000\r
245         mov     r11, #0xBB000000\r
246         mov     r12, #0xCC000000\r
247         mov     r14, #0xEE000000\r
248 \r
249         /* Likewise the floating point registers */\r
250         vmov    d0, r0, r1\r
251         vmov    d1, r2, r3\r
252         vmov    d2, r4, r5\r
253         vmov    d3, r6, r7\r
254         vmov    d4, r8, r9\r
255         vmov    d5, r10, r11\r
256         vmov    d6, r0, r1\r
257         vmov    d7, r2, r3\r
258         vmov    d8, r4, r5\r
259         vmov    d9, r6, r7\r
260         vmov    d10, r8, r9\r
261         vmov    d11, r10, r11\r
262         vmov    d12, r0, r1\r
263         vmov    d13, r2, r3\r
264         vmov    d14, r4, r5\r
265         vmov    d15, r6, r7\r
266 \r
267         /* Loop, checking each iteration that each register still contains the\r
268         expected value. */\r
269 reg2_loop:\r
270         /* Check all the VFP registers still contain the values set above.\r
271         First save registers that are clobbered by the test. */\r
272         push    { r0-r1 }\r
273 \r
274         vmov    r0, r1, d0\r
275         cmp     r0, #0xFF000000\r
276         bne     reg2_error_loopf\r
277         cmp     r1, #0x11000000\r
278         bne     reg2_error_loopf\r
279         vmov    r0, r1, d1\r
280         cmp     r0, #0x22000000\r
281         bne     reg2_error_loopf\r
282         cmp     r1, #0x33000000\r
283         bne     reg2_error_loopf\r
284         vmov    r0, r1, d2\r
285         cmp     r0, #0x44000000\r
286         bne     reg2_error_loopf\r
287         cmp     r1, #0x55000000\r
288         bne     reg2_error_loopf\r
289         vmov    r0, r1, d3\r
290         cmp     r0, #0x66000000\r
291         bne     reg2_error_loopf\r
292         cmp     r1, #0x77000000\r
293         bne     reg2_error_loopf\r
294         vmov    r0, r1, d4\r
295         cmp     r0, #0x88000000\r
296         bne     reg2_error_loopf\r
297         cmp     r1, #0x99000000\r
298         bne     reg2_error_loopf\r
299         vmov    r0, r1, d5\r
300         cmp     r0, #0xAA000000\r
301         bne     reg2_error_loopf\r
302         cmp     r1, #0xBB000000\r
303         bne     reg2_error_loopf\r
304         vmov    r0, r1, d6\r
305         cmp     r0, #0xFF000000\r
306         bne     reg2_error_loopf\r
307         cmp     r1, #0x11000000\r
308         bne     reg2_error_loopf\r
309         vmov    r0, r1, d7\r
310         cmp     r0, #0x22000000\r
311         bne     reg2_error_loopf\r
312         cmp     r1, #0x33000000\r
313         bne     reg2_error_loopf\r
314         vmov    r0, r1, d8\r
315         cmp     r0, #0x44000000\r
316         bne     reg2_error_loopf\r
317         cmp     r1, #0x55000000\r
318         bne     reg2_error_loopf\r
319         vmov    r0, r1, d9\r
320         cmp     r0, #0x66000000\r
321         bne     reg2_error_loopf\r
322         cmp     r1, #0x77000000\r
323         bne     reg2_error_loopf\r
324         vmov    r0, r1, d10\r
325         cmp     r0, #0x88000000\r
326         bne     reg2_error_loopf\r
327         cmp     r1, #0x99000000\r
328         bne     reg2_error_loopf\r
329         vmov    r0, r1, d11\r
330         cmp     r0, #0xAA000000\r
331         bne     reg2_error_loopf\r
332         cmp     r1, #0xBB000000\r
333         bne     reg2_error_loopf\r
334         vmov    r0, r1, d12\r
335         cmp     r0, #0xFF000000\r
336         bne     reg2_error_loopf\r
337         cmp     r1, #0x11000000\r
338         bne     reg2_error_loopf\r
339         vmov    r0, r1, d13\r
340         cmp     r0, #0x22000000\r
341         bne     reg2_error_loopf\r
342         cmp     r1, #0x33000000\r
343         bne     reg2_error_loopf\r
344         vmov    r0, r1, d14\r
345         cmp     r0, #0x44000000\r
346         bne     reg2_error_loopf\r
347         cmp     r1, #0x55000000\r
348         bne     reg2_error_loopf\r
349         vmov    r0, r1, d15\r
350         cmp     r0, #0x66000000\r
351         bne     reg2_error_loopf\r
352         cmp     r1, #0x77000000\r
353         bne     reg2_error_loopf\r
354 \r
355         /* Restore the registers that were clobbered by the test. */\r
356         pop     {r0-r1}\r
357 \r
358         /* VFP register test passed.  Jump to the core register test. */\r
359         b               reg2_loopf_pass\r
360 \r
361 reg2_error_loopf:\r
362         /* If this line is hit then a VFP register value was found to be\r
363         incorrect. */\r
364         b               reg2_error_loopf\r
365 \r
366 reg2_loopf_pass:\r
367 \r
368         cmp             r0, #0xFF000000\r
369         bne             reg2_error_loop\r
370         cmp             r1, #0x11000000\r
371         bne             reg2_error_loop\r
372         cmp             r2, #0x22000000\r
373         bne             reg2_error_loop\r
374         cmp             r3, #0x33000000\r
375         bne             reg2_error_loop\r
376         cmp             r4, #0x44000000\r
377         bne             reg2_error_loop\r
378         cmp             r5, #0x55000000\r
379         bne             reg2_error_loop\r
380         cmp             r6, #0x66000000\r
381         bne             reg2_error_loop\r
382         cmp             r7, #0x77000000\r
383         bne             reg2_error_loop\r
384         cmp             r8, #0x88000000\r
385         bne             reg2_error_loop\r
386         cmp             r9, #0x99000000\r
387         bne             reg2_error_loop\r
388         cmp             r10, #0xAA000000\r
389         bne             reg2_error_loop\r
390         cmp             r11, #0xBB000000\r
391         bne             reg2_error_loop\r
392         cmp             r12, #0xCC000000\r
393         bne             reg2_error_loop\r
394         cmp     r14, #0xEE000000\r
395         bne             reg2_error_loop\r
396 \r
397         /* Everything passed, increment the loop counter. */\r
398         push    { r0-r1 }\r
399         ldr             r0, =ulRegTest2LoopCounter\r
400         ldr     r1, [r0]\r
401         adds    r1, r1, #1\r
402         str     r1, [r0]\r
403         pop     { r0-r1 }\r
404 \r
405         /* Start again. */\r
406         b               reg2_loop\r
407 \r
408 reg2_error_loop:\r
409         /* If this line is hit then there was an error in a core register value.\r
410         The loop ensures the loop counter stops incrementing. */\r
411         b               reg2_error_loop\r
412         nop\r
413 \r
414 \r
415         END\r
416 \r