2 * FreeRTOS Kernel V10.2.0
\r
3 * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
\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
12 * The above copyright notice and this permission notice shall be included in all
\r
13 * copies or substantial portions of the Software.
\r
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
\r
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
\r
17 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
\r
18 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
\r
19 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
\r
20 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\r
22 * http://www.FreeRTOS.org
\r
23 * http://aws.amazon.com/freertos
\r
25 * 1 tab == 4 spaces!
\r
30 #include <sys/asm.h>
\r
31 #include "FreeRTOSConfig.h"
\r
40 /************************************************************************/
\r
41 /* Reg test macro helper. Test a register for a known value branching to
\r
42 error_loop if not correct otherwise continuing on */
\r
43 .macro portREG_TEST work_reg, test_reg, test_value
\r
45 /* Check each register maintains the value assigned to it for the lifetime
\r
47 addiu \work_reg, $0, 0x00
\r
48 addiu \work_reg, \test_reg, -\test_value
\r
49 beq \work_reg, $0, 1f
\r
51 /* The register value was not that expected. Jump to the error loop so the
\r
52 cycle counter stops incrementing. */
\r
58 /************************************************************************/
\r
59 /* FPU reg test macro helper, Test an FPU register for a known value branching to
\r
60 error_loop if not correct otherwise continuing on */
\r
61 #if ( __mips_hard_float == 1) && ( configUSE_TASK_FPU_SUPPORT == 1 )
\r
62 .macro portFPU_REG_TEST work_reg, test_reg, test_value
\r
63 /* get the lower 32 bit value from the FPU and compare to the test value */
\r
64 mfc1 \work_reg, \test_reg
\r
65 addiu \work_reg, \work_reg, -\test_value
\r
66 beq \work_reg, $0, 1f
\r
69 /* The register values was not that expected. Jump to the error loop */
\r
77 /************************************************************************/
\r
82 /* Reg test tasks call the error loop when they find an error. Sitting in the
\r
83 tight error loop prevents them incrementing their ulRegTestnCycles counter, and
\r
84 so allows the check softwate timer to know an error has been found. */
\r
97 /* Fill the registers with known values. */
\r
101 /* $4 contains the address of the loop counter - don't mess with $4. */
\r
107 addiu $10, $0, 0x110
\r
108 addiu $11, $0, 0x111
\r
109 addiu $12, $0, 0x112
\r
110 addiu $13, $0, 0x113
\r
111 addiu $14, $0, 0x114
\r
112 addiu $15, $0, 0x115
\r
113 addiu $16, $0, 0x116
\r
114 addiu $17, $0, 0x117
\r
115 addiu $18, $0, 0x118
\r
116 addiu $19, $0, 0x119
\r
117 addiu $20, $0, 0x120
\r
118 addiu $21, $0, 0x121
\r
119 addiu $23, $0, 0x123
\r
120 addiu $24, $0, 0x124
\r
121 addiu $25, $0, 0x125
\r
122 addiu $30, $0, 0x130
\r
123 addiu $22, $0, 0x131
\r
125 addiu $22, $0, 0x132
\r
127 addiu $22, $0, 0x133
\r
129 addiu $22, $0, 0x134
\r
131 addiu $22, $0, 0x135
\r
133 addiu $22, $0, 0x136
\r
136 /* Test the FPU registers if they are present on the part. */
\r
137 #if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 )
\r
138 addiu $22, $0, 0x180
\r
140 addiu $22, $0, 0x181
\r
142 addiu $22, $0, 0x182
\r
144 addiu $22, $0, 0x183
\r
146 addiu $22, $0, 0x184
\r
148 addiu $22, $0, 0x185
\r
150 addiu $22, $0, 0x186
\r
152 addiu $22, $0, 0x187
\r
154 addiu $22, $0, 0x188
\r
156 addiu $22, $0, 0x189
\r
158 addiu $22, $0, 0x18A
\r
160 addiu $22, $0, 0x18B
\r
162 addiu $22, $0, 0x18C
\r
164 addiu $22, $0, 0x18D
\r
166 addiu $22, $0, 0x18E
\r
168 addiu $22, $0, 0x18F
\r
170 addiu $22, $0, 0x190
\r
172 addiu $22, $0, 0x191
\r
174 addiu $22, $0, 0x192
\r
176 addiu $22, $0, 0x193
\r
178 addiu $22, $0, 0x194
\r
180 addiu $22, $0, 0x195
\r
182 addiu $22, $0, 0x196
\r
184 addiu $22, $0, 0x197
\r
186 addiu $22, $0, 0x198
\r
188 addiu $22, $0, 0x199
\r
190 addiu $22, $0, 0x19A
\r
192 addiu $22, $0, 0x19B
\r
194 addiu $22, $0, 0x19C
\r
196 addiu $22, $0, 0x19D
\r
198 addiu $22, $0, 0x19E
\r
200 addiu $22, $0, 0x19F
\r
205 portREG_TEST $22, $1, 0x11
\r
206 portREG_TEST $22, $2, 0x12
\r
207 portREG_TEST $22, $3, 0x13
\r
208 /* Do not test r4 as we are using it as a loop counter */
\r
209 portREG_TEST $22, $5, 0x15
\r
210 portREG_TEST $22, $6, 0x16
\r
211 portREG_TEST $22, $7, 0x17
\r
212 portREG_TEST $22, $8, 0x18
\r
213 portREG_TEST $22, $9, 0x19
\r
214 portREG_TEST $22, $10, 0x110
\r
215 portREG_TEST $22, $11, 0x111
\r
216 portREG_TEST $22, $12, 0x112
\r
217 portREG_TEST $22, $13, 0x113
\r
218 portREG_TEST $22, $14, 0x114
\r
219 portREG_TEST $22, $15, 0x115
\r
220 portREG_TEST $22, $16, 0x116
\r
221 portREG_TEST $22, $17, 0x117
\r
222 portREG_TEST $22, $18, 0x118
\r
223 portREG_TEST $22, $19, 0x119
\r
224 portREG_TEST $22, $20, 0x120
\r
225 portREG_TEST $22, $21, 0x121
\r
226 /* Do not test r22, used as a helper */
\r
227 portREG_TEST $22, $23, 0x123
\r
228 portREG_TEST $22, $24, 0x124
\r
229 portREG_TEST $22, $25, 0x125
\r
230 portREG_TEST $22, $30, 0x130
\r
233 addiu $22, $22, -0x131
\r
240 addiu $22, $22, -0x132
\r
247 addiu $22, $22, -0x133
\r
254 addiu $22, $22, -0x134
\r
261 addiu $22, $22, -0x135
\r
268 addiu $22, $22, -0x136
\r
274 /* Test the FPU registers if they are present on the part. */
\r
275 #if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 )
\r
276 portFPU_REG_TEST $22, $f0, 0x180
\r
277 portFPU_REG_TEST $22, $f1, 0x181
\r
278 portFPU_REG_TEST $22, $f2, 0x182
\r
279 portFPU_REG_TEST $22, $f3, 0x183
\r
280 portFPU_REG_TEST $22, $f4, 0x184
\r
281 portFPU_REG_TEST $22, $f5, 0x185
\r
282 portFPU_REG_TEST $22, $f6, 0x186
\r
283 portFPU_REG_TEST $22, $f7, 0x187
\r
284 portFPU_REG_TEST $22, $f8, 0x188
\r
285 portFPU_REG_TEST $22, $f9, 0x189
\r
286 portFPU_REG_TEST $22, $f10, 0x18A
\r
287 portFPU_REG_TEST $22, $f11, 0x18B
\r
288 portFPU_REG_TEST $22, $f12, 0x18C
\r
289 portFPU_REG_TEST $22, $f13, 0x18D
\r
290 portFPU_REG_TEST $22, $f14, 0x18E
\r
291 portFPU_REG_TEST $22, $f15, 0x18F
\r
292 portFPU_REG_TEST $22, $f16, 0x190
\r
293 portFPU_REG_TEST $22, $f17, 0x191
\r
294 portFPU_REG_TEST $22, $f18, 0x192
\r
295 portFPU_REG_TEST $22, $f19, 0x193
\r
296 portFPU_REG_TEST $22, $f20, 0x194
\r
297 portFPU_REG_TEST $22, $f21, 0x195
\r
298 portFPU_REG_TEST $22, $f22, 0x196
\r
299 portFPU_REG_TEST $22, $f23, 0x197
\r
300 portFPU_REG_TEST $22, $f24, 0x198
\r
301 portFPU_REG_TEST $22, $f25, 0x199
\r
302 portFPU_REG_TEST $22, $f26, 0x19A
\r
303 portFPU_REG_TEST $22, $f27, 0x19B
\r
304 portFPU_REG_TEST $22, $f28, 0x19C
\r
305 portFPU_REG_TEST $22, $f29, 0x19D
\r
306 portFPU_REG_TEST $22, $f30, 0x19E
\r
307 portFPU_REG_TEST $22, $f31, 0x19F
\r
310 /* No errors detected. Increment the loop count so the check timer knows
\r
311 this task is still running without error, then loop back to do it all
\r
312 again. The address of the loop counter is in $4. */
\r
314 addiu $22, $22, 0x01
\r
321 /************************************************************************/
\r
330 /* $4 contains the address of the loop counter - don't mess with $4. */
\r
336 addiu $10, $0, 0x210
\r
337 addiu $11, $0, 0x211
\r
338 addiu $12, $0, 0x212
\r
339 addiu $13, $0, 0x213
\r
340 addiu $14, $0, 0x214
\r
341 addiu $15, $0, 0x215
\r
342 addiu $16, $0, 0x216
\r
343 addiu $17, $0, 0x217
\r
344 addiu $18, $0, 0x218
\r
345 addiu $19, $0, 0x219
\r
346 addiu $20, $0, 0x220
\r
347 addiu $21, $0, 0x221
\r
348 addiu $23, $0, 0x223
\r
349 addiu $24, $0, 0x224
\r
350 addiu $25, $0, 0x225
\r
351 addiu $30, $0, 0x230
\r
352 addiu $22, $0, 0x231
\r
354 addiu $22, $0, 0x232
\r
356 addiu $22, $0, 0x233
\r
358 addiu $22, $0, 0x234
\r
360 addiu $22, $0, 0x235
\r
362 addiu $22, $0, 0x236
\r
365 /* Test the FPU registers if they are present on the part. */
\r
366 #if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 )
\r
367 addiu $22, $0, 0x280
\r
369 addiu $22, $0, 0x281
\r
371 addiu $22, $0, 0x282
\r
373 addiu $22, $0, 0x283
\r
375 addiu $22, $0, 0x284
\r
377 addiu $22, $0, 0x285
\r
379 addiu $22, $0, 0x286
\r
381 addiu $22, $0, 0x287
\r
383 addiu $22, $0, 0x288
\r
385 addiu $22, $0, 0x289
\r
387 addiu $22, $0, 0x28A
\r
389 addiu $22, $0, 0x28B
\r
391 addiu $22, $0, 0x28C
\r
393 addiu $22, $0, 0x28D
\r
395 addiu $22, $0, 0x28E
\r
397 addiu $22, $0, 0x28F
\r
399 addiu $22, $0, 0x290
\r
401 addiu $22, $0, 0x291
\r
403 addiu $22, $0, 0x292
\r
405 addiu $22, $0, 0x293
\r
407 addiu $22, $0, 0x294
\r
409 addiu $22, $0, 0x295
\r
411 addiu $22, $0, 0x296
\r
413 addiu $22, $0, 0x297
\r
415 addiu $22, $0, 0x298
\r
417 addiu $22, $0, 0x299
\r
419 addiu $22, $0, 0x29A
\r
421 addiu $22, $0, 0x29B
\r
423 addiu $22, $0, 0x29C
\r
425 addiu $22, $0, 0x29D
\r
427 addiu $22, $0, 0x29E
\r
429 addiu $22, $0, 0x29F
\r
434 portREG_TEST $22, $1, 0x21
\r
435 portREG_TEST $22, $2, 0x22
\r
436 portREG_TEST $22, $3, 0x23
\r
437 /* Do not test r4 as we are using it as a loop counter */
\r
438 portREG_TEST $22, $5, 0x25
\r
439 portREG_TEST $22, $6, 0x26
\r
440 portREG_TEST $22, $7, 0x27
\r
441 portREG_TEST $22, $8, 0x28
\r
442 portREG_TEST $22, $9, 0x29
\r
443 portREG_TEST $22, $10, 0x210
\r
444 portREG_TEST $22, $11, 0x211
\r
445 portREG_TEST $22, $12, 0x212
\r
446 portREG_TEST $22, $13, 0x213
\r
447 portREG_TEST $22, $14, 0x214
\r
448 portREG_TEST $22, $15, 0x215
\r
449 portREG_TEST $22, $16, 0x216
\r
450 portREG_TEST $22, $17, 0x217
\r
451 portREG_TEST $22, $18, 0x218
\r
452 portREG_TEST $22, $19, 0x219
\r
453 portREG_TEST $22, $20, 0x220
\r
454 portREG_TEST $22, $21, 0x221
\r
455 /* Do not test r22, used as a helper */
\r
456 portREG_TEST $22, $23, 0x223
\r
457 portREG_TEST $22, $24, 0x224
\r
458 portREG_TEST $22, $25, 0x225
\r
459 portREG_TEST $22, $30, 0x230
\r
462 addiu $22, $22, -0x231
\r
469 addiu $22, $22, -0x232
\r
476 addiu $22, $22, -0x233
\r
483 addiu $22, $22, -0x234
\r
490 addiu $22, $22, -0x235
\r
497 addiu $22, $22, -0x236
\r
503 /* Test the FPU registers if they are present on the part. */
\r
504 #if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 )
\r
505 portFPU_REG_TEST $22, $f0, 0x280
\r
506 portFPU_REG_TEST $22, $f1, 0x281
\r
507 portFPU_REG_TEST $22, $f2, 0x282
\r
508 portFPU_REG_TEST $22, $f3, 0x283
\r
509 portFPU_REG_TEST $22, $f4, 0x284
\r
510 portFPU_REG_TEST $22, $f5, 0x285
\r
511 portFPU_REG_TEST $22, $f6, 0x286
\r
512 portFPU_REG_TEST $22, $f7, 0x287
\r
513 portFPU_REG_TEST $22, $f8, 0x288
\r
514 portFPU_REG_TEST $22, $f9, 0x289
\r
515 portFPU_REG_TEST $22, $f10, 0x28A
\r
516 portFPU_REG_TEST $22, $f11, 0x28B
\r
517 portFPU_REG_TEST $22, $f12, 0x28C
\r
518 portFPU_REG_TEST $22, $f13, 0x28D
\r
519 portFPU_REG_TEST $22, $f14, 0x28E
\r
520 portFPU_REG_TEST $22, $f15, 0x28F
\r
521 portFPU_REG_TEST $22, $f16, 0x290
\r
522 portFPU_REG_TEST $22, $f17, 0x291
\r
523 portFPU_REG_TEST $22, $f18, 0x292
\r
524 portFPU_REG_TEST $22, $f19, 0x293
\r
525 portFPU_REG_TEST $22, $f20, 0x294
\r
526 portFPU_REG_TEST $22, $f21, 0x295
\r
527 portFPU_REG_TEST $22, $f22, 0x296
\r
528 portFPU_REG_TEST $22, $f23, 0x297
\r
529 portFPU_REG_TEST $22, $f24, 0x298
\r
530 portFPU_REG_TEST $22, $f25, 0x299
\r
531 portFPU_REG_TEST $22, $f26, 0x29A
\r
532 portFPU_REG_TEST $22, $f27, 0x29B
\r
533 portFPU_REG_TEST $22, $f28, 0x29C
\r
534 portFPU_REG_TEST $22, $f29, 0x29D
\r
535 portFPU_REG_TEST $22, $f30, 0x29E
\r
536 portFPU_REG_TEST $22, $f31, 0x29F
\r
539 /* No errors detected. Increment the loop count so the check timer knows
\r
540 this task is still running without error, then loop back to do it all
\r
541 again. The address of the loop counter is in $4. */
\r
543 addiu $22, $22, 0x01
\r