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: 属性宏相关内部头文件
14 */
15 #ifndef OS_CPU_ARMV8_EXTERNAL_H
16 #define OS_CPU_ARMV8_EXTERNAL_H
17
18 #include "prt_buildef.h"
19 #include "prt_hwi.h"
20 #include "prt_gic_external.h"
21
22 /*
23 * 模块间宏定义
24 */
25 #define OS_IRQ2HWI(irqNum) (irqNum)
26 #define OS_HWI2IRQ(hwiNum) (hwiNum)
27 #define OS_HWI_GET_HWINUM(archNum) (archNum)
28 #define OS_HWI_GET_HWI_PRIO(hwiPrio) (hwiPrio)
29 #define OS_HWI_IS_SGI(hwiNum) ((hwiNum) <= MAX_SGI_ID)
30 #define OS_HWI_IS_PPI(hwiNum) (((hwiNum) > MAX_SGI_ID) && ((hwiNum) <= MAX_PPI_ID))
31
32 /* OS_HWI_MAX_NUM 大小会影响bss段大小。需要根据实际使用hwi个数配置 */
33 #define OS_HWI_MAX_NUM 0x182U
34 #define OS_HWI_NUM_CHECK(hwiNum) ((hwiNum) >= OS_HWI_MAX_NUM)
35
36 #define OS_HWI_MAX (OS_HWI_MAX_NUM - 1)
37 #define OS_HWI_FORMARRAY_NUM OS_HWI_MAX_NUM
38 #define OS_HWI_MIN 0
39 #define OS_HWI_PRI_NUM 14
40
41 /* 中断优先级0~15,但非安全世界的中断优先级只能是偶数 */
42 #define OS_HWI_PRIO_CHECK(hwiPrio) ((hwiPrio) >= OS_HWI_PRI_NUM || ((hwiPrio) & 1U))
43 #define OS_HWI_SET_HOOK_ATTR(hwiNum, hwiPrio, hook)
44
45 #define OS_HWI_CLEAR_CHECK(hwiNum) ((hwiNum) == GIC_INT_ID_MASK)
46
47 #define OS_HWI_INTERNAL_NUM 5
48
49 #define OS_TICK_COUNT_UPDATE()
50
51 #define OS_HW_TICK_INIT() OS_OK
52
53 #define OS_IS_TICK_PERIOD_INVALID(cyclePerTick) (FALSE)
54
55 #define OS_TSK_STACK_SIZE_ALIGN 16U
56 #define OS_TSK_STACK_SIZE_ALLOC_ALIGN MEM_ADDR_ALIGN_016
57 #define OS_TSK_STACK_ADDR_ALIGN 16U
58
59 #define OS_MAX_CACHE_LINE_SIZE 4 /* 单核芯片定义为4 */
60
61 /* 任务栈最小值 */
62 #define OS_TSK_MIN_STACK_SIZE (ALIGN((0x1D0 + 0x10 + 0x4), 16))
63
64 /* Idle任务的消息队列数 */
65 #define OS_IDLE_TASK_QUE_NUM 1
66
67 #define DIV64(a, b) ((a) / (b))
68 #define DIV64_REMAIN(a, b) ((a) % (b))
69
70 #define OsIntUnLock() PRT_HwiUnLock()
71 #define OsIntLock() PRT_HwiLock()
72 #define OsIntRestore(intSave) PRT_HwiRestore(intSave)
73
74 /* 硬件平台保存的任务上下文 */
75 struct TagHwContext {
76 uintptr_t pc;
77 uintptr_t spsr;
78 uintptr_t far;
79 uintptr_t esr;
80 uintptr_t xzr;
81 uintptr_t lr;
82 uintptr_t x[30];
83 };
84
85 /*
86 * 模块间变量声明
87 */
88 extern uintptr_t __os_sys_sp_end;
89 extern uintptr_t __os_sys_sp_start;
90 extern uintptr_t __bss_end__;
91 extern uintptr_t __bss_start__;
92
93 /*
94 * 模块间函数声明
95 */
96 extern uintptr_t OsGetSysStackSP(void);
97 extern void OsSetSysStackSP(uintptr_t stackPointer, U32 hwiNum);
98 extern uintptr_t OsGetSysStackStart(void);
99 extern uintptr_t OsGetSysStackEnd(void);
100 extern void OsTaskTrap(void);
101 extern void OsTskContextLoad(uintptr_t stackPointer);
102
103 /*
104 * 描述: 使能IRQ中断
105 */
OsIntEnable(void)106 OS_SEC_ALW_INLINE INLINE void OsIntEnable(void)
107 {
108 OS_EMBED_ASM(
109 "msr daifclr, %0"
110 :
111 : "i"(DAIF_IRQ_BIT) // IRQ mask
112 : "memory");
113 }
114
115 /*
116 * 描述: 使能FIQ中断
117 */
OsFiqEnable(void)118 OS_SEC_ALW_INLINE INLINE void OsFiqEnable(void)
119 {
120 OS_EMBED_ASM(
121 "msr daifclr, %0"
122 :
123 : "i"(DAIF_FIQ_BIT) // FIQ mask
124 : "memory");
125 }
126
127 /*
128 * 描述: 禁止IRQ中断
129 */
OsIntDisable(void)130 OS_SEC_ALW_INLINE INLINE void OsIntDisable(void)
131 {
132 OS_EMBED_ASM(
133 "msr daifset, %0"
134 :
135 : "i"(DAIF_IRQ_BIT) // IRQ mask
136 : "memory", "cc");
137 }
138 #if (OS_GIC_VER == 2)
OsHwiNumGet(void)139 OS_SEC_ALW_INLINE INLINE U32 OsHwiNumGet(void)
140 {
141 U32 iar;
142
143 iar = GIC_REG_READ(GICC_IAR);
144
145 return (iar & IAR_MASK);
146 }
147 #else
148 /*
149 * 描述: 获取当前PENDING的中断号, 中断状态PENDING->ACTIVE
150 */
OsHwiNumGet(void)151 OS_SEC_ALW_INLINE INLINE U32 OsHwiNumGet(void)
152 {
153 U32 iar;
154
155 OS_EMBED_ASM("MRS %0," REG_ALIAS(ICC_IAR1_EL1)" \n"
156 : "=&r"(iar) : : "memory");
157
158 return iar;
159 }
160 #endif
161
162 #if (OS_GIC_VER == 2)
OsHwiClear(U32 intId)163 OS_SEC_ALW_INLINE INLINE void OsHwiClear(U32 intId)
164 {
165 GIC_REG_WRITE(GICC_EOIR, intId & IAR_MASK);
166 }
167 #else
168 /*
169 * 描述: 清除中断ACTIVE状态
170 */
OsHwiClear(U32 intId)171 OS_SEC_ALW_INLINE INLINE void OsHwiClear(U32 intId)
172 {
173 OS_EMBED_ASM("MSR " REG_ALIAS(ICC_EOIR1_EL1)", %0 \n"
174 : : "r"(intId) : "memory");
175 return;
176 }
177 #endif
178
179 /*
180 * 描述: 获取SP
181 */
OsGetSp(void)182 OS_SEC_ALW_INLINE INLINE uintptr_t OsGetSp(void)
183 {
184 uintptr_t sp;
185
186 OS_EMBED_ASM("MOV %0, SP" : "=r"(sp));
187
188 return sp;
189 }
190
191 /*
192 * 描述: 传入任务切换时的栈地址
193 */
OsTskGetInstrAddr(uintptr_t addr)194 OS_SEC_ALW_INLINE INLINE uintptr_t OsTskGetInstrAddr(uintptr_t addr)
195 {
196 return ((struct TagHwContext *)addr)->pc;
197 }
198
OsTaskTrapFast(void)199 OS_SEC_ALW_INLINE INLINE void OsTaskTrapFast(void)
200 {
201 OsTaskTrap();
202 }
203
OsTaskTrapFastPs(uintptr_t intSave)204 OS_SEC_ALW_INLINE INLINE void OsTaskTrapFastPs(uintptr_t intSave)
205 {
206 (void)intSave;
207 OsTaskTrap();
208 }
209
210 #endif /* OS_CPU_ARMV8_EXTERNAL_H */
211