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