Home | History | Annotate | Download | only in inc
      1 /**
      2  * @defgroup MCLF   MobiCore Load Format
      3  *
      4  * @defgroup MCLF_VER    MCLF Versions
      5  * @ingroup MCLF
      6  *
      7  * @addtogroup MCLF
      8  * @{
      9  *
     10  * MobiCore Load Format declarations.
     11  *
     12  * Holds the definitions for the layout of MobiCore Trustlet Blob.
     13  * <!-- Copyright Giesecke & Devrient GmbH 2009-2012 -->
     14  *
     15  * Redistribution and use in source and binary forms, with or without
     16  * modification, are permitted provided that the following conditions
     17  * are met:
     18  * 1. Redistributions of source code must retain the above copyright
     19  *    notice, this list of conditions and the following disclaimer.
     20  * 2. Redistributions in binary form must reproduce the above copyright
     21  *    notice, this list of conditions and the following disclaimer in the
     22  *    documentation and/or other materials provided with the distribution.
     23  * 3. The name of the author may not be used to endorse or promote
     24  *    products derived from this software without specific prior
     25  *    written permission.
     26  *
     27  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
     28  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     29  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     30  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
     31  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     32  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
     33  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     34  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     35  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     36  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     37  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     38  */
     39 #ifndef MCLOADFORMAT_H_
     40 #define MCLOADFORMAT_H_
     41 
     42 #include "mcUuid.h"
     43 #include "mcDriverId.h"
     44 
     45 #define MCLF_VERSION_MAJOR   2
     46 #define MCLF_VERSION_MINOR   1
     47 
     48 #define MC_SERVICE_HEADER_MAGIC_BE         ((uint32_t)('M'|('C'<<8)|('L'<<16)|('F'<<24))) /**< "MCLF" in big endian integer representation */
     49 #define MC_SERVICE_HEADER_MAGIC_LE         ((uint32_t)(('M'<<24)|('C'<<16)|('L'<<8)|'F')) /**< "MCLF" in little endian integer representation */
     50 #define MC_SERVICE_HEADER_MAGIC_STR         "MCLF"                                        /**< "MCLF" as string */
     51 
     52 /** @name MCLF flags */
     53 /*@{*/
     54 #define MC_SERVICE_HEADER_FLAGS_PERMANENT               (1U << 0) /**< Loaded service cannot be unloaded from MobiCore. */
     55 #define MC_SERVICE_HEADER_FLAGS_NO_CONTROL_INTERFACE    (1U << 1) /**< Service has no WSM control interface. */
     56 #define MC_SERVICE_HEADER_FLAGS_DEBUGGABLE              (1U << 2) /**< Service can be debugged. */
     57 /*@}*/
     58 
     59 #if !defined(ADDR_T_DEFINED)
     60 #define ADDR_T_DEFINED
     61 typedef void*    addr_t;                /**< an address, can be physical or virtual */
     62 #endif // !defined(ADDR_T_DEFINED)
     63 
     64 /** Service type.
     65  * The service type defines the type of executable.
     66  */
     67 typedef enum {
     68     SERVICE_TYPE_ILLEGAL    = 0,        /**< Service type is invalid. */
     69     SERVICE_TYPE_DRIVER     = 1,        /**< Service is a driver. */
     70     SERVICE_TYPE_SP_TRUSTLET   = 2,     /**< Service is a Trustlet. */
     71     SERVICE_TYPE_SYSTEM_TRUSTLET = 3    /**< Service is a system Trustlet. */
     72 } serviceType_t;
     73 
     74 /**
     75  * Memory types.
     76  */
     77 typedef enum {
     78     MCLF_MEM_TYPE_INTERNAL_PREFERRED = 0, /**< If available use internal memory; otherwise external memory. */
     79     MCLF_MEM_TYPE_INTERNAL = 1, /**< Internal memory must be used for executing the service. */
     80     MCLF_MEM_TYPE_EXTERNAL = 2, /**< External memory must be used for executing the service. */
     81 } memType_t;
     82 
     83 /**
     84  * Descriptor for a memory segment.
     85  */
     86 typedef struct {
     87     addr_t      start;  /**< Virtual start address. */
     88     uint32_t    len;    /**< Length of the segment in bytes. */
     89 } segmentDescriptor_t, *segmentDescriptor_ptr;
     90 
     91 /**
     92  * MCLF intro for data structure identification.
     93  * Must be the first element of a valid MCLF file.
     94  */
     95 typedef struct {
     96     uint32_t        magic;      /**< Header magic value ASCII "MCLF". */
     97     uint32_t        version;    /**< Version of the MCLF header structure. */
     98 } mclfIntro_t, *mclfIntro_ptr;
     99 
    100 /** @} */
    101 
    102 
    103 // Version 2 /////////////////////////////////////////////////////////////////////////////////////////////////////////
    104 /**
    105  * @defgroup MCLF_VER_V2   MCLF Version 2
    106  * @ingroup MCLF_VER
    107  *
    108  * @addtogroup MCLF_VER_V2
    109  * @{
    110  */
    111 
    112 /**
    113  * Version 2 MCLF header.
    114  */
    115 typedef struct {
    116     mclfIntro_t             intro;           /**< MCLF header start with the mandatory intro. */
    117     uint32_t                flags;           /**< Service flags. */
    118     memType_t               memType;         /**< Type of memory the service must be executed from. */
    119     serviceType_t           serviceType;     /**< Type of service. */
    120 
    121     uint32_t                numInstances;    /**< Number of instances which can be run simultaneously. */
    122     mcUuid_t                uuid;            /**< Loadable service unique identifier (UUID). */
    123     mcDriverId_t            driverId;        /**< If the serviceType is SERVICE_TYPE_DRIVER the Driver ID is used. */
    124     uint32_t                numThreads;      /**<
    125                                               * <pre>
    126                                               * <br>Number of threads (N) in a service depending on service type.<br>
    127                                               *
    128                                               *   SERVICE_TYPE_SP_TRUSTLET: N = 1
    129                                               *   SERVICE_TYPE_SYSTEM_TRUSTLET: N = 1
    130                                               *   SERVICE_TYPE_DRIVER: N >= 1
    131                                               * </pre>
    132                                               */
    133     segmentDescriptor_t     text;           /**< Virtual text segment. */
    134     segmentDescriptor_t     data;           /**< Virtual data segment. */
    135     uint32_t                bssLen;         /**< Length of the BSS segment in bytes. MUST be at least 8 byte. */
    136     addr_t                  entry;          /**< Virtual start address of service code. */
    137     uint32_t                serviceVersion; /**< Version of the interface the driver exports. */
    138 } mclfHeaderV2_t, *mclfHeaderV2_ptr;
    139 /** @} */
    140 
    141 
    142 /**
    143  * Version 2 MCLF text segment header.
    144  * Required to be present in MobiCore 1.2 components at address (0x1080).
    145  * This extension is initialized already at trustlet compile time,
    146  * but may be modified later by configuration tools and by MobiCore at load time.
    147  */
    148 typedef struct {
    149     uint32_t                version;        /**< Version of the TextHeader structure. */
    150     uint32_t                textHeaderLen;  /**< Size of this structure (fixed at compile time) */
    151     uint32_t                requiredFeat;   /**< Flags to indicate features that Mobicore must understand/interprete when loading.
    152                                                  Initial value set at compile time.
    153                                                  Required always. */
    154     addr_t                  mcLibEntry;     /**< Address for McLib entry.
    155                                                  Mobicore sets at load time for trustlets / drivers.
    156                                                  Required always. */
    157     segmentDescriptor_t     mcLibData;      /**< Segment for McLib data.
    158                                                  Set at compile time.
    159                                                  Required always. */
    160     addr_t                  mcLibBase;      /**< McLib base address.
    161                                                  Mobicore sets at load time for trustlets / drivers.
    162                                                  Required always. */
    163 } mclfTextHeader_t, *mclfTextHeader_ptr;
    164 
    165 // Version 2 ///////////////////////////////////////////////////////////////////////////////////////////////////
    166 /**
    167  * @addtogroup MCLF
    168  * @{
    169  */
    170 
    171 /** MCLF header */
    172 typedef union {
    173     mclfIntro_t    intro;           /**< Intro for data structure identification. */
    174     mclfHeaderV2_t mclfHeaderV2;    /**< Version 2 header */
    175 } mclfHeader_t, *mclfHeader_ptr;
    176 
    177 #endif /* MCLOADFORMAT_H_ */
    178 
    179 /** @} */
    180