Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Kernel Liteos A
提交
38163de8
K
Kernel Liteos A
项目概览
OpenHarmony
/
Kernel Liteos A
大约 2 年 前同步成功
通知
475
Star
414
Fork
55
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
4
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel Liteos A
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
4
Issue
4
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
38163de8
编写于
11月 02, 2021
作者:
O
openharmony_ci
提交者:
Gitee
11月 02, 2021
浏览文件
操作
浏览文件
下载
差异文件
!687 feat: liteipc 静态内存优化
Merge pull request !687 from zhushengle/liteipc
上级
fcb21ffc
52379242
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
207 addition
and
118 deletion
+207
-118
kernel/base/core/los_process.c
kernel/base/core/los_process.c
+5
-21
kernel/base/core/los_task.c
kernel/base/core/los_task.c
+1
-4
kernel/base/include/los_process_pri.h
kernel/base/include/los_process_pri.h
+1
-1
kernel/base/include/los_task_pri.h
kernel/base/include/los_task_pri.h
+4
-3
kernel/extended/liteipc/hm_liteipc.c
kernel/extended/liteipc/hm_liteipc.c
+186
-80
kernel/extended/liteipc/hm_liteipc.h
kernel/extended/liteipc/hm_liteipc.h
+10
-9
未找到文件。
kernel/base/core/los_process.c
浏览文件 @
38163de8
...
@@ -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
;
}
}
}
}
...
...
kernel/base/core/los_task.c
浏览文件 @
38163de8
...
@@ -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
;
...
...
kernel/base/include/los_process_pri.h
浏览文件 @
38163de8
...
@@ -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 */
...
...
kernel/base/include/los_task_pri.h
浏览文件 @
38163de8
...
@@ -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
;
...
...
kernel/extended/liteipc/hm_liteipc.c
浏览文件 @
38163de8
...
@@ -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
);
...
...
kernel/extended/liteipc/hm_liteipc.h
浏览文件 @
38163de8
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录