;/* | |
; * FreeRTOS Kernel V10.3.0 | |
; * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. | |
; * | |
; * Permission is hereby granted, free of charge, to any person obtaining a copy of | |
; * this software and associated documentation files (the "Software"), to deal in | |
; * the Software without restriction, including without limitation the rights to | |
; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | |
; * the Software, and to permit persons to whom the Software is furnished to do so, | |
; * subject to the following conditions: | |
; * | |
; * The above copyright notice and this permission notice shall be included in all | |
; * copies or substantial portions of the Software. | |
; * | |
; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS | |
; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | |
; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | |
; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | |
; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
; * | |
; * http://www.FreeRTOS.org | |
; * http://aws.amazon.com/freertos | |
; * | |
; * 1 tab == 4 spaces! | |
; */ | |
.import _ulRegTest1CycleCount | |
.import _ulRegTest2CycleCount | |
.import _vPortYield | |
.export _vRegTest1Task | |
.export _vRegTest2Task | |
.section P, code, align=4 | |
_vRegTest1Task: | |
; Fill the registers with known values. | |
mov #2, r1 | |
mov #3, r2 | |
mov #4, r3 | |
mov #5, r4 | |
mov #6, r5 | |
mov #7, r6 | |
mov #8, r7 | |
mov #9, r8 | |
mov #10, r9 | |
mov #11, r10 | |
mov #12, r11 | |
mov #13, r12 | |
mov #14, r13 | |
mov #15, r14 | |
mov #16, r0 | |
lds r0, macl | |
mov #17, r0 | |
lds r0, mach | |
mov #18, r0 | |
ldc r0, gbr | |
; Also fill the flop registers with known values. | |
lds r1, fpul | |
fsts fpul, fr1 | |
lds r2, fpul | |
fsts fpul, fr2 | |
lds r3, fpul | |
fsts fpul, fr3 | |
lds r4, fpul | |
fsts fpul, fr4 | |
lds r5, fpul | |
fsts fpul, fr5 | |
lds r6, fpul | |
fsts fpul, fr6 | |
lds r7, fpul | |
fsts fpul, fr7 | |
lds r8, fpul | |
fsts fpul, fr8 | |
lds r9, fpul | |
fsts fpul, fr9 | |
lds r10, fpul | |
fsts fpul, fr10 | |
lds r11, fpul | |
fsts fpul, fr11 | |
lds r12, fpul | |
fsts fpul, fr12 | |
lds r13, fpul | |
fsts fpul, fr13 | |
lds r14, fpul | |
fsts fpul, fr14 | |
_vRegTest1Loop: | |
; Reset r1 which was used in the tests. | |
mov #2, r1 | |
; Test that the registers still contain the expected values. If not, jump to | |
; vRegTestError, which will stop this function looping and so cause it to stop | |
; incrementing its loop counter. Both the standard and flop registers are | |
; checked. | |
mov #2, r0 | |
cmp/eq r0, r1 | |
bf _vRegTest1Error | |
flds fr1, fpul | |
sts fpul, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest1Error | |
mov #3, r0 | |
cmp/eq r0, r2 | |
bf _vRegTest1Error | |
flds fr2, fpul | |
sts fpul, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest1Error | |
mov #4, r0 | |
cmp/eq r0, r3 | |
bf _vRegTest1Error | |
flds fr3, fpul | |
sts fpul, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest1Error | |
mov #5, r0 | |
cmp/eq r0, r4 | |
bf _vRegTest1Error | |
flds fr4, fpul | |
sts fpul, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest1Error | |
mov #6, r0 | |
cmp/eq r0, r5 | |
bf _vRegTest1Error | |
flds fr5, fpul | |
sts fpul, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest1Error | |
mov #7, r0 | |
cmp/eq r0, r6 | |
bf _vRegTest1Error | |
flds fr6, fpul | |
sts fpul, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest1Error | |
mov #8, r0 | |
cmp/eq r0, r7 | |
bf _vRegTest1Error | |
flds fr7, fpul | |
sts fpul, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest1Error | |
mov #9, r0 | |
cmp/eq r0, r8 | |
bf _vRegTest1Error | |
flds fr8, fpul | |
sts fpul, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest1Error | |
mov #10, r0 | |
cmp/eq r0, r9 | |
bf _vRegTest1Error | |
flds fr9, fpul | |
sts fpul, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest1Error | |
mov #11, r0 | |
cmp/eq r0, r10 | |
bf _vRegTest1Error | |
flds fr10, fpul | |
sts fpul, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest1Error | |
mov #12, r0 | |
cmp/eq r0, r11 | |
bf _vRegTest1Error | |
flds fr11, fpul | |
sts fpul, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest1Error | |
mov #13, r0 | |
cmp/eq r0, r12 | |
bf _vRegTest1Error | |
flds fr12, fpul | |
sts fpul, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest1Error | |
mov #14, r0 | |
cmp/eq r0, r13 | |
bf _vRegTest1Error | |
flds fr13, fpul | |
sts fpul, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest1Error | |
mov #15, r0 | |
cmp/eq r0, r14 | |
bf _vRegTest1Error | |
flds fr14, fpul | |
sts fpul, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest1Error | |
sts macl, r0 | |
mov #16, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest1Error | |
sts mach, r0 | |
mov #17, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest1Error | |
stc gbr, r0 | |
mov #18, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest1Error | |
; Increment the loop counter to indicate that this task is still running and | |
; still healthy. | |
mov.l #_ulRegTest1CycleCount, r0 | |
mov.l @r0, r1 | |
add #1, r1 | |
mov.l r1, @r0 | |
; Jump back to test all the registers again. | |
bra _vRegTest1Loop | |
nop | |
;----------------------------------------------------------- | |
_vRegTest1Error: | |
bra _vRegTest1Error | |
nop | |
;----------------------------------------------------------- | |
_vRegTest2Task: | |
; Fill the standard registers with known values. | |
mov #12, r1 | |
mov #13, r2 | |
mov #14, r3 | |
mov #15, r4 | |
mov #16, r5 | |
mov #17, r6 | |
mov #18, r7 | |
mov #19, r8 | |
mov #110, r9 | |
mov #111, r10 | |
mov #112, r11 | |
mov #113, r12 | |
mov #114, r13 | |
mov #115, r0 | |
lds r0, macl | |
mov #116, r0 | |
lds r0, mach | |
mov #117, r0 | |
ldc r0, gbr | |
; Also fill the flop registers with known values. | |
lds r1, fpul | |
fsts fpul, fr1 | |
lds r2, fpul | |
fsts fpul, fr2 | |
lds r3, fpul | |
fsts fpul, fr3 | |
lds r4, fpul | |
fsts fpul, fr4 | |
lds r5, fpul | |
fsts fpul, fr5 | |
lds r6, fpul | |
fsts fpul, fr6 | |
lds r7, fpul | |
fsts fpul, fr7 | |
lds r8, fpul | |
fsts fpul, fr8 | |
lds r9, fpul | |
fsts fpul, fr9 | |
lds r10, fpul | |
fsts fpul, fr10 | |
lds r11, fpul | |
fsts fpul, fr11 | |
lds r12, fpul | |
fsts fpul, fr12 | |
lds r13, fpul | |
fsts fpul, fr13 | |
lds r14, fpul | |
fsts fpul, fr14 | |
_vRegTest2Loop: | |
; Reset r1 which was used in the tests. | |
mov #12, r1 | |
; Test that the registers still contain the expected values. If not, jump to | |
; vRegTestError, which will stop this function looping and so cause it to stop | |
; incrementing its loop counter. Both the standard and flop registers are | |
; checked. | |
mov #12, r0 | |
cmp/eq r0, r1 | |
bf _vRegTest2Error | |
flds fr1, fpul | |
sts fpul, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest2Error | |
mov #13, r0 | |
cmp/eq r0, r2 | |
bf _vRegTest2Error | |
flds fr2, fpul | |
sts fpul, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest2Error | |
mov #14, r0 | |
cmp/eq r0, r3 | |
bf _vRegTest2Error | |
flds fr3, fpul | |
sts fpul, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest2Error | |
mov #15, r0 | |
cmp/eq r0, r4 | |
bf _vRegTest2Error | |
flds fr4, fpul | |
sts fpul, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest2Error | |
mov #16, r0 | |
cmp/eq r0, r5 | |
bf _vRegTest2Error | |
flds fr5, fpul | |
sts fpul, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest2Error | |
mov #17, r0 | |
cmp/eq r0, r6 | |
bf _vRegTest2Error | |
flds fr6, fpul | |
sts fpul, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest2Error | |
mov #18, r0 | |
cmp/eq r0, r7 | |
bf _vRegTest2Error | |
flds fr7, fpul | |
sts fpul, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest2Error | |
mov #19, r0 | |
cmp/eq r0, r8 | |
bf _vRegTest2Error | |
flds fr8, fpul | |
sts fpul, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest2Error | |
mov #110, r0 | |
cmp/eq r0, r9 | |
bf _vRegTest2Error | |
flds fr9, fpul | |
sts fpul, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest2Error | |
mov #111, r0 | |
cmp/eq r0, r10 | |
bf _vRegTest2Error | |
flds fr10, fpul | |
sts fpul, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest2Error | |
mov #112, r0 | |
cmp/eq r0, r11 | |
bf _vRegTest2Error | |
flds fr11, fpul | |
sts fpul, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest2Error | |
mov #113, r0 | |
cmp/eq r0, r12 | |
bf _vRegTest2Error | |
flds fr12, fpul | |
sts fpul, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest2Error | |
mov #114, r0 | |
cmp/eq r0, r13 | |
bf _vRegTest2Error | |
flds fr13, fpul | |
sts fpul, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest2Error | |
sts macl, r0 | |
mov #115, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest2Error | |
sts mach, r0 | |
mov #116, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest2Error | |
stc gbr, r0 | |
mov #117, r1 | |
cmp/eq r0, r1 | |
bf _vRegTest2Error | |
; Increment the loop counter to indicate that this task is still running and | |
; still healthy. | |
mov.l #_ulRegTest2CycleCount, r0 | |
mov.l @r0, r1 | |
add #1, r1 | |
mov.l r1, @r0 | |
; Jump back to test all the registers again. | |
bra _vRegTest2Loop | |
nop | |
;----------------------------------------------------------- | |
_vRegTest2Error: | |
bra _vRegTest2Error | |
nop | |
.end | |