File indexing completed on 2025-05-11 08:24:48
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 #ifdef HAVE_CONFIG_H
0029 #include "config.h"
0030 #endif
0031
0032 #include <rtems.h>
0033 #include <rtems/score/percpudata.h>
0034
0035 #include <tmacros.h>
0036
0037 #include "sppercpudata01.h"
0038
0039 const char rtems_test_name[] = "SPPERCPUDATA 1";
0040
0041 PER_CPU_DATA_NEED_INITIALIZATION();
0042
0043 static RTEMS_ALIGNED(CPU_HEAP_ALIGNMENT)
0044 PER_CPU_DATA_ITEM(unsigned char, c) = 1;
0045
0046 static PER_CPU_DATA_ITEM(unsigned char, cz);
0047
0048 static PER_CPU_DATA_ITEM(unsigned short, s) = 2;
0049
0050 static PER_CPU_DATA_ITEM(unsigned short, sz);
0051
0052 static PER_CPU_DATA_ITEM(unsigned int, i) = 3;
0053
0054 static PER_CPU_DATA_ITEM(unsigned int, iz);
0055
0056 static PER_CPU_DATA_ITEM(unsigned long, l) = 4;
0057
0058 static PER_CPU_DATA_ITEM(unsigned long, lz);
0059
0060 static PER_CPU_DATA_ITEM(unsigned int, a[3]) = { 5, 6, 7 };
0061
0062 static PER_CPU_DATA_ITEM(unsigned int, az[3]);
0063
0064 typedef struct t {
0065 unsigned int a;
0066 unsigned int b;
0067 unsigned int c;
0068 } t;
0069
0070 static PER_CPU_DATA_ITEM(t, t) = { .a = 8, .b = 9, .c = 10 };
0071
0072 static void set_affinity(uint32_t cpu_index)
0073 {
0074 rtems_status_code sc;
0075 cpu_set_t set;
0076
0077 CPU_ZERO(&set);
0078 CPU_SET((int) cpu_index, &set);
0079 sc = rtems_task_set_affinity(RTEMS_SELF, sizeof(set), &set);
0080 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0081 }
0082
0083 static void test_initial_values(void)
0084 {
0085 uint32_t cpu_index;
0086
0087 for (
0088 cpu_index = 0;
0089 cpu_index < rtems_scheduler_get_processor_maximum();
0090 ++cpu_index
0091 ) {
0092 Per_CPU_Control *cpu;
0093 unsigned char *c;
0094 unsigned short *s;
0095 unsigned int *i;
0096 unsigned long *l;
0097 uintptr_t off;
0098 t *pt;
0099
0100 set_affinity(cpu_index);
0101 cpu = _Per_CPU_Get_by_index(cpu_index);
0102
0103 off = PER_CPU_DATA_OFFSET(c);
0104 rtems_test_assert(off % CPU_HEAP_ALIGNMENT == 0);
0105 c = PER_CPU_DATA_GET_BY_OFFSET(cpu, unsigned char, off);
0106 rtems_test_assert(*c == 1);
0107
0108 c = PER_CPU_DATA_GET(cpu, unsigned char, c);
0109 rtems_test_assert(*c == 1);
0110
0111 c = PER_CPU_DATA_GET(cpu, unsigned char, cz);
0112 rtems_test_assert(*c == 0);
0113
0114 s = PER_CPU_DATA_GET(cpu, unsigned short, s);
0115 rtems_test_assert(*s == 2);
0116
0117 s = PER_CPU_DATA_GET(cpu, unsigned short, sz);
0118 rtems_test_assert(*s == 0);
0119
0120 i = PER_CPU_DATA_GET(cpu, unsigned int, i);
0121 rtems_test_assert(*i == 3);
0122
0123 i = PER_CPU_DATA_GET(cpu, unsigned int, iz);
0124 rtems_test_assert(*i == 0);
0125
0126 l = PER_CPU_DATA_GET(cpu, unsigned long, l);
0127 rtems_test_assert(*l == 4);
0128
0129 l = PER_CPU_DATA_GET(cpu, unsigned long, lz);
0130 rtems_test_assert(*l == 0);
0131
0132 i = PER_CPU_DATA_GET(cpu, unsigned int, a[0]);
0133 rtems_test_assert(i[0] == 5);
0134 rtems_test_assert(i[1] == 6);
0135 rtems_test_assert(i[2] == 7);
0136
0137 i = PER_CPU_DATA_GET(cpu, unsigned int, az[0]);
0138 rtems_test_assert(i[0] == 0);
0139 rtems_test_assert(i[1] == 0);
0140 rtems_test_assert(i[2] == 0);
0141
0142 pt = PER_CPU_DATA_GET(cpu, t, t);
0143 rtems_test_assert(pt->a == 8);
0144 rtems_test_assert(pt->b == 9);
0145 rtems_test_assert(pt->c == 10);
0146
0147 pt = PER_CPU_DATA_GET(cpu, struct t, t);
0148 rtems_test_assert(pt->a == 8);
0149 rtems_test_assert(pt->b == 9);
0150 rtems_test_assert(pt->c == 10);
0151
0152 i = PER_CPU_DATA_GET(cpu, unsigned int, g);
0153 rtems_test_assert(*i == 11);
0154 }
0155 }
0156
0157 static void set_unique_values(unsigned int v)
0158 {
0159 uint32_t cpu_index;
0160
0161 for (
0162 cpu_index = 0;
0163 cpu_index < rtems_scheduler_get_processor_maximum();
0164 ++cpu_index
0165 ) {
0166 Per_CPU_Control *cpu;
0167 unsigned char *c;
0168 unsigned short *s;
0169 unsigned int *i;
0170 unsigned long *l;
0171 t *pt;
0172
0173 set_affinity(cpu_index);
0174 cpu = _Per_CPU_Get_by_index(cpu_index);
0175
0176 c = PER_CPU_DATA_GET(cpu, unsigned char, c);
0177 *c = (unsigned char) ++v;
0178
0179 c = PER_CPU_DATA_GET(cpu, unsigned char, cz);
0180 *c = (unsigned char) ++v;
0181
0182 s = PER_CPU_DATA_GET(cpu, unsigned short, s);
0183 *s = (unsigned short) ++v;
0184
0185 s = PER_CPU_DATA_GET(cpu, unsigned short, sz);
0186 *s = (unsigned short) ++v;
0187
0188 i = PER_CPU_DATA_GET(cpu, unsigned int, i);
0189 *i = ++v;
0190
0191 i = PER_CPU_DATA_GET(cpu, unsigned int, iz);
0192 *i = ++v;
0193
0194 l = PER_CPU_DATA_GET(cpu, unsigned long, l);
0195 *l = ++v;
0196
0197 l = PER_CPU_DATA_GET(cpu, unsigned long, lz);
0198 *l = ++v;
0199
0200 i = PER_CPU_DATA_GET(cpu, unsigned int, a[0]);
0201 i[0] = ++v;
0202 i[1] = ++v;
0203 i[2] = ++v;
0204
0205 i = PER_CPU_DATA_GET(cpu, unsigned int, az[0]);
0206 i[0] = ++v;
0207 i[1] = ++v;
0208 i[2] = ++v;
0209
0210 pt = PER_CPU_DATA_GET(cpu, t, t);
0211 pt->a = ++v;
0212 pt->b = ++v;
0213 pt->c = ++v;
0214
0215 i = PER_CPU_DATA_GET(cpu, unsigned int, g);
0216 *i = ++v;
0217 }
0218 }
0219
0220 static void test_unique_values(unsigned int v)
0221 {
0222 uint32_t cpu_index;
0223
0224 for (
0225 cpu_index = 0;
0226 cpu_index < rtems_scheduler_get_processor_maximum();
0227 ++cpu_index
0228 ) {
0229 Per_CPU_Control *cpu;
0230 unsigned char *c;
0231 unsigned short *s;
0232 unsigned int *i;
0233 unsigned long *l;
0234 uintptr_t off;
0235 t *pt;
0236
0237 set_affinity(cpu_index);
0238 cpu = _Per_CPU_Get_by_index(cpu_index);
0239
0240 c = PER_CPU_DATA_GET(cpu, unsigned char, c);
0241 ++v;
0242 rtems_test_assert(*c == (unsigned char) v);
0243
0244 off = PER_CPU_DATA_OFFSET(c);
0245 rtems_test_assert(off % CPU_HEAP_ALIGNMENT == 0);
0246 c = PER_CPU_DATA_GET_BY_OFFSET(cpu, unsigned char, off);
0247 rtems_test_assert(*c == (unsigned char) v);
0248
0249 c = PER_CPU_DATA_GET(cpu, unsigned char, cz);
0250 ++v;
0251 rtems_test_assert(*c == (unsigned char) v);
0252
0253 s = PER_CPU_DATA_GET(cpu, unsigned short, s);
0254 ++v;
0255 rtems_test_assert(*s == (unsigned short) v);
0256
0257 s = PER_CPU_DATA_GET(cpu, unsigned short, sz);
0258 ++v;
0259 rtems_test_assert(*s == (unsigned short) v);
0260
0261 i = PER_CPU_DATA_GET(cpu, unsigned int, i);
0262 ++v;
0263 rtems_test_assert(*i == v);
0264
0265 i = PER_CPU_DATA_GET(cpu, unsigned int, iz);
0266 ++v;
0267 rtems_test_assert(*i == v);
0268
0269 l = PER_CPU_DATA_GET(cpu, unsigned long, l);
0270 ++v;
0271 rtems_test_assert(*l == v);
0272
0273 l = PER_CPU_DATA_GET(cpu, unsigned long, lz);
0274 ++v;
0275 rtems_test_assert(*l == v);
0276
0277 i = PER_CPU_DATA_GET(cpu, unsigned int, a[0]);
0278 ++v;
0279 rtems_test_assert(i[0] == v);
0280 ++v;
0281 rtems_test_assert(i[1] == v);
0282 ++v;
0283 rtems_test_assert(i[2] == v);
0284
0285 i = PER_CPU_DATA_GET(cpu, unsigned int, az[0]);
0286 ++v;
0287 rtems_test_assert(i[0] == v);
0288 ++v;
0289 rtems_test_assert(i[1] == v);
0290 ++v;
0291 rtems_test_assert(i[2] == v);
0292
0293 pt = PER_CPU_DATA_GET(cpu, t, t);
0294 ++v;
0295 rtems_test_assert(pt->a == v);
0296 ++v;
0297 rtems_test_assert(pt->b == v);
0298 ++v;
0299 rtems_test_assert(pt->c == v);
0300
0301 i = PER_CPU_DATA_GET(cpu, unsigned int, g);
0302 ++v;
0303 rtems_test_assert(*i == v);
0304 }
0305 }
0306
0307 static void Init(rtems_task_argument arg)
0308 {
0309 TEST_BEGIN();
0310 test_initial_values();
0311 set_unique_values(12);
0312 test_unique_values(12);
0313 TEST_END();
0314 rtems_test_exit(0);
0315 }
0316
0317 #define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
0318 #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
0319
0320 #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
0321
0322 #define CONFIGURE_MAXIMUM_PROCESSORS 32
0323
0324 #define CONFIGURE_MAXIMUM_TASKS 1
0325
0326 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
0327
0328 #define CONFIGURE_INIT
0329
0330 #include <rtems/confdefs.h>