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