summaryrefslogblamecommitdiffstats
path: root/testsuites/sptests/sppercpudata01/init.c
blob: fbdf4c50add8401a5b76bdb04290ecc52b655a3e (plain) (tree)


























                                                                 

                                   

                                          









































                                                              




                                                        




                         
                  




                                           
                                 
                                                     


                                                            




















































                                                   




                                                        

























































                                                   




                                                        




                         
                  








                                                
                                 
                                                     


                                                            

















































































                                                                 
/*
 * Copyright (c) 2018 embedded brains GmbH.  All rights reserved.
 *
 *  embedded brains GmbH
 *  Dornierstr. 4
 *  82178 Puchheim
 *  Germany
 *  <rtems@embedded-brains.de>
 *
 * 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 <rtems.h>
#include <rtems/score/percpudata.h>

#include <tmacros.h>

#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 <rtems/confdefs.h>