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