]> begriffs open source - cmsis/blob - CMSIS/CoreValidation/Source/CV_CoreAFunc.c
Add LLVM LIT/FileCheck tests for Core files
[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 "cmsis_compiler.h"
9
10 #include "CV_Framework.h"
11 #include "cmsis_cv.h"
12
13 /*-----------------------------------------------------------------------------
14  *      Test implementation
15  *----------------------------------------------------------------------------*/
16
17 /*-----------------------------------------------------------------------------
18  *      Test cases
19  *----------------------------------------------------------------------------*/
20
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();
24
25   __enable_irq();
26   uint32_t cpsr = __get_CPSR();
27   ASSERT_TRUE((cpsr & CPSR_I_Msk) == 0U);
28
29   __disable_irq();
30   cpsr = __get_CPSR();
31   ASSERT_TRUE((cpsr & CPSR_I_Msk) == CPSR_I_Msk);
32
33   __set_CPSR(orig);
34 }
35
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();
39
40   __enable_fault_irq();
41   uint32_t cpsr = __get_CPSR();
42   ASSERT_TRUE((cpsr & CPSR_F_Msk) == 0U);
43
44   __disable_fault_irq();
45   cpsr = __get_CPSR();
46   ASSERT_TRUE((cpsr & CPSR_F_Msk) == CPSR_F_Msk);
47
48   __set_CPSR(orig);
49 }
50
51 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
52 void TC_CoreAFunc_FPSCR(void) {
53
54   volatile float f1 = 47.11f;
55   volatile float f2 = 8.15f;
56   volatile float f3 = f1 / f2;
57
58   uint32_t fpscr = __get_FPSCR();
59   __set_FPSCR(fpscr);
60
61   ASSERT_TRUE(fpscr == __get_FPSCR());
62   ASSERT_TRUE((f3 < 5.781f) && (f3 > 5.780f));
63 }
64
65 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
66 #if defined(__CC_ARM)
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))
72 #else
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))
75 #endif
76
77 void TC_CoreAFunc_CPSR(void) {
78   uint32_t result;
79
80   uint32_t cpsr = __get_CPSR();
81   __set_CPSR(cpsr & CPSR_M_Msk);
82
83   // Check negative flag
84   int32_t Rm = 5;
85   int32_t Rn = 7;
86   __SUBS(Rm, Rm, Rn);
87   result  = __get_CPSR();
88   ASSERT_TRUE((result & CPSR_N_Msk) == CPSR_N_Msk);
89
90   // Check zero and compare flag
91   Rm = 5;
92   __SUBS(Rm, Rm, Rm);
93   result  = __get_CPSR();
94   ASSERT_TRUE((result & CPSR_Z_Msk) == CPSR_Z_Msk);
95   ASSERT_TRUE((result & CPSR_C_Msk) == CPSR_C_Msk);
96
97   // Check overflow flag
98   Rm = 5;
99   Rn = INT32_MAX;
100   __ADDS(Rm, Rm, Rn);
101   result  = __get_CPSR();
102   ASSERT_TRUE((result & CPSR_V_Msk) == CPSR_V_Msk);
103 }
104
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();
108   __set_mode(mode);
109
110   ASSERT_TRUE(mode == __get_mode());
111 }
112
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;
117
118 void TC_CoreAFunc_SP(void) {
119   TC_CoreAFunc_SP_orig = __get_SP();
120
121   TC_CoreAFunc_SP_sp = TC_CoreAFunc_SP_orig + 0x12345678U;
122   __set_SP(TC_CoreAFunc_SP_sp);
123   TC_CoreAFunc_SP_result = __get_SP();
124
125   __set_SP(TC_CoreAFunc_SP_orig);
126
127   ASSERT_TRUE(TC_CoreAFunc_SP_result == TC_CoreAFunc_SP_sp);
128 }
129
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;
134
135 void TC_CoreAFunc_SP_usr(void) {
136   TC_CoreAFunc_SP_usr_orig = __get_SP_usr();
137
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();
141
142   __set_SP(TC_CoreAFunc_SP_usr_orig);
143
144   ASSERT_TRUE(TC_CoreAFunc_SP_usr_result == TC_CoreAFunc_SP_usr_sp);
145 }
146
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();
150   __set_FPEXC(fpexc);
151
152   ASSERT_TRUE(fpexc == __get_FPEXC());
153 }
154
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();
158   __set_ACTLR(actlr);
159
160   ASSERT_TRUE(actlr == __get_ACTLR());
161 }
162
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();
166   __set_CPACR(cpacr);
167
168   ASSERT_TRUE(cpacr == __get_CPACR());
169 }
170
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();
174   __set_DFSR(dfsr);
175
176   ASSERT_TRUE(dfsr == __get_DFSR());
177 }
178
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();
182   __set_IFSR(ifsr);
183
184   ASSERT_TRUE(ifsr == __get_IFSR());
185 }
186
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();
190
191   ASSERT_TRUE(isr == __get_ISR());
192 }
193
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();
197
198   ASSERT_TRUE(cbar == __get_CBAR());
199 }
200
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();
204   __set_TTBR0(ttbr0);
205
206   ASSERT_TRUE(ttbr0 == __get_TTBR0());
207 }
208
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();
212   __set_DACR(dacr);
213
214   ASSERT_TRUE(dacr == __get_DACR());
215 }
216
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();
220   __set_SCTLR(sctlr);
221
222   ASSERT_TRUE(sctlr == __get_SCTLR());
223 }
224
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();
228   __set_ACTRL(actrl);
229
230   ASSERT_TRUE(actrl == __get_ACTRL());
231 }
232
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();
236
237   ASSERT_TRUE(mpidr == __get_MPIDR());
238 }
239
240 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
241 static uint8_t vectorRAM[32U] __attribute__((aligned(32U)));
242
243 void TC_CoreAFunc_VBAR(void) {
244   uint32_t vbar = __get_VBAR();
245
246   memcpy(vectorRAM, (void*)vbar, sizeof(vectorRAM));
247
248   __set_VBAR((uint32_t)vectorRAM);
249   ASSERT_TRUE(((uint32_t)vectorRAM) == __get_VBAR());
250
251   __set_VBAR(vbar);
252 }
253
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();
257
258   memcpy(vectorRAM, (void*)mvbar, sizeof(vectorRAM));
259
260   __set_MVBAR((uint32_t)vectorRAM);
261   ASSERT_TRUE(((uint32_t)vectorRAM) == __get_MVBAR());
262
263   __set_MVBAR(mvbar);
264 }
265
266 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
267
268 void TC_CoreAFunc_FPU_Enable(void) {
269   uint32_t fpexc = __get_FPEXC();
270   __set_FPEXC(fpexc & ~0x40000000u); // disable FPU
271
272   uint32_t cp15;
273   __get_CP(15, 0, cp15, 1, 0, 2);
274
275   cp15 &= ~0x00F00000u;
276   __set_CP(15, 0, cp15, 1, 0, 2); // disable FPU access
277
278   __FPU_Enable();
279
280   __get_CP(15, 0, cp15, 1, 0, 2);
281   ASSERT_TRUE((cp15 & 0x00F00000u) == 0x00F00000u);
282
283   fpexc = __get_FPEXC();
284   ASSERT_TRUE((fpexc & 0x40000000u) == 0x40000000u);
285 }
286