Home | History | Annotate | Download | only in Mci
      1 /** @addtogroup MCP
      2  * @{
      3  * The MCP defines commands and responses which are used to control the MobiCore system.
      4  * MCP information is exchanged in a world share memory buffer which has been established prior between NWd
      5  * and SWd using the FastCall interface. The buffer needs to be provided by the MobiCore driver and is utilized
      6  * to send MCP commands to the MobiCore as well as receiving responses from the MobiCore.
      7  * The command of the normal world will be overwritten with the response from the secure side.
      8  *
      9  * @file
     10  * MCP command interface definitions.
     11  *
     12  * <!-- Copyright Giesecke & Devrient GmbH 2009-2012 -->
     13  *
     14  * Redistribution and use in source and binary forms, with or without
     15  * modification, are permitted provided that the following conditions
     16  * are met:
     17  * 1. Redistributions of source code must retain the above copyright
     18  *    notice, this list of conditions and the following disclaimer.
     19  * 2. Redistributions in binary form must reproduce the above copyright
     20  *    notice, this list of conditions and the following disclaimer in the
     21  *    documentation and/or other materials provided with the distribution.
     22  * 3. The name of the author may not be used to endorse or promote
     23  *    products derived from this software without specific prior
     24  *    written permission.
     25  *
     26  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
     27  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     28  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     29  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
     30  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     31  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
     32  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     34  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     35  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     36  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     37  */
     38 #ifndef MCP_H_
     39 #define MCP_H_
     40 
     41 #include "mcUuid.h"
     42 #include "mcLoadFormat.h"
     43 #include "mcVersionInfo.h"
     44 
     45 /** MobiCore Return Code Defines.
     46  * List of the possible MobiCore return codes.
     47  */
     48 typedef enum {
     49     MC_MCP_RET_OK                                   =  0, /**< Memory has successfully been mapped. */
     50     MC_MCP_RET_ERR_INVALID_SESSION                  =  1, /**< The session ID is invalid. */
     51     MC_MCP_RET_ERR_UNKNOWN_UUID                     =  2, /**< The UUID of the Trustlet is unknown. */
     52     MC_MCP_RET_ERR_UNKNOWN_DRIVER_ID                =  3, /**< The ID of the driver is unknown. */
     53     MC_MCP_RET_ERR_NO_MORE_SESSIONS                 =  4, /**< No more session are allowed. */
     54     MC_MCP_RET_ERR_CONTAINER_INVALID                =  5, /**< The container is invalid. */
     55     MC_MCP_RET_ERR_TRUSTLET_INVALID                 =  6, /**< The Trustlet is invalid. */
     56     MC_MCP_RET_ERR_ALREADY_MAPPED                   =  7, /**< The memory block has already been mapped before. */
     57     MC_MCP_RET_ERR_INVALID_PARAM                    =  8, /**< Alignment or length error in the command parameters. */
     58     MC_MCP_RET_ERR_OUT_OF_RESOURCES                 =  9, /**< No space left in the virtual address space of the session. */
     59     MC_MCP_RET_ERR_INVALID_WSM                      = 10, /**< WSM type unknown or broken WSM */
     60     MC_MCP_RET_ERR_UNKNOWN                          = 11, /**< unknown error. */
     61     MC_MCP_RET_ERR_INVALID_MAPPING_LENGTH           = 12, /**< Lenght of map invalid */
     62     MC_MCP_RET_ERR_MAPPING_TARGET                   = 13, /**< Map can only be applied to Trustlet session */
     63     MC_MCP_RET_ERR_OUT_OF_CRYPTO_RESSOURCES         = 14, /**< Couldn't open crypto session. */
     64     MC_MCP_RET_ERR_SIGNATURE_VERIFICATION_FAILED    = 15, /**< System Trustlet signature verification failed. */
     65     MC_MCP_RET_ERR_WRONG_PUBLIC_KEY                 = 16, /**< System Trustlet public key is wrong. */
     66     MC_MCP_RET_ERR_CONTAINER_TYPE_MISMATCH          = 17, /**< Wrong containter type(s). */
     67     MC_MCP_RET_ERR_CONTAINER_LOCKED                 = 18, /**< Container is locked (or not activated). */
     68     MC_MCP_RET_ERR_SP_NO_CHILD                      = 19, /**< SPID is not registered with root container. */
     69     MC_MCP_RET_ERR_TL_NO_CHILD                      = 20, /**< UUID is not registered with sp container. */
     70     MC_MCP_RET_ERR_UNWRAP_ROOT_FAILED               = 21, /**< Unwrapping of root container failed. */
     71     MC_MCP_RET_ERR_UNWRAP_SP_FAILED                 = 22, /**< Unwrapping of service provider container failed. */
     72     MC_MCP_RET_ERR_UNWRAP_TRUSTLET_FAILED           = 23, /**< Unwrapping of Trustlet container failed. */
     73     MC_MCP_RET_ERR_CONTAINER_VERSION_MISMATCH       = 24, /**< Container version mismatch. */
     74     MC_MCP_RET_ERR_SP_TL_DECRYPTION_FAILED          = 25, /**< Decryption of service provider trustlet failed. */
     75     MC_MCP_RET_ERR_SP_TL_HASH_CHECK_FAILED          = 26, /**< Hash check of service provider trustlet failed. */
     76     MC_MCP_RET_ERR_LAUNCH_TASK_FAILED               = 27, /**< Activation/starting of task failed. */
     77 
     78     // used for command verification
     79     MC_MCP_RET_ERR_UNKNOWN_COMMAND                  = 50, /**< The command is unknown. */
     80     MC_MCP_RET_ERR_INVALID_DATA                     = 51  /**< The command data is invalid. */
     81 } mcpResult_t;
     82 
     83 /** Possible MCP Command IDs
     84  * Command ID must be between 0 and 0x7FFFFFFF.
     85  */
     86 typedef enum {
     87     MC_MCP_CMD_ID_INVALID                = 0x00000000,   /**< Invalid command ID. */
     88     // Session commands
     89     MC_MCP_CMD_OPEN_SESSION              = 0x00000001,   /**< Open a session to a service. */
     90     MC_MCP_CMD_CLOSE_SESSION             = 0x00000003,   /**< Close an existing service session. */
     91     MC_MCP_CMD_MAP                       = 0x00000004,   /**< Map a block of WSM to a session. */
     92     MC_MCP_CMD_UNMAP                     = 0x00000005,   /**< Unmap a block of WSM from a session. */
     93     MC_MCP_CMD_SUSPEND                   = 0x00000006,   /**< Prepare MobiCore for suspend. */
     94     MC_MCP_CMD_RESUME                    = 0x00000007,   /**< Resume MobiCore from suspension. */
     95     MC_MCP_CMD_DONATE_RAM                = 0x00000008,   /**< Donate RAM to MobiCore. */
     96     MC_MCP_CMD_GET_MOBICORE_VERSION      = 0x00000009,   /**< Get MobiCore version information. */
     97 } mcpCmdId_t;
     98 
     99 
    100 #define FLAG_RESPONSE       (1U << 31)  /**< Flag to indicate that this is the response to a MCP command. */
    101 
    102 
    103 /** Types of WSM known to the MobiCore.
    104  */
    105 typedef enum {
    106     WSM_INVALID     = 0,    /**< Invalid memory type */
    107     WSM_CONTIGUOUS  = 1,    /**< Reference to WSM points to a contiguous region of pages. */
    108     WSM_L2          = 2,    /**< Reference to WSM points to an L2 table describing the memory region to share */
    109 }wsmType_t;
    110 
    111 /** Types of RAM known to the MobiCore.
    112  */
    113 typedef enum {
    114     RAM_INVALID     = 0,    /**< Invalid memory type */
    115     RAM_GENERIC     = 1,    /**< Generic RAM of no special type. */
    116 }ramType_t;
    117 
    118 /** Command header.
    119  * It just contains the command ID. Only values specified in mcpCmdId_t are allowed as command IDs.
    120  * If the command ID is unspecified the MobiCore returns an empty response with the result set to MC_MCP_RET_ERR_UNKNOWN_COMMAND .
    121  */
    122 typedef struct {
    123     mcpCmdId_t cmdId; /**< Command ID of the command */
    124 } commandHeader_t, *commandHeader_ptr;
    125 
    126 /** Response header.
    127  * MobiCore will reply to every MCP command with an MCP response. Like the MCP command the response consists of a
    128  * header followed by response data. The response is written to the same memory location as the MCP command.
    129  */
    130 typedef struct {
    131     uint32_t rspId;  /**< Command ID | FLAG_RESPONSE. */
    132     mcpResult_t result; /**< Result informs about the execution result of the command associated with the response. */
    133 } responseHeader_t, *responseHeader_ptr;
    134 
    135 
    136 
    137 /** @defgroup CMD MCP Commands
    138  * @{ */
    139 
    140 /** @defgroup ASMCMD Administrative Commands
    141  * @{ */
    142 
    143 /** @defgroup MCPDONATERAM DONATE_RAM
    144  * Donate NWd RAM to MobiCore.
    145  * This is a debug feature that is not available in release version.
    146  *
    147  * @{ */
    148 
    149 /** Donate RAM Command */
    150 typedef struct {
    151     commandHeader_t  cmdHeader; /**< Command header. */
    152     ramType_t        ramType;            /**< Type of RAM used for memory pool */
    153     uint32_t         adrBuffer;          /**< Physical address of the page range*/
    154     uint32_t         numPages;          /**< Number of pages contained in the donation. */
    155 } mcpCmdDonateRam_t, *mcpCmdDonateRam_ptr;
    156 
    157 /** Donate RAM Command Response */
    158 typedef struct {
    159     responseHeader_t  rspHeader; /**< Response header. */
    160 } mcpRspDonateRam_t, *mcpRspDonateRam_ptr;
    161 /** @} */// End MCPDONATERAM
    162 
    163 
    164 /** @defgroup MCPGETMOBICOREVERSION GET_MOBICORE_VERSION
    165  * Get MobiCore version info.
    166  *
    167  * @{ */
    168 
    169 /** Get MobiCore Version Command. */
    170 typedef struct {
    171     commandHeader_t cmdHeader;  /** Command header. */
    172 } mcpCmdGetMobiCoreVersion_t, *mcpCmdGetMobiCoreVersion_ptr;
    173 
    174 /** Get MobiCore Version Command Response. */
    175 typedef struct {
    176     responseHeader_t rspHeader;   /** Response header. */
    177     mcVersionInfo_t  versionInfo; /** MobiCore version info. */
    178 } mcpRspGetMobiCoreVersion_t, *mcpRspGetMobiCoreVersion_ptr;
    179 
    180 /** @} */// End MCPGETMOBICOREVERSION
    181 
    182 /** @} */// End ASMCMD
    183 
    184 
    185 /** @defgroup POWERCMD Power Management Commands
    186  * @{ */
    187 
    188 /** @defgroup MCPSUSPEND SUSPEND
    189  * Prepare MobiCore suspension.
    190  * This command allows MobiCore and MobiCore drivers to release or clean resources and save device state.
    191  *
    192  * @{ */
    193 
    194 /** Suspend Command */
    195 typedef struct {
    196     commandHeader_t  cmdHeader; /**< Command header. */
    197 } mcpCmdSuspend_t, *mcpCmdSuspend_ptr;
    198 
    199 /** Suspend Command Response */
    200 typedef struct {
    201     responseHeader_t  rspHeader; /**< Response header. */
    202 } mcpRspSuspend_t, *mcpRspSuspend_ptr;
    203 /** @} */// End MCPSUSPEND
    204 
    205 
    206 /** @defgroup MCPRESUME RESUME
    207  * Resume MobiCore from suspension.
    208  * This command allows MobiCore and MobiCore drivers to reinitialize hardware affected by suspension.
    209  *
    210  * @{ */
    211 
    212 /** Resume Command */
    213 typedef struct {
    214     commandHeader_t  cmdHeader; /**< Command header. */
    215 } mcpCmdResume_t, *mcpCmdResume_ptr;
    216 
    217 /** Resume Command Response */
    218 typedef struct {
    219     responseHeader_t  rspHeader; /**< Response header. */
    220 } mcpRspResume_t, *mcpRspResume_ptr;
    221 
    222 /** @} */// End MCPRESUME
    223 
    224 /** @} */// End POWERCMD
    225 
    226 
    227 
    228 /** @defgroup SESSCMD Session Management Commands
    229  * @{ */
    230 
    231 /** @defgroup MCPOPEN OPEN
    232  * Load and open a session to a Trustlet.
    233  * The OPEN command loads Trustlet data to the MobiCore context and opens a session to the Trustlet.
    234  * If wsmTypeLoadData is WSM_INVALID MobiCore tries to start a pre-installed Trustlet
    235  * associated with the uuid passed.
    236  * The uuid passed must match the uuid contained in the load data (if available).
    237  * On success, MobiCore returns the session ID which can be used for further communication.
    238  * @{ */
    239 
    240 /** Open Command */
    241 typedef struct {
    242     commandHeader_t   cmdHeader;        /**< Command header. */
    243     mcUuid_t            uuid;             /**< Byte array containing the service UUID. */
    244     wsmType_t         wsmTypeTci;       /**< Type of WSM used for the TCI */
    245     uint32_t          adrTciBuffer;     /**< Physical address of the TCI */
    246     uint32_t          ofsTciBuffer;     /**< Offset to the data. */
    247     uint32_t          lenTciBuffer;     /**< Length of the TCI. */
    248     wsmType_t         wsmTypeLoadData;  /**< Type of the memory containing the data to load. */
    249     uint32_t          adrLoadData;      /**< Physical address of the data to load. */
    250     uint32_t          ofsLoadData;      /**< Offset to the data. */
    251     uint32_t          lenLoadData;      /**< Length of the data to load. */
    252     mclfHeader_t      tlHeader;         /**< Service header. */
    253 } mcpCmdOpen_t, *mcpCmdOpen_ptr;
    254 
    255 /** Open Command Response */
    256 typedef struct {
    257     responseHeader_t  rspHeader; /**< Response header. */
    258     uint32_t          sessionId; /**< Session ID used for further communication. */
    259 } mcpRspOpen_t, *mcpRspOpen_ptr;
    260 
    261 /** @} */// End MCPOPEN
    262 
    263 
    264 /** @defgroup MCPCLOSE CLOSE
    265  * Close an existing session to a Trustlet.
    266  * The CLOSE command terminates a session and frees all resources in the MobiCore system which
    267  * are currently occupied by the session. Before closing the session, the MobiCore runtime
    268  * management waits until all pending operations, like calls to drivers, invoked by the Trustlet
    269  * have been terminated.
    270  * Mapped memory will automatically be unmapped from the MobiCore context. The NWd is responsible for
    271  * processing the freed memory according to the Rich-OS needs.
    272  *
    273  * @{ */
    274 
    275 /** Close Command */
    276 typedef struct {
    277     commandHeader_t  cmdHeader;  /**< Command header. */
    278     uint32_t         sessionId;  /**< Session ID. */
    279 } mcpCmdClose_t, *mcpCmdClose_ptr;
    280 
    281 /** Close Command Response */
    282 typedef struct {
    283     responseHeader_t  rspHeader; /**< Response header. */
    284 } mcpRspClose_t, *mcpRspClose_ptr;
    285 
    286 /** @} */// End MCPCLOSE
    287 
    288 
    289 /** @defgroup MCPMAP MAP
    290  * Map a portion of memory to a session.
    291  * The MAP command provides a block of memory to the context of a service.
    292  * The memory then becomes world-shared memory (WSM).
    293  * The WSM can either be normal anonymous memory from malloc() or be a
    294  * block of page aligned, contiguous memory.
    295  * The only allowed memory type here is WSM_L2.
    296  * @{ */
    297 
    298 /** Map Command */
    299 typedef struct {
    300     commandHeader_t  cmdHeader;     /**< Command header. */
    301     uint32_t         sessionId;     /**< Session ID of a valid session */
    302     wsmType_t        wsmType;       /**< Type of WSM used of the memory*/
    303     uint32_t         adrBuffer;     /**< Physical address of the memory */
    304     uint32_t         ofsBuffer;     /**< Offset to the payload. */
    305     uint32_t         lenBuffer;     /**< Length of the buffer. */
    306 } mcpCmdMap_t, *mcpCmdMap_ptr;
    307 
    308 #define MCP_MAP_MAX         0x100000    /**< Maximum allowed length for MCP map. */
    309 
    310 /** Map Command Response */
    311 typedef struct {
    312     responseHeader_t  rspHeader;        /**< Response header. */
    313     uint32_t          secureVirtualAdr; /**< Virtual address in the context of the service the WSM is mapped to, already includes a possible offset! */
    314 } mcpRspMap_t, *mcpRspMap_ptr;
    315 
    316 /** @} *///End MCPMAP
    317 
    318 
    319 /** @defgroup MCPUNMAP UNMAP
    320  * Unmap a portion of world-shared memory from a session.
    321  * The UNMAP command is used to unmap a previously mapped block of
    322  * world shared memory from the context of a session.
    323  *
    324  * Attention: The memory block will be immediately unmapped from the specified session.
    325  * If the service is still accessing the memory, the service will trigger a segmentation fault.
    326  * @{ */
    327 
    328 /** Unmap Command */
    329 typedef struct {
    330     commandHeader_t  cmdHeader;         /**< Command header. */
    331     uint32_t         sessionId;         /**< Session ID of a valid session */
    332     wsmType_t        wsmType;           /**< Type of WSM used of the memory*/
    333     uint32_t         secureVirtualAdr;  /**< Virtual address in the context of the service the WSM has been mapped to, already includes a possible offset! */
    334     uint32_t         lenVirtualBuffer;  /**< Length of the virtual buffer. */
    335 } mcpCmdUnmap_t, *mcpCmdUnmap_ptr;
    336 
    337 /** Unmap Command Response */
    338 typedef struct {
    339     responseHeader_t rspHeader; /**< Response header. */
    340 } mcpRspUnmap_t, *mcpRspUnmap_ptr;
    341 
    342 /** @} */// End MCPUNMAP
    343 
    344 /** @} */// End SESSCMD
    345 
    346 /** @} */// End CMD
    347 
    348 /** Structure of the MCP buffer. */
    349 typedef union {
    350     commandHeader_t              cmdHeader;              /**< Command header. */
    351     responseHeader_t             rspHeader;              /**< Response header. */
    352     mcpCmdOpen_t                 cmdOpen;                /**< Load and open service. */
    353     mcpRspOpen_t                 rspOpen;                /**< Response to load and open service. */
    354     mcpCmdClose_t                cmdClose;               /**< Close command. */
    355     mcpRspClose_t                rspClose;               /**< Response to close command. */
    356     mcpCmdMap_t                  cmdMap;                 /**< Map WSM to service context. */
    357     mcpRspMap_t                  rspMap;                 /**< Response to MAP command. */
    358     mcpCmdUnmap_t                cmdUnmap;               /**< Unmap WSM from service context. */
    359     mcpRspUnmap_t                rspUnmap;               /**< Response to UNMAP command. */
    360     mcpCmdSuspend_t              cmdSuspend;             /**< Suspend MobiCore. */
    361     mcpRspSuspend_t              rspSuspend;             /**< Response to SUSPEND command. */
    362     mcpCmdResume_t               cmdResume;              /**< Resume MobiCore. */
    363     mcpRspResume_t               rspResume;              /**< Response to RESUME command. */
    364     mcpCmdDonateRam_t            cmdDonateRam;           /**< Donate RAM to MobiCore. */
    365     mcpRspDonateRam_t            rspDonateRam;           /**< Response to DONATE_RAM command. */
    366     mcpCmdGetMobiCoreVersion_t   cmdGetMobiCoreVersion;  /**< Get MobiCore Version command. */
    367     mcpRspGetMobiCoreVersion_t   rspGetMobiCoreVersion;  /**< Response to GET_MOBICORE_VERSION command. */
    368 } mcpMessage_t, *mcpMessage_ptr;
    369 
    370 
    371 #define MIN_MCP_LEN         sizeof(mcpMessage_t)  /**< Minimum MCP buffer length (in bytes). */
    372 
    373 #define MC_FLAG_NO_SLEEP_REQ   0
    374 #define MC_FLAG_REQ_TO_SLEEP   1
    375 
    376 #define MC_STATE_NORMAL_EXECUTION 0
    377 #define MC_STATE_READY_TO_SLEEP   1
    378 
    379 typedef struct {
    380     uint16_t  SleepReq;
    381     uint16_t  ReadyToSleep;
    382 } mcSleepMod_t, *mcSleepMod_ptr;
    383 
    384 /** MobiCore status flags */
    385 typedef struct {
    386     uint32_t      schedule;   /**< Scheduling hint: if <> MC_FLAG_SCHEDULE_IDLE, MobiCore should be scheduled by the NWd */
    387     mcSleepMod_t  sleepMode;  /**<  */
    388     uint32_t      RFU2;       /**< Reserved for future use: Must not be interpreted */
    389     uint32_t      RFU3;       /**< Reserved for future use: Must not be interpreted */
    390 } mcFlags_t, *mcFlags_ptr;
    391 
    392 #define MC_FLAG_SCHEDULE_IDLE      0 /**< MobiCore is idle. No scheduling required. */
    393 #define MC_FLAG_SCHEDULE_NON_IDLE  1 /**< MobiCore is non idle, scheduling is required. */
    394 
    395 
    396 
    397 /** MCP buffer structure */
    398 typedef struct {
    399     mcFlags_t     mcFlags;    /**< MobiCore Flags */
    400     mcpMessage_t  mcpMessage; /**< MCP message buffer */
    401 } mcpBuffer_t, *mcpBuffer_ptr;
    402 
    403 /** @} */
    404 #endif /* MCP_H_ */
    405