summaryrefslogtreecommitdiffstats
path: root/cpukit/include/rtems/sysinit.h
blob: 3e6f4d99331f751921c798414e0f90f565b77b50 (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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
/* SPDX-License-Identifier: BSD-2-Clause */

/**
 * @file
 *
 * @ingroup RTEMSAPISystemInit
 *
 * @brief This header file provides the API of the @ref RTEMSAPISystemInit.
 */

/*
 * Copyright (C) 2015, 2023 embedded brains GmbH & Co. KG
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef _RTEMS_SYSINIT_H
#define _RTEMS_SYSINIT_H

#include <rtems/linkersets.h>

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

/**
 * @ingroup RTEMSImpl
 *
 * @brief Enables a verbose system initialization.
 */
void _Sysinit_Verbose( void );

/**
 * @ingroup RTEMSImpl
 *
 * @brief Creates the system initialization item associated with the handler
 *   and index.
 *
 * The enum helps to detect typos in the module and order parameters of
 * RTEMS_SYSINIT_ITEM().
 */
#define _RTEMS_SYSINIT_INDEX_ITEM( handler, index ) \
  enum { _Sysinit_##handler = index }; \
  RTEMS_LINKER_ROSET_ITEM_ORDERED( \
    _Sysinit, \
    rtems_sysinit_item, \
    handler, \
    index \
  ) = { handler }

/**
 * @ingroup RTEMSImpl
 *
 * @brief Creates the system initialization item associated with the handler,
 *   module, and order.
 *
 * This helper macro is used to perform parameter expansion in
 * RTEMS_SYSINIT_ITEM().
 */
#define _RTEMS_SYSINIT_ITEM( handler, module, order ) \
  _RTEMS_SYSINIT_INDEX_ITEM( handler, 0x##module##order )

/**
 * @defgroup RTEMSAPISystemInit System Initialization Support
 *
 * @ingroup RTEMSAPI
 *
 * @brief The system initialization support provides an ordered invocation of
 *   system initialization handlers registered in a linker set.
 *
 * @{
 */

/*
 * 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_SCHEDULER                  000780
#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;

/**
 * @brief Creates the system initialization item associated with the handler,
 *   module, and order.
 *
 * @param handler is the system initialization handler.
 *
 * @param module is the system initialization module.  It shall be a 6-digit
 *   hex number without a 0x-prefix.
 *
 * @param order is the system initialization order with respect to the module.
 *   It shall be a 2-digit hex number without a 0x-prefix.
 */
#define RTEMS_SYSINIT_ITEM( handler, module, order ) \
  _RTEMS_SYSINIT_ITEM( handler, module, order )

/** @} */

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* _RTEMS_SYSINIT_H */