Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:48

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /*
0004  * Copyright (c) 2018 embedded brains GmbH & Co. KG
0005  *
0006  * Redistribution and use in source and binary forms, with or without
0007  * modification, are permitted provided that the following conditions
0008  * are met:
0009  * 1. Redistributions of source code must retain the above copyright
0010  *    notice, this list of conditions and the following disclaimer.
0011  * 2. Redistributions in binary form must reproduce the above copyright
0012  *    notice, this list of conditions and the following disclaimer in the
0013  *    documentation and/or other materials provided with the distribution.
0014  *
0015  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0016  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0017  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0018  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0019  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0020  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0021  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0022  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0023  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0024  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0025  * POSSIBILITY OF SUCH DAMAGE.
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>