1 /*-----------------------------------------------------------------------------
3 * Purpose: CMSIS CORE validation tests implementation
4 *-----------------------------------------------------------------------------
5 * Copyright (c) 2017 ARM Limited. All rights reserved.
6 *----------------------------------------------------------------------------*/
8 #include "cmsis_compiler.h"
10 #include "CV_Framework.h"
13 /*-----------------------------------------------------------------------------
15 *----------------------------------------------------------------------------*/
17 /*-----------------------------------------------------------------------------
19 *----------------------------------------------------------------------------*/
21 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
22 void TC_CoreAFunc_IRQ(void) {
23 uint32_t orig = __get_CPSR();
26 uint32_t cpsr = __get_CPSR();
27 ASSERT_TRUE((cpsr & CPSR_I_Msk) == 0U);
31 ASSERT_TRUE((cpsr & CPSR_I_Msk) == CPSR_I_Msk);
36 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
37 void TC_CoreAFunc_FaultIRQ(void) {
38 uint32_t orig = __get_CPSR();
41 uint32_t cpsr = __get_CPSR();
42 ASSERT_TRUE((cpsr & CPSR_F_Msk) == 0U);
44 __disable_fault_irq();
46 ASSERT_TRUE((cpsr & CPSR_F_Msk) == CPSR_F_Msk);
51 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
52 void TC_CoreAFunc_FPSCR(void) {
54 volatile float f1 = 47.11f;
55 volatile float f2 = 8.15f;
56 volatile float f3 = f1 / f2;
58 uint32_t fpscr = __get_FPSCR();
61 ASSERT_TRUE(fpscr == __get_FPSCR());
62 ASSERT_TRUE((f3 < 5.781f) && (f3 > 5.780f));
65 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
67 #define __SUBS(Rd, Rm, Rn) __ASM volatile("SUBS " # Rd ", " # Rm ", " # Rn)
68 #define __ADDS(Rd, Rm, Rn) __ASM volatile("ADDS " # Rd ", " # Rm ", " # Rn)
69 #elif defined( __GNUC__ ) && defined(__thumb__)
70 #define __SUBS(Rd, Rm, Rn) __ASM volatile("SUB %0, %1, %2" : "=r"(Rd) : "r"(Rm), "r"(Rn))
71 #define __ADDS(Rd, Rm, Rn) __ASM volatile("ADD %0, %1, %2" : "=r"(Rd) : "r"(Rm), "r"(Rn))
73 #define __SUBS(Rd, Rm, Rn) __ASM volatile("SUBS %0, %1, %2" : "=r"(Rd) : "r"(Rm), "r"(Rn))
74 #define __ADDS(Rd, Rm, Rn) __ASM volatile("ADDS %0, %1, %2" : "=r"(Rd) : "r"(Rm), "r"(Rn))
77 void TC_CoreAFunc_CPSR(void) {
80 uint32_t cpsr = __get_CPSR();
81 __set_CPSR(cpsr & CPSR_M_Msk);
83 // Check negative flag
87 result = __get_CPSR();
88 ASSERT_TRUE((result & CPSR_N_Msk) == CPSR_N_Msk);
90 // Check zero and compare flag
93 result = __get_CPSR();
94 ASSERT_TRUE((result & CPSR_Z_Msk) == CPSR_Z_Msk);
95 ASSERT_TRUE((result & CPSR_C_Msk) == CPSR_C_Msk);
97 // Check overflow flag
101 result = __get_CPSR();
102 ASSERT_TRUE((result & CPSR_V_Msk) == CPSR_V_Msk);
105 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
106 void TC_CoreAFunc_Mode(void) {
107 uint32_t mode = __get_mode();
110 ASSERT_TRUE(mode == __get_mode());
113 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
114 static uint32_t TC_CoreAFunc_SP_orig;
115 static uint32_t TC_CoreAFunc_SP_sp;
116 static uint32_t TC_CoreAFunc_SP_result;
118 void TC_CoreAFunc_SP(void) {
119 TC_CoreAFunc_SP_orig = __get_SP();
121 TC_CoreAFunc_SP_sp = TC_CoreAFunc_SP_orig + 0x12345678U;
122 __set_SP(TC_CoreAFunc_SP_sp);
123 TC_CoreAFunc_SP_result = __get_SP();
125 __set_SP(TC_CoreAFunc_SP_orig);
127 ASSERT_TRUE(TC_CoreAFunc_SP_result == TC_CoreAFunc_SP_sp);
130 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
131 static uint32_t TC_CoreAFunc_SP_usr_orig;
132 static uint32_t TC_CoreAFunc_SP_usr_sp;
133 static uint32_t TC_CoreAFunc_SP_usr_result;
135 void TC_CoreAFunc_SP_usr(void) {
136 TC_CoreAFunc_SP_usr_orig = __get_SP_usr();
138 TC_CoreAFunc_SP_usr_sp = TC_CoreAFunc_SP_usr_orig + 0x12345678U;
139 __set_SP(TC_CoreAFunc_SP_usr_sp);
140 TC_CoreAFunc_SP_usr_result = __get_SP_usr();
142 __set_SP(TC_CoreAFunc_SP_usr_orig);
144 ASSERT_TRUE(TC_CoreAFunc_SP_usr_result == TC_CoreAFunc_SP_usr_sp);
147 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
148 void TC_CoreAFunc_FPEXC(void) {
149 uint32_t fpexc = __get_FPEXC();
152 ASSERT_TRUE(fpexc == __get_FPEXC());
155 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
156 void TC_CoreAFunc_ACTLR(void) {
157 uint32_t actlr = __get_ACTLR();
160 ASSERT_TRUE(actlr == __get_ACTLR());
163 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
164 void TC_CoreAFunc_CPACR(void) {
165 uint32_t cpacr = __get_CPACR();
168 ASSERT_TRUE(cpacr == __get_CPACR());
171 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
172 void TC_CoreAFunc_DFSR(void) {
173 uint32_t dfsr = __get_DFSR();
176 ASSERT_TRUE(dfsr == __get_DFSR());
179 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
180 void TC_CoreAFunc_IFSR(void) {
181 uint32_t ifsr = __get_IFSR();
184 ASSERT_TRUE(ifsr == __get_IFSR());
187 /*0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
188 void TC_CoreAFunc_ISR(void) {
189 uint32_t isr = __get_ISR();
191 ASSERT_TRUE(isr == __get_ISR());
194 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
195 void TC_CoreAFunc_CBAR(void) {
196 uint32_t cbar = __get_CBAR();
198 ASSERT_TRUE(cbar == __get_CBAR());
201 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
202 void TC_CoreAFunc_TTBR0(void) {
203 uint32_t ttbr0 = __get_TTBR0();
206 ASSERT_TRUE(ttbr0 == __get_TTBR0());
209 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
210 void TC_CoreAFunc_DACR(void) {
211 uint32_t dacr = __get_DACR();
214 ASSERT_TRUE(dacr == __get_DACR());
217 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
218 void TC_CoreAFunc_SCTLR(void) {
219 uint32_t sctlr = __get_SCTLR();
222 ASSERT_TRUE(sctlr == __get_SCTLR());
225 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
226 void TC_CoreAFunc_ACTRL(void) {
227 uint32_t actrl = __get_ACTRL();
230 ASSERT_TRUE(actrl == __get_ACTRL());
233 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
234 void TC_CoreAFunc_MPIDR(void) {
235 uint32_t mpidr = __get_MPIDR();
237 ASSERT_TRUE(mpidr == __get_MPIDR());
240 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
241 static uint8_t vectorRAM[32U] __attribute__((aligned(32U)));
243 void TC_CoreAFunc_VBAR(void) {
244 uint32_t vbar = __get_VBAR();
246 memcpy(vectorRAM, (void*)vbar, sizeof(vectorRAM));
248 __set_VBAR((uint32_t)vectorRAM);
249 ASSERT_TRUE(((uint32_t)vectorRAM) == __get_VBAR());
254 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
255 void TC_CoreAFunc_MVBAR(void) {
256 uint32_t mvbar = __get_MVBAR();
258 memcpy(vectorRAM, (void*)mvbar, sizeof(vectorRAM));
260 __set_MVBAR((uint32_t)vectorRAM);
261 ASSERT_TRUE(((uint32_t)vectorRAM) == __get_MVBAR());
266 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
268 void TC_CoreAFunc_FPU_Enable(void) {
269 uint32_t fpexc = __get_FPEXC();
270 __set_FPEXC(fpexc & ~0x40000000u); // disable FPU
273 __get_CP(15, 0, cp15, 1, 0, 2);
275 cp15 &= ~0x00F00000u;
276 __set_CP(15, 0, cp15, 1, 0, 2); // disable FPU access
280 __get_CP(15, 0, cp15, 1, 0, 2);
281 ASSERT_TRUE((cp15 & 0x00F00000u) == 0x00F00000u);
283 fpexc = __get_FPEXC();
284 ASSERT_TRUE((fpexc & 0x40000000u) == 0x40000000u);