1/*
2 * Copyright (c) 2020 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16/**
17 * @addtogroup Init OHOS Init
18 * @{
19 *
20 * @brief Provides the entries for initializing and starting services and features.
21 *
22 * This module provides the entries for initializing services and features during service
23 * development. \n
24 * Services and features are initialized in the following sequence: core phase, core system
25 * service, core system feature, system startup, system service, system feature, application-layer
26 * service, and application-layer feature. \n
27 *
28 * @since 1.0
29 * @version 1.0
30 */
31
32/**
33 * @file ohos_init.h
34 *
35 * @brief Provides the entries for initializing and starting services and features.
36 *
37 * This file provides the entries for initializing services and features during service
38 * development. \n
39 *
40 * @since 1.0
41 * @version 1.0
42 */
43
44#ifndef OHOS_LAYER_INIT_H
45#define OHOS_LAYER_INIT_H
46#ifdef __cplusplus
47#if __cplusplus
48extern "C" {
49#endif
50#endif
51typedef void (*InitCall)(void);
52
53#define USED_ATTR __attribute__((used))
54
55#ifdef LAYER_INIT_SHARED_LIB
56#define LAYER_INIT_LEVEL_0 0
57#define LAYER_INIT_LEVEL_1 1
58#define LAYER_INIT_LEVEL_2 2
59#define LAYER_INIT_LEVEL_3 3
60#define LAYER_INIT_LEVEL_4 4
61#define CTOR_VALUE_device 100
62#define CTOR_VALUE_core 110
63#define CTOR_VALUE_sys_service 120
64#define CTOR_VALUE_sys_feature 130
65#define CTOR_VALUE_app_service 140
66#define CTOR_VALUE_app_feature 150
67#define CTOR_VALUE_run  700
68#define LAYER_INITCALL(func, layer, clayer, priority)                                     \
69    static __attribute__((constructor(CTOR_VALUE_##layer + LAYER_INIT_LEVEL_##priority))) \
70        void BOOT_##layer##priority##func() {func();}
71#else
72#define LAYER_INITCALL(func, layer, clayer, priority)            \
73    static const InitCall USED_ATTR __zinitcall_##layer##_##func \
74        __attribute__((section(".zinitcall." clayer #priority ".init"))) = func
75#endif
76// Default priority is 2, priority range is [0, 4]
77#define LAYER_INITCALL_DEF(func, layer, clayer) \
78    LAYER_INITCALL(func, layer, clayer, 2)
79
80/**
81 * @brief Identifies the entry for initializing and starting a core phase by the priority 2.
82 *
83 * This macro is used when Samgr is initialized and started. \n
84 * This macro is used to identify the entry called at the priority 2 of the core phase of
85 * the startup process. \n
86 *
87 * @param func Indicates the entry function for initializing and starting a core phase.
88 * The type is void (*)(void).
89 */
90#define CORE_INIT(func) LAYER_INITCALL_DEF(func, core, "core")
91/**
92 * @brief Identifies the entry for initializing and starting a core phase by the specified
93 * priority.
94 *
95 * This macro is used when Samgr is initialized and started. \n
96 * This macro is used to identify the entry called at the specified priority of the core phase of
97 * the startup process. \n
98 *
99 * @param func Indicates the entry function for initializing and starting a core phase.
100 * The type is void (*)(void).
101 * @param priority Indicates the calling priority when starting the core phase.
102 * The value range is [0,5), and the calling sequence is 0, 1, 2, 3, and 4.
103 */
104#define CORE_INIT_PRI(func, priority) LAYER_INITCALL(func, core, "core", priority)
105
106/**
107 * @brief Identifies the entry for initializing and starting a core system service by the
108 * priority 2.
109 *
110 * This macro is used to identify the entry called at the priority 2 in the core system
111 * service phase of the startup process. \n
112 *
113 * @param func Indicates the entry function for initializing and starting a core system service.
114 * The type is void (*)(void).
115 */
116#define SYS_SERVICE_INIT(func) LAYER_INITCALL_DEF(func, sys_service, "sys.service")
117/**
118 * @brief Identifies the entry for initializing and starting a core system service by the
119 * specified priority.
120 *
121 * This macro is used to identify the entry called at the specified priority in the core system
122 * service phase of the startup process. \n
123 *
124 * @param func Indicates the entry function for initializing and starting a core system service.
125 * The type is void (*)(void).
126 * @param priority Indicates the calling priority when starting the core system service in the
127 * startup phase. The value range is [0,5), and the calling sequence is 0, 1, 2, 3, and 4.
128 */
129#define SYS_SERVICE_INIT_PRI(func, priority) LAYER_INITCALL(func, sys_service, "sys.service", priority)
130
131/**
132 * @brief Identifies the entry for initializing and starting a core system feature by the
133 * priority 2.
134 *
135 * This macro is used to identify the entry called at the priority 2 in the core system
136 * feature phase of the startup process. \n
137 *
138 * @param func Indicates the entry function for initializing and starting a core system service.
139 * The type is void (*)(void).
140 */
141#define SYS_FEATURE_INIT(func) LAYER_INITCALL_DEF(func, sys_feature, "sys.feature")
142/**
143 * @brief Identifies the entry for initializing and starting a core system feature by the
144 * specified priority.
145 *
146 * This macro is used to identify the entry called at the specified priority in the core system
147 * feature phase of the startup process. \n
148 *
149 * @param func Indicates the entry function for initializing and starting a core system feature.
150 * The type is void (*)(void).
151 * @param priority Indicates the calling priority when starting the core system feature phase.
152 * The value range is [0, 5), and the calling sequence is 0, 1, 2, 3, and 4.
153 */
154#define SYS_FEATURE_INIT_PRI(func, priority) LAYER_INITCALL(func, sys_feature, "sys.feature", priority)
155
156/**
157 * @brief Identifies the entry for initializing and starting a system running phase by the
158 * priority 2.
159 *
160 * This macro is used to identify the entry called at the priority 2 in the system startup
161 * phase of the startup process. \n
162 *
163 * @param func Indicates the entry function for initializing and starting a system running phase.
164 * The type is void (*)(void).
165 */
166#define SYS_RUN(func) LAYER_INITCALL_DEF(func, run, "run")
167/**
168 * @brief Identifies the entry for initializing and starting a system running phase by the
169 * specified priority.
170 *
171 * This macro is used to identify the entry called at the specified priority in the system startup
172 * phase of the startup process. \n
173 *
174 * @param func Indicates the entry function for initializing and starting a system running phase.
175 * The type is void (*)(void).
176 * @param priority Indicates the calling priority when starting the system startup phase.
177 * The value range is [0, 5), and the calling sequence is 0, 1, 2, 3, and 4.
178 */
179#define SYS_RUN_PRI(func, priority) LAYER_INITCALL(func, run, "run", priority)
180
181/**
182 * @brief Identifies the entry for initializing and starting a system service by the priority 2.
183 *
184 * This macro is used to identify the entry called at the priority 2 in the system service
185 * phase of the startup process. \n
186 *
187 * @param func Indicates the entry function for initializing and starting a system service.
188 * The type is void (*)(void).
189 */
190#define SYSEX_SERVICE_INIT(func) LAYER_INITCALL_DEF(func, app_service, "app.service")
191/**
192 * @brief Identifies the entry for initializing and starting a system service by the specified
193 * priority.
194 *
195 * This macro is used to identify the entry called at the specified priority of the system service
196 * phase of the startup process. \n
197 *
198 * @param func Indicates the entry function for initializing and starting a system service.
199 * The type is void (*)(void).
200 * @param priority Indicates the calling priority when starting the system service phase.
201 * The value range is [0,5), and the calling sequence is 0, 1, 2, 3, and 4.
202 */
203#define SYSEX_SERVICE_INIT_PRI(func, priority) LAYER_INITCALL(func, app_service, "app.service", priority)
204
205/**
206 * @brief Identifies the entry for initializing and starting a system feature by the priority 2.
207 *
208 * This macro is used to identify the entry called at the priority 2 of the system feature
209 * phase of the startup process. \n
210 *
211 * @param func Indicates the entry function for initializing and starting a system feature.
212 * The type is void (*)(void).
213 */
214#define SYSEX_FEATURE_INIT(func) LAYER_INITCALL_DEF(func, app_feature, "app.feature")
215/**
216 * @brief Identifies the entry for initializing and starting a system feature by the specified
217 * priority.
218 *
219 * This macro is used to identify the entry called at the specified priority of the system feature
220 * phase of the startup process. \n
221 *
222 * @param func Indicates the entry function for initializing and starting a system feature.
223 * The type is void (*)(void).
224 * @param priority Indicates the calling priority when starting the system feature phase.
225 * The value range is [0,5), and the calling sequence is 0, 1, 2, 3, and 4.
226 */
227#define SYSEX_FEATURE_INIT_PRI(func, priority) LAYER_INITCALL(func, app_feature, "app.feature", priority)
228
229/**
230 * @brief Identifies the entry for initializing and starting an application-layer service by the
231 * priority 2.
232 *
233 * This macro is used to identify the entry called at the priority 2 of the application-layer
234 * service phase of the startup process. \n
235 *
236 * @param func Indicates the entry function for initializing and starting an application-layer
237 * service. The type is void (*)(void).
238 */
239#define APP_SERVICE_INIT(func) LAYER_INITCALL_DEF(func, app_service, "app.service")
240/**
241 * @brief Identifies the entry for initializing and starting an application-layer service by the
242 * specified priority.
243 *
244 * This macro is used to identify the entry called at the specified priority of the
245 * application-layer service phase of the startup process. \n
246 *
247 * @param func Indicates the entry function for initializing and starting an application-layer
248 * service. The type is void (*)(void).
249 * @param priority Indicates the calling priority when starting the application-layer service
250 * phase. The value range is [0,5), and the calling sequence is 0, 1, 2, 3, and 4.
251 */
252#define APP_SERVICE_INIT_PRI(func, priority) LAYER_INITCALL(func, app_service, "app.service", priority)
253
254/**
255 * @brief Identifies the entry for initializing and starting an application-layer feature by the
256 * priority 2.
257 *
258 * This macro is used to identify the entry called at the priority 2 of the application-layer
259 * feature phase of the startup process. \n
260 *
261 * @param func Indicates the entry function for initializing and starting an application-layer
262 * feature. The type is void (*)(void).
263 */
264#define APP_FEATURE_INIT(func) LAYER_INITCALL_DEF(func, app_feature, "app.feature")
265/**
266 * @brief Identifies the entry for initializing and starting an application-layer feature by
267 * the specified priority.
268 *
269 * This macro is used to identify the entry called at the specified priority of the
270 * application-layer feature phase of the startup process. \n
271 *
272 * @param func Indicates the entry function for initializing and starting an application-layer
273 * feature. The type is void (*)(void).
274 * @param priority Indicates the calling priority when starting the application-layer feature.
275 * The value range is [0, 5), and the calling sequence is 0, 1, 2, 3, and 4.
276 */
277#define APP_FEATURE_INIT_PRI(func, priority) LAYER_INITCALL(func, app_feature, "app.feature", priority)
278
279#ifdef __cplusplus
280#if __cplusplus
281}
282#endif
283#endif
284#endif // OHOS_LAYER_INIT_H
285/** @} */
286