]> begriffs open source - cmsis/blob - CMSIS/CoreValidation/Source/CV_CoreAFunc.c
CoreValidation: Added test functions for MSPLIM and PSPLIM.
[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   __enable_irq();
22   __disable_irq();
23 }
24
25 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
26 void TC_CoreAFunc_FPSCR(void) {
27
28   volatile float f1 = 47.11f;
29   volatile float f2 = 8.15f;
30   volatile float f3 = f1 / f2;
31
32   uint32_t fpscr = __get_FPSCR();
33   __set_FPSCR(fpscr);
34
35   ASSERT_TRUE(fpscr == __get_FPSCR());
36   ASSERT_TRUE((f3 < 5.781f) && (f3 > 5.780f));
37 }
38
39 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
40 #if defined(__CC_ARM)
41 #define __SUBS(Rd, Rm, Rn) __ASM("SUBS " # Rd ", " # Rm ", " # Rn)
42 #define __ADDS(Rd, Rm, Rn) __ASM("ADDS " # Rd ", " # Rm ", " # Rn)
43 #elif defined( __GNUC__ ) && defined(__thumb__)
44 #define __SUBS(Rd, Rm, Rn) __ASM("SUB %0, %1, %2" : "=r"(Rd) : "r"(Rm), "r"(Rn))
45 #define __ADDS(Rd, Rm, Rn) __ASM("ADD %0, %1, %2" : "=r"(Rd) : "r"(Rm), "r"(Rn))
46 #else
47 #define __SUBS(Rd, Rm, Rn) __ASM("SUBS %0, %1, %2" : "=r"(Rd) : "r"(Rm), "r"(Rn))
48 #define __ADDS(Rd, Rm, Rn) __ASM("ADDS %0, %1, %2" : "=r"(Rd) : "r"(Rm), "r"(Rn))
49 #endif
50
51 void TC_CoreAFunc_CPSR(void) {
52   uint32_t result;
53
54   uint32_t cpsr = __get_CPSR();
55   __set_CPSR(cpsr & CPSR_M_Msk);
56
57   // Check negative flag
58   int32_t Rm = 5;
59   int32_t Rn = 7;
60   __SUBS(Rm, Rm, Rn);
61   result  = __get_CPSR();
62   ASSERT_TRUE((result & CPSR_N_Msk) == CPSR_N_Msk);
63
64   // Check zero and compare flag
65   Rm = 5;
66   __SUBS(Rm, Rm, Rm);
67   result  = __get_CPSR();
68   ASSERT_TRUE((result & CPSR_Z_Msk) == CPSR_Z_Msk);
69   ASSERT_TRUE((result & CPSR_C_Msk) == CPSR_C_Msk);
70
71   // Check overflow flag
72   Rm = 5;
73   Rn = INT32_MAX;
74   __ADDS(Rm, Rm, Rn);
75   result  = __get_CPSR();
76   ASSERT_TRUE((result & CPSR_V_Msk) == CPSR_V_Msk);
77 }
78
79 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
80 void TC_CoreAFunc_Mode(void) {
81   uint32_t mode = __get_mode();
82   __set_mode(mode);
83
84   ASSERT_TRUE(mode == __get_mode());
85 }
86
87 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
88 static uint32_t TC_CoreAFunc_SP_orig;
89 static uint32_t TC_CoreAFunc_SP_sp;
90 static uint32_t TC_CoreAFunc_SP_result;
91
92 void TC_CoreAFunc_SP(void) {
93   TC_CoreAFunc_SP_orig = __get_SP();
94
95   TC_CoreAFunc_SP_sp = TC_CoreAFunc_SP_orig + 0x12345678U;
96   __set_SP(TC_CoreAFunc_SP_sp);
97   TC_CoreAFunc_SP_result = __get_SP();
98
99   __set_SP(TC_CoreAFunc_SP_orig);
100
101   ASSERT_TRUE(TC_CoreAFunc_SP_result == TC_CoreAFunc_SP_sp);
102 }
103
104 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
105 static uint32_t TC_CoreAFunc_SP_usr_orig;
106 static uint32_t TC_CoreAFunc_SP_usr_sp;
107 static uint32_t TC_CoreAFunc_SP_usr_result;
108
109 void TC_CoreAFunc_SP_usr(void) {
110   TC_CoreAFunc_SP_usr_orig = __get_SP_usr();
111
112   TC_CoreAFunc_SP_usr_sp = TC_CoreAFunc_SP_usr_orig + 0x12345678U;
113   __set_SP(TC_CoreAFunc_SP_usr_sp);
114   TC_CoreAFunc_SP_usr_result = __get_SP_usr();
115
116   __set_SP(TC_CoreAFunc_SP_usr_orig);
117
118   ASSERT_TRUE(TC_CoreAFunc_SP_usr_result == TC_CoreAFunc_SP_usr_sp);
119 }
120
121 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
122 void TC_CoreAFunc_FPEXC(void) {
123   uint32_t fpexc = __get_FPEXC();
124   __set_FPEXC(fpexc);
125
126   ASSERT_TRUE(fpexc == __get_FPEXC());
127 }
128
129 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
130 void TC_CoreAFunc_ACTLR(void) {
131   uint32_t actlr = __get_ACTLR();
132   __set_ACTLR(actlr);
133
134   ASSERT_TRUE(actlr == __get_ACTLR());
135 }
136
137 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
138 void TC_CoreAFunc_CPACR(void) {
139   uint32_t cpacr = __get_CPACR();
140   __set_CPACR(cpacr);
141
142   ASSERT_TRUE(cpacr == __get_CPACR());
143 }
144
145 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
146 void TC_CoreAFunc_DFSR(void) {
147   uint32_t dfsr = __get_DFSR();
148   __set_DFSR(dfsr);
149
150   ASSERT_TRUE(dfsr == __get_DFSR());
151 }
152
153 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
154 void TC_CoreAFunc_IFSR(void) {
155   uint32_t ifsr = __get_IFSR();
156   __set_IFSR(ifsr);
157
158   ASSERT_TRUE(ifsr == __get_IFSR());
159 }
160
161 /*0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
162 void TC_CoreAFunc_ISR(void) {
163   uint32_t isr = __get_ISR();
164
165   ASSERT_TRUE(isr == __get_ISR());
166 }
167
168 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
169 void TC_CoreAFunc_CBAR(void) {
170   uint32_t cbar = __get_CBAR();
171
172   ASSERT_TRUE(cbar == __get_CBAR());
173 }
174
175 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
176 void TC_CoreAFunc_TTBR0(void) {
177   uint32_t ttbr0 = __get_TTBR0();
178   __set_TTBR0(ttbr0);
179
180   ASSERT_TRUE(ttbr0 == __get_TTBR0());
181 }
182
183 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
184 void TC_CoreAFunc_DACR(void) {
185   uint32_t dacr = __get_DACR();
186   __set_DACR(dacr);
187
188   ASSERT_TRUE(dacr == __get_DACR());
189 }
190
191 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
192 void TC_CoreAFunc_SCTLR(void) {
193   uint32_t sctlr = __get_SCTLR();
194   __set_SCTLR(sctlr);
195
196   ASSERT_TRUE(sctlr == __get_SCTLR());
197 }
198
199 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
200 void TC_CoreAFunc_ACTRL(void) {
201   uint32_t actrl = __get_ACTRL();
202   __set_ACTRL(actrl);
203
204   ASSERT_TRUE(actrl == __get_ACTRL());
205 }
206
207 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
208 void TC_CoreAFunc_MPIDR(void) {
209   uint32_t mpidr = __get_MPIDR();
210
211   ASSERT_TRUE(mpidr == __get_MPIDR());
212 }
213
214 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
215 void TC_CoreAFunc_VBAR(void) {
216   uint32_t vbar = __get_VBAR();
217   __set_VBAR(vbar);
218
219   ASSERT_TRUE(vbar == __get_VBAR());
220 }