13d8536b4Sopenharmony_ci/*
23d8536b4Sopenharmony_ci * Copyright (c) 2022-2022 Huawei Device Co., Ltd. All rights reserved.
33d8536b4Sopenharmony_ci *
43d8536b4Sopenharmony_ci * Redistribution and use in source and binary forms, with or without modification,
53d8536b4Sopenharmony_ci * are permitted provided that the following conditions are met:
63d8536b4Sopenharmony_ci *
73d8536b4Sopenharmony_ci * 1. Redistributions of source code must retain the above copyright notice, this list of
83d8536b4Sopenharmony_ci *    conditions and the following disclaimer.
93d8536b4Sopenharmony_ci *
103d8536b4Sopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright notice, this list
113d8536b4Sopenharmony_ci *    of conditions and the following disclaimer in the documentation and/or other materials
123d8536b4Sopenharmony_ci *    provided with the distribution.
133d8536b4Sopenharmony_ci *
143d8536b4Sopenharmony_ci * 3. Neither the name of the copyright holder nor the names of its contributors may be used
153d8536b4Sopenharmony_ci *    to endorse or promote products derived from this software without specific prior written
163d8536b4Sopenharmony_ci *    permission.
173d8536b4Sopenharmony_ci *
183d8536b4Sopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
193d8536b4Sopenharmony_ci * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
203d8536b4Sopenharmony_ci * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
213d8536b4Sopenharmony_ci * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
223d8536b4Sopenharmony_ci * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
233d8536b4Sopenharmony_ci * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
243d8536b4Sopenharmony_ci * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
253d8536b4Sopenharmony_ci * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
263d8536b4Sopenharmony_ci * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
273d8536b4Sopenharmony_ci * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
283d8536b4Sopenharmony_ci * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
293d8536b4Sopenharmony_ci */
303d8536b4Sopenharmony_ci
313d8536b4Sopenharmony_ci#include "los_box.h"
323d8536b4Sopenharmony_ci#include "los_task.h"
333d8536b4Sopenharmony_ci#include "los_context.h"
343d8536b4Sopenharmony_ci#include "los_arch_context.h"
353d8536b4Sopenharmony_ci#include "los_debug.h"
363d8536b4Sopenharmony_ci
373d8536b4Sopenharmony_cistatic UserTaskCB g_UserTaskCBArray[LOSCFG_BASE_CORE_TSK_LIMIT] = { 0 };
383d8536b4Sopenharmony_cistatic LosBoxCB g_boxCB[1];
393d8536b4Sopenharmony_ci
403d8536b4Sopenharmony_ciVOID OsUserTaskInit(UINT32 taskID, UINTPTR entry, UINTPTR userArea, UINTPTR userSp)
413d8536b4Sopenharmony_ci{
423d8536b4Sopenharmony_ci    LosTaskCB *taskCB = OS_TCB_FROM_TID(taskID);
433d8536b4Sopenharmony_ci    taskCB->taskStatus |= OS_TASK_FLAG_USER_TASK;
443d8536b4Sopenharmony_ci    HalUserTaskStackInit(taskCB->stackPointer, entry, userSp);
453d8536b4Sopenharmony_ci
463d8536b4Sopenharmony_ci    g_UserTaskCBArray[taskID].userArea = userArea;
473d8536b4Sopenharmony_ci    g_UserTaskCBArray[taskID].userSp = userSp;
483d8536b4Sopenharmony_ci    g_UserTaskCBArray[taskID].boxID = g_UserTaskCBArray[g_losTask.runTask->taskID].boxID;
493d8536b4Sopenharmony_ci}
503d8536b4Sopenharmony_ci
513d8536b4Sopenharmony_ciVOID OsUserTaskDelete(UINT32 taskID)
523d8536b4Sopenharmony_ci{
533d8536b4Sopenharmony_ci    (VOID)memset_s(&g_UserTaskCBArray[taskID], sizeof(UserTaskCB), 0, sizeof(UserTaskCB));
543d8536b4Sopenharmony_ci}
553d8536b4Sopenharmony_ci
563d8536b4Sopenharmony_ciUserTaskCB *OsGetUserTaskCB(UINT32 taskID)
573d8536b4Sopenharmony_ci{
583d8536b4Sopenharmony_ci    return &g_UserTaskCBArray[taskID];
593d8536b4Sopenharmony_ci}
603d8536b4Sopenharmony_ci
613d8536b4Sopenharmony_cistatic UINT32 BoxInit(VOID)
623d8536b4Sopenharmony_ci{
633d8536b4Sopenharmony_ci    UINT32 count = sizeof(g_boxCB) / sizeof(LosBoxCB);
643d8536b4Sopenharmony_ci    for (UINT32 i = 0; i < count; i++) {
653d8536b4Sopenharmony_ci        LosBoxCB *box = &g_boxCB[i];
663d8536b4Sopenharmony_ci        box->boxStackAddr = box->boxStartAddr + box->boxSize - box->boxStackSize;
673d8536b4Sopenharmony_ci    }
683d8536b4Sopenharmony_ci
693d8536b4Sopenharmony_ci    return LOS_OK;
703d8536b4Sopenharmony_ci}
713d8536b4Sopenharmony_ci
723d8536b4Sopenharmony_ciVOID OsBoxStart(VOID)
733d8536b4Sopenharmony_ci{
743d8536b4Sopenharmony_ci    UINT32 ret, taskID;
753d8536b4Sopenharmony_ci    UINT32 count = sizeof(g_boxCB) / sizeof(LosBoxCB);
763d8536b4Sopenharmony_ci    TSK_INIT_PARAM_S taskInitParam = { 0 };
773d8536b4Sopenharmony_ci
783d8536b4Sopenharmony_ci    for (UINT32 i = 0; i < count; i++) {
793d8536b4Sopenharmony_ci        LosBoxCB *box = &g_boxCB[i];
803d8536b4Sopenharmony_ci        taskInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)box->boxStartAddr;
813d8536b4Sopenharmony_ci        taskInitParam.uwStackSize = 0x1000;
823d8536b4Sopenharmony_ci        taskInitParam.pcName = "BoxMainTask";
833d8536b4Sopenharmony_ci        taskInitParam.usTaskPrio = LOSCFG_BOX_PRIO;
843d8536b4Sopenharmony_ci        taskInitParam.uwResved = LOS_TASK_ATTR_JOINABLE;
853d8536b4Sopenharmony_ci        ret = LOS_TaskCreateOnly(&taskID, &taskInitParam);
863d8536b4Sopenharmony_ci        if (ret != LOS_OK) {
873d8536b4Sopenharmony_ci            PRINT_ERR("Create box %u main task failed, Error 0x%x\n", i, ret);
883d8536b4Sopenharmony_ci            return;
893d8536b4Sopenharmony_ci        }
903d8536b4Sopenharmony_ci
913d8536b4Sopenharmony_ci        OsUserTaskInit(taskID, (UINTPTR)_ulibc_start, 0, box->boxStackAddr + box->boxStackSize);
923d8536b4Sopenharmony_ci        g_UserTaskCBArray[taskID].boxID = i;
933d8536b4Sopenharmony_ci
943d8536b4Sopenharmony_ci        ret = LOS_TaskResume(taskID);
953d8536b4Sopenharmony_ci        if (ret != LOS_OK) {
963d8536b4Sopenharmony_ci            PRINT_ERR("Box(%u) resume task %u failed, Error 0x%x\n", i, taskID, ret);
973d8536b4Sopenharmony_ci            return;
983d8536b4Sopenharmony_ci        }
993d8536b4Sopenharmony_ci    }
1003d8536b4Sopenharmony_ci}
1013d8536b4Sopenharmony_ci
1023d8536b4Sopenharmony_ciUINT32 LOS_BoxStart(VOID)
1033d8536b4Sopenharmony_ci{
1043d8536b4Sopenharmony_ci    UINT32 ret, taskID;
1053d8536b4Sopenharmony_ci    TSK_INIT_PARAM_S taskInitParam = { 0 };
1063d8536b4Sopenharmony_ci
1073d8536b4Sopenharmony_ci    ret = BoxInit();
1083d8536b4Sopenharmony_ci    if (ret != LOS_OK) {
1093d8536b4Sopenharmony_ci        PRINT_ERR("Box init failed! Error 0x%x\n", ret);
1103d8536b4Sopenharmony_ci        return ret;
1113d8536b4Sopenharmony_ci    }
1123d8536b4Sopenharmony_ci
1133d8536b4Sopenharmony_ci    taskInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)OsBoxStart;
1143d8536b4Sopenharmony_ci    taskInitParam.uwStackSize = 0x1000;
1153d8536b4Sopenharmony_ci    taskInitParam.pcName = "BoxStart";
1163d8536b4Sopenharmony_ci    taskInitParam.usTaskPrio = LOSCFG_BOX_START_PRIO;
1173d8536b4Sopenharmony_ci    taskInitParam.uwResved = 0;
1183d8536b4Sopenharmony_ci    return LOS_TaskCreate(&taskID, &taskInitParam);
1193d8536b4Sopenharmony_ci}
120