source: rtems/testsuites/sptests/sppercpudata01/init.c @ 99de42c

5
Last change on this file since 99de42c was 1fe1b820, checked in by Sebastian Huber <sebastian.huber@…>, on 09/10/18 at 09:47:24

score: Fix PER_CPU_DATA_GET_BY_OFFSET()

Add uniprocessor version for PER_CPU_DATA_GET_BY_OFFSET(). Fix warnings
in uniprocessor configurations.

Update #3507.

  • Property mode set to 100644
File size: 6.9 KB
Line 
1/*
2 * Copyright (c) 2018 embedded brains GmbH.  All rights reserved.
3 *
4 *  embedded brains GmbH
5 *  Dornierstr. 4
6 *  82178 Puchheim
7 *  Germany
8 *  <rtems@embedded-brains.de>
9 *
10 * The license and distribution terms for this file may be
11 * found in the file LICENSE in this distribution or at
12 * http://www.rtems.org/license/LICENSE.
13 */
14
15#ifdef HAVE_CONFIG_H
16#include "config.h"
17#endif
18
19#include <rtems.h>
20#include <rtems/score/percpudata.h>
21
22#include <tmacros.h>
23
24#include "sppercpudata01.h"
25
26const char rtems_test_name[] = "SPPERCPUDATA 1";
27
28static PER_CPU_DATA_ITEM(unsigned char, c) = 1;
29
30static PER_CPU_DATA_ITEM(unsigned char, cz);
31
32static PER_CPU_DATA_ITEM(unsigned short, s) = 2;
33
34static PER_CPU_DATA_ITEM(unsigned short, sz);
35
36static PER_CPU_DATA_ITEM(unsigned int, i) = 3;
37
38static PER_CPU_DATA_ITEM(unsigned int, iz);
39
40static PER_CPU_DATA_ITEM(unsigned long, l) = 4;
41
42static PER_CPU_DATA_ITEM(unsigned long, lz);
43
44static PER_CPU_DATA_ITEM(unsigned int, a[3]) = { 5, 6, 7 };
45
46static PER_CPU_DATA_ITEM(unsigned int, az[3]);
47
48typedef struct t {
49  unsigned int a;
50  unsigned int b;
51  unsigned int c;
52} t;
53
54static PER_CPU_DATA_ITEM(t, t) = { .a = 8, .b = 9, .c = 10 };
55
56static void set_affinity(uint32_t cpu_index)
57{
58  rtems_status_code sc;
59  cpu_set_t set;
60
61  CPU_ZERO(&set);
62  CPU_SET((int) cpu_index, &set);
63  sc = rtems_task_set_affinity(RTEMS_SELF, sizeof(set), &set);
64  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
65}
66
67static void test_initial_values(void)
68{
69  uint32_t cpu_index;
70
71  for (cpu_index = 0; cpu_index < rtems_get_processor_count(); ++cpu_index) {
72    Per_CPU_Control *cpu;
73    unsigned char *c;
74    unsigned short *s;
75    unsigned int *i;
76    unsigned long *l;
77    uintptr_t off;
78    t *pt;
79
80    set_affinity(cpu_index);
81    cpu = _Per_CPU_Get_by_index(cpu_index);
82
83    off = PER_CPU_DATA_OFFSET(c);
84    c = PER_CPU_DATA_GET_BY_OFFSET(cpu, unsigned char, off);
85    rtems_test_assert(*c == 1);
86
87    c = PER_CPU_DATA_GET(cpu, unsigned char, c);
88    rtems_test_assert(*c == 1);
89
90    c = PER_CPU_DATA_GET(cpu, unsigned char, cz);
91    rtems_test_assert(*c == 0);
92
93    s = PER_CPU_DATA_GET(cpu, unsigned short, s);
94    rtems_test_assert(*s == 2);
95
96    s = PER_CPU_DATA_GET(cpu, unsigned short, sz);
97    rtems_test_assert(*s == 0);
98
99    i = PER_CPU_DATA_GET(cpu, unsigned int, i);
100    rtems_test_assert(*i == 3);
101
102    i = PER_CPU_DATA_GET(cpu, unsigned int, iz);
103    rtems_test_assert(*i == 0);
104
105    l = PER_CPU_DATA_GET(cpu, unsigned long, l);
106    rtems_test_assert(*l == 4);
107
108    l = PER_CPU_DATA_GET(cpu, unsigned long, lz);
109    rtems_test_assert(*l == 0);
110
111    i = PER_CPU_DATA_GET(cpu, unsigned int, a[0]);
112    rtems_test_assert(i[0] == 5);
113    rtems_test_assert(i[1] == 6);
114    rtems_test_assert(i[2] == 7);
115
116    i = PER_CPU_DATA_GET(cpu, unsigned int, az[0]);
117    rtems_test_assert(i[0] == 0);
118    rtems_test_assert(i[1] == 0);
119    rtems_test_assert(i[2] == 0);
120
121    pt = PER_CPU_DATA_GET(cpu, t, t);
122    rtems_test_assert(pt->a == 8);
123    rtems_test_assert(pt->b == 9);
124    rtems_test_assert(pt->c == 10);
125
126    pt = PER_CPU_DATA_GET(cpu, struct t, t);
127    rtems_test_assert(pt->a == 8);
128    rtems_test_assert(pt->b == 9);
129    rtems_test_assert(pt->c == 10);
130
131    i = PER_CPU_DATA_GET(cpu, unsigned int, g);
132    rtems_test_assert(*i == 11);
133  }
134}
135
136static void set_unique_values(unsigned int v)
137{
138  uint32_t cpu_index;
139
140  for (cpu_index = 0; cpu_index < rtems_get_processor_count(); ++cpu_index) {
141    Per_CPU_Control *cpu;
142    unsigned char *c;
143    unsigned short *s;
144    unsigned int *i;
145    unsigned long *l;
146    t *pt;
147
148    set_affinity(cpu_index);
149    cpu = _Per_CPU_Get_by_index(cpu_index);
150
151    c = PER_CPU_DATA_GET(cpu, unsigned char, c);
152    *c = (unsigned char) ++v;
153
154    c = PER_CPU_DATA_GET(cpu, unsigned char, cz);
155    *c = (unsigned char) ++v;
156
157    s = PER_CPU_DATA_GET(cpu, unsigned short, s);
158    *s = (unsigned short) ++v;
159
160    s = PER_CPU_DATA_GET(cpu, unsigned short, sz);
161    *s = (unsigned short) ++v;
162
163    i = PER_CPU_DATA_GET(cpu, unsigned int, i);
164    *i = ++v;
165
166    i = PER_CPU_DATA_GET(cpu, unsigned int, iz);
167    *i = ++v;
168
169    l = PER_CPU_DATA_GET(cpu, unsigned long, l);
170    *l = ++v;
171
172    l = PER_CPU_DATA_GET(cpu, unsigned long, lz);
173    *l = ++v;
174
175    i = PER_CPU_DATA_GET(cpu, unsigned int, a[0]);
176    i[0] = ++v;
177    i[1] = ++v;
178    i[2] = ++v;
179
180    i = PER_CPU_DATA_GET(cpu, unsigned int, az[0]);
181    i[0] = ++v;
182    i[1] = ++v;
183    i[2] = ++v;
184
185    pt = PER_CPU_DATA_GET(cpu, t, t);
186    pt->a = ++v;
187    pt->b = ++v;
188    pt->c = ++v;
189
190    i = PER_CPU_DATA_GET(cpu, unsigned int, g);
191    *i = ++v;
192  }
193}
194
195static void test_unique_values(unsigned int v)
196{
197  uint32_t cpu_index;
198
199  for (cpu_index = 0; cpu_index < rtems_get_processor_count(); ++cpu_index) {
200    Per_CPU_Control *cpu;
201    unsigned char *c;
202    unsigned short *s;
203    unsigned int *i;
204    unsigned long *l;
205    uintptr_t off;
206    t *pt;
207
208    set_affinity(cpu_index);
209    cpu = _Per_CPU_Get_by_index(cpu_index);
210
211    c = PER_CPU_DATA_GET(cpu, unsigned char, c);
212    ++v;
213    rtems_test_assert(*c == (unsigned char) v);
214
215    off = PER_CPU_DATA_OFFSET(c);
216    c = PER_CPU_DATA_GET_BY_OFFSET(cpu, unsigned char, off);
217    rtems_test_assert(*c == (unsigned char) v);
218
219    c = PER_CPU_DATA_GET(cpu, unsigned char, cz);
220    ++v;
221    rtems_test_assert(*c == (unsigned char) v);
222
223    s = PER_CPU_DATA_GET(cpu, unsigned short, s);
224    ++v;
225    rtems_test_assert(*s == (unsigned short) v);
226
227    s = PER_CPU_DATA_GET(cpu, unsigned short, sz);
228    ++v;
229    rtems_test_assert(*s == (unsigned short) v);
230
231    i = PER_CPU_DATA_GET(cpu, unsigned int, i);
232    ++v;
233    rtems_test_assert(*i == v);
234
235    i = PER_CPU_DATA_GET(cpu, unsigned int, iz);
236    ++v;
237    rtems_test_assert(*i == v);
238
239    l = PER_CPU_DATA_GET(cpu, unsigned long, l);
240    ++v;
241    rtems_test_assert(*l == v);
242
243    l = PER_CPU_DATA_GET(cpu, unsigned long, lz);
244    ++v;
245    rtems_test_assert(*l == v);
246
247    i = PER_CPU_DATA_GET(cpu, unsigned int, a[0]);
248    ++v;
249    rtems_test_assert(i[0] == v);
250    ++v;
251    rtems_test_assert(i[1] == v);
252    ++v;
253    rtems_test_assert(i[2] == v);
254
255    i = PER_CPU_DATA_GET(cpu, unsigned int, az[0]);
256    ++v;
257    rtems_test_assert(i[0] == v);
258    ++v;
259    rtems_test_assert(i[1] == v);
260    ++v;
261    rtems_test_assert(i[2] == v);
262
263    pt = PER_CPU_DATA_GET(cpu, t, t);
264    ++v;
265    rtems_test_assert(pt->a == v);
266    ++v;
267    rtems_test_assert(pt->b == v);
268    ++v;
269    rtems_test_assert(pt->c == v);
270
271    i = PER_CPU_DATA_GET(cpu, unsigned int, g);
272    ++v;
273    rtems_test_assert(*i == v);
274  }
275}
276
277static void Init(rtems_task_argument arg)
278{
279  TEST_BEGIN();
280  test_initial_values();
281  set_unique_values(12);
282  test_unique_values(12);
283  TEST_END();
284  rtems_test_exit(0);
285}
286
287#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
288#define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
289
290#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
291
292#define CONFIGURE_MAXIMUM_PROCESSORS 32
293
294#define CONFIGURE_MAXIMUM_TASKS 1
295
296#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
297
298#define CONFIGURE_INIT
299
300#include <rtems/confdefs.h>
Note: See TracBrowser for help on using the repository browser.