1 // SPDX-License-Identifier: BSD-2-Clause
2 /*
3  * Copyright (c) 2017, Linaro Limited
4  * Copyright (c) 2020, Arm Limited.
5  */
6 #include <crypto/crypto.h>
7 #include <initcall.h>
8 #include <kernel/early_ta.h>
9 #include <kernel/embedded_ts.h>
10 #include <kernel/ts_store.h>
11 #include <kernel/user_ta.h>
12 #include <stdio.h>
13 #include <string.h>
14 #include <trace.h>
15 #include <utee_defines.h>
16 #include <util.h>
17 
find_early_ta(const TEE_UUID * uuid)18 static const struct embedded_ts *find_early_ta(const TEE_UUID *uuid)
19 {
20 	const struct embedded_ts *ta = NULL;
21 
22 	for_each_early_ta(ta)
23 		if (!memcmp(&ta->uuid, uuid, sizeof(*uuid)))
24 			return ta;
25 
26 	return NULL;
27 }
28 
early_ta_open(const TEE_UUID * uuid,struct ts_store_handle ** h)29 static TEE_Result early_ta_open(const TEE_UUID *uuid,
30 				struct ts_store_handle **h)
31 {
32 	return emb_ts_open(uuid, h, find_early_ta);
33 }
34 
35 REGISTER_TA_STORE(2) = {
36 	.description = "early TA",
37 	.open = early_ta_open,
38 	.get_size = emb_ts_get_size,
39 	.get_tag = emb_ts_get_tag,
40 	.read = emb_ts_read,
41 	.close = emb_ts_close,
42 };
43 
early_ta_init(void)44 static TEE_Result early_ta_init(void)
45 {
46 	const struct embedded_ts *ta = NULL;
47 	char __maybe_unused msg[60] = { '\0', };
48 
49 	for_each_early_ta(ta) {
50 		if (ta->uncompressed_size)
51 			snprintf(msg, sizeof(msg),
52 				 " (compressed, uncompressed %u)",
53 				 ta->uncompressed_size);
54 		else
55 			msg[0] = '\0';
56 		DMSG("Early TA %pUl size %u%s", (void *)&ta->uuid, ta->size,
57 		     msg);
58 	}
59 
60 	return TEE_SUCCESS;
61 }
62 
63 service_init(early_ta_init);
64