Permalink
Cannot retrieve contributors at this time
Fetching contributors…
| /* | |
| * Copyright (c) 2013-2015 TRUSTONIC LIMITED | |
| * All rights reserved. | |
| * | |
| * Redistribution and use in source and binary forms, with or without | |
| * modification, are permitted provided that the following conditions are met: | |
| * | |
| * 1. Redistributions of source code must retain the above copyright notice, | |
| * this list of conditions and the following disclaimer. | |
| * | |
| * 2. Redistributions in binary form must reproduce the above copyright | |
| * notice, this list of conditions and the following disclaimer in the | |
| * documentation and/or other materials provided with the distribution. | |
| * | |
| * 3. Neither the name of the TRUSTONIC LIMITED nor the names of its | |
| * contributors may be used to endorse or promote products derived from | |
| * this software without specific prior written permission. | |
| * | |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | |
| * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR | |
| * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; | |
| * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | |
| * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR | |
| * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF | |
| * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| */ | |
| #ifndef MCLOADFORMAT_H_ | |
| #define MCLOADFORMAT_H_ | |
| #include "mcUuid.h" | |
| #include "mcSuid.h" | |
| #include "mcDriverId.h" | |
| #define MCLF_VERSION_MAJOR 2 | |
| #define MCLF_VERSION_MINOR 5 | |
| #define MCLF_VERSION_MINOR_CURRENT 3 | |
| #define MC_SERVICE_HEADER_MAGIC_BE ((uint32_t)('M'|('C'<<8)|('L'<<16)|('F'<<24))) /**< "MCLF" in big endian integer representation */ | |
| #define MC_SERVICE_HEADER_MAGIC_LE ((uint32_t)(('M'<<24)|('C'<<16)|('L'<<8)|'F')) /**< "MCLF" in little endian integer representation */ | |
| #define MC_SERVICE_HEADER_MAGIC_STR "MCLF" /**< "MCLF" as string */ | |
| /** @name MCLF flags */ | |
| #define MC_SERVICE_HEADER_FLAGS_PERMANENT (1U << 0) /**< Loaded service cannot be unloaded from MobiCore. */ | |
| #define MC_SERVICE_HEADER_FLAGS_NO_CONTROL_INTERFACE (1U << 1) /**< Service has no WSM control interface. */ | |
| #define MC_SERVICE_HEADER_FLAGS_DEBUGGABLE (1U << 2) /**< Service can be debugged. */ | |
| #define MC_SERVICE_HEADER_FLAGS_EXTENDED_LAYOUT (1U << 3) /**< New-layout trusted application or trusted driver. */ | |
| /** Service type. | |
| * The service type defines the type of executable. | |
| */ | |
| typedef enum { | |
| SERVICE_TYPE_ILLEGAL = 0, /**< Service type is invalid. */ | |
| SERVICE_TYPE_DRIVER = 1, /**< Service is a driver. */ | |
| SERVICE_TYPE_SP_TRUSTLET = 2, /**< Service is a Trustlet. */ | |
| SERVICE_TYPE_SYSTEM_TRUSTLET = 3, /**< Service is a system Trustlet. */ | |
| SERVICE_TYPE_MIDDLEWARE = 4, /**< Service is a middleware. */ | |
| SERVICE_TYPE_LAST_ENTRY = 5, /**< marker for last entry */ | |
| } serviceType_t; | |
| /** | |
| * Memory types. | |
| */ | |
| typedef enum { | |
| MCLF_MEM_TYPE_INTERNAL_PREFERRED = 0, /**< If available use internal memory; otherwise external memory. */ | |
| MCLF_MEM_TYPE_INTERNAL = 1, /**< Internal memory must be used for executing the service. */ | |
| MCLF_MEM_TYPE_EXTERNAL = 2, /**< External memory must be used for executing the service. */ | |
| } memType_t; | |
| /** | |
| * Descriptor for a memory segment. | |
| */ | |
| typedef struct { | |
| uint32_t start; /**< Virtual start address. */ | |
| uint32_t len; /**< Length of the segment in bytes. */ | |
| } segmentDescriptor_t, *segmentDescriptor_ptr; | |
| /** | |
| * MCLF intro for data structure identification. | |
| * Must be the first element of a valid MCLF file. | |
| */ | |
| typedef struct { | |
| uint32_t magic; /**< Header magic value ASCII "MCLF". */ | |
| uint32_t version; /**< Version of the MCLF header structure. */ | |
| } mclfIntro_t, *mclfIntro_ptr; | |
| // Version 2 ///////////////////////////////////////////////////////////////////////////////////////////////////////// | |
| /** | |
| * @defgroup MCLF_VER_V2 MCLF Version 32 | |
| * @ingroup MCLF_VER | |
| * | |
| * @addtogroup MCLF_VER_V2 | |
| */ | |
| /** | |
| * Version 2.1/2.2 MCLF header. | |
| */ | |
| typedef struct { | |
| mclfIntro_t intro; /**< MCLF header start with the mandatory intro. */ | |
| uint32_t flags; /**< Service flags. */ | |
| memType_t memType; /**< Type of memory the service must be executed from. */ | |
| serviceType_t serviceType; /**< Type of service. */ | |
| uint32_t numInstances; /**< Number of instances which can be run simultaneously. */ | |
| mcUuid_t uuid; /**< Loadable service unique identifier (UUID). */ | |
| mcDriverId_t driverId; /**< If the serviceType is SERVICE_TYPE_DRIVER the Driver ID is used. */ | |
| uint32_t numThreads; /**< | |
| * <pre> | |
| * <br>Number of threads (N) in a service depending on service type.<br> | |
| * | |
| * SERVICE_TYPE_SP_TRUSTLET: N = 1 | |
| * SERVICE_TYPE_SYSTEM_TRUSTLET: N = 1 | |
| * SERVICE_TYPE_DRIVER: N >= 1 | |
| * </pre> | |
| */ | |
| segmentDescriptor_t text; /**< Virtual text segment. */ | |
| segmentDescriptor_t data; /**< Virtual data segment. */ | |
| uint32_t bssLen; /**< Length of the BSS segment in bytes. MUST be at least 8 byte. */ | |
| uint32_t entry; /**< Virtual start address of service code. */ | |
| uint32_t serviceVersion; /**< Version of the interface the driver exports. */ | |
| // These should be put on next MCLF update: | |
| // mcSuid_t permittedSuid; /**< Starting 2.3: If nonzero, suid which is allowed to execute binary */ | |
| // uint32_t permittedHwCf; /**< Starting 2.3: If nonzero, hw configuration which is allowed to execute binary */ | |
| } mclfHeaderV2_t, *mclfHeaderV2_ptr; | |
| /** | |
| * Version 2.3 MCLF header. | |
| */ | |
| typedef struct { | |
| mclfHeaderV2_t mclfHeaderV2; | |
| mcSuid_t permittedSuid; /**< Starting 2.3: If nonzero, suid which is allowed to execute binary */ | |
| uint32_t permittedHwCfg; /**< Starting 2.3: If nonzero, hw configuration which is allowed to execute binary */ | |
| } mclfHeaderV23_t, *mclfHeaderV23_ptr; | |
| /** | |
| * Version 2.4 MCLF header. | |
| */ | |
| typedef struct { | |
| mclfHeaderV23_t mclfHeaderV2; | |
| uint32_t gp_level; /**<Starting 2.4: 0 for legacy MobiCore trustlets and 1 for Potato TAs. */ | |
| uint32_t attestationOffset; /**<Starting 2.4: Offset of attestation data area. */ | |
| } mclfHeaderV24_t, *mclfHeaderV24_ptr; | |
| /* | |
| * HEAP parameters | |
| */ | |
| typedef struct { | |
| uint32_t init; | |
| uint32_t max; | |
| } heapSize_t, *heapSize_ptr; | |
| /* | |
| * McLib Internal Management Data | |
| * This structure defines the parameters of a buffer used internally by McLib for each TA/TDriver | |
| * and it specifies default heap parameters (for MCLF header versions >=2.5) | |
| * | |
| * `mcLibData` field describes McLib work buffer | |
| * and it is used for MCLF header versions <=2.4 | |
| * In this case the buffer is a part of TA BSS section | |
| * | |
| * For MCLF header versions >=2.5 `mcLibData` field is not used anymore and | |
| * replaced by `mcLibData` field | |
| * RTM itself determines actual address in this case and sets `mcLibData` field value | |
| * | |
| * `heapSize` field describes default heap parameters and | |
| * it is used only for MCLF header versions >=2.5 | |
| * | |
| */ | |
| typedef struct { | |
| union { | |
| segmentDescriptor_t mcLibData; /**< Segment for McLib data. | |
| Set at compile time. | |
| Required always. */ | |
| heapSize_t heapSize; /**< Initial and maximum heap sizes. | |
| Set by MobiConvert for extended-layout TAs */ | |
| } cfg; | |
| uint32_t mcLibBase; /**< McLib base address. | |
| Mobicore sets at load time for trustlets / drivers. | |
| Required always. */ | |
| } mclfIMD_t, *mclfIMD_ptr; | |
| /** | |
| * Version 2 MCLF text segment header. | |
| * Required to be present in MobiCore 1.2 components at address (0x1080). | |
| * This extension is initialized already at trustlet compile time, | |
| * but may be modified later by configuration tools and by MobiCore at load time. | |
| */ | |
| typedef struct { | |
| uint32_t version; /**< Version of the TextHeader structure. */ | |
| uint32_t textHeaderLen; /**< Size of this structure (fixed at compile time) */ | |
| uint32_t requiredFeat; /**< Flags to indicate features that Mobicore must understand/interprete when loading. | |
| Required always. */ | |
| uint32_t mcLibEntry; /**< Address for McLib entry. | |
| Mobicore sets at load time for trustlets / drivers. | |
| Required always. */ | |
| mclfIMD_t mcIMD; /**< McLib Internal Management Data */ | |
| uint32_t tlApiVers; /**< TlApi version used when building trustlet. | |
| Value set at compile time. | |
| Required always. */ | |
| uint32_t drApiVers; /**< DrApi version used when building trustlet. | |
| Value set at compile time for drivers. 0 for trustlets. | |
| Required always. */ | |
| uint32_t ta_properties; /**< address of _TA_Properties in the TA. */ | |
| } mclfTextHeader_t, *mclfTextHeader_ptr; | |
| // Version 2 /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| /** | |
| * @addtogroup MCLF | |
| */ | |
| /** MCLF header */ | |
| typedef union { | |
| mclfIntro_t intro; /**< Intro for data structure identification. */ | |
| mclfHeaderV2_t mclfHeaderV2; /**< Version 2 header */ | |
| } mclfHeader_t, *mclfHeader_ptr; | |
| // Version 2.3 changes header definition | |
| // Above structure is hard-coded into many places. | |
| // So new changes are made into separate structure. | |
| #define MCLF_HEADER_SIZE_V23 (0x080) | |
| // Actual (known) length can be calculated using macro | |
| #define MCLF_HEADER_SIZE(version) ((version)>0x20002?(MCLF_HEADER_SIZE_V23):sizeof(mclfHeader_t)) | |
| // This is only minimum size, so nothing below this makes sense. | |
| #define MCLF_BINARY_MIN_SIZE(version) (MCLF_HEADER_SIZE_V23+sizeof(mclfTextHeader_t)) | |
| #endif /* MCLOADFORMAT_H_ */ | |