xref: /optee_os/core/kernel/initcall.c (revision bd59a6ad7593cfac9075a9e7e854620ba80dada3)
1c5c56024SJens Wiklander // SPDX-License-Identifier: BSD-2-Clause
2c5c56024SJens Wiklander /*
3c5c56024SJens Wiklander  * Copyright (c) 2020, Linaro Limited
4c5c56024SJens Wiklander  * Copyright (c) 2014, STMicroelectronics International N.V.
5c5c56024SJens Wiklander  */
6c5c56024SJens Wiklander 
7c5c56024SJens Wiklander #include <initcall.h>
8c5c56024SJens Wiklander #include <trace.h>
9c5c56024SJens Wiklander #include <kernel/linker.h>
10c5c56024SJens Wiklander 
11c5c56024SJens Wiklander /*
12c5c56024SJens Wiklander  * Note: this function is weak just to make it possible to exclude it from
13c5c56024SJens Wiklander  * the unpaged area.
14c5c56024SJens Wiklander  */
15*bd59a6adSJens Wiklander void __weak call_preinitcalls(void)
16*bd59a6adSJens Wiklander {
17*bd59a6adSJens Wiklander 	const struct initcall *call = NULL;
18*bd59a6adSJens Wiklander 	TEE_Result ret = TEE_SUCCESS;
19*bd59a6adSJens Wiklander 
20*bd59a6adSJens Wiklander 	for (call = preinitcall_begin; call < preinitcall_end; call++) {
21*bd59a6adSJens Wiklander 		DMSG("level %d %s()", call->level, call->func_name);
22*bd59a6adSJens Wiklander 		ret = call->func();
23*bd59a6adSJens Wiklander 		if (ret != TEE_SUCCESS) {
24*bd59a6adSJens Wiklander 			EMSG("Preinitcall __text_start + 0x%08" PRIxVA
25*bd59a6adSJens Wiklander 			     " failed", (vaddr_t)call - VCORE_START_VA);
26*bd59a6adSJens Wiklander 		}
27*bd59a6adSJens Wiklander 	}
28*bd59a6adSJens Wiklander }
29*bd59a6adSJens Wiklander 
30*bd59a6adSJens Wiklander /*
31*bd59a6adSJens Wiklander  * Note: this function is weak just to make it possible to exclude it from
32*bd59a6adSJens Wiklander  * the unpaged area.
33*bd59a6adSJens Wiklander  */
34c5c56024SJens Wiklander void __weak call_initcalls(void)
35c5c56024SJens Wiklander {
36c5c56024SJens Wiklander 	const struct initcall *call = NULL;
37c5c56024SJens Wiklander 	TEE_Result ret = TEE_SUCCESS;
38c5c56024SJens Wiklander 
39c5c56024SJens Wiklander 	for (call = initcall_begin; call < initcall_end; call++) {
40c5c56024SJens Wiklander 		DMSG("level %d %s()", call->level, call->func_name);
41c5c56024SJens Wiklander 		ret = call->func();
42c5c56024SJens Wiklander 		if (ret != TEE_SUCCESS) {
43c5c56024SJens Wiklander 			EMSG("Initcall __text_start + 0x%08" PRIxVA
44c5c56024SJens Wiklander 			     " failed", (vaddr_t)call - VCORE_START_VA);
45c5c56024SJens Wiklander 		}
46c5c56024SJens Wiklander 	}
47c5c56024SJens Wiklander }
48e3172f9dSJens Wiklander 
49e3172f9dSJens Wiklander /*
50e3172f9dSJens Wiklander  * Note: this function is weak just to make it possible to exclude it from
51e3172f9dSJens Wiklander  * the unpaged area.
52e3172f9dSJens Wiklander  */
53e3172f9dSJens Wiklander void __weak call_finalcalls(void)
54e3172f9dSJens Wiklander {
55e3172f9dSJens Wiklander 	const struct initcall *call = NULL;
56e3172f9dSJens Wiklander 	TEE_Result ret = TEE_SUCCESS;
57e3172f9dSJens Wiklander 
58e3172f9dSJens Wiklander 	for (call = finalcall_begin; call < finalcall_end; call++) {
59e3172f9dSJens Wiklander 		DMSG("level %d %s()", call->level, call->func_name);
60e3172f9dSJens Wiklander 		ret = call->func();
61e3172f9dSJens Wiklander 		if (ret != TEE_SUCCESS) {
62e3172f9dSJens Wiklander 			EMSG("Finalcall __text_start + 0x%08" PRIxVA
63e3172f9dSJens Wiklander 			     " failed", (vaddr_t)call - VCORE_START_VA);
64e3172f9dSJens Wiklander 		}
65e3172f9dSJens Wiklander 	}
66e3172f9dSJens Wiklander }
67