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