• 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: 属性宏相关内部头文件
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