summaryrefslogtreecommitdiffstats
path: root/testsuites/ada/support/init.c
blob: 3e395fc15f081c72f3db67accb2e44264eff9b54 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/*
 *  COPYRIGHT (c) 1989-2015
 *  On-Line Applications Research Corporation (OAR).
 */

#include <sys/types.h>
#include <limits.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

#include <rtems.h>
#include <rtems/test.h>
#include <rtems/score/threadimpl.h>

/*
 * This is the entry point automatically generated by GNAT.
 */
extern int gnat_main ( int argc, char **argv, char **envp );

static void *POSIX_Init(
  void *argument
)
{
  (void) gnat_main ( 0, 0, 0 );

  exit( 0 );
}

/*
 *  Prototypes for various test support routines. Since these are bound to
 *  from Ada, there are no external .h files even though they must be public.
 */
void ada_test_begin(void);
void ada_test_end(void);
uint32_t milliseconds_per_tick(void);
uint32_t ticks_per_second(void);
uint32_t work_space_size(void);
uint32_t is_configured_multiprocessing(void);
uint32_t get_node(void);
rtems_id tcb_to_id(Thread_Control *tcb);
void check_type(long type, long size, long alignment);

/*
 *  By putting this in brackets rather than quotes, we get the search
 *  path and can get this file from ".." in the mptests.
 */
#define CONFIGURE_INIT
#define CONFIGURE_GNAT_RTEMS
#define CONFIGURE_MEMORY_OVERHEAD  (256)

#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION

#define CONFIGURE_DISABLE_SMP_CONFIGURATION

#include <config.h>

const char rtems_test_name[] = ADA_TEST_NAME;

void ada_test_begin(void)
{
  rtems_test_begin(rtems_test_name, RTEMS_TEST_STATE_PASS);
}

void ada_test_end(void)
{
  rtems_test_end(rtems_test_name);
}

rtems_id tcb_to_id(
  Thread_Control *tcb
)
{
  return tcb->Object.id; /* Only for sp04 */
}

uint32_t milliseconds_per_tick(void)
{
  return CONFIGURE_MICROSECONDS_PER_TICK / 1000;
}

uint32_t ticks_per_second(void)
{
  return rtems_clock_get_ticks_per_second();
}

uint32_t work_space_size(void)
{
  return rtems_configuration_get_work_space_size()
    + rtems_configuration_get_stack_space_size();
}

uint32_t is_configured_multiprocessing(void)
{
#if defined(RTEMS_MULTIPROCESSING)
  return 1;
#else
  return 0;
#endif
}

uint32_t get_node(void)
{
  /* XXX HACK -- use public API */
  return _Objects_Local_node;
}

typedef struct {
  const char *name;
  long size;
  long alignment;
} type_spec;

#define TYPE_SPEC(t) { #t, sizeof(t) * CHAR_BIT, _Alignof(t) }

static const type_spec types[] = {
  TYPE_SPEC(clockid_t),
  TYPE_SPEC(pid_t),
  TYPE_SPEC(pthread_attr_t),
  TYPE_SPEC(pthread_condattr_t),
  TYPE_SPEC(pthread_cond_t),
  TYPE_SPEC(pthread_key_t),
  TYPE_SPEC(pthread_mutexattr_t),
  TYPE_SPEC(pthread_mutex_t),
  TYPE_SPEC(pthread_rwlockattr_t),
  TYPE_SPEC(pthread_rwlock_t),
  TYPE_SPEC(pthread_t),
  TYPE_SPEC(rtems_id),
  TYPE_SPEC(sigset_t),
  TYPE_SPEC(stack_t),
  TYPE_SPEC(struct sched_param),
  TYPE_SPEC(struct sigaction),
  TYPE_SPEC(struct timespec)
};

void check_type(long type, long size, long alignment)
{
  if (type >= 0 && type < (long) RTEMS_ARRAY_SIZE(types)) {
    const type_spec *ts;

    ts = &types[type];
    printf(
      "%s: size %li == %li, alignment %li == %li\n",
      ts->name,
      ts->size,
      size,
      ts->alignment,
      alignment
    );
    if (ts->size != size || ts->alignment != alignment) {
      exit(0);
    }
  } else {
    exit(0);
  }
}