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