1 /*-----------------------------------------------------------------------------
3 * Purpose: CMSIS CORE validation tests implementation
4 *-----------------------------------------------------------------------------
5 * Copyright (c) 2017 ARM Limited. All rights reserved.
6 *----------------------------------------------------------------------------*/
8 #include "CV_Framework.h"
11 /*-----------------------------------------------------------------------------
13 *----------------------------------------------------------------------------*/
15 /*-----------------------------------------------------------------------------
17 *----------------------------------------------------------------------------*/
19 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
20 void TC_CoreAFunc_IRQ(void) {
21 uint32_t orig = __get_CPSR();
24 uint32_t cpsr = __get_CPSR();
25 ASSERT_TRUE((cpsr & CPSR_I_Msk) == 0U);
29 ASSERT_TRUE((cpsr & CPSR_I_Msk) == CPSR_I_Msk);
34 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
35 void TC_CoreAFunc_FaultIRQ(void) {
36 uint32_t orig = __get_CPSR();
39 uint32_t cpsr = __get_CPSR();
40 ASSERT_TRUE((cpsr & CPSR_F_Msk) == 0U);
42 __disable_fault_irq();
44 ASSERT_TRUE((cpsr & CPSR_F_Msk) == CPSR_F_Msk);
49 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
50 void TC_CoreAFunc_FPSCR(void) {
52 volatile float f1 = 47.11f;
53 volatile float f2 = 8.15f;
54 volatile float f3 = f1 / f2;
56 uint32_t fpscr = __get_FPSCR();
59 ASSERT_TRUE(fpscr == __get_FPSCR());
60 ASSERT_TRUE((f3 < 5.781f) && (f3 > 5.780f));
63 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
65 #define __SUBS(Rd, Rm, Rn) __ASM volatile("SUBS " # Rd ", " # Rm ", " # Rn)
66 #define __ADDS(Rd, Rm, Rn) __ASM volatile("ADDS " # Rd ", " # Rm ", " # Rn)
67 #elif defined( __GNUC__ ) && defined(__thumb__)
68 #define __SUBS(Rd, Rm, Rn) __ASM volatile("SUB %0, %1, %2" : "=r"(Rd) : "r"(Rm), "r"(Rn))
69 #define __ADDS(Rd, Rm, Rn) __ASM volatile("ADD %0, %1, %2" : "=r"(Rd) : "r"(Rm), "r"(Rn))
71 #define __SUBS(Rd, Rm, Rn) __ASM volatile("SUBS %0, %1, %2" : "=r"(Rd) : "r"(Rm), "r"(Rn))
72 #define __ADDS(Rd, Rm, Rn) __ASM volatile("ADDS %0, %1, %2" : "=r"(Rd) : "r"(Rm), "r"(Rn))
75 void TC_CoreAFunc_CPSR(void) {
78 uint32_t cpsr = __get_CPSR();
79 __set_CPSR(cpsr & CPSR_M_Msk);
81 // Check negative flag
85 result = __get_CPSR();
86 ASSERT_TRUE((result & CPSR_N_Msk) == CPSR_N_Msk);
88 // Check zero and compare flag
91 result = __get_CPSR();
92 ASSERT_TRUE((result & CPSR_Z_Msk) == CPSR_Z_Msk);
93 ASSERT_TRUE((result & CPSR_C_Msk) == CPSR_C_Msk);
95 // Check overflow flag
99 result = __get_CPSR();
100 ASSERT_TRUE((result & CPSR_V_Msk) == CPSR_V_Msk);
103 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
104 void TC_CoreAFunc_Mode(void) {
105 uint32_t mode = __get_mode();
108 ASSERT_TRUE(mode == __get_mode());
111 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
112 void TC_CoreAFunc_FPEXC(void) {
113 uint32_t fpexc = __get_FPEXC();
116 ASSERT_TRUE(fpexc == __get_FPEXC());
119 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
120 void TC_CoreAFunc_ACTLR(void) {
121 uint32_t actlr = __get_ACTLR();
124 ASSERT_TRUE(actlr == __get_ACTLR());
127 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
128 void TC_CoreAFunc_CPACR(void) {
129 uint32_t cpacr = __get_CPACR();
132 ASSERT_TRUE(cpacr == __get_CPACR());
135 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
136 void TC_CoreAFunc_DFSR(void) {
137 uint32_t dfsr = __get_DFSR();
140 ASSERT_TRUE(dfsr == __get_DFSR());
143 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
144 void TC_CoreAFunc_IFSR(void) {
145 uint32_t ifsr = __get_IFSR();
148 ASSERT_TRUE(ifsr == __get_IFSR());
151 /*0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
152 void TC_CoreAFunc_ISR(void) {
153 uint32_t isr = __get_ISR();
155 ASSERT_TRUE(isr == __get_ISR());
158 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
159 void TC_CoreAFunc_CBAR(void) {
160 uint32_t cbar = __get_CBAR();
162 ASSERT_TRUE(cbar == __get_CBAR());
165 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
166 void TC_CoreAFunc_TTBR0(void) {
167 uint32_t ttbr0 = __get_TTBR0();
170 ASSERT_TRUE(ttbr0 == __get_TTBR0());
173 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
174 void TC_CoreAFunc_DACR(void) {
175 uint32_t dacr = __get_DACR();
178 ASSERT_TRUE(dacr == __get_DACR());
181 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
182 void TC_CoreAFunc_SCTLR(void) {
183 uint32_t sctlr = __get_SCTLR();
186 ASSERT_TRUE(sctlr == __get_SCTLR());
189 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
190 void TC_CoreAFunc_MPIDR(void) {
191 uint32_t mpidr = __get_MPIDR();
193 ASSERT_TRUE(mpidr == __get_MPIDR());
196 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
197 static uint8_t vectorRAM[32U] __attribute__((aligned(32U)));
199 void TC_CoreAFunc_VBAR(void) {
200 uint32_t vbar = __get_VBAR();
202 memcpy(vectorRAM, (void*)vbar, sizeof(vectorRAM));
204 __set_VBAR((uint32_t)vectorRAM);
205 ASSERT_TRUE(((uint32_t)vectorRAM) == __get_VBAR());
210 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
211 void TC_CoreAFunc_MVBAR(void) {
212 uint32_t mvbar = __get_MVBAR();
214 memcpy(vectorRAM, (void*)mvbar, sizeof(vectorRAM));
216 __set_MVBAR((uint32_t)vectorRAM);
217 ASSERT_TRUE(((uint32_t)vectorRAM) == __get_MVBAR());
222 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
224 #define STRINGIFYx(x) #x
225 #define STRINGIFY(x) STRINGIFYx(x)
227 void TC_CoreAFunc_FPU_Enable(void) {
228 uint32_t fpexc = __get_FPEXC();
229 __set_FPEXC(fpexc & ~0x40000000ul); // disable FPU
231 fpexc = __get_FPEXC();
232 ASSERT_TRUE((fpexc & 0x40000000ul) == 0x00000000ul);
235 __get_CP(15, 0, cparc, 1, 0, 2);
237 cparc &= ~0x00F00000ul;
238 __set_CP(15, 0, cparc, 1, 0, 2); // disable FPU access
240 __get_CP(15, 0, cparc, 1, 0, 2);
241 ASSERT_TRUE((cparc & 0x00F00000ul) == 0x00000000ul);
245 __get_CP(15, 0, cparc, 1, 0, 2);
246 ASSERT_TRUE((cparc & 0x00F00000ul) == 0x00F00000ul);
248 fpexc = __get_FPEXC();
249 ASSERT_TRUE((fpexc & 0x40000000ul) == 0x40000000ul);