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 #ifndef LITE_BOOTSTRAP_SERVICE_H
16 #define LITE_BOOTSTRAP_SERVICE_H
17 #ifdef __cplusplus
18 #if __cplusplus
19 extern "C" {
20 #endif
21 #endif
22 
23 #define APP_NAME(name, step) ".zinitcall.app." #name #step ".init"
24 #define MODULE_NAME(name, step) ".zinitcall." #name #step ".init"
25 
26 #define APP_CALL(name, step)                                      \
27     do {                                                          \
28         InitCall *initcall = (InitCall *)(APP_BEGIN(name, step)); \
29         InitCall *initend = (InitCall *)(APP_END(name, step));    \
30         for (; initcall < initend; initcall++) {                  \
31             (*initcall)();                                        \
32         }                                                         \
33     } while (0)
34 
35 #define MODULE_CALL(name, step)                                      \
36     do {                                                             \
37         InitCall *initcall = (InitCall *)(MODULE_BEGIN(name, step)); \
38         InitCall *initend = (InitCall *)(MODULE_END(name, step));    \
39         for (; initcall < initend; initcall++) {                     \
40             (*initcall)();                                           \
41         }                                                            \
42     } while (0)
43 
44 #if (defined(__GNUC__) || defined(__clang__))
45 #define APP_BEGIN(name, step)                                 \
46     ({  extern InitCall __zinitcall_app_##name##_start;       \
47         InitCall *initCall = &__zinitcall_app_##name##_start; \
48         (initCall);                                           \
49     })
50 
51 #define APP_END(name, step)                                 \
52     ({  extern InitCall __zinitcall_app_##name##_end;       \
53         InitCall *initCall = &__zinitcall_app_##name##_end; \
54         (initCall);                                         \
55     })
56 
57 #define MODULE_BEGIN(name, step)                          \
58     ({  extern InitCall __zinitcall_##name##_start;       \
59         InitCall *initCall = &__zinitcall_##name##_start; \
60         (initCall);                                       \
61     })
62 #define MODULE_END(name, step)                          \
63     ({  extern InitCall __zinitcall_##name##_end;       \
64         InitCall *initCall = &__zinitcall_##name##_end; \
65         (initCall);                                     \
66     })
67 
68 #define INIT_APP_CALL(name)                             \
69     do {                                                \
70         APP_CALL(name, 0);                              \
71     } while (0)
72 
73 #define INIT_TEST_CALL()                                \
74     do {                                                \
75         MODULE_CALL(test, 0);                           \
76     } while (0)
77 
78 #elif (defined(__ICCARM__))
79 #define APP_BEGIN(name, step) __section_begin(APP_NAME(name, step))
80 #define APP_END(name, step) __section_end(APP_NAME(name, step))
81 #define MODULE_BEGIN(name, step) __section_begin(MODULE_NAME(name, step))
82 #define MODULE_END(name, step) __section_end(MODULE_NAME(name, step))
83 
84 #pragma section = APP_NAME(service, 0)
85 #pragma section = APP_NAME(service, 1)
86 #pragma section = APP_NAME(service, 2)
87 #pragma section = APP_NAME(service, 3)
88 #pragma section = APP_NAME(service, 4)
89 #pragma section = APP_NAME(feature, 0)
90 #pragma section = APP_NAME(feature, 1)
91 #pragma section = APP_NAME(feature, 2)
92 #pragma section = APP_NAME(feature, 3)
93 #pragma section = APP_NAME(feature, 4)
94 #pragma section = MODULE_NAME(test, 0)
95 #pragma section = MODULE_NAME(test, 1)
96 #pragma section = MODULE_NAME(test, 2)
97 #pragma section = MODULE_NAME(test, 3)
98 #pragma section = MODULE_NAME(test, 4)
99 
100 #define INIT_APP_CALL(name) \
101     do {                    \
102         APP_CALL(name, 0);  \
103         APP_CALL(name, 1);  \
104         APP_CALL(name, 2);  \
105         APP_CALL(name, 3);  \
106         APP_CALL(name, 4);  \
107     } while (0)
108 
109 #define INIT_TEST_CALL()      \
110     do {                      \
111         MODULE_CALL(test, 0); \
112         MODULE_CALL(test, 1); \
113         MODULE_CALL(test, 2); \
114         MODULE_CALL(test, 3); \
115         MODULE_CALL(test, 4); \
116     } while (0)
117 #else
118 #error Not support current compiler!
119 #endif
120 
121 #ifdef __cplusplus
122 #if __cplusplus
123 }
124 #endif
125 #endif
126 #endif // LITE_BOOTSTRAP_SERVICE_H
127