• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2022 Huawei Technologies Co., Ltd. All rights reserved.
3  *
4  * UniProton is licensed under Mulan PSL v2.
5  * You can use this software according to the terms and conditions of the Mulan PSL v2.
6  * You may obtain a copy of Mulan PSL v2 at:
7  *          http://license.coscl.org.cn/MulanPSL2
8  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
9  * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
10  * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
11  * See the Mulan PSL v2 for more details.
12  * Create: 2022-11-22
13  * Description: Hardware Initialization
14  */
15 #include "prt_cpu_external.h"
16 #include "prt_sys_external.h"
17 
18 #define ARMV8_X1_INIT_VALUE     0x01010101UL
19 #define ARMV8_X2_INIT_VALUE     0x02020202UL
20 #define ARMV8_X3_INIT_VALUE     0x03030303UL
21 #define ARMV8_X4_INIT_VALUE     0x04040404UL
22 #define ARMV8_X5_INIT_VALUE     0x05050505UL
23 #define ARMV8_X6_INIT_VALUE     0x06060606UL
24 #define ARMV8_X7_INIT_VALUE     0x07070707UL
25 #define ARMV8_X8_INIT_VALUE     0x08080808UL
26 #define ARMV8_X9_INIT_VALUE     0x09090909UL
27 #define ARMV8_X10_INIT_VALUE    0x10101010UL
28 #define ARMV8_X11_INIT_VALUE    0x11111111UL
29 #define ARMV8_X12_INIT_VALUE    0x12121212UL
30 #define ARMV8_X13_INIT_VALUE    0x13131313UL
31 #define ARMV8_X14_INIT_VALUE    0x14141414UL
32 #define ARMV8_X15_INIT_VALUE    0x15151515UL
33 #define ARMV8_X16_INIT_VALUE    0x16161616UL
34 #define ARMV8_X17_INIT_VALUE    0x17171717UL
35 #define ARMV8_X18_INIT_VALUE    0x18181818UL
36 #define ARMV8_X19_INIT_VALUE    0x19191919UL
37 #define ARMV8_X20_INIT_VALUE    0x20202020UL
38 #define ARMV8_X21_INIT_VALUE    0x21212121UL
39 #define ARMV8_X22_INIT_VALUE    0x22222222UL
40 #define ARMV8_X23_INIT_VALUE    0x23232323UL
41 #define ARMV8_X24_INIT_VALUE    0x24242424UL
42 #define ARMV8_X25_INIT_VALUE    0x25252525UL
43 #define ARMV8_X26_INIT_VALUE    0x26262626UL
44 #define ARMV8_X27_INIT_VALUE    0x27272727UL
45 #define ARMV8_X28_INIT_VALUE    0x28282828UL
46 #define ARMV8_X29_INIT_VALUE    0x29292929UL
47 
48 #define ARMV8_SPSR_INIT_VALUE   0x305U   // EL1_SP1 | D | A | I | F
49 
50 /* Tick中断对应的硬件定时器ID */
51 OS_SEC_DATA U32 g_tickTimerID = U32_INVALID;
52 
53 // 系统栈配置
54 OS_SEC_DATA uintptr_t g_sysStackHigh = (uintptr_t)&__os_sys_sp_end;
55 OS_SEC_DATA uintptr_t g_sysStackLow = (uintptr_t)&__os_sys_sp_start;
56 
InitSystemSp(void)57 INIT_SEC_L4_TEXT void InitSystemSp(void)
58 {
59     return;
60 }
61 
62 /*
63  * 描述: 获取系统栈的起始地址(低地址)
64  */
OsGetSysStackStart(void)65 INIT_SEC_L4_TEXT uintptr_t OsGetSysStackStart(void)
66 {
67     return g_sysStackLow;
68 }
69 
70 /*
71  * 描述: 获取系统栈的结束地址(高地址)
72  */
OsGetSysStackEnd(void)73 INIT_SEC_L4_TEXT uintptr_t OsGetSysStackEnd(void)
74 {
75     return g_sysStackHigh;
76 }
77 
78 /*
79  * 描述: 获取系统栈的栈底(高地址)
80  */
OsGetSysStackSP(void)81 OS_SEC_L0_TEXT uintptr_t OsGetSysStackSP(void)
82 {
83     return OsGetSysStackEnd();
84 }
85 
86 /*
87  * 描述: 初始化任务栈的上下文
88  */
OsTskContextInit(U32 taskID,U32 stackSize,uintptr_t * topStack,uintptr_t funcTskEntry)89 INIT_SEC_L4_TEXT void *OsTskContextInit(U32 taskID, U32 stackSize, uintptr_t *topStack, uintptr_t funcTskEntry)
90 {
91     (void)taskID;
92     struct TskContext *stack = (struct TskContext *)((uintptr_t)topStack + stackSize);
93 
94     stack -= 1;
95 
96     stack->x00 = 0;
97     stack->x01 = ARMV8_X1_INIT_VALUE;
98     stack->x02 = ARMV8_X2_INIT_VALUE;
99     stack->x03 = ARMV8_X3_INIT_VALUE;
100     stack->x04 = ARMV8_X4_INIT_VALUE;
101     stack->x05 = ARMV8_X5_INIT_VALUE;
102     stack->x06 = ARMV8_X6_INIT_VALUE;
103     stack->x07 = ARMV8_X7_INIT_VALUE;
104     stack->x08 = ARMV8_X8_INIT_VALUE;
105     stack->x09 = ARMV8_X9_INIT_VALUE;
106     stack->x10 = ARMV8_X10_INIT_VALUE;
107     stack->x11 = ARMV8_X11_INIT_VALUE;
108     stack->x12 = ARMV8_X12_INIT_VALUE;
109     stack->x13 = ARMV8_X13_INIT_VALUE;
110     stack->x14 = ARMV8_X14_INIT_VALUE;
111     stack->x15 = ARMV8_X15_INIT_VALUE;
112     stack->x16 = ARMV8_X16_INIT_VALUE;
113     stack->x17 = ARMV8_X17_INIT_VALUE;
114     stack->x18 = ARMV8_X18_INIT_VALUE;
115     stack->x19 = ARMV8_X19_INIT_VALUE;
116     stack->x20 = ARMV8_X20_INIT_VALUE;
117     stack->x21 = ARMV8_X21_INIT_VALUE;
118     stack->x22 = ARMV8_X22_INIT_VALUE;
119     stack->x23 = ARMV8_X23_INIT_VALUE;
120     stack->x24 = ARMV8_X24_INIT_VALUE;
121     stack->x25 = ARMV8_X25_INIT_VALUE;
122     stack->x26 = ARMV8_X26_INIT_VALUE;
123     stack->x27 = ARMV8_X27_INIT_VALUE;
124     stack->x28 = ARMV8_X28_INIT_VALUE;
125     stack->x29 = ARMV8_X29_INIT_VALUE;
126     stack->x30 = funcTskEntry;   // x30: lr(link register)
127     stack->xzr = 0;
128 
129     stack->elr = funcTskEntry;
130     stack->esr = 0;
131     stack->far = 0;
132     stack->spsr = ARMV8_SPSR_INIT_VALUE;    // EL1_SP1 | D | A | I | F
133     return stack;
134 }
135 
136 /*
137  * 描述: 从指定地址获取任务上下文
138  */
OsTskContextGet(uintptr_t saveAddr,struct TskContext * context)139 OS_SEC_L4_TEXT void OsTskContextGet(uintptr_t saveAddr, struct TskContext *context)
140 {
141     *context = *((struct TskContext *)saveAddr);
142 
143     return;
144 }
145 
146 /*
147  * 描述: 手动触发异常(EL1)
148  */
OsAsmIll(void)149 OS_SEC_L4_TEXT void OsAsmIll(void)
150 {
151     OS_EMBED_ASM("svc  0");
152 }
153