/** | |
* @defgroup MCLF MobiCore Load Format | |
* | |
* @defgroup MCLF_VER MCLF Versions | |
* @ingroup MCLF | |
* | |
* @addtogroup MCLF | |
* @{ | |
* | |
* MobiCore Load Format declarations. | |
* | |
* Holds the definitions for the layout of MobiCore Trustlet Blob. | |
* <!-- Copyright Giesecke & Devrient GmbH 2009-2012 --> | |
* | |
* 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. The name of the author may not be used to endorse or promote | |
* products derived from this software without specific prior | |
* written permission. | |
* | |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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 "mcDriverId.h" | |
#define MCLF_VERSION_MAJOR 2 | |
#define MCLF_VERSION_MINOR 1 | |
#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. */ | |
/*@}*/ | |
#if !defined(ADDR_T_DEFINED) | |
#define ADDR_T_DEFINED | |
typedef void* addr_t; /**< an address, can be physical or virtual */ | |
#endif // !defined(ADDR_T_DEFINED) | |
/** 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. */ | |
} 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 { | |
addr_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 1 ///////////////////////////////////////////////////////////////////////////////////////////////////////// | |
/** | |
* @defgroup MCLF_VER_V1 MCLF Version 1 | |
* @ingroup MCLF_VER | |
* | |
* @addtogroup MCLF_VER_V1 | |
* @{ | |
*/ | |
/** | |
* Version 1 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. */ | |
addr_t entry; /**< Virtual start address of service code. */ | |
} mclfHeaderV1_t, *mclfHeaderV1_ptr; | |
/** @} */ | |
// Version 2 ///////////////////////////////////////////////////////////////////////////////////////////////////////// | |
/** | |
* @defgroup MCLF_VER_V2 MCLF Version 2 | |
* @ingroup MCLF_VER | |
* | |
* @addtogroup MCLF_VER_V2 | |
* @{ | |
*/ | |
/** | |
* Version 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. */ | |
addr_t entry; /**< Virtual start address of service code. */ | |
uint32_t serviceVersion; /**< Version of the interface the driver exports. */ | |
} mclfHeaderV2_t, *mclfHeaderV2_ptr; | |
/** @} */ | |
// Version 1 and 2 /////////////////////////////////////////////////////////////////////////////////////////////////// | |
/** | |
* @addtogroup MCLF | |
* @{ | |
*/ | |
/** MCLF header */ | |
typedef union { | |
mclfIntro_t intro; /**< Intro for data structure identification. */ | |
mclfHeaderV1_t mclfHeaderV1; /**< Version 1 header */ | |
mclfHeaderV2_t mclfHeaderV2; /**< Version 2 header */ | |
} mclfHeader_t, *mclfHeader_ptr; | |
#endif /* MCLOADFORMAT_H_ */ | |
/** @} */ |