Home | History | Annotate | Download | only in Generic
      1 /** @addtogroup MCD_MCDIMPL_DAEMON_DEV
      2  * @{
      3  * @file
      4  *
      5  * Class for TrustZone Devices.
      6  * TrustZone device implements communication functions needed for
      7  * accessing MobiCore located in an TrustZone environment.
      8  *
      9  * <!-- Copyright Giesecke & Devrient GmbH 2009 - 2012 -->
     10  *
     11  * Redistribution and use in source and binary forms, with or without
     12  * modification, are permitted provided that the following conditions
     13  * are met:
     14  * 1. Redistributions of source code must retain the above copyright
     15  *    notice, this list of conditions and the following disclaimer.
     16  * 2. Redistributions in binary form must reproduce the above copyright
     17  *    notice, this list of conditions and the following disclaimer in the
     18  *    documentation and/or other materials provided with the distribution.
     19  * 3. The name of the author may not be used to endorse or promote
     20  *    products derived from this software without specific prior
     21  *    written permission.
     22  *
     23  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
     24  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     25  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
     27  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
     29  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     30  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     31  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     32  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     33  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     34  */
     35 #ifndef TRUSTZONEDEVICE_H_
     36 #define TRUSTZONEDEVICE_H_
     37 
     38 
     39 #include <stdint.h>
     40 
     41 #include "McTypes.h"
     42 
     43 #include "CSemaphore.h"
     44 #include "CMcKMod.h"
     45 #include "CWsm.h"
     46 
     47 #include "ExcDevice.h"
     48 #include "MobiCoreDevice.h"
     49 
     50 
     51 #define SCHEDULING_FREQ     5   /**< N-SIQ every n-th time */
     52 
     53 class TrustZoneDevice : public MobiCoreDevice
     54 {
     55 
     56 protected:
     57     bool         schedulerEnabled; /**< NQ IRQ Scheduler enabling */
     58     CSemaphore   schedSync; /**< Semaphore to synchronize S-SIQs with scheduler thread */
     59     CMcKMod_ptr  pMcKMod; /**< kernel module */
     60     CWsm_ptr     pWsmMcp; /**< WSM use for MCP */
     61     CWsm_ptr     mobicoreInDDR;  /**< WSM used for Mobicore binary */
     62 
     63     /** Access functions to the MC Linux kernel module
     64      */
     65     bool yield(void);
     66 
     67     bool nsiq(void);
     68 
     69     bool waitSsiq(void);
     70 
     71 public:
     72 
     73     TrustZoneDevice(void);
     74 
     75     virtual ~TrustZoneDevice(void);
     76 
     77 //  static MobiCoreDevice* getDeviceInstance(
     78 //      void
     79 //  );
     80     /** Set up MCI and wait till MC is initialized
     81      *
     82      * @param devFile the device node to speak to.
     83      * @param loadMobiCore
     84      * @param mobicoreImage
     85      * @param enableScheduler
     86      *
     87      * @return true if mobicore is initialized
     88      * @trows ExcDevice
     89      */
     90     bool initDevice(
     91         const char  *devFile,
     92         bool        loadMobiCore,
     93         const char  *mobicoreImage,
     94         bool        enableScheduler
     95     );
     96 
     97     void initDeviceStep2(void);
     98 
     99     void notify(uint32_t sessionId);
    100 
    101     void dumpMobicoreStatus(void);
    102 
    103     uint32_t getMobicoreStatus(void);
    104 
    105     bool checkMciVersion(void);
    106 
    107     /** Memory allocation functions */
    108     bool getMciInstance(uint32_t len, CWsm_ptr *mci, bool *reused);
    109 
    110     //bool freeWsm(CWsm_ptr pWsm);
    111 
    112     CWsm_ptr registerWsmL2(addr_t buffer, uint32_t len, uint32_t pid);
    113 
    114     bool unregisterWsmL2(CWsm_ptr pWsm);
    115 
    116     bool lockWsmL2(uint32_t handle);
    117 
    118     bool unlockWsmL2(uint32_t handle);
    119 
    120     addr_t findWsmL2(uint32_t handle);
    121 
    122     bool findContiguousWsm(uint32_t handle, addr_t *phys, uint32_t *len);
    123 
    124     /**
    125      * Cleanup all orphaned bulk buffers.
    126      */
    127     bool cleanupWsmL2(void);
    128 
    129     /**
    130      * Allocates persistent WSM memory for TL (won't be fried when TLC exits).
    131      */
    132     CWsm_ptr allocateContiguousPersistentWsm(uint32_t len);
    133 
    134     bool schedulerAvailable(void);
    135 
    136     void schedule(void);
    137 
    138     void handleIrq(void);
    139 };
    140 
    141 #endif /* TRUSTZONEDEVICE_H_ */
    142 
    143 /** @} */
    144