• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Nuclei Limited. All rights reserved.
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Licensed under the Apache License, Version 2.0 (the License); you may
7  * not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an AS IS BASIS, WITHOUT
14  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18 
19 #include "los_arch_context.h"
20 #include "los_arch_interrupt.h"
21 #include "los_task.h"
22 #include "los_memory.h"
23 #include "los_timer.h"
24 #include "los_sched.h"
25 #include "los_interrupt.h"
26 #include "los_debug.h"
27 #include "nuclei_sdk_soc.h"
28 
29 #define INITIAL_MSTATUS                 ( MSTATUS_MPP | MSTATUS_MPIE | MSTATUS_FS_INITIAL)
30 #define ALIGN_DOWN(size, align)         ((size) & ~((align) - 1))
31 
ArchInit(VOID)32 LITE_OS_SEC_TEXT_INIT VOID ArchInit(VOID)
33 {
34     HalHwiInit();
35 }
36 
ArchSysExit(VOID)37 LITE_OS_SEC_TEXT_MINOR VOID ArchSysExit(VOID)
38 {
39     ArchIntLock();
40     while (1) {
41     }
42 }
43 
ArchTskStackInit(UINT32 taskID,UINT32 stackSize,VOID * topStack)44 LITE_OS_SEC_TEXT_INIT VOID *ArchTskStackInit(UINT32 taskID, UINT32 stackSize, VOID *topStack)
45 {
46     UINT32 index;
47     UINT8 *stk = 0;
48     TaskContext *context = NULL;
49 
50     stk = ((UINT8 *)topStack) + stackSize + sizeof(STACK_TYPE);
51     stk = (UINT8 *)ALIGN_DOWN((uintptr_t)stk, REGBYTES);
52     context = (TaskContext *)(stk - sizeof(TaskContext));
53 
54     for (index = 1; index < sizeof(TaskContext)/ sizeof(STACK_TYPE); index ++) {
55         ((STACK_TYPE *)context)[index] = OS_TASK_STACK_INIT;
56     }
57     context->ra      = (STACK_TYPE)ArchSysExit;
58     context->a0      = (STACK_TYPE)taskID;
59     context->epc     = (STACK_TYPE)OsTaskEntry;
60 
61     context->mstatus = INITIAL_MSTATUS;
62 
63     return (VOID *)context;
64 }
65 
66 extern LosTask g_losTask;
ArchStartSchedule(VOID)67 LITE_OS_SEC_TEXT_INIT UINT32 ArchStartSchedule(VOID)
68 {
69     (VOID)LOS_IntLock();
70     OsSchedStart();
71     HalStartToRun();
72     return LOS_OK; /* never return */
73 }
74 
ArchTaskSchedule(VOID)75 VOID ArchTaskSchedule(VOID)
76 {
77     SysTimer_SetSWIRQ();
78 }
79 
HalTaskSwitch(VOID)80 VOID HalTaskSwitch(VOID)
81 {
82     SysTimer_ClearSWIRQ();
83     OsSchedTaskSwitch();
84     /* Set newTask to runTask */
85     g_losTask.runTask = g_losTask.newTask;
86 }
87 
88