提交 52379242 编写于 作者: Z zhushengle

feat: liteipc 静态内存优化

Close #I4G4HP
Signed-off-by: Nzhushengle <zhushengle@huawei.com>
Change-Id: I259c792365d9747f391c5bd275e77f04b83e0792
上级 ebfac57d
...@@ -373,10 +373,7 @@ LITE_OS_SEC_TEXT VOID OsProcessResourcesToFree(LosProcessCB *processCB) ...@@ -373,10 +373,7 @@ LITE_OS_SEC_TEXT VOID OsProcessResourcesToFree(LosProcessCB *processCB)
#endif #endif
#ifdef LOSCFG_KERNEL_LITEIPC #ifdef LOSCFG_KERNEL_LITEIPC
if (OsProcessIsUserMode(processCB)) { (VOID)LiteIpcPoolDestroy(processCB->processID);
LiteIpcPoolDelete(&(processCB->ipcInfo), processCB->processID);
(VOID)memset_s(&(processCB->ipcInfo), sizeof(ProcIpcInfo), 0, sizeof(ProcIpcInfo));
}
#endif #endif
if (processCB->resourceLimit != NULL) { if (processCB->resourceLimit != NULL) {
...@@ -750,16 +747,6 @@ STATIC UINT32 OsProcessCreateInit(LosProcessCB *processCB, UINT32 flags, const C ...@@ -750,16 +747,6 @@ STATIC UINT32 OsProcessCreateInit(LosProcessCB *processCB, UINT32 flags, const C
goto EXIT; goto EXIT;
} }
#ifdef LOSCFG_KERNEL_LITEIPC
if (OsProcessIsUserMode(processCB)) {
ret = LiteIpcPoolInit(&(processCB->ipcInfo));
if (ret != LOS_OK) {
ret = LOS_ENOMEM;
goto EXIT;
}
}
#endif
#ifdef LOSCFG_FS_VFS #ifdef LOSCFG_FS_VFS
processCB->files = alloc_files(); processCB->files = alloc_files();
if (processCB->files == NULL) { if (processCB->files == NULL) {
...@@ -1439,10 +1426,7 @@ LITE_OS_SEC_TEXT UINT32 OsExecRecycleAndInit(LosProcessCB *processCB, const CHAR ...@@ -1439,10 +1426,7 @@ LITE_OS_SEC_TEXT UINT32 OsExecRecycleAndInit(LosProcessCB *processCB, const CHAR
} }
#ifdef LOSCFG_KERNEL_LITEIPC #ifdef LOSCFG_KERNEL_LITEIPC
ret = LiteIpcPoolInit(&(processCB->ipcInfo)); (VOID)LiteIpcPoolDestroy(processCB->processID);
if (ret != LOS_OK) {
return LOS_NOK;
}
#endif #endif
processCB->sigHandler = 0; processCB->sigHandler = 0;
...@@ -1833,9 +1817,9 @@ STATIC UINT32 OsCopyProcessResources(UINT32 flags, LosProcessCB *child, LosProce ...@@ -1833,9 +1817,9 @@ STATIC UINT32 OsCopyProcessResources(UINT32 flags, LosProcessCB *child, LosProce
} }
#ifdef LOSCFG_KERNEL_LITEIPC #ifdef LOSCFG_KERNEL_LITEIPC
if (OsProcessIsUserMode(child)) { if (run->ipcInfo != NULL) {
ret = LiteIpcPoolReInit(&child->ipcInfo, (const ProcIpcInfo *)(&run->ipcInfo)); child->ipcInfo = LiteIpcPoolReInit((const ProcIpcInfo *)(run->ipcInfo));
if (ret != LOS_OK) { if (child->ipcInfo == NULL) {
return LOS_ENOMEM; return LOS_ENOMEM;
} }
} }
......
...@@ -510,7 +510,7 @@ LITE_OS_SEC_TEXT VOID OsTaskResourcesToFree(LosTaskCB *taskCB) ...@@ -510,7 +510,7 @@ LITE_OS_SEC_TEXT VOID OsTaskResourcesToFree(LosTaskCB *taskCB)
} }
#ifdef LOSCFG_KERNEL_LITEIPC #ifdef LOSCFG_KERNEL_LITEIPC
LiteIpcRemoveServiceHandle(taskCB); LiteIpcRemoveServiceHandle(taskCB->taskID);
#endif #endif
} }
#endif #endif
...@@ -552,9 +552,6 @@ LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskCBInitBase(LosTaskCB *taskCB, ...@@ -552,9 +552,6 @@ LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskCBInitBase(LosTaskCB *taskCB,
taskCB->currCpu = OS_TASK_INVALID_CPUID; taskCB->currCpu = OS_TASK_INVALID_CPUID;
taskCB->cpuAffiMask = (initParam->usCpuAffiMask) ? taskCB->cpuAffiMask = (initParam->usCpuAffiMask) ?
initParam->usCpuAffiMask : LOSCFG_KERNEL_CPU_MASK; initParam->usCpuAffiMask : LOSCFG_KERNEL_CPU_MASK;
#endif
#ifdef LOSCFG_KERNEL_LITEIPC
LOS_ListInit(&(taskCB->msgListHead));
#endif #endif
taskCB->policy = (initParam->policy == LOS_SCHED_FIFO) ? LOS_SCHED_FIFO : LOS_SCHED_RR; taskCB->policy = (initParam->policy == LOS_SCHED_FIFO) ? LOS_SCHED_FIFO : LOS_SCHED_RR;
taskCB->taskStatus = OS_TASK_STATUS_INIT; taskCB->taskStatus = OS_TASK_STATUS_INIT;
......
...@@ -103,7 +103,7 @@ typedef struct ProcessCB { ...@@ -103,7 +103,7 @@ typedef struct ProcessCB {
UINTPTR sigHandler; /**< Signal handler */ UINTPTR sigHandler; /**< Signal handler */
sigset_t sigShare; /**< Signal share bit */ sigset_t sigShare; /**< Signal share bit */
#ifdef LOSCFG_KERNEL_LITEIPC #ifdef LOSCFG_KERNEL_LITEIPC
ProcIpcInfo ipcInfo; /**< Memory pool for lite ipc */ ProcIpcInfo *ipcInfo; /**< Memory pool for lite ipc */
#endif #endif
#ifdef LOSCFG_KERNEL_VM #ifdef LOSCFG_KERNEL_VM
LosVmSpace *vmSpace; /**< VMM space for processes */ LosVmSpace *vmSpace; /**< VMM space for processes */
......
...@@ -44,7 +44,9 @@ ...@@ -44,7 +44,9 @@
#ifdef LOSCFG_KERNEL_CPUP #ifdef LOSCFG_KERNEL_CPUP
#include "los_cpup_pri.h" #include "los_cpup_pri.h"
#endif #endif
#ifdef LOSCFG_KERNEL_LITEIPC
#include "hm_liteipc.h"
#endif
#ifdef __cplusplus #ifdef __cplusplus
#if __cplusplus #if __cplusplus
extern "C" { extern "C" {
...@@ -359,8 +361,7 @@ typedef struct { ...@@ -359,8 +361,7 @@ typedef struct {
UINT16 waitFlag; /**< The type of child process that is waiting, belonging to a group or parent, UINT16 waitFlag; /**< The type of child process that is waiting, belonging to a group or parent,
a specific child process, or any child process */ a specific child process, or any child process */
#ifdef LOSCFG_KERNEL_LITEIPC #ifdef LOSCFG_KERNEL_LITEIPC
LOS_DL_LIST msgListHead; IpcTaskInfo *ipcTaskInfo;
BOOL accessMap[LOSCFG_BASE_CORE_TSK_LIMIT];
#endif #endif
#ifdef LOSCFG_KERNEL_PERF #ifdef LOSCFG_KERNEL_PERF
UINTPTR pc; UINTPTR pc;
......
...@@ -75,7 +75,6 @@ STATIC HandleInfo g_cmsTask; ...@@ -75,7 +75,6 @@ STATIC HandleInfo g_cmsTask;
STATIC HandleInfo g_serviceHandleMap[MAX_SERVICE_NUM]; STATIC HandleInfo g_serviceHandleMap[MAX_SERVICE_NUM];
#endif #endif
STATIC LOS_DL_LIST g_ipcPendlist; STATIC LOS_DL_LIST g_ipcPendlist;
STATIC LOS_DL_LIST g_ipcUsedNodelist[LOSCFG_BASE_CORE_PROCESS_LIMIT];
/* ipc lock */ /* ipc lock */
SPIN_LOCK_INIT(g_ipcSpin); SPIN_LOCK_INIT(g_ipcSpin);
...@@ -89,6 +88,7 @@ STATIC int LiteIpcMmap(struct file* filep, LosVmMapRegion *region); ...@@ -89,6 +88,7 @@ STATIC int LiteIpcMmap(struct file* filep, LosVmMapRegion *region);
STATIC UINT32 LiteIpcWrite(IpcContent *content); STATIC UINT32 LiteIpcWrite(IpcContent *content);
STATIC UINT32 GetTid(UINT32 serviceHandle, UINT32 *taskID); STATIC UINT32 GetTid(UINT32 serviceHandle, UINT32 *taskID);
STATIC UINT32 HandleSpecialObjects(UINT32 dstTid, IpcListNode *node, BOOL isRollback); STATIC UINT32 HandleSpecialObjects(UINT32 dstTid, IpcListNode *node, BOOL isRollback);
STATIC ProcIpcInfo *LiteIpcPoolCreate(VOID);
STATIC const struct file_operations_vfs g_liteIpcFops = { STATIC const struct file_operations_vfs g_liteIpcFops = {
.open = LiteIpcOpen, /* open */ .open = LiteIpcOpen, /* open */
...@@ -99,7 +99,7 @@ STATIC const struct file_operations_vfs g_liteIpcFops = { ...@@ -99,7 +99,7 @@ STATIC const struct file_operations_vfs g_liteIpcFops = {
LITE_OS_SEC_TEXT_INIT UINT32 OsLiteIpcInit(VOID) LITE_OS_SEC_TEXT_INIT UINT32 OsLiteIpcInit(VOID)
{ {
UINT32 ret, i; UINT32 ret;
#if (USE_TASKID_AS_HANDLE == YES) #if (USE_TASKID_AS_HANDLE == YES)
g_cmsTask.status = HANDLE_NOT_USED; g_cmsTask.status = HANDLE_NOT_USED;
#else #else
...@@ -114,9 +114,6 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsLiteIpcInit(VOID) ...@@ -114,9 +114,6 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsLiteIpcInit(VOID)
PRINT_ERR("register lite_ipc driver failed:%d\n", ret); PRINT_ERR("register lite_ipc driver failed:%d\n", ret);
} }
LOS_ListInit(&(g_ipcPendlist)); LOS_ListInit(&(g_ipcPendlist));
for (i = 0; i < LOSCFG_BASE_CORE_PROCESS_LIMIT; i++) {
LOS_ListInit(&(g_ipcUsedNodelist[i]));
}
return ret; return ret;
} }
...@@ -125,6 +122,16 @@ LOS_MODULE_INIT(OsLiteIpcInit, LOS_INIT_LEVEL_KMOD_EXTENDED); ...@@ -125,6 +122,16 @@ LOS_MODULE_INIT(OsLiteIpcInit, LOS_INIT_LEVEL_KMOD_EXTENDED);
LITE_OS_SEC_TEXT STATIC int LiteIpcOpen(struct file *filep) LITE_OS_SEC_TEXT STATIC int LiteIpcOpen(struct file *filep)
{ {
LosProcessCB *pcb = OsCurrProcessGet();
if (pcb->ipcInfo != NULL) {
return 0;
}
pcb->ipcInfo = LiteIpcPoolCreate();
if (pcb->ipcInfo == NULL) {
return -ENOMEM;
}
return 0; return 0;
} }
...@@ -133,11 +140,10 @@ LITE_OS_SEC_TEXT STATIC int LiteIpcClose(struct file *filep) ...@@ -133,11 +140,10 @@ LITE_OS_SEC_TEXT STATIC int LiteIpcClose(struct file *filep)
return 0; return 0;
} }
LITE_OS_SEC_TEXT STATIC BOOL IsPoolMapped(VOID) LITE_OS_SEC_TEXT STATIC BOOL IsPoolMapped(ProcIpcInfo *ipcInfo)
{ {
LosProcessCB *pcb = OsCurrProcessGet(); return (ipcInfo->pool.uvaddr != NULL) && (ipcInfo->pool.kvaddr != NULL) &&
return (pcb->ipcInfo.pool.uvaddr != NULL) && (pcb->ipcInfo.pool.kvaddr != NULL) && (ipcInfo->pool.poolSize != 0);
(pcb->ipcInfo.pool.poolSize != 0);
} }
LITE_OS_SEC_TEXT STATIC INT32 DoIpcMmap(LosProcessCB *pcb, LosVmMapRegion *region) LITE_OS_SEC_TEXT STATIC INT32 DoIpcMmap(LosProcessCB *pcb, LosVmMapRegion *region)
...@@ -147,8 +153,8 @@ LITE_OS_SEC_TEXT STATIC INT32 DoIpcMmap(LosProcessCB *pcb, LosVmMapRegion *regio ...@@ -147,8 +153,8 @@ LITE_OS_SEC_TEXT STATIC INT32 DoIpcMmap(LosProcessCB *pcb, LosVmMapRegion *regio
PADDR_T pa; PADDR_T pa;
UINT32 uflags = VM_MAP_REGION_FLAG_PERM_READ | VM_MAP_REGION_FLAG_PERM_USER; UINT32 uflags = VM_MAP_REGION_FLAG_PERM_READ | VM_MAP_REGION_FLAG_PERM_USER;
LosVmPage *vmPage = NULL; LosVmPage *vmPage = NULL;
VADDR_T uva = (VADDR_T)(UINTPTR)pcb->ipcInfo.pool.uvaddr; VADDR_T uva = (VADDR_T)(UINTPTR)pcb->ipcInfo->pool.uvaddr;
VADDR_T kva = (VADDR_T)(UINTPTR)pcb->ipcInfo.pool.kvaddr; VADDR_T kva = (VADDR_T)(UINTPTR)pcb->ipcInfo->pool.kvaddr;
(VOID)LOS_MuxAcquire(&pcb->vmSpace->regionMux); (VOID)LOS_MuxAcquire(&pcb->vmSpace->regionMux);
...@@ -191,28 +197,30 @@ LITE_OS_SEC_TEXT STATIC int LiteIpcMmap(struct file *filep, LosVmMapRegion *regi ...@@ -191,28 +197,30 @@ LITE_OS_SEC_TEXT STATIC int LiteIpcMmap(struct file *filep, LosVmMapRegion *regi
int ret = 0; int ret = 0;
LosVmMapRegion *regionTemp = NULL; LosVmMapRegion *regionTemp = NULL;
LosProcessCB *pcb = OsCurrProcessGet(); LosProcessCB *pcb = OsCurrProcessGet();
if ((region == NULL) || (region->range.size > LITE_IPC_POOL_MAX_SIZE) || ProcIpcInfo *ipcInfo = pcb->ipcInfo;
if ((ipcInfo == NULL) || (region == NULL) || (region->range.size > LITE_IPC_POOL_MAX_SIZE) ||
(!LOS_IsRegionPermUserReadOnly(region)) || (!LOS_IsRegionFlagPrivateOnly(region))) { (!LOS_IsRegionPermUserReadOnly(region)) || (!LOS_IsRegionFlagPrivateOnly(region))) {
ret = -EINVAL; ret = -EINVAL;
goto ERROR_REGION_OUT; goto ERROR_REGION_OUT;
} }
if (IsPoolMapped()) { if (IsPoolMapped(ipcInfo)) {
return -EEXIST; return -EEXIST;
} }
if (pcb->ipcInfo.pool.uvaddr != NULL) { if (ipcInfo->pool.uvaddr != NULL) {
regionTemp = LOS_RegionFind(pcb->vmSpace, (VADDR_T)(UINTPTR)pcb->ipcInfo.pool.uvaddr); regionTemp = LOS_RegionFind(pcb->vmSpace, (VADDR_T)(UINTPTR)ipcInfo->pool.uvaddr);
if (regionTemp != NULL) { if (regionTemp != NULL) {
(VOID)LOS_RegionFree(pcb->vmSpace, regionTemp); (VOID)LOS_RegionFree(pcb->vmSpace, regionTemp);
} }
} }
pcb->ipcInfo.pool.uvaddr = (VOID *)(UINTPTR)region->range.base; ipcInfo->pool.uvaddr = (VOID *)(UINTPTR)region->range.base;
if (pcb->ipcInfo.pool.kvaddr != NULL) { if (ipcInfo->pool.kvaddr != NULL) {
LOS_VFree(pcb->ipcInfo.pool.kvaddr); LOS_VFree(ipcInfo->pool.kvaddr);
pcb->ipcInfo.pool.kvaddr = NULL; ipcInfo->pool.kvaddr = NULL;
} }
/* use vmalloc to alloc phy mem */ /* use vmalloc to alloc phy mem */
pcb->ipcInfo.pool.kvaddr = LOS_VMalloc(region->range.size); ipcInfo->pool.kvaddr = LOS_VMalloc(region->range.size);
if (pcb->ipcInfo.pool.kvaddr == NULL) { if (ipcInfo->pool.kvaddr == NULL) {
ret = -ENOMEM; ret = -ENOMEM;
goto ERROR_REGION_OUT; goto ERROR_REGION_OUT;
} }
...@@ -222,39 +230,58 @@ LITE_OS_SEC_TEXT STATIC int LiteIpcMmap(struct file *filep, LosVmMapRegion *regi ...@@ -222,39 +230,58 @@ LITE_OS_SEC_TEXT STATIC int LiteIpcMmap(struct file *filep, LosVmMapRegion *regi
goto ERROR_MAP_OUT; goto ERROR_MAP_OUT;
} }
/* ipc pool init */ /* ipc pool init */
if (LOS_MemInit(pcb->ipcInfo.pool.kvaddr, region->range.size) != LOS_OK) { if (LOS_MemInit(ipcInfo->pool.kvaddr, region->range.size) != LOS_OK) {
ret = -EINVAL; ret = -EINVAL;
goto ERROR_MAP_OUT; goto ERROR_MAP_OUT;
} }
pcb->ipcInfo.pool.poolSize = region->range.size; ipcInfo->pool.poolSize = region->range.size;
return 0; return 0;
ERROR_MAP_OUT: ERROR_MAP_OUT:
LOS_VFree(pcb->ipcInfo.pool.kvaddr); LOS_VFree(ipcInfo->pool.kvaddr);
ERROR_REGION_OUT: ERROR_REGION_OUT:
pcb->ipcInfo.pool.uvaddr = NULL; ipcInfo->pool.uvaddr = NULL;
pcb->ipcInfo.pool.kvaddr = NULL; ipcInfo->pool.kvaddr = NULL;
return ret; return ret;
} }
LITE_OS_SEC_TEXT_INIT UINT32 LiteIpcPoolInit(ProcIpcInfo *ipcInfo) LITE_OS_SEC_TEXT_INIT STATIC UINT32 LiteIpcPoolInit(ProcIpcInfo *ipcInfo)
{ {
ipcInfo->pool.uvaddr = NULL; ipcInfo->pool.uvaddr = NULL;
ipcInfo->pool.kvaddr = NULL; ipcInfo->pool.kvaddr = NULL;
ipcInfo->pool.poolSize = 0; ipcInfo->pool.poolSize = 0;
ipcInfo->ipcTaskID = INVAILD_ID; ipcInfo->ipcTaskID = INVAILD_ID;
LOS_ListInit(&ipcInfo->ipcUsedNodelist);
return LOS_OK; return LOS_OK;
} }
LITE_OS_SEC_TEXT UINT32 LiteIpcPoolReInit(ProcIpcInfo *child, const ProcIpcInfo *parent) LITE_OS_SEC_TEXT_INIT STATIC ProcIpcInfo *LiteIpcPoolCreate(VOID)
{ {
child->pool.uvaddr = parent->pool.uvaddr; ProcIpcInfo *ipcInfo = LOS_MemAlloc(m_aucSysMem1, sizeof(ProcIpcInfo));
child->pool.kvaddr = NULL; if (ipcInfo == NULL) {
child->pool.poolSize = 0; return NULL;
child->ipcTaskID = INVAILD_ID; }
return LOS_OK;
(VOID)memset_s(ipcInfo, sizeof(ProcIpcInfo), 0, sizeof(ProcIpcInfo));
(VOID)LiteIpcPoolInit(ipcInfo);
return ipcInfo;
}
LITE_OS_SEC_TEXT ProcIpcInfo *LiteIpcPoolReInit(const ProcIpcInfo *parent)
{
ProcIpcInfo *ipcInfo = LiteIpcPoolCreate();
if (ipcInfo == NULL) {
return NULL;
}
ipcInfo->pool.uvaddr = parent->pool.uvaddr;
ipcInfo->pool.kvaddr = NULL;
ipcInfo->pool.poolSize = 0;
ipcInfo->ipcTaskID = INVAILD_ID;
return ipcInfo;
} }
LITE_OS_SEC_TEXT VOID LiteIpcPoolDelete(ProcIpcInfo *ipcInfo, UINT32 processID) STATIC VOID LiteIpcPoolDelete(ProcIpcInfo *ipcInfo, UINT32 processID)
{ {
UINT32 intSave; UINT32 intSave;
IpcUsedNode *node = NULL; IpcUsedNode *node = NULL;
...@@ -262,8 +289,8 @@ LITE_OS_SEC_TEXT VOID LiteIpcPoolDelete(ProcIpcInfo *ipcInfo, UINT32 processID) ...@@ -262,8 +289,8 @@ LITE_OS_SEC_TEXT VOID LiteIpcPoolDelete(ProcIpcInfo *ipcInfo, UINT32 processID)
LOS_VFree(ipcInfo->pool.kvaddr); LOS_VFree(ipcInfo->pool.kvaddr);
ipcInfo->pool.kvaddr = NULL; ipcInfo->pool.kvaddr = NULL;
IPC_LOCK(intSave); IPC_LOCK(intSave);
while (!LOS_ListEmpty(&g_ipcUsedNodelist[processID])) { while (!LOS_ListEmpty(&ipcInfo->ipcUsedNodelist)) {
node = LOS_DL_LIST_ENTRY(g_ipcUsedNodelist[processID].pstNext, IpcUsedNode, list); node = LOS_DL_LIST_ENTRY(ipcInfo->ipcUsedNodelist.pstNext, IpcUsedNode, list);
LOS_ListDelete(&node->list); LOS_ListDelete(&node->list);
free(node); free(node);
} }
...@@ -273,45 +300,75 @@ LITE_OS_SEC_TEXT VOID LiteIpcPoolDelete(ProcIpcInfo *ipcInfo, UINT32 processID) ...@@ -273,45 +300,75 @@ LITE_OS_SEC_TEXT VOID LiteIpcPoolDelete(ProcIpcInfo *ipcInfo, UINT32 processID)
for (UINT32 i = 0; i < MAX_SERVICE_NUM; i++) { for (UINT32 i = 0; i < MAX_SERVICE_NUM; i++) {
if (ipcInfo->access[i] == TRUE) { if (ipcInfo->access[i] == TRUE) {
ipcInfo->access[i] = FALSE; ipcInfo->access[i] = FALSE;
OS_TCB_FROM_TID(i)->accessMap[processID] = FALSE; if (OS_TCB_FROM_TID(i)->ipcTaskInfo != NULL) {
OS_TCB_FROM_TID(i)->ipcTaskInfo->accessMap[processID] = FALSE;
}
} }
} }
} }
LITE_OS_SEC_TEXT UINT32 LiteIpcPoolDestroy(UINT32 processID)
{
LosProcessCB *pcb = OS_PCB_FROM_PID(processID);
if (pcb->ipcInfo == NULL) {
return LOS_NOK;
}
LiteIpcPoolDelete(pcb->ipcInfo, pcb->processID);
LOS_MemFree(m_aucSysMem1, pcb->ipcInfo);
pcb->ipcInfo = NULL;
return LOS_OK;
}
LITE_OS_SEC_TEXT_INIT STATIC IpcTaskInfo *LiteIpcTaskInit(VOID)
{
IpcTaskInfo *taskInfo = LOS_MemAlloc((VOID *)m_aucSysMem1, sizeof(IpcTaskInfo));
if (taskInfo == NULL) {
return NULL;
}
(VOID)memset_s(taskInfo, sizeof(IpcTaskInfo), 0, sizeof(IpcTaskInfo));
LOS_ListInit(&taskInfo->msgListHead);
return taskInfo;
}
/* Only when kernenl no longer access ipc node content, can user free the ipc node */ /* Only when kernenl no longer access ipc node content, can user free the ipc node */
LITE_OS_SEC_TEXT STATIC VOID EnableIpcNodeFreeByUser(UINT32 processID, VOID *buf) LITE_OS_SEC_TEXT STATIC VOID EnableIpcNodeFreeByUser(UINT32 processID, VOID *buf)
{ {
UINT32 intSave; UINT32 intSave;
ProcIpcInfo *ipcInfo = OS_PCB_FROM_PID(processID)->ipcInfo;
IpcUsedNode *node = (IpcUsedNode *)malloc(sizeof(IpcUsedNode)); IpcUsedNode *node = (IpcUsedNode *)malloc(sizeof(IpcUsedNode));
if (node != NULL) { if (node != NULL) {
node->ptr = buf; node->ptr = buf;
IPC_LOCK(intSave); IPC_LOCK(intSave);
LOS_ListAdd(&g_ipcUsedNodelist[processID], &node->list); LOS_ListAdd(&ipcInfo->ipcUsedNodelist, &node->list);
IPC_UNLOCK(intSave); IPC_UNLOCK(intSave);
} }
} }
LITE_OS_SEC_TEXT STATIC VOID *LiteIpcNodeAlloc(UINT32 processID, UINT32 size) LITE_OS_SEC_TEXT STATIC VOID *LiteIpcNodeAlloc(UINT32 processID, UINT32 size)
{ {
VOID *ptr = LOS_MemAlloc(OS_PCB_FROM_PID(processID)->ipcInfo.pool.kvaddr, size); VOID *ptr = LOS_MemAlloc(OS_PCB_FROM_PID(processID)->ipcInfo->pool.kvaddr, size);
PRINT_INFO("LiteIpcNodeAlloc pid:%d, pool:%x buf:%x size:%d\n", PRINT_INFO("LiteIpcNodeAlloc pid:%d, pool:%x buf:%x size:%d\n",
processID, OS_PCB_FROM_PID(processID)->ipcInfo.pool.kvaddr, ptr, size); processID, OS_PCB_FROM_PID(processID)->ipcInfo->pool.kvaddr, ptr, size);
return ptr; return ptr;
} }
LITE_OS_SEC_TEXT STATIC UINT32 LiteIpcNodeFree(UINT32 processID, VOID *buf) LITE_OS_SEC_TEXT STATIC UINT32 LiteIpcNodeFree(UINT32 processID, VOID *buf)
{ {
PRINT_INFO("LiteIpcNodeFree pid:%d, pool:%x buf:%x\n", PRINT_INFO("LiteIpcNodeFree pid:%d, pool:%x buf:%x\n",
processID, OS_PCB_FROM_PID(processID)->ipcInfo.pool.kvaddr, buf); processID, OS_PCB_FROM_PID(processID)->ipcInfo->pool.kvaddr, buf);
return LOS_MemFree(OS_PCB_FROM_PID(processID)->ipcInfo.pool.kvaddr, buf); return LOS_MemFree(OS_PCB_FROM_PID(processID)->ipcInfo->pool.kvaddr, buf);
} }
LITE_OS_SEC_TEXT STATIC BOOL IsIpcNode(UINT32 processID, const VOID *buf) LITE_OS_SEC_TEXT STATIC BOOL IsIpcNode(UINT32 processID, const VOID *buf)
{ {
IpcUsedNode *node = NULL; IpcUsedNode *node = NULL;
UINT32 intSave; UINT32 intSave;
ProcIpcInfo *ipcInfo = OS_PCB_FROM_PID(processID)->ipcInfo;
IPC_LOCK(intSave); IPC_LOCK(intSave);
LOS_DL_LIST_FOR_EACH_ENTRY(node, &g_ipcUsedNodelist[processID], IpcUsedNode, list) { LOS_DL_LIST_FOR_EACH_ENTRY(node, &ipcInfo->ipcUsedNodelist, IpcUsedNode, list) {
if (node->ptr == buf) { if (node->ptr == buf) {
LOS_ListDelete(&node->list); LOS_ListDelete(&node->list);
IPC_UNLOCK(intSave); IPC_UNLOCK(intSave);
...@@ -325,14 +382,14 @@ LITE_OS_SEC_TEXT STATIC BOOL IsIpcNode(UINT32 processID, const VOID *buf) ...@@ -325,14 +382,14 @@ LITE_OS_SEC_TEXT STATIC BOOL IsIpcNode(UINT32 processID, const VOID *buf)
LITE_OS_SEC_TEXT STATIC INTPTR GetIpcUserAddr(UINT32 processID, INTPTR kernelAddr) LITE_OS_SEC_TEXT STATIC INTPTR GetIpcUserAddr(UINT32 processID, INTPTR kernelAddr)
{ {
IpcPool pool = OS_PCB_FROM_PID(processID)->ipcInfo.pool; IpcPool pool = OS_PCB_FROM_PID(processID)->ipcInfo->pool;
INTPTR offset = (INTPTR)(pool.uvaddr) - (INTPTR)(pool.kvaddr); INTPTR offset = (INTPTR)(pool.uvaddr) - (INTPTR)(pool.kvaddr);
return kernelAddr + offset; return kernelAddr + offset;
} }
LITE_OS_SEC_TEXT STATIC INTPTR GetIpcKernelAddr(UINT32 processID, INTPTR userAddr) LITE_OS_SEC_TEXT STATIC INTPTR GetIpcKernelAddr(UINT32 processID, INTPTR userAddr)
{ {
IpcPool pool = OS_PCB_FROM_PID(processID)->ipcInfo.pool; IpcPool pool = OS_PCB_FROM_PID(processID)->ipcInfo->pool;
INTPTR offset = (INTPTR)(pool.uvaddr) - (INTPTR)(pool.kvaddr); INTPTR offset = (INTPTR)(pool.uvaddr) - (INTPTR)(pool.kvaddr);
return userAddr - offset; return userAddr - offset;
} }
...@@ -341,7 +398,7 @@ LITE_OS_SEC_TEXT STATIC UINT32 CheckUsedBuffer(const VOID *node, IpcListNode **o ...@@ -341,7 +398,7 @@ LITE_OS_SEC_TEXT STATIC UINT32 CheckUsedBuffer(const VOID *node, IpcListNode **o
{ {
VOID *ptr = NULL; VOID *ptr = NULL;
LosProcessCB *pcb = OsCurrProcessGet(); LosProcessCB *pcb = OsCurrProcessGet();
IpcPool pool = pcb->ipcInfo.pool; IpcPool pool = pcb->ipcInfo->pool;
if ((node == NULL) || ((INTPTR)node < (INTPTR)(pool.uvaddr)) || if ((node == NULL) || ((INTPTR)node < (INTPTR)(pool.uvaddr)) ||
((INTPTR)node > (INTPTR)(pool.uvaddr) + pool.poolSize)) { ((INTPTR)node > (INTPTR)(pool.uvaddr) + pool.poolSize)) {
return -EINVAL; return -EINVAL;
...@@ -417,12 +474,18 @@ LITE_OS_SEC_TEXT STATIC UINT32 AddServiceAccess(UINT32 taskID, UINT32 serviceHan ...@@ -417,12 +474,18 @@ LITE_OS_SEC_TEXT STATIC UINT32 AddServiceAccess(UINT32 taskID, UINT32 serviceHan
UINT32 serviceTid = 0; UINT32 serviceTid = 0;
UINT32 ret = GetTid(serviceHandle, &serviceTid); UINT32 ret = GetTid(serviceHandle, &serviceTid);
if (ret != LOS_OK) { if (ret != LOS_OK) {
PRINT_ERR("AddServiceAccess GetTid failed\n"); PRINT_ERR("Liteipc AddServiceAccess GetTid failed\n");
return ret; return ret;
} }
LosTaskCB *tcb = OS_TCB_FROM_TID(serviceTid);
UINT32 processID = OS_TCB_FROM_TID(taskID)->processID; UINT32 processID = OS_TCB_FROM_TID(taskID)->processID;
OS_TCB_FROM_TID(serviceTid)->accessMap[processID] = TRUE; LosProcessCB *pcb = OS_PCB_FROM_PID(processID);
OS_PCB_FROM_PID(processID)->ipcInfo.access[serviceTid] = TRUE; if ((tcb->ipcTaskInfo == NULL) || (pcb->ipcInfo == NULL)) {
PRINT_ERR("Liteipc AddServiceAccess ipc not create! pid %u tid %u\n", processID, tcb->taskID);
return -EINVAL;
}
tcb->ipcTaskInfo->accessMap[processID] = TRUE;
pcb->ipcInfo->access[serviceTid] = TRUE;
return LOS_OK; return LOS_OK;
} }
...@@ -439,28 +502,33 @@ LITE_OS_SEC_TEXT STATIC BOOL HasServiceAccess(UINT32 serviceHandle) ...@@ -439,28 +502,33 @@ LITE_OS_SEC_TEXT STATIC BOOL HasServiceAccess(UINT32 serviceHandle)
} }
ret = GetTid(serviceHandle, &serviceTid); ret = GetTid(serviceHandle, &serviceTid);
if (ret != LOS_OK) { if (ret != LOS_OK) {
PRINT_ERR("HasServiceAccess GetTid failed\n"); PRINT_ERR("Liteipc HasServiceAccess GetTid failed\n");
return FALSE; return FALSE;
} }
if (OS_TCB_FROM_TID(serviceTid)->processID == curProcessID) { if (OS_TCB_FROM_TID(serviceTid)->processID == curProcessID) {
return TRUE; return TRUE;
} }
return OS_TCB_FROM_TID(serviceTid)->accessMap[curProcessID];
if (OS_TCB_FROM_TID(serviceTid)->ipcTaskInfo == NULL) {
return FALSE;
}
return OS_TCB_FROM_TID(serviceTid)->ipcTaskInfo->accessMap[curProcessID];
} }
LITE_OS_SEC_TEXT STATIC UINT32 SetIpcTask(VOID) LITE_OS_SEC_TEXT STATIC UINT32 SetIpcTask(VOID)
{ {
if (OsCurrProcessGet()->ipcInfo.ipcTaskID == INVAILD_ID) { if (OsCurrProcessGet()->ipcInfo->ipcTaskID == INVAILD_ID) {
OsCurrProcessGet()->ipcInfo.ipcTaskID = LOS_CurTaskIDGet(); OsCurrProcessGet()->ipcInfo->ipcTaskID = LOS_CurTaskIDGet();
return OsCurrProcessGet()->ipcInfo.ipcTaskID; return OsCurrProcessGet()->ipcInfo->ipcTaskID;
} }
PRINT_ERR("curprocess %d IpcTask already set!\n", OsCurrProcessGet()->processID); PRINT_ERR("Liteipc curprocess %d IpcTask already set!\n", OsCurrProcessGet()->processID);
return -EINVAL; return -EINVAL;
} }
LITE_OS_SEC_TEXT BOOL IsIpcTaskSet(VOID) LITE_OS_SEC_TEXT BOOL IsIpcTaskSet(VOID)
{ {
if (OsCurrProcessGet()->ipcInfo.ipcTaskID == INVAILD_ID) { if (OsCurrProcessGet()->ipcInfo->ipcTaskID == INVAILD_ID) {
return FALSE; return FALSE;
} }
return TRUE; return TRUE;
...@@ -468,10 +536,10 @@ LITE_OS_SEC_TEXT BOOL IsIpcTaskSet(VOID) ...@@ -468,10 +536,10 @@ LITE_OS_SEC_TEXT BOOL IsIpcTaskSet(VOID)
LITE_OS_SEC_TEXT STATIC UINT32 GetIpcTaskID(UINT32 processID, UINT32 *ipcTaskID) LITE_OS_SEC_TEXT STATIC UINT32 GetIpcTaskID(UINT32 processID, UINT32 *ipcTaskID)
{ {
if (OS_PCB_FROM_PID(processID)->ipcInfo.ipcTaskID == INVAILD_ID) { if (OS_PCB_FROM_PID(processID)->ipcInfo->ipcTaskID == INVAILD_ID) {
return LOS_NOK; return LOS_NOK;
} }
*ipcTaskID = OS_PCB_FROM_PID(processID)->ipcInfo.ipcTaskID; *ipcTaskID = OS_PCB_FROM_PID(processID)->ipcInfo->ipcTaskID;
return LOS_OK; return LOS_OK;
} }
...@@ -481,8 +549,13 @@ LITE_OS_SEC_TEXT STATIC UINT32 SendDeathMsg(UINT32 processID, UINT32 serviceHand ...@@ -481,8 +549,13 @@ LITE_OS_SEC_TEXT STATIC UINT32 SendDeathMsg(UINT32 processID, UINT32 serviceHand
UINT32 ret; UINT32 ret;
IpcContent content; IpcContent content;
IpcMsg msg; IpcMsg msg;
LosProcessCB *pcb = OS_PCB_FROM_PID(processID);
if (pcb->ipcInfo == NULL) {
return -EINVAL;
}
OS_PCB_FROM_PID(processID)->ipcInfo.access[serviceHandle] = false; pcb->ipcInfo->access[serviceHandle] = FALSE;
ret = GetIpcTaskID(processID, &ipcTaskID); ret = GetIpcTaskID(processID, &ipcTaskID);
if (ret != LOS_OK) { if (ret != LOS_OK) {
...@@ -498,9 +571,15 @@ LITE_OS_SEC_TEXT STATIC UINT32 SendDeathMsg(UINT32 processID, UINT32 serviceHand ...@@ -498,9 +571,15 @@ LITE_OS_SEC_TEXT STATIC UINT32 SendDeathMsg(UINT32 processID, UINT32 serviceHand
return LiteIpcWrite(&content); return LiteIpcWrite(&content);
} }
LITE_OS_SEC_TEXT VOID LiteIpcRemoveServiceHandle(LosTaskCB *taskCB) LITE_OS_SEC_TEXT VOID LiteIpcRemoveServiceHandle(UINT32 taskID)
{ {
UINT32 j; UINT32 j;
LosTaskCB *taskCB = OS_TCB_FROM_TID(taskID);
IpcTaskInfo *ipcTaskInfo = taskCB->ipcTaskInfo;
if (ipcTaskInfo == NULL) {
return;
}
#if (USE_TASKID_AS_HANDLE == YES) #if (USE_TASKID_AS_HANDLE == YES)
UINT32 intSave; UINT32 intSave;
...@@ -509,7 +588,7 @@ LITE_OS_SEC_TEXT VOID LiteIpcRemoveServiceHandle(LosTaskCB *taskCB) ...@@ -509,7 +588,7 @@ LITE_OS_SEC_TEXT VOID LiteIpcRemoveServiceHandle(LosTaskCB *taskCB)
IpcListNode *node = NULL; IpcListNode *node = NULL;
UINT32 processID = taskCB->processID; UINT32 processID = taskCB->processID;
listHead = &(taskCB->msgListHead); listHead = &(ipcTaskInfo->msgListHead);
do { do {
SCHEDULER_LOCK(intSave); SCHEDULER_LOCK(intSave);
if (LOS_ListEmpty(listHead)) { if (LOS_ListEmpty(listHead)) {
...@@ -525,10 +604,10 @@ LITE_OS_SEC_TEXT VOID LiteIpcRemoveServiceHandle(LosTaskCB *taskCB) ...@@ -525,10 +604,10 @@ LITE_OS_SEC_TEXT VOID LiteIpcRemoveServiceHandle(LosTaskCB *taskCB)
} }
} while (1); } while (1);
taskCB->accessMap[processID] = FALSE; ipcTaskInfo->accessMap[processID] = FALSE;
for (j = 0; j < MAX_SERVICE_NUM; j++) { for (j = 0; j < MAX_SERVICE_NUM; j++) {
if (taskCB->accessMap[j] == TRUE) { if (ipcTaskInfo->accessMap[j] == TRUE) {
taskCB->accessMap[j] = FALSE; ipcTaskInfo->accessMap[j] = FALSE;
(VOID)SendDeathMsg(j, taskCB->taskID); (VOID)SendDeathMsg(j, taskCB->taskID);
} }
} }
...@@ -545,12 +624,15 @@ LITE_OS_SEC_TEXT VOID LiteIpcRemoveServiceHandle(LosTaskCB *taskCB) ...@@ -545,12 +624,15 @@ LITE_OS_SEC_TEXT VOID LiteIpcRemoveServiceHandle(LosTaskCB *taskCB)
/* run deathHandler */ /* run deathHandler */
if (i < MAX_SERVICE_NUM) { if (i < MAX_SERVICE_NUM) {
for (j = 0; j < MAX_SERVICE_NUM; j++) { for (j = 0; j < MAX_SERVICE_NUM; j++) {
if (taskCB->accessMap[j] == TRUE) { if (ipcTaskInfo->accessMap[j] == TRUE) {
(VOID)SendDeathMsg(j, i); (VOID)SendDeathMsg(j, i);
} }
} }
} }
#endif #endif
(VOID)LOS_MemFree(m_aucSysMem1, ipcTaskInfo);
taskCB->ipcTaskInfo = NULL;
} }
LITE_OS_SEC_TEXT STATIC UINT32 SetCms(UINTPTR maxMsgSize) LITE_OS_SEC_TEXT STATIC UINT32 SetCms(UINTPTR maxMsgSize)
...@@ -650,12 +732,12 @@ LITE_OS_SEC_TEXT STATIC UINT32 HandlePtr(UINT32 processID, SpecialObj *obj, BOOL ...@@ -650,12 +732,12 @@ LITE_OS_SEC_TEXT STATIC UINT32 HandlePtr(UINT32 processID, SpecialObj *obj, BOOL
} }
if (isRollback == FALSE) { if (isRollback == FALSE) {
if (LOS_IsUserAddress((vaddr_t)(UINTPTR)(obj->content.ptr.buff)) == FALSE) { if (LOS_IsUserAddress((vaddr_t)(UINTPTR)(obj->content.ptr.buff)) == FALSE) {
PRINT_ERR("Bad ptr address\n"); PRINT_ERR("Liteipc Bad ptr address\n");
return -EINVAL; return -EINVAL;
} }
buf = LiteIpcNodeAlloc(processID, obj->content.ptr.buffSz); buf = LiteIpcNodeAlloc(processID, obj->content.ptr.buffSz);
if (buf == NULL) { if (buf == NULL) {
PRINT_ERR("DealPtr alloc mem failed\n"); PRINT_ERR("Liteipc DealPtr alloc mem failed\n");
return -EINVAL; return -EINVAL;
} }
ret = copy_from_user(buf, obj->content.ptr.buff, obj->content.ptr.buffSz); ret = copy_from_user(buf, obj->content.ptr.buff, obj->content.ptr.buffSz);
...@@ -676,15 +758,15 @@ LITE_OS_SEC_TEXT STATIC UINT32 HandleSvc(UINT32 dstTid, const SpecialObj *obj, B ...@@ -676,15 +758,15 @@ LITE_OS_SEC_TEXT STATIC UINT32 HandleSvc(UINT32 dstTid, const SpecialObj *obj, B
UINT32 taskID = 0; UINT32 taskID = 0;
if (isRollback == FALSE) { if (isRollback == FALSE) {
if (IsTaskAlive(obj->content.svc.handle) == FALSE) { if (IsTaskAlive(obj->content.svc.handle) == FALSE) {
PRINT_ERR("HandleSvc wrong svctid\n"); PRINT_ERR("Liteipc HandleSvc wrong svctid\n");
return -EINVAL; return -EINVAL;
} }
if (HasServiceAccess(obj->content.svc.handle) == FALSE) { if (HasServiceAccess(obj->content.svc.handle) == FALSE) {
PRINT_ERR("%s, %d\n", __FUNCTION__, __LINE__); PRINT_ERR("Liteipc %s, %d\n", __FUNCTION__, __LINE__);
return -EACCES; return -EACCES;
} }
if (GetTid(obj->content.svc.handle, &taskID) == 0) { if (GetTid(obj->content.svc.handle, &taskID) == 0) {
if (taskID == OS_PCB_FROM_PID(OS_TCB_FROM_TID(taskID)->processID)->ipcInfo.ipcTaskID) { if (taskID == OS_PCB_FROM_PID(OS_TCB_FROM_TID(taskID)->processID)->ipcInfo->ipcTaskID) {
AddServiceAccess(dstTid, obj->content.svc.handle); AddServiceAccess(dstTid, obj->content.svc.handle);
} }
} }
...@@ -873,7 +955,7 @@ LITE_OS_SEC_TEXT STATIC UINT32 CheckPara(IpcContent *content, UINT32 *dstTid) ...@@ -873,7 +955,7 @@ LITE_OS_SEC_TEXT STATIC UINT32 CheckPara(IpcContent *content, UINT32 *dstTid)
return -EINVAL; return -EINVAL;
} }
} else { } else {
PRINT_ERR("%s, %d\n", __FUNCTION__, __LINE__); PRINT_ERR("Liteipc %s, %d\n", __FUNCTION__, __LINE__);
return -EACCES; return -EACCES;
} }
#if (USE_TIMESTAMP == YES) #if (USE_TIMESTAMP == YES)
...@@ -898,7 +980,7 @@ LITE_OS_SEC_TEXT STATIC UINT32 CheckPara(IpcContent *content, UINT32 *dstTid) ...@@ -898,7 +980,7 @@ LITE_OS_SEC_TEXT STATIC UINT32 CheckPara(IpcContent *content, UINT32 *dstTid)
#endif #endif
OsHookCall(LOS_HOOK_TYPE_IPC_WRITE_DROP, msg, *dstTid, OsHookCall(LOS_HOOK_TYPE_IPC_WRITE_DROP, msg, *dstTid,
(*dstTid == INVAILD_ID) ? INVAILD_ID : OS_TCB_FROM_TID(*dstTid)->processID, 0); (*dstTid == INVAILD_ID) ? INVAILD_ID : OS_TCB_FROM_TID(*dstTid)->processID, 0);
PRINT_ERR("A timeout reply, request timestamp:%lld, now:%lld\n", msg->timestamp, now); PRINT_ERR("Liteipc A timeout reply, request timestamp:%lld, now:%lld\n", msg->timestamp, now);
return -ETIME; return -ETIME;
} }
#endif #endif
...@@ -933,8 +1015,15 @@ LITE_OS_SEC_TEXT STATIC UINT32 LiteIpcWrite(IpcContent *content) ...@@ -933,8 +1015,15 @@ LITE_OS_SEC_TEXT STATIC UINT32 LiteIpcWrite(IpcContent *content)
return ret; return ret;
} }
LosTaskCB *tcb = OS_TCB_FROM_TID(dstTid);
LosProcessCB *pcb = OS_PCB_FROM_PID(tcb->processID);
if (pcb->ipcInfo == NULL) {
PRINT_ERR("pid %u Liteipc not create\n", tcb->processID);
return -EINVAL;
}
UINT32 bufSz = sizeof(IpcListNode) + msg->dataSz + msg->spObjNum * sizeof(UINT32); UINT32 bufSz = sizeof(IpcListNode) + msg->dataSz + msg->spObjNum * sizeof(UINT32);
IpcListNode *buf = (IpcListNode *)LiteIpcNodeAlloc(OS_TCB_FROM_TID(dstTid)->processID, bufSz); IpcListNode *buf = (IpcListNode *)LiteIpcNodeAlloc(tcb->processID, bufSz);
if (buf == NULL) { if (buf == NULL) {
PRINT_ERR("%s, %d\n", __FUNCTION__, __LINE__); PRINT_ERR("%s, %d\n", __FUNCTION__, __LINE__);
return -ENOMEM; return -ENOMEM;
...@@ -944,6 +1033,11 @@ LITE_OS_SEC_TEXT STATIC UINT32 LiteIpcWrite(IpcContent *content) ...@@ -944,6 +1033,11 @@ LITE_OS_SEC_TEXT STATIC UINT32 LiteIpcWrite(IpcContent *content)
PRINT_ERR("%s, %d\n", __FUNCTION__, __LINE__); PRINT_ERR("%s, %d\n", __FUNCTION__, __LINE__);
goto ERROR_COPY; goto ERROR_COPY;
} }
if (tcb->ipcTaskInfo == NULL) {
tcb->ipcTaskInfo = LiteIpcTaskInit();
}
ret = HandleSpecialObjects(dstTid, buf, FALSE); ret = HandleSpecialObjects(dstTid, buf, FALSE);
if (ret != LOS_OK) { if (ret != LOS_OK) {
PRINT_ERR("%s, %d\n", __FUNCTION__, __LINE__); PRINT_ERR("%s, %d\n", __FUNCTION__, __LINE__);
...@@ -951,8 +1045,7 @@ LITE_OS_SEC_TEXT STATIC UINT32 LiteIpcWrite(IpcContent *content) ...@@ -951,8 +1045,7 @@ LITE_OS_SEC_TEXT STATIC UINT32 LiteIpcWrite(IpcContent *content)
} }
/* add data to list and wake up dest task */ /* add data to list and wake up dest task */
SCHEDULER_LOCK(intSave); SCHEDULER_LOCK(intSave);
LosTaskCB *tcb = OS_TCB_FROM_TID(dstTid); LOS_ListTailInsert(&(tcb->ipcTaskInfo->msgListHead), &(buf->listNode));
LOS_ListTailInsert(&(tcb->msgListHead), &(buf->listNode));
OsHookCall(LOS_HOOK_TYPE_IPC_WRITE, &buf->msg, dstTid, tcb->processID, tcb->waitFlag); OsHookCall(LOS_HOOK_TYPE_IPC_WRITE, &buf->msg, dstTid, tcb->processID, tcb->waitFlag);
if (tcb->waitFlag == OS_TASK_WAIT_LITEIPC) { if (tcb->waitFlag == OS_TASK_WAIT_LITEIPC) {
OsTaskWakeClearPendMask(tcb); OsTaskWakeClearPendMask(tcb);
...@@ -1030,7 +1123,11 @@ LITE_OS_SEC_TEXT STATIC UINT32 LiteIpcRead(IpcContent *content) ...@@ -1030,7 +1123,11 @@ LITE_OS_SEC_TEXT STATIC UINT32 LiteIpcRead(IpcContent *content)
UINT32 timeout = syncFlag ? LOS_MS2Tick(LITEIPC_TIMEOUT_MS) : LOS_WAIT_FOREVER; UINT32 timeout = syncFlag ? LOS_MS2Tick(LITEIPC_TIMEOUT_MS) : LOS_WAIT_FOREVER;
LosTaskCB *tcb = OS_TCB_FROM_TID(selfTid); LosTaskCB *tcb = OS_TCB_FROM_TID(selfTid);
listHead = &(tcb->msgListHead); if (tcb->ipcTaskInfo == NULL) {
tcb->ipcTaskInfo = LiteIpcTaskInit();
}
listHead = &(tcb->ipcTaskInfo->msgListHead);
do { do {
SCHEDULER_LOCK(intSave); SCHEDULER_LOCK(intSave);
if (LOS_ListEmpty(listHead)) { if (LOS_ListEmpty(listHead)) {
...@@ -1189,10 +1286,19 @@ LITE_OS_SEC_TEXT STATIC UINT32 HandleCmsCmd(CmsCmdContent *content) ...@@ -1189,10 +1286,19 @@ LITE_OS_SEC_TEXT STATIC UINT32 HandleCmsCmd(CmsCmdContent *content)
LITE_OS_SEC_TEXT int LiteIpcIoctl(struct file *filep, int cmd, unsigned long arg) LITE_OS_SEC_TEXT int LiteIpcIoctl(struct file *filep, int cmd, unsigned long arg)
{ {
UINT32 ret = LOS_OK; UINT32 ret = LOS_OK;
if (IsPoolMapped() == FALSE) { LosProcessCB *pcb = OsCurrProcessGet();
PRINT_ERR("Ipc pool not init, need to mmap first!\n"); ProcIpcInfo *ipcInfo = pcb->ipcInfo;
if (ipcInfo == NULL) {
PRINT_ERR("Liteipc pool not create!\n");
return -EINVAL;
}
if (IsPoolMapped(ipcInfo) == FALSE) {
PRINT_ERR("Liteipc Ipc pool not init, need to mmap first!\n");
return -ENOMEM; return -ENOMEM;
} }
switch (cmd) { switch (cmd) {
case IPC_SET_CMS: case IPC_SET_CMS:
return SetCms(arg); return SetCms(arg);
...@@ -1200,7 +1306,7 @@ LITE_OS_SEC_TEXT int LiteIpcIoctl(struct file *filep, int cmd, unsigned long arg ...@@ -1200,7 +1306,7 @@ LITE_OS_SEC_TEXT int LiteIpcIoctl(struct file *filep, int cmd, unsigned long arg
return HandleCmsCmd((CmsCmdContent *)(UINTPTR)arg); return HandleCmsCmd((CmsCmdContent *)(UINTPTR)arg);
case IPC_SET_IPC_THREAD: case IPC_SET_IPC_THREAD:
if (IsCmsSet() == FALSE) { if (IsCmsSet() == FALSE) {
PRINT_ERR("ServiceManager not set!\n"); PRINT_ERR("Liteipc ServiceManager not set!\n");
return -EINVAL; return -EINVAL;
} }
return SetIpcTask(); return SetIpcTask();
...@@ -1209,7 +1315,7 @@ LITE_OS_SEC_TEXT int LiteIpcIoctl(struct file *filep, int cmd, unsigned long arg ...@@ -1209,7 +1315,7 @@ LITE_OS_SEC_TEXT int LiteIpcIoctl(struct file *filep, int cmd, unsigned long arg
return -EINVAL; return -EINVAL;
} }
if (IsCmsSet() == FALSE) { if (IsCmsSet() == FALSE) {
PRINT_ERR("ServiceManager not set!\n"); PRINT_ERR("Liteipc ServiceManager not set!\n");
return -EINVAL; return -EINVAL;
} }
ret = LiteIpcMsgHandle((IpcContent *)(UINTPTR)arg); ret = LiteIpcMsgHandle((IpcContent *)(UINTPTR)arg);
......
...@@ -34,7 +34,6 @@ ...@@ -34,7 +34,6 @@
#include "sys/ioctl.h" #include "sys/ioctl.h"
#include "los_config.h" #include "los_config.h"
#include "los_task_pri.h"
#include "los_typedef.h" #include "los_typedef.h"
#include "los_vm_map.h" #include "los_vm_map.h"
...@@ -70,9 +69,15 @@ typedef struct { ...@@ -70,9 +69,15 @@ typedef struct {
typedef struct { typedef struct {
IpcPool pool; IpcPool pool;
UINT32 ipcTaskID; UINT32 ipcTaskID;
LOS_DL_LIST ipcUsedNodelist;
UINT32 access[LOSCFG_BASE_CORE_TSK_LIMIT]; UINT32 access[LOSCFG_BASE_CORE_TSK_LIMIT];
} ProcIpcInfo; } ProcIpcInfo;
typedef struct {
LOS_DL_LIST msgListHead;
BOOL accessMap[LOSCFG_BASE_CORE_TSK_LIMIT];
} IpcTaskInfo;
typedef enum { typedef enum {
OBJ_FD, OBJ_FD,
OBJ_PTR, OBJ_PTR,
...@@ -172,17 +177,13 @@ typedef struct { ...@@ -172,17 +177,13 @@ typedef struct {
/* init liteipc driver */ /* init liteipc driver */
extern UINT32 OsLiteIpcInit(VOID); extern UINT32 OsLiteIpcInit(VOID);
/* init process liteipc memory pool */
extern UINT32 LiteIpcPoolInit(ProcIpcInfo *ipcInfo);
/* reinit process liteipc memory pool, using in fork situation */ /* reinit process liteipc memory pool, using in fork situation */
extern UINT32 LiteIpcPoolReInit(ProcIpcInfo *childIpcInfo, const ProcIpcInfo *parentIpcInfo); extern ProcIpcInfo *LiteIpcPoolReInit(const ProcIpcInfo *parentIpcInfo);
/* delete process liteipc memory pool */
extern VOID LiteIpcPoolDelete(ProcIpcInfo *ipcInfo, UINT32 processID);
/* remove service handle and send death notify */ /* remove service handle and send death notify */
extern VOID LiteIpcRemoveServiceHandle(LosTaskCB *taskCB); extern VOID LiteIpcRemoveServiceHandle(UINT32 taskID);
extern UINT32 LiteIpcPoolDestroy(UINT32 processID);
#ifdef __cplusplus #ifdef __cplusplus
#if __cplusplus #if __cplusplus
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册