/* * Copyright (c) 2018 embedded brains GmbH. All rights reserved. * * embedded brains GmbH * Dornierstr. 4 * 82178 Puchheim * Germany * * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.rtems.org/license/LICENSE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "sppercpudata01.h" const char rtems_test_name[] = "SPPERCPUDATA 1"; PER_CPU_DATA_NEED_INITIALIZATION(); static RTEMS_ALIGNED(CPU_HEAP_ALIGNMENT) PER_CPU_DATA_ITEM(unsigned char, c) = 1; static PER_CPU_DATA_ITEM(unsigned char, cz); static PER_CPU_DATA_ITEM(unsigned short, s) = 2; static PER_CPU_DATA_ITEM(unsigned short, sz); static PER_CPU_DATA_ITEM(unsigned int, i) = 3; static PER_CPU_DATA_ITEM(unsigned int, iz); static PER_CPU_DATA_ITEM(unsigned long, l) = 4; static PER_CPU_DATA_ITEM(unsigned long, lz); static PER_CPU_DATA_ITEM(unsigned int, a[3]) = { 5, 6, 7 }; static PER_CPU_DATA_ITEM(unsigned int, az[3]); typedef struct t { unsigned int a; unsigned int b; unsigned int c; } t; static PER_CPU_DATA_ITEM(t, t) = { .a = 8, .b = 9, .c = 10 }; static void set_affinity(uint32_t cpu_index) { rtems_status_code sc; cpu_set_t set; CPU_ZERO(&set); CPU_SET((int) cpu_index, &set); sc = rtems_task_set_affinity(RTEMS_SELF, sizeof(set), &set); rtems_test_assert(sc == RTEMS_SUCCESSFUL); } static void test_initial_values(void) { uint32_t cpu_index; for ( cpu_index = 0; cpu_index < rtems_scheduler_get_processor_maximum(); ++cpu_index ) { Per_CPU_Control *cpu; unsigned char *c; unsigned short *s; unsigned int *i; unsigned long *l; uintptr_t off; t *pt; set_affinity(cpu_index); cpu = _Per_CPU_Get_by_index(cpu_index); off = PER_CPU_DATA_OFFSET(c); rtems_test_assert(off % CPU_HEAP_ALIGNMENT == 0); c = PER_CPU_DATA_GET_BY_OFFSET(cpu, unsigned char, off); rtems_test_assert(*c == 1); c = PER_CPU_DATA_GET(cpu, unsigned char, c); rtems_test_assert(*c == 1); c = PER_CPU_DATA_GET(cpu, unsigned char, cz); rtems_test_assert(*c == 0); s = PER_CPU_DATA_GET(cpu, unsigned short, s); rtems_test_assert(*s == 2); s = PER_CPU_DATA_GET(cpu, unsigned short, sz); rtems_test_assert(*s == 0); i = PER_CPU_DATA_GET(cpu, unsigned int, i); rtems_test_assert(*i == 3); i = PER_CPU_DATA_GET(cpu, unsigned int, iz); rtems_test_assert(*i == 0); l = PER_CPU_DATA_GET(cpu, unsigned long, l); rtems_test_assert(*l == 4); l = PER_CPU_DATA_GET(cpu, unsigned long, lz); rtems_test_assert(*l == 0); i = PER_CPU_DATA_GET(cpu, unsigned int, a[0]); rtems_test_assert(i[0] == 5); rtems_test_assert(i[1] == 6); rtems_test_assert(i[2] == 7); i = PER_CPU_DATA_GET(cpu, unsigned int, az[0]); rtems_test_assert(i[0] == 0); rtems_test_assert(i[1] == 0); rtems_test_assert(i[2] == 0); pt = PER_CPU_DATA_GET(cpu, t, t); rtems_test_assert(pt->a == 8); rtems_test_assert(pt->b == 9); rtems_test_assert(pt->c == 10); pt = PER_CPU_DATA_GET(cpu, struct t, t); rtems_test_assert(pt->a == 8); rtems_test_assert(pt->b == 9); rtems_test_assert(pt->c == 10); i = PER_CPU_DATA_GET(cpu, unsigned int, g); rtems_test_assert(*i == 11); } } static void set_unique_values(unsigned int v) { uint32_t cpu_index; for ( cpu_index = 0; cpu_index < rtems_scheduler_get_processor_maximum(); ++cpu_index ) { Per_CPU_Control *cpu; unsigned char *c; unsigned short *s; unsigned int *i; unsigned long *l; t *pt; set_affinity(cpu_index); cpu = _Per_CPU_Get_by_index(cpu_index); c = PER_CPU_DATA_GET(cpu, unsigned char, c); *c = (unsigned char) ++v; c = PER_CPU_DATA_GET(cpu, unsigned char, cz); *c = (unsigned char) ++v; s = PER_CPU_DATA_GET(cpu, unsigned short, s); *s = (unsigned short) ++v; s = PER_CPU_DATA_GET(cpu, unsigned short, sz); *s = (unsigned short) ++v; i = PER_CPU_DATA_GET(cpu, unsigned int, i); *i = ++v; i = PER_CPU_DATA_GET(cpu, unsigned int, iz); *i = ++v; l = PER_CPU_DATA_GET(cpu, unsigned long, l); *l = ++v; l = PER_CPU_DATA_GET(cpu, unsigned long, lz); *l = ++v; i = PER_CPU_DATA_GET(cpu, unsigned int, a[0]); i[0] = ++v; i[1] = ++v; i[2] = ++v; i = PER_CPU_DATA_GET(cpu, unsigned int, az[0]); i[0] = ++v; i[1] = ++v; i[2] = ++v; pt = PER_CPU_DATA_GET(cpu, t, t); pt->a = ++v; pt->b = ++v; pt->c = ++v; i = PER_CPU_DATA_GET(cpu, unsigned int, g); *i = ++v; } } static void test_unique_values(unsigned int v) { uint32_t cpu_index; for ( cpu_index = 0; cpu_index < rtems_scheduler_get_processor_maximum(); ++cpu_index ) { Per_CPU_Control *cpu; unsigned char *c; unsigned short *s; unsigned int *i; unsigned long *l; uintptr_t off; t *pt; set_affinity(cpu_index); cpu = _Per_CPU_Get_by_index(cpu_index); c = PER_CPU_DATA_GET(cpu, unsigned char, c); ++v; rtems_test_assert(*c == (unsigned char) v); off = PER_CPU_DATA_OFFSET(c); rtems_test_assert(off % CPU_HEAP_ALIGNMENT == 0); c = PER_CPU_DATA_GET_BY_OFFSET(cpu, unsigned char, off); rtems_test_assert(*c == (unsigned char) v); c = PER_CPU_DATA_GET(cpu, unsigned char, cz); ++v; rtems_test_assert(*c == (unsigned char) v); s = PER_CPU_DATA_GET(cpu, unsigned short, s); ++v; rtems_test_assert(*s == (unsigned short) v); s = PER_CPU_DATA_GET(cpu, unsigned short, sz); ++v; rtems_test_assert(*s == (unsigned short) v); i = PER_CPU_DATA_GET(cpu, unsigned int, i); ++v; rtems_test_assert(*i == v); i = PER_CPU_DATA_GET(cpu, unsigned int, iz); ++v; rtems_test_assert(*i == v); l = PER_CPU_DATA_GET(cpu, unsigned long, l); ++v; rtems_test_assert(*l == v); l = PER_CPU_DATA_GET(cpu, unsigned long, lz); ++v; rtems_test_assert(*l == v); i = PER_CPU_DATA_GET(cpu, unsigned int, a[0]); ++v; rtems_test_assert(i[0] == v); ++v; rtems_test_assert(i[1] == v); ++v; rtems_test_assert(i[2] == v); i = PER_CPU_DATA_GET(cpu, unsigned int, az[0]); ++v; rtems_test_assert(i[0] == v); ++v; rtems_test_assert(i[1] == v); ++v; rtems_test_assert(i[2] == v); pt = PER_CPU_DATA_GET(cpu, t, t); ++v; rtems_test_assert(pt->a == v); ++v; rtems_test_assert(pt->b == v); ++v; rtems_test_assert(pt->c == v); i = PER_CPU_DATA_GET(cpu, unsigned int, g); ++v; rtems_test_assert(*i == v); } } static void Init(rtems_task_argument arg) { TEST_BEGIN(); test_initial_values(); set_unique_values(12); test_unique_values(12); TEST_END(); rtems_test_exit(0); } #define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION #define CONFIGURE_MAXIMUM_PROCESSORS 32 #define CONFIGURE_MAXIMUM_TASKS 1 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE #define CONFIGURE_INIT #include