source: rtems/testsuites/sptests/spsysinit01/init.c @ 4eee8781

5
Last change on this file since 4eee8781 was 4eee8781, checked in by Sebastian Huber <sebastian.huber@…>, on 12/14/15 at 15:40:28

Optional POSIX Spinlock initialization

Update #2408.

  • Property mode set to 100644
File size: 13.4 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/barrierimpl.h>
32#include <rtems/posix/condimpl.h>
33#include <rtems/posix/mqueueimpl.h>
34#include <rtems/posix/muteximpl.h>
35#include <rtems/posix/psignalimpl.h>
36#include <rtems/posix/pthreadimpl.h>
37#include <rtems/posix/rwlockimpl.h>
38#include <rtems/posix/semaphoreimpl.h>
39#include <rtems/posix/spinlockimpl.h>
40#include <rtems/posix/timerimpl.h>
41#endif /* RTEMS_POSIX_API */
42#include <rtems/rtems/barrierimpl.h>
43#include <rtems/rtems/dpmemimpl.h>
44#include <rtems/rtems/messageimpl.h>
45#include <rtems/rtems/partimpl.h>
46#include <rtems/rtems/ratemonimpl.h>
47#include <rtems/rtems/regionimpl.h>
48#include <rtems/rtems/semimpl.h>
49#include <rtems/rtems/tasksimpl.h>
50#include <rtems/rtems/timerimpl.h>
51#include <rtems/score/apimutex.h>
52#include <rtems/score/chainimpl.h>
53#include <rtems/score/sysstate.h>
54#include <rtems/score/userextimpl.h>
55#include <rtems/score/wkspace.h>
56
57const char rtems_test_name[] = "SPSYSINIT 1";
58
59typedef enum {
60  BSP_WORK_AREAS_PRE,
61  BSP_WORK_AREAS_POST,
62  BSP_START_PRE,
63  BSP_START_POST,
64  INITIAL_EXTENSIONS_PRE,
65  INITIAL_EXTENSIONS_POST,
66  DATA_STRUCTURES_PRE,
67  DATA_STRUCTURES_POST,
68  USER_EXTENSIONS_PRE,
69  USER_EXTENSIONS_POST,
70  CLASSIC_TASKS_PRE,
71  CLASSIC_TASKS_POST,
72  CLASSIC_TIMER_PRE,
73  CLASSIC_TIMER_POST,
74  CLASSIC_SIGNAL_PRE,
75  CLASSIC_SIGNAL_POST,
76  CLASSIC_EVENT_PRE,
77  CLASSIC_EVENT_POST,
78  CLASSIC_MESSAGE_QUEUE_PRE,
79  CLASSIC_MESSAGE_QUEUE_POST,
80  CLASSIC_SEMAPHORE_PRE,
81  CLASSIC_SEMAPHORE_POST,
82  CLASSIC_PARTITION_PRE,
83  CLASSIC_PARTITION_POST,
84  CLASSIC_REGION_PRE,
85  CLASSIC_REGION_POST,
86  CLASSIC_DUAL_PORTED_MEMORY_PRE,
87  CLASSIC_DUAL_PORTED_MEMORY_POST,
88  CLASSIC_RATE_MONOTONIC_PRE,
89  CLASSIC_RATE_MONOTONIC_POST,
90  CLASSIC_BARRIER_PRE,
91  CLASSIC_BARRIER_POST,
92#ifdef RTEMS_POSIX_API
93  POSIX_SIGNALS_PRE,
94  POSIX_SIGNALS_POST,
95  POSIX_THREADS_PRE,
96  POSIX_THREADS_POST,
97  POSIX_CONDITION_VARIABLE_PRE,
98  POSIX_CONDITION_VARIABLE_POST,
99  POSIX_MUTEX_PRE,
100  POSIX_MUTEX_POST,
101  POSIX_MESSAGE_QUEUE_PRE,
102  POSIX_MESSAGE_QUEUE_POST,
103  POSIX_SEMAPHORE_PRE,
104  POSIX_SEMAPHORE_POST,
105  POSIX_TIMER_PRE,
106  POSIX_TIMER_POST,
107  POSIX_BARRIER_PRE,
108  POSIX_BARRIER_POST,
109  POSIX_RWLOCK_PRE,
110  POSIX_RWLOCK_POST,
111  POSIX_SPINLOCK_PRE,
112  POSIX_SPINLOCK_POST,
113  POSIX_CLEANUP_PRE,
114  POSIX_CLEANUP_POST,
115#endif /* RTEMS_POSIX_API */
116  IDLE_THREADS_PRE,
117  IDLE_THREADS_POST,
118  BSP_LIBC_PRE,
119  BSP_LIBC_POST,
120  BEFORE_DRIVERS_PRE,
121  BEFORE_DRIVERS_POST,
122  BSP_PRE_DRIVERS_PRE,
123  BSP_PRE_DRIVERS_POST,
124  DEVICE_DRIVERS_PRE,
125  DEVICE_DRIVERS_POST,
126  BSP_POST_DRIVERS_PRE,
127  BSP_POST_DRIVERS_POST,
128  INIT_TASK,
129  DONE
130} init_step;
131
132#define FIRST(x) \
133  static void x##_first(void); \
134  RTEMS_SYSINIT_ITEM( \
135    x##_first, \
136    x, \
137    RTEMS_SYSINIT_ORDER_FIRST \
138  ); \
139  static void x##_first(void)
140
141#define LAST(x) \
142  static void x##_last(void); \
143  RTEMS_SYSINIT_ITEM( \
144    x##_last, \
145    x, \
146    RTEMS_SYSINIT_ORDER_LAST \
147  ); \
148  static void x##_last(void)
149
150static init_step step;
151
152static void next_step(init_step expected)
153{
154  assert(step == expected);
155  step = expected + 1;
156}
157
158FIRST(RTEMS_SYSINIT_BSP_WORK_AREAS)
159{
160  rtems_test_begink();
161  assert(_Workspace_Area.area_begin == 0);
162  next_step(BSP_WORK_AREAS_PRE);
163}
164
165LAST(RTEMS_SYSINIT_BSP_WORK_AREAS)
166{
167  assert(_Workspace_Area.area_begin != 0);
168  next_step(BSP_WORK_AREAS_POST);
169}
170
171FIRST(RTEMS_SYSINIT_BSP_START)
172{
173  /*
174   * Since the work performed here is BSP-specific, there is no way to test pre
175   * and post conditions.
176   */
177  next_step(BSP_START_PRE);
178}
179
180LAST(RTEMS_SYSINIT_BSP_START)
181{
182  next_step(BSP_START_POST);
183}
184
185FIRST(RTEMS_SYSINIT_INITIAL_EXTENSIONS)
186{
187  assert(_Chain_Is_empty(&_User_extensions_Switches_list));
188  next_step(INITIAL_EXTENSIONS_PRE);
189}
190
191LAST(RTEMS_SYSINIT_INITIAL_EXTENSIONS)
192{
193  assert(!_Chain_Is_empty(&_User_extensions_Switches_list));
194  next_step(INITIAL_EXTENSIONS_POST);
195}
196
197FIRST(RTEMS_SYSINIT_DATA_STRUCTURES)
198{
199  assert(_RTEMS_Allocator_Mutex == NULL);
200  next_step(DATA_STRUCTURES_PRE);
201}
202
203LAST(RTEMS_SYSINIT_DATA_STRUCTURES)
204{
205  assert(_RTEMS_Allocator_Mutex != NULL);
206  next_step(DATA_STRUCTURES_POST);
207}
208
209FIRST(RTEMS_SYSINIT_USER_EXTENSIONS)
210{
211  assert(_Extension_Information.maximum == 0);
212  next_step(USER_EXTENSIONS_PRE);
213}
214
215LAST(RTEMS_SYSINIT_USER_EXTENSIONS)
216{
217  assert(_Extension_Information.maximum != 0);
218  next_step(USER_EXTENSIONS_POST);
219}
220
221FIRST(RTEMS_SYSINIT_CLASSIC_TASKS)
222{
223  assert(_RTEMS_tasks_Information.Objects.maximum == 0);
224  next_step(CLASSIC_TASKS_PRE);
225}
226
227LAST(RTEMS_SYSINIT_CLASSIC_TASKS)
228{
229  assert(_RTEMS_tasks_Information.Objects.maximum != 0);
230  next_step(CLASSIC_TASKS_POST);
231}
232
233FIRST(RTEMS_SYSINIT_CLASSIC_TIMER)
234{
235  assert(_Timer_Information.maximum == 0);
236  next_step(CLASSIC_TIMER_PRE);
237}
238
239LAST(RTEMS_SYSINIT_CLASSIC_TIMER)
240{
241  assert(_Timer_Information.maximum != 0);
242  next_step(CLASSIC_TIMER_POST);
243}
244
245FIRST(RTEMS_SYSINIT_CLASSIC_SIGNAL)
246{
247  /* There is nothing to do in case RTEMS_MULTIPROCESSING is not defined */
248  next_step(CLASSIC_SIGNAL_PRE);
249}
250
251LAST(RTEMS_SYSINIT_CLASSIC_SIGNAL)
252{
253  next_step(CLASSIC_SIGNAL_POST);
254}
255
256FIRST(RTEMS_SYSINIT_CLASSIC_EVENT)
257{
258  /* There is nothing to do in case RTEMS_MULTIPROCESSING is not defined */
259  next_step(CLASSIC_EVENT_PRE);
260}
261
262LAST(RTEMS_SYSINIT_CLASSIC_EVENT)
263{
264  next_step(CLASSIC_EVENT_POST);
265}
266
267FIRST(RTEMS_SYSINIT_CLASSIC_MESSAGE_QUEUE)
268{
269  assert(_Message_queue_Information.maximum == 0);
270  next_step(CLASSIC_MESSAGE_QUEUE_PRE);
271}
272
273LAST(RTEMS_SYSINIT_CLASSIC_MESSAGE_QUEUE)
274{
275  assert(_Message_queue_Information.maximum != 0);
276  next_step(CLASSIC_MESSAGE_QUEUE_POST);
277}
278
279FIRST(RTEMS_SYSINIT_CLASSIC_SEMAPHORE)
280{
281  assert(_Semaphore_Information.maximum == 0);
282  next_step(CLASSIC_SEMAPHORE_PRE);
283}
284
285LAST(RTEMS_SYSINIT_CLASSIC_SEMAPHORE)
286{
287  assert(_Semaphore_Information.maximum != 0);
288  next_step(CLASSIC_SEMAPHORE_POST);
289}
290
291FIRST(RTEMS_SYSINIT_CLASSIC_PARTITION)
292{
293  assert(_Partition_Information.maximum == 0);
294  next_step(CLASSIC_PARTITION_PRE);
295}
296
297LAST(RTEMS_SYSINIT_CLASSIC_PARTITION)
298{
299  assert(_Partition_Information.maximum != 0);
300  next_step(CLASSIC_PARTITION_POST);
301}
302
303FIRST(RTEMS_SYSINIT_CLASSIC_REGION)
304{
305  assert(_Region_Information.maximum == 0);
306  next_step(CLASSIC_REGION_PRE);
307}
308
309LAST(RTEMS_SYSINIT_CLASSIC_REGION)
310{
311  assert(_Region_Information.maximum != 0);
312  next_step(CLASSIC_REGION_POST);
313}
314
315FIRST(RTEMS_SYSINIT_CLASSIC_DUAL_PORTED_MEMORY)
316{
317  assert(_Dual_ported_memory_Information.maximum == 0);
318  next_step(CLASSIC_DUAL_PORTED_MEMORY_PRE);
319}
320
321LAST(RTEMS_SYSINIT_CLASSIC_DUAL_PORTED_MEMORY)
322{
323  assert(_Dual_ported_memory_Information.maximum != 0);
324  next_step(CLASSIC_DUAL_PORTED_MEMORY_POST);
325}
326
327FIRST(RTEMS_SYSINIT_CLASSIC_RATE_MONOTONIC)
328{
329  assert(_Rate_monotonic_Information.maximum == 0);
330  next_step(CLASSIC_RATE_MONOTONIC_PRE);
331}
332
333LAST(RTEMS_SYSINIT_CLASSIC_RATE_MONOTONIC)
334{
335  assert(_Rate_monotonic_Information.maximum != 0);
336  next_step(CLASSIC_RATE_MONOTONIC_POST);
337}
338
339FIRST(RTEMS_SYSINIT_CLASSIC_BARRIER)
340{
341  assert(_Barrier_Information.maximum == 0);
342  next_step(CLASSIC_BARRIER_PRE);
343}
344
345LAST(RTEMS_SYSINIT_CLASSIC_BARRIER)
346{
347  assert(_Barrier_Information.maximum != 0);
348  next_step(CLASSIC_BARRIER_POST);
349}
350
351#ifdef RTEMS_POSIX_API
352
353FIRST(RTEMS_SYSINIT_POSIX_SIGNALS)
354{
355  assert(
356    memcmp(
357      &_POSIX_signals_Vectors,
358      _POSIX_signals_Default_vectors,
359      sizeof(_POSIX_signals_Vectors)
360    ) != 0
361  );
362  next_step(POSIX_SIGNALS_PRE);
363}
364
365LAST(RTEMS_SYSINIT_POSIX_SIGNALS)
366{
367  assert(
368    memcmp(
369      &_POSIX_signals_Vectors,
370      _POSIX_signals_Default_vectors,
371      sizeof(_POSIX_signals_Vectors)
372    ) == 0
373  );
374  next_step(POSIX_SIGNALS_POST);
375}
376
377FIRST(RTEMS_SYSINIT_POSIX_THREADS)
378{
379  assert(_POSIX_Threads_Information.Objects.maximum == 0);
380  next_step(POSIX_THREADS_PRE);
381}
382
383LAST(RTEMS_SYSINIT_POSIX_THREADS)
384{
385  assert(_POSIX_Threads_Information.Objects.maximum != 0);
386  next_step(POSIX_THREADS_POST);
387}
388
389FIRST(RTEMS_SYSINIT_POSIX_CONDITION_VARIABLE)
390{
391  assert(_POSIX_Condition_variables_Information.maximum == 0);
392  next_step(POSIX_CONDITION_VARIABLE_PRE);
393}
394
395LAST(RTEMS_SYSINIT_POSIX_CONDITION_VARIABLE)
396{
397  assert(_POSIX_Condition_variables_Information.maximum != 0);
398  next_step(POSIX_CONDITION_VARIABLE_POST);
399}
400
401FIRST(RTEMS_SYSINIT_POSIX_MUTEX)
402{
403  assert(_POSIX_Mutex_Information.maximum == 0);
404  next_step(POSIX_MUTEX_PRE);
405}
406
407LAST(RTEMS_SYSINIT_POSIX_MUTEX)
408{
409  assert(_POSIX_Mutex_Information.maximum != 0);
410  next_step(POSIX_MUTEX_POST);
411}
412
413FIRST(RTEMS_SYSINIT_POSIX_MESSAGE_QUEUE)
414{
415  assert(_POSIX_Message_queue_Information.maximum == 0);
416  next_step(POSIX_MESSAGE_QUEUE_PRE);
417}
418
419LAST(RTEMS_SYSINIT_POSIX_MESSAGE_QUEUE)
420{
421  assert(_POSIX_Message_queue_Information.maximum != 0);
422  next_step(POSIX_MESSAGE_QUEUE_POST);
423}
424
425FIRST(RTEMS_SYSINIT_POSIX_SEMAPHORE)
426{
427  assert(_POSIX_Semaphore_Information.maximum == 0);
428  next_step(POSIX_SEMAPHORE_PRE);
429}
430
431LAST(RTEMS_SYSINIT_POSIX_SEMAPHORE)
432{
433  assert(_POSIX_Semaphore_Information.maximum != 0);
434  next_step(POSIX_SEMAPHORE_POST);
435}
436
437FIRST(RTEMS_SYSINIT_POSIX_TIMER)
438{
439  assert(_POSIX_Timer_Information.maximum == 0);
440  next_step(POSIX_TIMER_PRE);
441}
442
443LAST(RTEMS_SYSINIT_POSIX_TIMER)
444{
445  assert(_POSIX_Timer_Information.maximum != 0);
446  next_step(POSIX_TIMER_POST);
447}
448
449FIRST(RTEMS_SYSINIT_POSIX_BARRIER)
450{
451  assert(_POSIX_Barrier_Information.maximum == 0);
452  next_step(POSIX_BARRIER_PRE);
453}
454
455LAST(RTEMS_SYSINIT_POSIX_BARRIER)
456{
457  assert(_POSIX_Barrier_Information.maximum != 0);
458  next_step(POSIX_BARRIER_POST);
459}
460
461FIRST(RTEMS_SYSINIT_POSIX_RWLOCK)
462{
463  assert(_POSIX_RWLock_Information.maximum == 0);
464  next_step(POSIX_RWLOCK_PRE);
465}
466
467LAST(RTEMS_SYSINIT_POSIX_RWLOCK)
468{
469  assert(_POSIX_RWLock_Information.maximum != 0);
470  next_step(POSIX_RWLOCK_POST);
471}
472
473FIRST(RTEMS_SYSINIT_POSIX_SPINLOCK)
474{
475  assert(_POSIX_Spinlock_Information.maximum == 0);
476  next_step(POSIX_SPINLOCK_PRE);
477}
478
479LAST(RTEMS_SYSINIT_POSIX_SPINLOCK)
480{
481  assert(_POSIX_Spinlock_Information.maximum != 0);
482  next_step(POSIX_SPINLOCK_POST);
483}
484
485static size_t user_extensions_pre_posix_cleanup;
486
487FIRST(RTEMS_SYSINIT_POSIX_CLEANUP)
488{
489  user_extensions_pre_posix_cleanup =
490    _Chain_Node_count_unprotected(&_User_extensions_List);
491  next_step(POSIX_CLEANUP_PRE);
492}
493
494LAST(RTEMS_SYSINIT_POSIX_CLEANUP)
495{
496  assert(
497    user_extensions_pre_posix_cleanup + 1 ==
498      _Chain_Node_count_unprotected(&_User_extensions_List)
499  );
500  next_step(POSIX_CLEANUP_POST);
501}
502
503#endif /* RTEMS_POSIX_API */
504
505FIRST(RTEMS_SYSINIT_IDLE_THREADS)
506{
507  assert(_System_state_Is_before_initialization(_System_state_Get()));
508  next_step(IDLE_THREADS_PRE);
509}
510
511LAST(RTEMS_SYSINIT_IDLE_THREADS)
512{
513  assert(_System_state_Is_before_multitasking(_System_state_Get()));
514  next_step(IDLE_THREADS_POST);
515}
516
517FIRST(RTEMS_SYSINIT_BSP_LIBC)
518{
519  assert(rtems_libio_semaphore == 0);
520  next_step(BSP_LIBC_PRE);
521}
522
523LAST(RTEMS_SYSINIT_BSP_LIBC)
524{
525  assert(rtems_libio_semaphore != 0);
526  next_step(BSP_LIBC_POST);
527}
528
529FIRST(RTEMS_SYSINIT_BEFORE_DRIVERS)
530{
531  /* Omit test of build configuration specific pre and post conditions */
532  next_step(BEFORE_DRIVERS_PRE);
533}
534
535LAST(RTEMS_SYSINIT_BEFORE_DRIVERS)
536{
537  next_step(BEFORE_DRIVERS_POST);
538}
539
540FIRST(RTEMS_SYSINIT_BSP_PRE_DRIVERS)
541{
542  /*
543   * Since the work performed here is BSP-specific, there is no way to test pre
544   * and post conditions.
545   */
546  next_step(BSP_PRE_DRIVERS_PRE);
547}
548
549LAST(RTEMS_SYSINIT_BSP_PRE_DRIVERS)
550{
551  next_step(BSP_PRE_DRIVERS_POST);
552}
553
554FIRST(RTEMS_SYSINIT_DEVICE_DRIVERS)
555{
556  assert(!_IO_All_drivers_initialized);
557  next_step(DEVICE_DRIVERS_PRE);
558}
559
560LAST(RTEMS_SYSINIT_DEVICE_DRIVERS)
561{
562  assert(_IO_All_drivers_initialized);
563  next_step(DEVICE_DRIVERS_POST);
564}
565
566FIRST(RTEMS_SYSINIT_BSP_POST_DRIVERS)
567{
568  assert(rtems_libio_iop_freelist != NULL);
569  next_step(BSP_POST_DRIVERS_PRE);
570}
571
572LAST(RTEMS_SYSINIT_BSP_POST_DRIVERS)
573{
574  assert(rtems_libio_iop_freelist == NULL);
575  next_step(BSP_POST_DRIVERS_POST);
576}
577
578static void Init(rtems_task_argument arg)
579{
580#ifdef RTEMS_POSIX_API
581  pthread_cleanup_push(NULL, NULL);
582  pthread_cleanup_pop(0);
583#endif /* RTEMS_POSIX_API */
584  next_step(INIT_TASK);
585  rtems_test_endk();
586  exit(0);
587}
588
589#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
590#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
591
592#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 1
593
594#define CONFIGURE_MAXIMUM_BARRIERS 1
595
596#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
597
598#define CONFIGURE_MAXIMUM_PARTITIONS 1
599
600#define CONFIGURE_MAXIMUM_PERIODS 1
601
602#define CONFIGURE_MAXIMUM_PORTS 1
603
604#define CONFIGURE_MAXIMUM_REGIONS 1
605
606#define CONFIGURE_MAXIMUM_SEMAPHORES 1
607
608#define CONFIGURE_MAXIMUM_TASKS 1
609
610#define CONFIGURE_MAXIMUM_TIMERS 1
611
612#ifdef RTEMS_POSIX_API
613
614#define CONFIGURE_MAXIMUM_POSIX_BARRIERS 1
615
616#define CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES 1
617
618#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 1
619
620#define CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES 1
621
622#define CONFIGURE_MAXIMUM_POSIX_RWLOCKS 1
623
624#define CONFIGURE_MAXIMUM_POSIX_SEMAPHORES 1
625
626#define CONFIGURE_MAXIMUM_POSIX_SPINLOCKS 1
627
628#define CONFIGURE_MAXIMUM_POSIX_TIMERS 1
629
630#define CONFIGURE_MAXIMUM_POSIX_THREADS 1
631
632#endif /* RTEMS_POSIX_API */
633
634#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
635
636#define CONFIGURE_STACK_CHECKER_ENABLED
637
638#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
639
640#define CONFIGURE_INIT
641
642#include <rtems/confdefs.h>
Note: See TracBrowser for help on using the repository browser.