]> begriffs open source - cmsis/blob - CMSIS/CoreValidation/Source/CV_CoreAFunc.c
CoreValidation: Added test case for __FPU_Enable.
[cmsis] / CMSIS / CoreValidation / Source / CV_CoreAFunc.c
1 /*-----------------------------------------------------------------------------
2  *      Name:         CV_CoreFunc.c 
3  *      Purpose:      CMSIS CORE validation tests implementation
4  *-----------------------------------------------------------------------------
5  *      Copyright (c) 2017 ARM Limited. All rights reserved.
6  *----------------------------------------------------------------------------*/
7
8 #include "CV_Framework.h"
9 #include "cmsis_cv.h"
10
11 /*-----------------------------------------------------------------------------
12  *      Test implementation
13  *----------------------------------------------------------------------------*/
14
15 /*-----------------------------------------------------------------------------
16  *      Test cases
17  *----------------------------------------------------------------------------*/
18
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();
22   
23   __enable_irq();
24   uint32_t cpsr = __get_CPSR();
25   ASSERT_TRUE((cpsr & CPSR_I_Msk) == 0U);
26   
27   __disable_irq();
28   cpsr = __get_CPSR();
29   ASSERT_TRUE((cpsr & CPSR_I_Msk) == CPSR_I_Msk);
30   
31   __set_CPSR(orig);
32 }
33
34 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
35 void TC_CoreAFunc_FPSCR(void) {
36
37   volatile float f1 = 47.11f;
38   volatile float f2 = 8.15f;
39   volatile float f3 = f1 / f2;
40
41   uint32_t fpscr = __get_FPSCR();
42   __set_FPSCR(fpscr);
43
44   ASSERT_TRUE(fpscr == __get_FPSCR());
45   ASSERT_TRUE((f3 < 5.781f) && (f3 > 5.780f));
46 }
47
48 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
49 #if defined(__CC_ARM)
50 #define __SUBS(Rd, Rm, Rn) __ASM volatile("SUBS " # Rd ", " # Rm ", " # Rn)
51 #define __ADDS(Rd, Rm, Rn) __ASM volatile("ADDS " # Rd ", " # Rm ", " # Rn)
52 #elif defined( __GNUC__ ) && defined(__thumb__)
53 #define __SUBS(Rd, Rm, Rn) __ASM volatile("SUB %0, %1, %2" : "=r"(Rd) : "r"(Rm), "r"(Rn))
54 #define __ADDS(Rd, Rm, Rn) __ASM volatile("ADD %0, %1, %2" : "=r"(Rd) : "r"(Rm), "r"(Rn))
55 #else
56 #define __SUBS(Rd, Rm, Rn) __ASM volatile("SUBS %0, %1, %2" : "=r"(Rd) : "r"(Rm), "r"(Rn))
57 #define __ADDS(Rd, Rm, Rn) __ASM volatile("ADDS %0, %1, %2" : "=r"(Rd) : "r"(Rm), "r"(Rn))
58 #endif
59
60 void TC_CoreAFunc_CPSR(void) {
61   uint32_t result;
62
63   uint32_t cpsr = __get_CPSR();
64   __set_CPSR(cpsr & CPSR_M_Msk);
65
66   // Check negative flag
67   int32_t Rm = 5;
68   int32_t Rn = 7;
69   __SUBS(Rm, Rm, Rn);
70   result  = __get_CPSR();
71   ASSERT_TRUE((result & CPSR_N_Msk) == CPSR_N_Msk);
72
73   // Check zero and compare flag
74   Rm = 5;
75   __SUBS(Rm, Rm, Rm);
76   result  = __get_CPSR();
77   ASSERT_TRUE((result & CPSR_Z_Msk) == CPSR_Z_Msk);
78   ASSERT_TRUE((result & CPSR_C_Msk) == CPSR_C_Msk);
79
80   // Check overflow flag
81   Rm = 5;
82   Rn = INT32_MAX;
83   __ADDS(Rm, Rm, Rn);
84   result  = __get_CPSR();
85   ASSERT_TRUE((result & CPSR_V_Msk) == CPSR_V_Msk);
86 }
87
88 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
89 void TC_CoreAFunc_Mode(void) {
90   uint32_t mode = __get_mode();
91   __set_mode(mode);
92
93   ASSERT_TRUE(mode == __get_mode());
94 }
95
96 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
97 static uint32_t TC_CoreAFunc_SP_orig;
98 static uint32_t TC_CoreAFunc_SP_sp;
99 static uint32_t TC_CoreAFunc_SP_result;
100
101 void TC_CoreAFunc_SP(void) {
102   TC_CoreAFunc_SP_orig = __get_SP();
103
104   TC_CoreAFunc_SP_sp = TC_CoreAFunc_SP_orig + 0x12345678U;
105   __set_SP(TC_CoreAFunc_SP_sp);
106   TC_CoreAFunc_SP_result = __get_SP();
107
108   __set_SP(TC_CoreAFunc_SP_orig);
109
110   ASSERT_TRUE(TC_CoreAFunc_SP_result == TC_CoreAFunc_SP_sp);
111 }
112
113 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
114 static uint32_t TC_CoreAFunc_SP_usr_orig;
115 static uint32_t TC_CoreAFunc_SP_usr_sp;
116 static uint32_t TC_CoreAFunc_SP_usr_result;
117
118 void TC_CoreAFunc_SP_usr(void) {
119   TC_CoreAFunc_SP_usr_orig = __get_SP_usr();
120
121   TC_CoreAFunc_SP_usr_sp = TC_CoreAFunc_SP_usr_orig + 0x12345678U;
122   __set_SP(TC_CoreAFunc_SP_usr_sp);
123   TC_CoreAFunc_SP_usr_result = __get_SP_usr();
124
125   __set_SP(TC_CoreAFunc_SP_usr_orig);
126
127   ASSERT_TRUE(TC_CoreAFunc_SP_usr_result == TC_CoreAFunc_SP_usr_sp);
128 }
129
130 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
131 void TC_CoreAFunc_FPEXC(void) {
132   uint32_t fpexc = __get_FPEXC();
133   __set_FPEXC(fpexc);
134
135   ASSERT_TRUE(fpexc == __get_FPEXC());
136 }
137
138 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
139 void TC_CoreAFunc_ACTLR(void) {
140   uint32_t actlr = __get_ACTLR();
141   __set_ACTLR(actlr);
142
143   ASSERT_TRUE(actlr == __get_ACTLR());
144 }
145
146 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
147 void TC_CoreAFunc_CPACR(void) {
148   uint32_t cpacr = __get_CPACR();
149   __set_CPACR(cpacr);
150
151   ASSERT_TRUE(cpacr == __get_CPACR());
152 }
153
154 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
155 void TC_CoreAFunc_DFSR(void) {
156   uint32_t dfsr = __get_DFSR();
157   __set_DFSR(dfsr);
158
159   ASSERT_TRUE(dfsr == __get_DFSR());
160 }
161
162 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
163 void TC_CoreAFunc_IFSR(void) {
164   uint32_t ifsr = __get_IFSR();
165   __set_IFSR(ifsr);
166
167   ASSERT_TRUE(ifsr == __get_IFSR());
168 }
169
170 /*0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
171 void TC_CoreAFunc_ISR(void) {
172   uint32_t isr = __get_ISR();
173
174   ASSERT_TRUE(isr == __get_ISR());
175 }
176
177 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
178 void TC_CoreAFunc_CBAR(void) {
179   uint32_t cbar = __get_CBAR();
180
181   ASSERT_TRUE(cbar == __get_CBAR());
182 }
183
184 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
185 void TC_CoreAFunc_TTBR0(void) {
186   uint32_t ttbr0 = __get_TTBR0();
187   __set_TTBR0(ttbr0);
188
189   ASSERT_TRUE(ttbr0 == __get_TTBR0());
190 }
191
192 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
193 void TC_CoreAFunc_DACR(void) {
194   uint32_t dacr = __get_DACR();
195   __set_DACR(dacr);
196
197   ASSERT_TRUE(dacr == __get_DACR());
198 }
199
200 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
201 void TC_CoreAFunc_SCTLR(void) {
202   uint32_t sctlr = __get_SCTLR();
203   __set_SCTLR(sctlr);
204
205   ASSERT_TRUE(sctlr == __get_SCTLR());
206 }
207
208 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
209 void TC_CoreAFunc_ACTRL(void) {
210   uint32_t actrl = __get_ACTRL();
211   __set_ACTRL(actrl);
212
213   ASSERT_TRUE(actrl == __get_ACTRL());
214 }
215
216 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
217 void TC_CoreAFunc_MPIDR(void) {
218   uint32_t mpidr = __get_MPIDR();
219
220   ASSERT_TRUE(mpidr == __get_MPIDR());
221 }
222
223 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
224 static uint8_t vectorRAM[32U] __attribute__((aligned(32U)));
225
226 void TC_CoreAFunc_VBAR(void) {
227   uint32_t vbar = __get_VBAR();
228   
229   memcpy(vectorRAM, (void*)vbar, sizeof(vectorRAM));
230   
231   __set_VBAR((uint32_t)vectorRAM);
232   ASSERT_TRUE(((uint32_t)vectorRAM) == __get_VBAR());
233   
234   __set_VBAR(vbar);
235 }
236
237 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
238 void TC_CoreAFunc_MVBAR(void) {
239   uint32_t mvbar = __get_MVBAR();
240   
241   memcpy(vectorRAM, (void*)mvbar, sizeof(vectorRAM));
242   
243   __set_MVBAR((uint32_t)vectorRAM);
244   ASSERT_TRUE(((uint32_t)vectorRAM) == __get_MVBAR());
245   
246   __set_MVBAR(mvbar);
247 }
248
249 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
250
251 void TC_CoreAFunc_FPU_Enable(void) {
252   uint32_t fpexc = __get_FPEXC();
253   __set_FPEXC(fpexc & ~0x40000000u); // disable FPU
254   
255   uint32_t cp15;
256   __get_CP(15, 0, cp15, 1, 0, 2);
257   
258   cp15 &= ~0x00F00000u;
259   __set_CP(15, 0, cp15, 1, 0, 2); // disable FPU access
260   
261   __FPU_Enable();
262     
263   __get_CP(15, 0, cp15, 1, 0, 2);
264   ASSERT_TRUE((cp15 & 0x00F00000u) == 0x00F00000u);
265
266   fpexc = __get_FPEXC();  
267   ASSERT_TRUE((fpexc & 0x40000000u) == 0x40000000u);
268 }
269