summaryrefslogtreecommitdiffstats
path: root/cpukit/include/rtems/sysinit.h
blob: 3e85aa9a2b44c6d47a8f79de47dd9a280978005f (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
/*
 * Copyright (c) 2015, 2020 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.
 */

#ifndef _RTEMS_SYSINIT_H
#define _RTEMS_SYSINIT_H

#include <rtems/linkersets.h>

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/*
 * The value of each module define must consist of exactly six hexadecimal
 * digits without a 0x-prefix.  A 0x-prefix is concatenated with the module and
 * order values to form a proper integer literal.
 */
#define RTEMS_SYSINIT_RECORD                     000100
#define RTEMS_SYSINIT_BSP_EARLY                  000140
#define RTEMS_SYSINIT_MEMORY                     000180
#define RTEMS_SYSINIT_DIRTY_MEMORY               0001c0
#define RTEMS_SYSINIT_ZERO_MEMORY                0001e0
#define RTEMS_SYSINIT_ISR_STACK                  000200
#define RTEMS_SYSINIT_PER_CPU_DATA               000220
#define RTEMS_SYSINIT_SBRK                       000240
#define RTEMS_SYSINIT_STACK_ALLOCATOR            000250
#define RTEMS_SYSINIT_WORKSPACE                  000260
#define RTEMS_SYSINIT_MALLOC                     000280
#define RTEMS_SYSINIT_BSP_START                  000300
#define RTEMS_SYSINIT_CPU_COUNTER                000400
#define RTEMS_SYSINIT_TARGET_HASH                000480
#define RTEMS_SYSINIT_INITIAL_EXTENSIONS         000500
#define RTEMS_SYSINIT_MP_EARLY                   000600
#define RTEMS_SYSINIT_DATA_STRUCTURES            000700
#define RTEMS_SYSINIT_MP                         000800
#define RTEMS_SYSINIT_USER_EXTENSIONS            000900
#define RTEMS_SYSINIT_CLASSIC_TASKS              000a00
#define RTEMS_SYSINIT_CLASSIC_TASKS_MP           000a80
#define RTEMS_SYSINIT_CLASSIC_TIMER              000b00
#define RTEMS_SYSINIT_CLASSIC_SIGNAL_MP          000c00
#define RTEMS_SYSINIT_CLASSIC_EVENT_MP           000d00
#define RTEMS_SYSINIT_CLASSIC_MESSAGE_QUEUE      000e00
#define RTEMS_SYSINIT_CLASSIC_MESSAGE_QUEUE_MP   000e80
#define RTEMS_SYSINIT_CLASSIC_SEMAPHORE          000f00
#define RTEMS_SYSINIT_CLASSIC_SEMAPHORE_MP       000f80
#define RTEMS_SYSINIT_CLASSIC_PARTITION          001000
#define RTEMS_SYSINIT_CLASSIC_PARTITION_MP       001080
#define RTEMS_SYSINIT_CLASSIC_REGION             001100
#define RTEMS_SYSINIT_CLASSIC_DUAL_PORTED_MEMORY 001200
#define RTEMS_SYSINIT_CLASSIC_RATE_MONOTONIC     001300
#define RTEMS_SYSINIT_CLASSIC_BARRIER            001400
#define RTEMS_SYSINIT_POSIX_SIGNALS              001500
#define RTEMS_SYSINIT_POSIX_THREADS              001600
#define RTEMS_SYSINIT_POSIX_MESSAGE_QUEUE        001700
#define RTEMS_SYSINIT_POSIX_SEMAPHORE            001800
#define RTEMS_SYSINIT_POSIX_TIMER                001900
#define RTEMS_SYSINIT_POSIX_SHM                  001a00
#define RTEMS_SYSINIT_POSIX_KEYS                 001b00
#define RTEMS_SYSINIT_POSIX_CLEANUP              001c00
#define RTEMS_SYSINIT_IDLE_THREADS               001d00
#define RTEMS_SYSINIT_LIBIO                      001e00
#define RTEMS_SYSINIT_USER_ENVIRONMENT           001e80
#define RTEMS_SYSINIT_ROOT_FILESYSTEM            001f00
#define RTEMS_SYSINIT_DRVMGR                     002000
#define RTEMS_SYSINIT_MP_SERVER                  002100
#define RTEMS_SYSINIT_BSP_PRE_DRIVERS            002200
#define RTEMS_SYSINIT_DRVMGR_LEVEL_1             002300
#define RTEMS_SYSINIT_DEVICE_DRIVERS             002400
#define RTEMS_SYSINIT_DRVMGR_LEVEL_2             002500
#define RTEMS_SYSINIT_DRVMGR_LEVEL_3             002600
#define RTEMS_SYSINIT_DRVMGR_LEVEL_4             002700
#define RTEMS_SYSINIT_MP_FINALIZE                002800
#define RTEMS_SYSINIT_CLASSIC_USER_TASKS         002900
#define RTEMS_SYSINIT_POSIX_USER_THREADS         002a00
#define RTEMS_SYSINIT_STD_FILE_DESCRIPTORS       002b00
#define RTEMS_SYSINIT_LAST                       ffffff

/*
 * The value of each order define must consist of exactly two hexadecimal
 * digits without a 0x-prefix.  A 0x-prefix is concatenated with the module and
 * order values to form a proper integer literal.
 */
#define RTEMS_SYSINIT_ORDER_FIRST      00
#define RTEMS_SYSINIT_ORDER_SECOND     01
#define RTEMS_SYSINIT_ORDER_THIRD      02
#define RTEMS_SYSINIT_ORDER_FOURTH     03
#define RTEMS_SYSINIT_ORDER_FIFTH      04
#define RTEMS_SYSINIT_ORDER_SIXTH      05
#define RTEMS_SYSINIT_ORDER_SEVENTH    06
#define RTEMS_SYSINIT_ORDER_EIGHTH     07
#define RTEMS_SYSINIT_ORDER_NINETH     08
#define RTEMS_SYSINIT_ORDER_TENTH      09
#define RTEMS_SYSINIT_ORDER_MIDDLE     80
#define RTEMS_SYSINIT_ORDER_LAST_BUT_9 f6
#define RTEMS_SYSINIT_ORDER_LAST_BUT_8 f7
#define RTEMS_SYSINIT_ORDER_LAST_BUT_7 f8
#define RTEMS_SYSINIT_ORDER_LAST_BUT_6 f9
#define RTEMS_SYSINIT_ORDER_LAST_BUT_5 fa
#define RTEMS_SYSINIT_ORDER_LAST_BUT_4 fb
#define RTEMS_SYSINIT_ORDER_LAST_BUT_3 fc
#define RTEMS_SYSINIT_ORDER_LAST_BUT_2 fd
#define RTEMS_SYSINIT_ORDER_LAST_BUT_1 fe
#define RTEMS_SYSINIT_ORDER_LAST       ff

typedef void ( *rtems_sysinit_handler )( void );

typedef struct {
  rtems_sysinit_handler handler;
} rtems_sysinit_item;

/* The enum helps to detect typos in the module and order parameters */
#define _RTEMS_SYSINIT_INDEX_ITEM( handler, index ) \
  enum { _Sysinit_##handler = index }; \
  RTEMS_LINKER_ROSET_ITEM_ORDERED( \
    _Sysinit, \
    rtems_sysinit_item, \
    handler, \
    index \
  ) = { handler }

/* Create index from module and order */
#define _RTEMS_SYSINIT_ITEM( handler, module, order ) \
  _RTEMS_SYSINIT_INDEX_ITEM( handler, 0x##module##order )

/* Perform parameter expansion */
#define RTEMS_SYSINIT_ITEM( handler, module, order ) \
  _RTEMS_SYSINIT_ITEM( handler, module, order )

/**
 * @brief System initialization handler to enable a verbose system
 * initialization.
 */
void _Sysinit_Verbose( void );

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* _RTEMS_SYSINIT_H */