//------------------------------------------------------------------------------ void MobiCoreDriverDaemon::processMapBulkBuf( Connection *connection ) { do { // Read entire command data mcDrvCmdMapBulkMemPayload_t cmdMapBulkMemPayload; uint32_t rlen = connection->readData( &cmdMapBulkMemPayload, sizeof(cmdMapBulkMemPayload)); if (rlen != sizeof(cmdMapBulkMemPayload)) { LOG_E("processMapBulkBuf(): MapBulkMemPayload length error: %d", rlen); writeResult(connection, MC_DRV_RSP_PAYLOAD_LENGTH_ERROR); break; } // Device required MobiCoreDevice *device = (MobiCoreDevice *) (connection->connectionData); if (NULL == device) { LOG_E("processMapBulkBuf(): device is NULL"); writeResult(connection, MC_DRV_RSP_DEVICE_NOT_OPENED); break; } // Map bulk memory to secure world mcDrvRspMapBulkMem_t rspMapBulk; device->mapBulk( connection, &cmdMapBulkMemPayload, &(rspMapBulk.payload)); uint32_t mcResult = rspMapBulk.payload.mcResult; if (MC_MCP_RET_OK != mcResult) { LOG_E("processMapBulkBuf(): rspMapBulk.mcResult=%d", mcResult); writeResult(connection, MC_DRV_RSP_FAILED); break; } rspMapBulk.header.responseId = MC_DRV_RSP_OK; connection->writeData(&rspMapBulk, sizeof(rspMapBulk)); } while (false); }
//------------------------------------------------------------------------------ void MobiCoreDriverDaemon::processMapBulkBuf(Connection *connection) { MC_DRV_CMD_MAP_BULK_BUF_struct cmd; RECV_PAYLOAD_FROM_CLIENT(connection, &cmd); // Device required MobiCoreDevice *device = (MobiCoreDevice *) (connection->connectionData); CHECK_DEVICE(device, connection); if (!device->lockWsmL2(cmd.handle)) { LOG_E("Couldn't lock the buffer!"); writeResult(connection, MC_DRV_ERR_DAEMON_WSM_HANDLE_NOT_FOUND); return; } uint32_t secureVirtualAdr = (uint32_t)NULL; uint64_t pAddrL2 = device->findWsmL2(cmd.handle, connection->socketDescriptor); if (pAddrL2 == 0) { LOG_E("Failed to resolve WSM with handle %u", cmd.handle); writeResult(connection, MC_DRV_ERR_DAEMON_WSM_HANDLE_NOT_FOUND); return; } // Map bulk memory to secure world mcResult_t mcResult = device->mapBulk(connection, cmd.sessionId, cmd.handle, pAddrL2, cmd.offsetPayload, cmd.lenBulkMem, &secureVirtualAdr); if (mcResult != MC_DRV_OK) { writeResult(connection, mcResult); return; } mcDrvRspMapBulkMem_t rsp; rsp.header.responseId = MC_DRV_OK; rsp.payload.sessionId = cmd.sessionId; rsp.payload.secureVirtualAdr = secureVirtualAdr; connection->writeData(&rsp, sizeof(mcDrvRspMapBulkMem_t)); }