source: rtems/testsuites/sptests/spsysinit01/init.c @ 9871f5dc

5
Last change on this file since 9871f5dc was 9871f5dc, checked in by Sebastian Huber <sebastian.huber@…>, on 12/14/15 at 15:31:44

Optional POSIX Mutex initialization

Update #2408.

  • Property mode set to 100644
File size: 11.2 KB
Line 
1/*
2 * Copyright (c) 2015 embedded brains GmbH.  All rights reserved.
3 *
4 *  embedded brains GmbH
5 *  Dornierstr. 4
6 *  82178 Puchheim
7 *  Germany
8 *  <rtems@embedded-brains.de>
9 *
10 * The license and distribution terms for this file may be
11 * found in the file LICENSE in this distribution or at
12 * http://www.rtems.com/license/LICENSE.
13 */
14
15#ifdef HAVE_CONFIG_H
16  #include "config.h"
17#endif
18
19#include <assert.h>
20#include <pthread.h>
21#include <string.h>
22#include <stdlib.h>
23
24#include <rtems.h>
25#include <rtems/libio_.h>
26#include <rtems/sysinit.h>
27#include <rtems/test.h>
28
29#include <rtems/extensionimpl.h>
30#ifdef RTEMS_POSIX_API
31#include <rtems/posix/condimpl.h>
32#include <rtems/posix/muteximpl.h>
33#include <rtems/posix/psignalimpl.h>
34#include <rtems/posix/pthreadimpl.h>
35#endif /* RTEMS_POSIX_API */
36#include <rtems/rtems/barrierimpl.h>
37#include <rtems/rtems/dpmemimpl.h>
38#include <rtems/rtems/messageimpl.h>
39#include <rtems/rtems/partimpl.h>
40#include <rtems/rtems/ratemonimpl.h>
41#include <rtems/rtems/regionimpl.h>
42#include <rtems/rtems/semimpl.h>
43#include <rtems/rtems/tasksimpl.h>
44#include <rtems/rtems/timerimpl.h>
45#include <rtems/score/apimutex.h>
46#include <rtems/score/chainimpl.h>
47#include <rtems/score/sysstate.h>
48#include <rtems/score/userextimpl.h>
49#include <rtems/score/wkspace.h>
50
51const char rtems_test_name[] = "SPSYSINIT 1";
52
53typedef enum {
54  BSP_WORK_AREAS_PRE,
55  BSP_WORK_AREAS_POST,
56  BSP_START_PRE,
57  BSP_START_POST,
58  INITIAL_EXTENSIONS_PRE,
59  INITIAL_EXTENSIONS_POST,
60  DATA_STRUCTURES_PRE,
61  DATA_STRUCTURES_POST,
62  USER_EXTENSIONS_PRE,
63  USER_EXTENSIONS_POST,
64  CLASSIC_TASKS_PRE,
65  CLASSIC_TASKS_POST,
66  CLASSIC_TIMER_PRE,
67  CLASSIC_TIMER_POST,
68  CLASSIC_SIGNAL_PRE,
69  CLASSIC_SIGNAL_POST,
70  CLASSIC_EVENT_PRE,
71  CLASSIC_EVENT_POST,
72  CLASSIC_MESSAGE_QUEUE_PRE,
73  CLASSIC_MESSAGE_QUEUE_POST,
74  CLASSIC_SEMAPHORE_PRE,
75  CLASSIC_SEMAPHORE_POST,
76  CLASSIC_PARTITION_PRE,
77  CLASSIC_PARTITION_POST,
78  CLASSIC_REGION_PRE,
79  CLASSIC_REGION_POST,
80  CLASSIC_DUAL_PORTED_MEMORY_PRE,
81  CLASSIC_DUAL_PORTED_MEMORY_POST,
82  CLASSIC_RATE_MONOTONIC_PRE,
83  CLASSIC_RATE_MONOTONIC_POST,
84  CLASSIC_BARRIER_PRE,
85  CLASSIC_BARRIER_POST,
86#ifdef RTEMS_POSIX_API
87  POSIX_SIGNALS_PRE,
88  POSIX_SIGNALS_POST,
89  POSIX_THREADS_PRE,
90  POSIX_THREADS_POST,
91  POSIX_CONDITION_VARIABLE_PRE,
92  POSIX_CONDITION_VARIABLE_POST,
93  POSIX_MUTEX_PRE,
94  POSIX_MUTEX_POST,
95  POSIX_CLEANUP_PRE,
96  POSIX_CLEANUP_POST,
97#endif /* RTEMS_POSIX_API */
98  IDLE_THREADS_PRE,
99  IDLE_THREADS_POST,
100  BSP_LIBC_PRE,
101  BSP_LIBC_POST,
102  BEFORE_DRIVERS_PRE,
103  BEFORE_DRIVERS_POST,
104  BSP_PRE_DRIVERS_PRE,
105  BSP_PRE_DRIVERS_POST,
106  DEVICE_DRIVERS_PRE,
107  DEVICE_DRIVERS_POST,
108  BSP_POST_DRIVERS_PRE,
109  BSP_POST_DRIVERS_POST,
110  INIT_TASK,
111  DONE
112} init_step;
113
114#define FIRST(x) \
115  static void x##_first(void); \
116  RTEMS_SYSINIT_ITEM( \
117    x##_first, \
118    x, \
119    RTEMS_SYSINIT_ORDER_FIRST \
120  ); \
121  static void x##_first(void)
122
123#define LAST(x) \
124  static void x##_last(void); \
125  RTEMS_SYSINIT_ITEM( \
126    x##_last, \
127    x, \
128    RTEMS_SYSINIT_ORDER_LAST \
129  ); \
130  static void x##_last(void)
131
132static init_step step;
133
134static void next_step(init_step expected)
135{
136  assert(step == expected);
137  step = expected + 1;
138}
139
140FIRST(RTEMS_SYSINIT_BSP_WORK_AREAS)
141{
142  rtems_test_begink();
143  assert(_Workspace_Area.area_begin == 0);
144  next_step(BSP_WORK_AREAS_PRE);
145}
146
147LAST(RTEMS_SYSINIT_BSP_WORK_AREAS)
148{
149  assert(_Workspace_Area.area_begin != 0);
150  next_step(BSP_WORK_AREAS_POST);
151}
152
153FIRST(RTEMS_SYSINIT_BSP_START)
154{
155  /*
156   * Since the work performed here is BSP-specific, there is no way to test pre
157   * and post conditions.
158   */
159  next_step(BSP_START_PRE);
160}
161
162LAST(RTEMS_SYSINIT_BSP_START)
163{
164  next_step(BSP_START_POST);
165}
166
167FIRST(RTEMS_SYSINIT_INITIAL_EXTENSIONS)
168{
169  assert(_Chain_Is_empty(&_User_extensions_Switches_list));
170  next_step(INITIAL_EXTENSIONS_PRE);
171}
172
173LAST(RTEMS_SYSINIT_INITIAL_EXTENSIONS)
174{
175  assert(!_Chain_Is_empty(&_User_extensions_Switches_list));
176  next_step(INITIAL_EXTENSIONS_POST);
177}
178
179FIRST(RTEMS_SYSINIT_DATA_STRUCTURES)
180{
181  assert(_RTEMS_Allocator_Mutex == NULL);
182  next_step(DATA_STRUCTURES_PRE);
183}
184
185LAST(RTEMS_SYSINIT_DATA_STRUCTURES)
186{
187  assert(_RTEMS_Allocator_Mutex != NULL);
188  next_step(DATA_STRUCTURES_POST);
189}
190
191FIRST(RTEMS_SYSINIT_USER_EXTENSIONS)
192{
193  assert(_Extension_Information.maximum == 0);
194  next_step(USER_EXTENSIONS_PRE);
195}
196
197LAST(RTEMS_SYSINIT_USER_EXTENSIONS)
198{
199  assert(_Extension_Information.maximum != 0);
200  next_step(USER_EXTENSIONS_POST);
201}
202
203FIRST(RTEMS_SYSINIT_CLASSIC_TASKS)
204{
205  assert(_RTEMS_tasks_Information.Objects.maximum == 0);
206  next_step(CLASSIC_TASKS_PRE);
207}
208
209LAST(RTEMS_SYSINIT_CLASSIC_TASKS)
210{
211  assert(_RTEMS_tasks_Information.Objects.maximum != 0);
212  next_step(CLASSIC_TASKS_POST);
213}
214
215FIRST(RTEMS_SYSINIT_CLASSIC_TIMER)
216{
217  assert(_Timer_Information.maximum == 0);
218  next_step(CLASSIC_TIMER_PRE);
219}
220
221LAST(RTEMS_SYSINIT_CLASSIC_TIMER)
222{
223  assert(_Timer_Information.maximum != 0);
224  next_step(CLASSIC_TIMER_POST);
225}
226
227FIRST(RTEMS_SYSINIT_CLASSIC_SIGNAL)
228{
229  /* There is nothing to do in case RTEMS_MULTIPROCESSING is not defined */
230  next_step(CLASSIC_SIGNAL_PRE);
231}
232
233LAST(RTEMS_SYSINIT_CLASSIC_SIGNAL)
234{
235  next_step(CLASSIC_SIGNAL_POST);
236}
237
238FIRST(RTEMS_SYSINIT_CLASSIC_EVENT)
239{
240  /* There is nothing to do in case RTEMS_MULTIPROCESSING is not defined */
241  next_step(CLASSIC_EVENT_PRE);
242}
243
244LAST(RTEMS_SYSINIT_CLASSIC_EVENT)
245{
246  next_step(CLASSIC_EVENT_POST);
247}
248
249FIRST(RTEMS_SYSINIT_CLASSIC_MESSAGE_QUEUE)
250{
251  assert(_Message_queue_Information.maximum == 0);
252  next_step(CLASSIC_MESSAGE_QUEUE_PRE);
253}
254
255LAST(RTEMS_SYSINIT_CLASSIC_MESSAGE_QUEUE)
256{
257  assert(_Message_queue_Information.maximum != 0);
258  next_step(CLASSIC_MESSAGE_QUEUE_POST);
259}
260
261FIRST(RTEMS_SYSINIT_CLASSIC_SEMAPHORE)
262{
263  assert(_Semaphore_Information.maximum == 0);
264  next_step(CLASSIC_SEMAPHORE_PRE);
265}
266
267LAST(RTEMS_SYSINIT_CLASSIC_SEMAPHORE)
268{
269  assert(_Semaphore_Information.maximum != 0);
270  next_step(CLASSIC_SEMAPHORE_POST);
271}
272
273FIRST(RTEMS_SYSINIT_CLASSIC_PARTITION)
274{
275  assert(_Partition_Information.maximum == 0);
276  next_step(CLASSIC_PARTITION_PRE);
277}
278
279LAST(RTEMS_SYSINIT_CLASSIC_PARTITION)
280{
281  assert(_Partition_Information.maximum != 0);
282  next_step(CLASSIC_PARTITION_POST);
283}
284
285FIRST(RTEMS_SYSINIT_CLASSIC_REGION)
286{
287  assert(_Region_Information.maximum == 0);
288  next_step(CLASSIC_REGION_PRE);
289}
290
291LAST(RTEMS_SYSINIT_CLASSIC_REGION)
292{
293  assert(_Region_Information.maximum != 0);
294  next_step(CLASSIC_REGION_POST);
295}
296
297FIRST(RTEMS_SYSINIT_CLASSIC_DUAL_PORTED_MEMORY)
298{
299  assert(_Dual_ported_memory_Information.maximum == 0);
300  next_step(CLASSIC_DUAL_PORTED_MEMORY_PRE);
301}
302
303LAST(RTEMS_SYSINIT_CLASSIC_DUAL_PORTED_MEMORY)
304{
305  assert(_Dual_ported_memory_Information.maximum != 0);
306  next_step(CLASSIC_DUAL_PORTED_MEMORY_POST);
307}
308
309FIRST(RTEMS_SYSINIT_CLASSIC_RATE_MONOTONIC)
310{
311  assert(_Rate_monotonic_Information.maximum == 0);
312  next_step(CLASSIC_RATE_MONOTONIC_PRE);
313}
314
315LAST(RTEMS_SYSINIT_CLASSIC_RATE_MONOTONIC)
316{
317  assert(_Rate_monotonic_Information.maximum != 0);
318  next_step(CLASSIC_RATE_MONOTONIC_POST);
319}
320
321FIRST(RTEMS_SYSINIT_CLASSIC_BARRIER)
322{
323  assert(_Barrier_Information.maximum == 0);
324  next_step(CLASSIC_BARRIER_PRE);
325}
326
327LAST(RTEMS_SYSINIT_CLASSIC_BARRIER)
328{
329  assert(_Barrier_Information.maximum != 0);
330  next_step(CLASSIC_BARRIER_POST);
331}
332
333#ifdef RTEMS_POSIX_API
334
335FIRST(RTEMS_SYSINIT_POSIX_SIGNALS)
336{
337  assert(
338    memcmp(
339      &_POSIX_signals_Vectors,
340      _POSIX_signals_Default_vectors,
341      sizeof(_POSIX_signals_Vectors)
342    ) != 0
343  );
344  next_step(POSIX_SIGNALS_PRE);
345}
346
347LAST(RTEMS_SYSINIT_POSIX_SIGNALS)
348{
349  assert(
350    memcmp(
351      &_POSIX_signals_Vectors,
352      _POSIX_signals_Default_vectors,
353      sizeof(_POSIX_signals_Vectors)
354    ) == 0
355  );
356  next_step(POSIX_SIGNALS_POST);
357}
358
359FIRST(RTEMS_SYSINIT_POSIX_THREADS)
360{
361  assert(_POSIX_Threads_Information.Objects.maximum == 0);
362  next_step(POSIX_THREADS_PRE);
363}
364
365LAST(RTEMS_SYSINIT_POSIX_THREADS)
366{
367  assert(_POSIX_Threads_Information.Objects.maximum != 0);
368  next_step(POSIX_THREADS_POST);
369}
370
371FIRST(RTEMS_SYSINIT_POSIX_CONDITION_VARIABLE)
372{
373  assert(_POSIX_Condition_variables_Information.maximum == 0);
374  next_step(POSIX_CONDITION_VARIABLE_PRE);
375}
376
377LAST(RTEMS_SYSINIT_POSIX_CONDITION_VARIABLE)
378{
379  assert(_POSIX_Condition_variables_Information.maximum != 0);
380  next_step(POSIX_CONDITION_VARIABLE_POST);
381}
382
383FIRST(RTEMS_SYSINIT_POSIX_MUTEX)
384{
385  assert(_POSIX_Mutex_Information.maximum == 0);
386  next_step(POSIX_MUTEX_PRE);
387}
388
389LAST(RTEMS_SYSINIT_POSIX_MUTEX)
390{
391  assert(_POSIX_Mutex_Information.maximum != 0);
392  next_step(POSIX_MUTEX_POST);
393}
394
395static size_t user_extensions_pre_posix_cleanup;
396
397FIRST(RTEMS_SYSINIT_POSIX_CLEANUP)
398{
399  user_extensions_pre_posix_cleanup =
400    _Chain_Node_count_unprotected(&_User_extensions_List);
401  next_step(POSIX_CLEANUP_PRE);
402}
403
404LAST(RTEMS_SYSINIT_POSIX_CLEANUP)
405{
406  assert(
407    user_extensions_pre_posix_cleanup + 1 ==
408      _Chain_Node_count_unprotected(&_User_extensions_List)
409  );
410  next_step(POSIX_CLEANUP_POST);
411}
412
413#endif /* RTEMS_POSIX_API */
414
415FIRST(RTEMS_SYSINIT_IDLE_THREADS)
416{
417  assert(_System_state_Is_before_initialization(_System_state_Get()));
418  next_step(IDLE_THREADS_PRE);
419}
420
421LAST(RTEMS_SYSINIT_IDLE_THREADS)
422{
423  assert(_System_state_Is_before_multitasking(_System_state_Get()));
424  next_step(IDLE_THREADS_POST);
425}
426
427FIRST(RTEMS_SYSINIT_BSP_LIBC)
428{
429  assert(rtems_libio_semaphore == 0);
430  next_step(BSP_LIBC_PRE);
431}
432
433LAST(RTEMS_SYSINIT_BSP_LIBC)
434{
435  assert(rtems_libio_semaphore != 0);
436  next_step(BSP_LIBC_POST);
437}
438
439FIRST(RTEMS_SYSINIT_BEFORE_DRIVERS)
440{
441  /* Omit test of build configuration specific pre and post conditions */
442  next_step(BEFORE_DRIVERS_PRE);
443}
444
445LAST(RTEMS_SYSINIT_BEFORE_DRIVERS)
446{
447  next_step(BEFORE_DRIVERS_POST);
448}
449
450FIRST(RTEMS_SYSINIT_BSP_PRE_DRIVERS)
451{
452  /*
453   * Since the work performed here is BSP-specific, there is no way to test pre
454   * and post conditions.
455   */
456  next_step(BSP_PRE_DRIVERS_PRE);
457}
458
459LAST(RTEMS_SYSINIT_BSP_PRE_DRIVERS)
460{
461  next_step(BSP_PRE_DRIVERS_POST);
462}
463
464FIRST(RTEMS_SYSINIT_DEVICE_DRIVERS)
465{
466  assert(!_IO_All_drivers_initialized);
467  next_step(DEVICE_DRIVERS_PRE);
468}
469
470LAST(RTEMS_SYSINIT_DEVICE_DRIVERS)
471{
472  assert(_IO_All_drivers_initialized);
473  next_step(DEVICE_DRIVERS_POST);
474}
475
476FIRST(RTEMS_SYSINIT_BSP_POST_DRIVERS)
477{
478  assert(rtems_libio_iop_freelist != NULL);
479  next_step(BSP_POST_DRIVERS_PRE);
480}
481
482LAST(RTEMS_SYSINIT_BSP_POST_DRIVERS)
483{
484  assert(rtems_libio_iop_freelist == NULL);
485  next_step(BSP_POST_DRIVERS_POST);
486}
487
488static void Init(rtems_task_argument arg)
489{
490#ifdef RTEMS_POSIX_API
491  pthread_cleanup_push(NULL, NULL);
492  pthread_cleanup_pop(0);
493#endif /* RTEMS_POSIX_API */
494  next_step(INIT_TASK);
495  rtems_test_endk();
496  exit(0);
497}
498
499#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
500#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
501
502#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 1
503
504#define CONFIGURE_MAXIMUM_BARRIERS 1
505
506#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
507
508#define CONFIGURE_MAXIMUM_PARTITIONS 1
509
510#define CONFIGURE_MAXIMUM_PERIODS 1
511
512#define CONFIGURE_MAXIMUM_PORTS 1
513
514#define CONFIGURE_MAXIMUM_REGIONS 1
515
516#define CONFIGURE_MAXIMUM_SEMAPHORES 1
517
518#define CONFIGURE_MAXIMUM_TASKS 1
519
520#define CONFIGURE_MAXIMUM_TIMERS 1
521
522#ifdef RTEMS_POSIX_API
523
524#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 1
525
526#define CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES 1
527
528#define CONFIGURE_MAXIMUM_POSIX_THREADS 1
529
530#endif /* RTEMS_POSIX_API */
531
532#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
533
534#define CONFIGURE_STACK_CHECKER_ENABLED
535
536#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
537
538#define CONFIGURE_INIT
539
540#include <rtems/confdefs.h>
Note: See TracBrowser for help on using the repository browser.