14e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park/** @addtogroup MCD_MCDIMPL_DAEMON_DEV 24e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * @{ 34e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * @file 44e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 54e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * MobiCore device. 64e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * The MobiCore device class handles the MCP processing within the driver. 74e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * Concrete devices implementing the communication behavior for the platforms have to be derived 84e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * from this. 94e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 104e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * <!-- Copyright Giesecke & Devrient GmbH 2009 - 2012 --> 117b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * 124e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * Redistribution and use in source and binary forms, with or without 134e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * modification, are permitted provided that the following conditions 144e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * are met: 154e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 1. Redistributions of source code must retain the above copyright 164e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * notice, this list of conditions and the following disclaimer. 174e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 2. Redistributions in binary form must reproduce the above copyright 184e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * notice, this list of conditions and the following disclaimer in the 194e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * documentation and/or other materials provided with the distribution. 204e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 3. The name of the author may not be used to endorse or promote 214e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * products derived from this software without specific prior 224e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * written permission. 234e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 244e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 254e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 264e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 274e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 284e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 294e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 304e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 314e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 324e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 334e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 344e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 354e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park */ 364e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#ifndef MOBICOREDEVICE_H_ 374e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#define MOBICOREDEVICE_H_ 384e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 394e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include <stdint.h> 404e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include <vector> 414e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 424e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "McTypes.h" 437b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim#include "MobiCoreDriverApi.h" 444e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 454e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "Mci/mcimcp.h" 464e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "mcLoadFormat.h" 474e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "MobiCoreDriverCmd.h" 484e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 494e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "Connection.h" 504e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "CWsm.h" 514e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 524e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "ExcDevice.h" 534e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "DeviceScheduler.h" 544e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "DeviceIrqHandler.h" 554e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "NotificationQueue.h" 564e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "TrustletSession.h" 574e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "mcVersionInfo.h" 584e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 594e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 604e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Parkclass MobiCoreDevice; 614e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 624e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Parktypedef struct { 637b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim addr_t baseAddr; /**< Physical address of the data to load. */ 647b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim uint32_t offs; /**< Offset to the data. */ 657b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim uint32_t len; /**< Length of the data to load. */ 667b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim mclfHeader_ptr tlHeader; /**< Pointer to trustlet header. */ 674e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} loadDataOpenSession_t, *loadDataOpenSession_ptr; 684e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 694e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park/** 704e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * Factory method to return the platform specific MobiCore device. 714e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * Implemented in the platform specific *Device.cpp 724e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park */ 737b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kimextern MobiCoreDevice *getDeviceInstance(void); 744e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 757b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kimclass MobiCoreDevice : public DeviceScheduler, public DeviceIrqHandler 767b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim{ 774e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 784e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Parkprotected: 794e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 807b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim NotificationQueue *nq; /**< Pointer to the notification queue within the MCI buffer */ 817b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim mcFlags_t *mcFlags; /**< Pointer to the MC flags within the MCI buffer */ 827b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim mcpMessage_t *mcpMessage; /**< Pointer to the MCP message structure within the MCI buffer */ 837b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim CSemaphore mcpSessionNotification; /**< Semaphore to synchronize incoming notifications for the MCP session */ 844e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 857b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim trustletSessionList_t trustletSessions; /**< Available Trustlet Sessions */ 867b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim mcVersionInfo_t *mcVersionInfo; /**< MobiCore version info. */ 877b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim bool mcFault; /**< Signal RTM fault */ 887b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim bool mciReused; /**< Signal restart of Daemon. */ 897b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 907b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim /* In a special case a Trustlet can create a race condition in the daemon. 917b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * If at Trustlet start it detects an error of some sort and calls the 927b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * exit function before waiting for any notifications from NWD then the daemon 937b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * will receive the openSession notification from RTM and the error notification 947b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * from the Trustlet at the same time but because the internal objects in 957b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * the daemon are not yet completely setup then the error notification will 967b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * never be sent to the TLC! 977b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * 987b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * This queue holds notifications received between the time the daemon 997b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * puts the MCP command for open session until the internal session objects 1007b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * are setup correctly. 1017b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim */ 1027b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim std::queue<notification_t> notifications; /**< Notifications queue for open session notification */ 1034e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1047b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim MobiCoreDevice(); 1054e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1067b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim void signalMcpNotification(void); 1077b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1087b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim bool waitMcpNotification(void); 1097b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1107b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kimprivate: 1117b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim virtual bool yield(void) = 0; 1124e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1137b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim virtual bool nsiq(void) = 0; 1147b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1157b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim virtual bool waitSsiq(void) = 0; 1164e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1174e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Parkpublic: 1187b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim virtual ~MobiCoreDevice(); 1197b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1207b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim TrustletSession *getTrustletSession(uint32_t sessionId); 1217b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1227b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim void cleanSessionBuffers(TrustletSession *session); 1237b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim void removeTrustletSession(uint32_t sessionId); 1247b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1257b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim Connection *getSessionConnection(uint32_t sessionId, notification_t *notification); 1267b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1277b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim bool open(Connection *connection); 1287b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1297b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim void close(Connection *connection); 1307b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1317b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim mcResult_t openSession(Connection *deviceConnection, 1327b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim loadDataOpenSession_ptr pLoadDataOpenSession, 1337b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim MC_DRV_CMD_OPEN_SESSION_struct *cmdOpenSession, 1347b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim mcDrvRspOpenSessionPayload_ptr pRspOpenSessionPayload); 1357b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1367b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim TrustletSession *registerTrustletConnection( Connection *connection, 1377b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim MC_DRV_CMD_NQ_CONNECT_struct *cmdNqConnect); 1387b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1397b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim // Internal function 1407b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim mcResult_t closeSession(uint32_t sessionId); 1417b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1427b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim // Do more checks 1437b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim mcResult_t closeSession(Connection *deviceConnection, uint32_t sessionId); 1447b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1457b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim virtual void notify(uint32_t sessionId) = 0; 1467b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1477b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim mcResult_t mapBulk(uint32_t sessionId, uint32_t handle, uint32_t pAddrL2, uint32_t offsetPayload, 1487b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim uint32_t lenBulkMem, uint32_t *secureVirtualAdr); 1497b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1507b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim mcResult_t unmapBulk(uint32_t sessionId, uint32_t handle, uint32_t secureVirtualAdr, uint32_t lenBulkMem); 1517b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1527b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim void start(); 1537b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1547b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim void donateRam(const uint32_t donationSize); 1557b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1567b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim mcResult_t getMobiCoreVersion(mcDrvRspGetMobiCoreVersionPayload_ptr pRspGetMobiCoreVersionPayload); 1577b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1587b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim bool getMcFault() { 1597b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return mcFault; 1607b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 1617b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1627b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim void queueUnknownNotification(notification_t notification); 1637b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1647b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim virtual void dumpMobicoreStatus(void) = 0; 1657b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1667b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim virtual uint32_t getMobicoreStatus(void) = 0; 1677b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1687b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim virtual bool schedulerAvailable(void) = 0; 1697b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1707b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim virtual void schedule(void) = 0; 1717b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1727b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim virtual void handleIrq(void) = 0; 1737b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1747b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim //virtual bool freeWsm(CWsm_ptr pWsm) = 0; 1757b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1767b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim /** 1777b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * Initialize MobiCore. 1787b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * 1797b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * @param devFile the device node to speak to. 1807b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * @param loadMobiCore 1817b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * @param mobicoreImage 1827b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * @param enableScheduler 1837b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * 1847b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * @returns true if MobiCore is already initialized. 1857b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * */ 1867b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim virtual bool initDevice( 1877b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim const char *devFile, 1887b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim bool loadMobiCore, 1897b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim const char *mobicoreImage, 1907b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim bool enableScheduler 1917b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim ) = 0; 1927b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1937b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim virtual void initDeviceStep2(void) = 0; 1947b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1957b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim virtual bool getMciInstance(uint32_t len, CWsm_ptr *mci, bool *reused) = 0; 1967b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1977b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim virtual CWsm_ptr registerWsmL2(addr_t buffer, uint32_t len, uint32_t pid) = 0; 1987b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1997b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim virtual bool unregisterWsmL2(CWsm_ptr pWsm) = 0; 2007b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 2017b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim virtual bool lockWsmL2(uint32_t handle) = 0; 2027b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 2037b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim virtual bool unlockWsmL2(uint32_t handle) = 0; 2047b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 2057b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim virtual addr_t findWsmL2(uint32_t handle) = 0; 2067b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 2077b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim virtual bool findContiguousWsm(uint32_t handle, addr_t *phys, uint32_t *len) = 0; 2087b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 2097b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim /** 2107b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * Cleanup all orphaned bulk buffers. 2117b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim */ 2127b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim virtual bool cleanupWsmL2(void) = 0; 2137b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 2147b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim /** 2157b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * Allocates persistent WSM memory for TL (won't be released when TLC exits). 2167b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim */ 2177b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim virtual CWsm_ptr allocateContiguousPersistentWsm(uint32_t len) = 0; 2184e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2197b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim bool mobicoreAlreadyRunning(void) { 2207b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return mciReused; 2217b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 2224e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park}; 2234e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2244e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#endif /* MOBICOREDEVICE_H_ */ 2254e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2264e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park/** @} */ 227