• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2022 Huawei Device Co., Ltd. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without modification,
5  * are permitted provided that the following conditions are met:
6  *
7  * 1. Redistributions of source code must retain the above copyright notice, this list of
8  *    conditions and the following disclaimer.
9  *
10  * 2. Redistributions in binary form must reproduce the above copyright notice, this list
11  *    of conditions and the following disclaimer in the documentation and/or other materials
12  *    provided with the distribution.
13  *
14  * 3. Neither the name of the copyright holder nor the names of its contributors may be used
15  *    to endorse or promote products derived from this software without specific prior written
16  *    permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
20  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
22  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
25  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
27  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
28  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30 
31 #include "los_box.h"
32 #include "los_task.h"
33 #include "los_context.h"
34 #include "los_arch_context.h"
35 #include "los_debug.h"
36 
37 static UserTaskCB g_UserTaskCBArray[LOSCFG_BASE_CORE_TSK_LIMIT] = { 0 };
38 static LosBoxCB g_boxCB[1];
39 
OsUserTaskInit(UINT32 taskID,UINTPTR entry,UINTPTR userArea,UINTPTR userSp)40 VOID OsUserTaskInit(UINT32 taskID, UINTPTR entry, UINTPTR userArea, UINTPTR userSp)
41 {
42     LosTaskCB *taskCB = OS_TCB_FROM_TID(taskID);
43     taskCB->taskStatus |= OS_TASK_FLAG_USER_TASK;
44     HalUserTaskStackInit(taskCB->stackPointer, entry, userSp);
45 
46     g_UserTaskCBArray[taskID].userArea = userArea;
47     g_UserTaskCBArray[taskID].userSp = userSp;
48     g_UserTaskCBArray[taskID].boxID = g_UserTaskCBArray[g_losTask.runTask->taskID].boxID;
49 }
50 
OsUserTaskDelete(UINT32 taskID)51 VOID OsUserTaskDelete(UINT32 taskID)
52 {
53     (VOID)memset_s(&g_UserTaskCBArray[taskID], sizeof(UserTaskCB), 0, sizeof(UserTaskCB));
54 }
55 
OsGetUserTaskCB(UINT32 taskID)56 UserTaskCB *OsGetUserTaskCB(UINT32 taskID)
57 {
58     return &g_UserTaskCBArray[taskID];
59 }
60 
BoxInit(VOID)61 static UINT32 BoxInit(VOID)
62 {
63     UINT32 count = sizeof(g_boxCB) / sizeof(LosBoxCB);
64     for (UINT32 i = 0; i < count; i++) {
65         LosBoxCB *box = &g_boxCB[i];
66         box->boxStackAddr = box->boxStartAddr + box->boxSize - box->boxStackSize;
67     }
68 
69     return LOS_OK;
70 }
71 
OsBoxStart(VOID)72 VOID OsBoxStart(VOID)
73 {
74     UINT32 ret, taskID;
75     UINT32 count = sizeof(g_boxCB) / sizeof(LosBoxCB);
76     TSK_INIT_PARAM_S taskInitParam = { 0 };
77 
78     for (UINT32 i = 0; i < count; i++) {
79         LosBoxCB *box = &g_boxCB[i];
80         taskInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)box->boxStartAddr;
81         taskInitParam.uwStackSize = 0x1000;
82         taskInitParam.pcName = "BoxMainTask";
83         taskInitParam.usTaskPrio = LOSCFG_BOX_PRIO;
84         taskInitParam.uwResved = LOS_TASK_ATTR_JOINABLE;
85         ret = LOS_TaskCreateOnly(&taskID, &taskInitParam);
86         if (ret != LOS_OK) {
87             PRINT_ERR("Create box %u main task failed, Error 0x%x\n", i, ret);
88             return;
89         }
90 
91         OsUserTaskInit(taskID, (UINTPTR)_ulibc_start, 0, box->boxStackAddr + box->boxStackSize);
92         g_UserTaskCBArray[taskID].boxID = i;
93 
94         ret = LOS_TaskResume(taskID);
95         if (ret != LOS_OK) {
96             PRINT_ERR("Box(%u) resume task %u failed, Error 0x%x\n", i, taskID, ret);
97             return;
98         }
99     }
100 }
101 
LOS_BoxStart(VOID)102 UINT32 LOS_BoxStart(VOID)
103 {
104     UINT32 ret, taskID;
105     TSK_INIT_PARAM_S taskInitParam = { 0 };
106 
107     ret = BoxInit();
108     if (ret != LOS_OK) {
109         PRINT_ERR("Box init failed! Error 0x%x\n", ret);
110         return ret;
111     }
112 
113     taskInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)OsBoxStart;
114     taskInitParam.uwStackSize = 0x1000;
115     taskInitParam.pcName = "BoxStart";
116     taskInitParam.usTaskPrio = LOSCFG_BOX_START_PRIO;
117     taskInitParam.uwResved = 0;
118     return LOS_TaskCreate(&taskID, &taskInitParam);
119 }
120