/* | |
* 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! | |
*/ | |
.file "RegTest.S" | |
#include "FreeRTOSConfig.h" | |
#include "ISR_Support.h" | |
.extern ulRegTest1Counter | |
.extern ulRegTest2Counter | |
.extern dRegTest1_st7 | |
.extern dRegTest1_st6 | |
.extern dRegTest1_st5 | |
.extern dRegTest1_st4 | |
.extern dRegTest1_st3 | |
.extern dRegTest1_st2 | |
.extern dRegTest1_st1 | |
.extern dRegTest2_st7 | |
.extern dRegTest2_st6 | |
.extern dRegTest2_st5 | |
.extern dRegTest2_st4 | |
.extern dRegTest2_st3 | |
.extern dRegTest2_st2 | |
.extern dRegTest2_st1 | |
.extern vGenerateYieldInterrupt | |
.extern vHPETIRQHandler1 | |
.global vRegTest1 | |
.global vRegTest2 | |
.global vApplicationHPETTimer1Wrapper | |
.section .text.last /* Push up the memory to check executing from higher memory addresses. */ | |
.align 4 | |
.func vRegTest1 | |
vRegTest1: | |
/* Set initial values into the general purpose registers. */ | |
movl $0x11111111, %eax | |
movl $0x22222222, %ebx | |
movl $0x33333333, %ecx | |
movl $0x44444444, %edx | |
movl $0x55555555, %esi | |
movl $0x66666666, %edi | |
/* Set initial values into the floating point registers. */ | |
.if configSUPPORT_FPU == 1 | |
fldl dRegTest1_st7 | |
fldl dRegTest1_st6 | |
fldl dRegTest1_st5 | |
fldl dRegTest1_st4 | |
fldl dRegTest1_st3 | |
fldl dRegTest1_st2 | |
fldl dRegTest1_st1 | |
.endif /* configSUPPORT_FPU */ | |
_RegTest1Loop: | |
/* Loop checking the values originally loaded into the general purpose | |
registers remain through the life of the task. */ | |
cmp $0x11111111, %eax | |
jne _RegTest1Error | |
cmp $0x22222222, %ebx | |
jne _RegTest1Error | |
cmp $0x33333333, %ecx | |
jne _RegTest1Error | |
cmp $0x44444444, %edx | |
jne _RegTest1Error | |
cmp $0x55555555, %esi | |
jne _RegTest1Error | |
cmp $0x66666666, %edi | |
jne _RegTest1Error | |
.if configSUPPORT_FPU == 1 | |
/* Loop checking the values originally loaded into the floating point | |
registers remain through the life of the task. */ | |
push %eax /* push clobbered register. */ | |
fldl dRegTest1_st7 /* st( 0 ) set to st( 7 ) value. */ | |
fucomp %st( 7 ) /* Compare st( 0 ) with st( 7 ) and pop. */ | |
fnstsw %ax /* Copy status word to ax. */ | |
and $0x45, %ah /* Mask bits. */ | |
xor $0x40, %ah /* test bits. */ | |
jne _RegTest1Error | |
fldl dRegTest1_st6 | |
fucomp %st( 6 ) | |
fnstsw %ax | |
and $0x45, %ah | |
xor $0x40, %ah | |
jne _RegTest1Error | |
fldl dRegTest1_st5 | |
fucomp %st( 5 ) | |
fnstsw %ax | |
and $0x45, %ah | |
xor $0x40, %ah | |
jne _RegTest1Error | |
fldl dRegTest1_st4 | |
fucomp %st( 4 ) | |
fnstsw %ax | |
and $0x45, %ah | |
xor $0x40, %ah | |
jne _RegTest1Error | |
fldl dRegTest1_st3 | |
fucomp %st( 3 ) | |
fnstsw %ax | |
and $0x45, %ah | |
xor $0x40, %ah | |
jne _RegTest1Error | |
fldl dRegTest1_st2 | |
fucomp %st( 2 ) | |
fnstsw %ax | |
and $0x45, %ah | |
xor $0x40, %ah | |
jne _RegTest1Error | |
fldl dRegTest1_st1 | |
fucomp %st( 1 ) | |
fnstsw %ax | |
and $0x45, %ah | |
xor $0x40, %ah | |
jne _RegTest1Error | |
/* Restore clobbered register. */ | |
pop %eax | |
.endif /* configSUPPORT_FPU */ | |
/* Incrememnt the loop counter to prove this task has not gone into the | |
error null loop. */ | |
add $1, ulRegTest1Counter | |
/* Loop again. */ | |
jmp _RegTest1Loop | |
_RegTest1Error: | |
jmp . | |
.endfunc | |
/*-----------------------------------------------------------*/ | |
.func vRegTest2 | |
vRegTest2: | |
/* Set initial values into the general purpose registers. */ | |
movl $0x10101010, %eax | |
movl $0x20202020, %ebx | |
movl $0x30303030, %ecx | |
movl $0x40404040, %edx | |
movl $0x50505050, %esi | |
movl $0x60606060, %edi | |
/* Set initial values into the floating point registers. */ | |
.if configSUPPORT_FPU == 1 | |
fldl dRegTest2_st7 | |
fldl dRegTest2_st6 | |
fldl dRegTest2_st5 | |
fldl dRegTest2_st4 | |
fldl dRegTest2_st3 | |
fldl dRegTest2_st2 | |
fldl dRegTest2_st1 | |
.endif | |
_RegTest2Loop: | |
/* Loop checking the values originally loaded into the general purpose | |
registers remain through the life of the task. */ | |
cmp $0x10101010, %eax | |
jne _RegTest2Error | |
cmp $0x20202020, %ebx | |
jne _RegTest2Error | |
cmp $0x30303030, %ecx | |
jne _RegTest2Error | |
cmp $0x40404040, %edx | |
jne _RegTest2Error | |
cmp $0x50505050, %esi | |
jne _RegTest2Error | |
cmp $0x60606060, %edi | |
jne _RegTest1Error | |
.if configSUPPORT_FPU == 1 | |
/* Loop checking the values originally loaded into the floating point | |
registers remain through the life of the task. */ | |
/* Loop checking the values originally loaded into the floating point | |
registers remain through the life of the task. */ | |
push %eax /* push clobbered register. */ | |
fldl dRegTest2_st7 /* st( 0 ) set to st( 7 ) value. */ | |
fucomp %st( 7 ) /* Compare st( 0 ) with st( 7 ) and pop. */ | |
fnstsw %ax /* Copy status word to ax. */ | |
and $0x45, %ah /* Mask bits. */ | |
xor $0x40, %ah /* test bits. */ | |
jne _RegTest1Error | |
fldl dRegTest2_st6 | |
fucomp %st( 6 ) | |
fnstsw %ax | |
and $0x45, %ah | |
xor $0x40, %ah | |
jne _RegTest1Error | |
fldl dRegTest2_st5 | |
fucomp %st( 5 ) | |
fnstsw %ax | |
and $0x45, %ah | |
xor $0x40, %ah | |
jne _RegTest1Error | |
fldl dRegTest2_st4 | |
fucomp %st( 4 ) | |
fnstsw %ax | |
and $0x45, %ah | |
xor $0x40, %ah | |
jne _RegTest1Error | |
fldl dRegTest2_st3 | |
fucomp %st( 3 ) | |
fnstsw %ax | |
and $0x45, %ah | |
xor $0x40, %ah | |
jne _RegTest1Error | |
fldl dRegTest2_st2 | |
fucomp %st( 2 ) | |
fnstsw %ax | |
and $0x45, %ah | |
xor $0x40, %ah | |
jne _RegTest1Error | |
fldl dRegTest2_st1 | |
fucomp %st( 1 ) | |
fnstsw %ax | |
and $0x45, %ah | |
xor $0x40, %ah | |
jne _RegTest1Error | |
/* Restore clobbered register. */ | |
pop %eax | |
.endif /* configSUPPORT_FPU */ | |
/* Force a yield from one of the reg test tasks to increase coverage. */ | |
call vGenerateYieldInterrupt | |
/* Increment the loop counter to prove this task has not entered the error | |
null loop. */ | |
add $1, ulRegTest2Counter | |
jmp _RegTest2Loop | |
_RegTest2Error: | |
jmp . | |
.endfunc | |
/*-----------------------------------------------------------*/ | |
/* Purely for demonstration purposes, two of the HPET timers used by the | |
IntQueue test use the central interrupt handler, and timer 1 uses its own | |
assembly wrapper - which is defined below. See | |
http://www.freertos.org/RTOS_Intel_Quark_Galileo_GCC.html#interrupts for more | |
information. */ | |
.func vApplicationHPETTimer1Wrapper | |
vApplicationHPETTimer1Wrapper: | |
portFREERTOS_INTERRUPT_ENTRY | |
call vHPETIRQHandler1 | |
portFREERTOS_INTERRUPT_EXIT | |
.endfunc | |
.end |