WS63 SDK 文档 7021f4f@fbb_ws63
ws63 和 ws63e 解决方案的 SDK 文档
载入中...
搜索中...
未找到
arch_encoding.h
浏览该文件的文档.
1/*
2 * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2021-2022. All rights reserved.
3 * Description: riscv encoding
4 *
5 * Create: 2021-07-21
6 */
7
8#ifndef ARCH_ENCODING_H
9#define ARCH_ENCODING_H
10
11#ifdef __cplusplus
12#if __cplusplus
13extern "C" {
14#endif /* __cplusplus */
15#endif /* __cplusplus */
16
17#define MCAUSE 0x342
18#define MCAUSE_INSN_MISALIGN 0x0
19#define MCAUSE_INSN_FAULT 0x1
20#define MCAUSE_INSN_ILLEGAL 0x2
21#define MCAUSE_BRKT 0x3
22#define MCSUSE_LOAD_MISALIGN 0x4
23#define MCAUSE_LOAD_FAULT 0x5
24#define MCAUSE_AMO_MISALIGN 0x6
25#define MCAUSE_AMO_FAULT 0x7
26#define MCAUSE_ECALL_U 0x8
27#define MCAUSE_ECALL_M 0xB
28#define MCAUSE_INSN_PAGE_FAULT 0xC
29#define MCAUSE_LOAD_PAGE_FAULT 0xD
30#define MCAUSE_AMO_PAGE_FAULT 0xF
31
32#define EXC_SIZE_ON_STACK (160) // 16byte align
33
34#define MSTATUS_UIE 0x00000001
35#define MSTATUS_SIE 0x00000002
36#define MSTATUS_HIE 0x00000004
37#define MSTATUS_MIE 0x00000008
38#define MSTATUS_UPIE 0x00000010
39#define MSTATUS_SPIE 0x00000020
40#define MSTATUS_HPIE 0x00000040
41#define MSTATUS_MPIE 0x00000080
42#define MSTATUS_SPP 0x00000100
43#define MSTATUS_HPP 0x00000600
44#define MSTATUS_MPP 0x00001800
45#define MSTATUS_FS 0x00006000
46#define MSTATUS_XS 0x00018000
47#define MSTATUS_MPRV 0x00020000
48#define MSTATUS_PUM 0x00040000
49#define MSTATUS_VM 0x1F000000
50#define MSTATUS32_SD 0x80000000
51#define MSTATUS64_SD 0x8000000000000000
52
53#define MCAUSE32_CAUSE 0x7FFFFFFF
54#define MCAUSE64_CAUSE 0x7FFFFFFFFFFFFFFF
55#define MCAUSE32_INT 0x80000000
56#define MCAUSE64_INT 0x8000000000000000
57
58#define SSTATUS_UIE 0x00000001
59#define SSTATUS_SIE 0x00000002
60#define SSTATUS_UPIE 0x00000010
61#define SSTATUS_SPIE 0x00000020
62#define SSTATUS_SPP 0x00000100
63#define SSTATUS_FS 0x00006000
64#define SSTATUS_XS 0x00018000
65#define SSTATUS_PUM 0x00040000
66#define SSTATUS32_SD 0x80000000
67#define SSTATUS64_SD 0x8000000000000000
68
69#define IRQ_S_SOFT 1
70#define IRQ_H_SOFT 2
71#define IRQ_M_SOFT 3
72#define IRQ_S_TIMER 5
73#define IRQ_H_TIMER 6
74#define IRQ_M_TIMER 7
75#define IRQ_S_EXT 9
76#define IRQ_H_EXT 10
77#define IRQ_M_EXT 11
78#define IRQ_COP 12
79#define IRQ_HOST 13
80#define IRQ_LOCIE0 26
81#define IRQ_LOCIE1 27
82#define IRQ_LOCIE2 28
83#define IRQ_LOCIE3 29
84#define IRQ_LOCIE4 30
85#define IRQ_LOCIE5 31
86
87// rv_custom_local_interrupt 6 -31
88#define IRQ_LOCIE6 0
89#define IRQ_LOCIE7 1
90#define IRQ_LOCIE8 2
91#define IRQ_LOCIE9 3
92#define IRQ_LOCIE10 4
93#define IRQ_LOCIE11 5
94#define IRQ_LOCIE12 6
95#define IRQ_LOCIE13 7
96#define IRQ_LOCIE14 8
97#define IRQ_LOCIE15 9
98#define IRQ_LOCIE16 10
99#define IRQ_LOCIE17 11
100#define IRQ_LOCIE18 12
101#define IRQ_LOCIE19 13
102#define IRQ_LOCIE20 14
103#define IRQ_LOCIE21 15
104#define IRQ_LOCIE22 16
105#define IRQ_LOCIE23 17
106#define IRQ_LOCIE24 18
107#define IRQ_LOCIE25 19
108#define IRQ_LOCIE26 20
109#define IRQ_LOCIE27 21
110#define IRQ_LOCIE28 22
111#define IRQ_LOCIE29 23
112#define IRQ_LOCIE30 24
113#define IRQ_LOCIE31 25
114
115// rv_nmi
116#define IRQ_NMI 12
117#define MIP_NMI (1 << IRQ_NMI)
118
119#define MIP_SSIE (1 << IRQ_S_SOFT)
120#define MIP_HSIE (1 << IRQ_H_SOFT)
121#define MIP_MSIE (1 << IRQ_M_SOFT)
122#define MIP_STIE (1 << IRQ_S_TIMER)
123#define MIP_HTIE (1 << IRQ_H_TIMER)
124#define MIP_MTIE (1 << IRQ_M_TIMER)
125#define MIP_SEIE (1 << IRQ_S_EXT)
126#define MIP_HEIE (1 << IRQ_H_EXT)
127#define MIP_MEIE (1 << IRQ_M_EXT)
128#define MIP_NMIE (1 << IRQ_COP)
129#define MIP_LOCIE0 (1 << IRQ_LOCIE0)
130#define MIP_LOCIE1 (1 << IRQ_LOCIE1)
131#define MIP_LOCIE2 (1 << IRQ_LOCIE2)
132#define MIP_LOCIE3 (1 << IRQ_LOCIE3)
133#define MIP_LOCIE4 (1 << IRQ_LOCIE4)
134#define MIP_LOCIE5 ((uint32_t)1 << IRQ_LOCIE5)
135
136// rv_custom_csr
137#define LOCIPD0_LOCIE6 (1 << IRQ_LOCIE6)
138#define LOCIPD0_LOCIE7 (1 << IRQ_LOCIE7)
139#define LOCIPD0_LOCIE8 (1 << IRQ_LOCIE8)
140#define LOCIPD0_LOCIE9 (1 << IRQ_LOCIE9)
141#define LOCIPD0_LOCIE10 (1 << IRQ_LOCIE10)
142#define LOCIPD0_LOCIE11 (1 << IRQ_LOCIE11)
143#define LOCIPD0_LOCIE12 (1 << IRQ_LOCIE12)
144#define LOCIPD0_LOCIE13 (1 << IRQ_LOCIE13)
145#define LOCIPD0_LOCIE14 (1 << IRQ_LOCIE14)
146#define LOCIPD0_LOCIE15 (1 << IRQ_LOCIE15)
147#define LOCIPD0_LOCIE16 (1 << IRQ_LOCIE16)
148#define LOCIPD0_LOCIE17 (1 << IRQ_LOCIE17)
149#define LOCIPD0_LOCIE18 (1 << IRQ_LOCIE18)
150#define LOCIPD0_LOCIE19 (1 << IRQ_LOCIE19)
151#define LOCIPD0_LOCIE20 (1 << IRQ_LOCIE20)
152#define LOCIPD0_LOCIE21 (1 << IRQ_LOCIE21)
153#define LOCIPD0_LOCIE22 (1 << IRQ_LOCIE22)
154#define LOCIPD0_LOCIE23 (1 << IRQ_LOCIE23)
155#define LOCIPD0_LOCIE24 (1 << IRQ_LOCIE24)
156#define LOCIPD0_LOCIE25 (1 << IRQ_LOCIE25)
157#define LOCIPD0_LOCIE26 (1 << IRQ_LOCIE26)
158#define LOCIPD0_LOCIE27 (1 << IRQ_LOCIE27)
159#define LOCIPD0_LOCIE28 (1 << IRQ_LOCIE28)
160#define LOCIPD0_LOCIE29 (1 << IRQ_LOCIE29)
161#define LOCIPD0_LOCIE30 (1 << IRQ_LOCIE30)
162#define LOCIPD0_LOCIE31 (1 << IRQ_LOCIE31)
163
164#define PMPCFG0 0
165#define PMPCFG1 1
166#define PMPCFG2 2
167#define PMPCFG3 3
168
169#define PMPADDR0 0
170#define PMPADDR1 1
171#define PMPADDR2 2
172#define PMPADDR3 3
173#define PMPADDR4 4
174#define PMPADDR5 5
175#define PMPADDR6 6
176#define PMPADDR7 7
177#define PMPADDR8 8
178#define PMPADDR9 9
179#define PMPADDR10 10
180#define PMPADDR11 11
181#define PMPADDR12 12
182#define PMPADDR13 13
183#define PMPADDR14 14
184#define PMPADDR15 15
185
186// rv_custom_csr
187#define LOCIPRI0 (0xBC0)
188#define LOCIPRI1 (0xBC1)
189#define LOCIPRI2 (0xBC2)
190#define LOCIPRI3 (0xBC3)
191
192#define ICCTL (0x7C0)
193#define DCCTL (0x7C1)
194#define ICMAINT (0x7C2)
195#define DCMAINT (0x7C3)
196#define ICINVA (0x7C4)
197#define DCINCVA (0x7C5)
198#define MEMATTRL (0x7D8)
199#define MEMATTRH (0x7D9)
200#define LOCIPRI4 (0xBC4)
201#define LOCIPRI5 (0xBC5)
202#define LOCIPRI6 (0xBC6)
203#define LOCIPRI7 (0xBC7)
204#define LOCIPRI8 (0xBC8)
205#define LOCIPRI9 (0xBC9)
206#define LOCIPRI10 (0xBCA)
207#define LOCIPRI11 (0xBCB)
208#define LOCIPRI12 (0xBCC)
209#define LOCIPRI13 (0xBCD)
210#define LOCIPRI14 (0xBCE)
211#define LOCIPRI15 (0xBCF)
212
213#define locipri(x) LOCIPRI##x
214
215#define EXTERNAL_INTERRUPT_GROUP0 0
216#define EXTERNAL_INTERRUPT_GROUP1 1
217#define EXTERNAL_INTERRUPT_GROUP2 2
218#define EXTERNAL_INTERRUPT_GROUP3 3
219#define EXTERNAL_INTERRUPT_GROUP4 4
220#define EXTERNAL_INTERRUPT_GROUP5 5
221#define EXTERNAL_INTERRUPT_GROUP6 6
222#define EXTERNAL_INTERRUPT_GROUP7 7
223
224#define LOCIEN0 0xBE0
225#define LOCIEN1 0xBE1
226#define LOCIEN2 0xBE2
227
228#define LOCIPD0 0xBE8
229#define LOCIPD1 0xBE9
230#define LOCIPD2 0xBEA
231#define LOCIPD3 0xBEB
232
233/* local interrupt pending clear register */
234#define LOCIPCLR 0xBF0
235#define PRITHD 0xBFE
236#define CXCPTSC 0xFC2
237
238#define SIP_SSIP MIP_SSIP
239#define SIP_STIP MIP_STIP
240
241#define PRV_U 0
242#define PRV_S 1
243#define PRV_H 2
244#define PRV_M 3
245
246#define VM_MBARE 0
247#define VM_MBB 1
248#define VM_MBBID 2
249#define VM_SV32 8
250#define VM_SV39 9
251#define VM_SV48 10
252
253#define DEFAULT_RSTVEC 0x00001000
254#define DEFAULT_NMIVEC 0x00001004
255#define DEFAULT_MTVEC 0x00001010
256#define CONFIG_STRING_ADDR 0x0000100C
257#define EXT_IO_BASE 0x40000000
258#define DRAM_BASE 0x80000000
259
260// page table entry (PTE) fields
261#define PTE_V 0x001 // Valid
262#define PTE_TYPE 0x01E // Type
263#define PTE_R 0x020 // Referenced
264#define PTE_D 0x040 // Dirty
265#define PTE_SOFT 0x380 // Reserved for Software
266
267#define PTE_TYPE_TABLE 0x00
268#define PTE_TYPE_TABLE_GLOBAL 0x02
269#define PTE_TYPE_URX_SR 0x04
270#define PTE_TYPE_URWX_SRW 0x06
271#define PTE_TYPE_UR_SR 0x08
272#define PTE_TYPE_URW_SRW 0x0A
273#define PTE_TYPE_URX_SRX 0x0C
274#define PTE_TYPE_URWX_SRWX 0x0E
275#define PTE_TYPE_SR 0x10
276#define PTE_TYPE_SRW 0x12
277#define PTE_TYPE_SRX 0x14
278#define PTE_TYPE_SRWX 0x16
279#define PTE_TYPE_SR_GLOBAL 0x18
280#define PTE_TYPE_SRW_GLOBAL 0x1A
281#define PTE_TYPE_SRX_GLOBAL 0x1C
282#define PTE_TYPE_SRWX_GLOBAL 0x1E
283
284#define PTE_PPN_SHIFT 10
285
286#define pte_table(pte) ((0x0000000AU >> ((pte) & 0x1F)) & 1)
287#define pte_ur(pte) ((0x0000AAA0U >> ((pte) & 0x1F)) & 1)
288#define pte_uw(pte) ((0x00008880U >> ((pte) & 0x1F)) & 1)
289#define pte_ux(pte) ((0x0000A0A0U >> ((pte) & 0x1F)) & 1)
290#define pte_sr(pte) ((0xAAAAAAA0U >> ((pte) & 0x1F)) & 1)
291#define pte_sw(pte) ((0x88888880U >> ((pte) & 0x1F)) & 1)
292#define pte_sx(pte) ((0xA0A0A000U >> ((pte) & 0x1F)) & 1)
293
294#define pte_check_perm(pte, supervisor, store, fetch) \
295 ((store) ? ((supervisor) ? pte_sw(pte) : pte_uw(pte)) : \
296 (fetch) ? ((supervisor) ? pte_sx(pte) : pte_ux(pte)) : \
297 ((supervisor) ? pte_sr(pte) : pte_ur(pte)))
298
299#ifdef __riscv
300
301#ifdef __riscv64
302# define MSTATUS_SD MSTATUS64_SD
303# define SSTATUS_SD SSTATUS64_SD
304# define MCAUSE_INT MCAUSE64_INT
305# define MCAUSE_CAUSE MCAUSE64_CAUSE
306# define RISCV_PGLEVEL_BITS 9
307#else
308# define MSTATUS_SD MSTATUS32_SD
309# define SSTATUS_SD SSTATUS32_SD
310# define RISCV_PGLEVEL_BITS 10
311# define MCAUSE_INT MCAUSE32_INT
312# define MCAUSE_CAUSE MCAUSE32_CAUSE
313#endif
314
315#define RISCV_PGSHIFT 12
316#define RISCV_PGSIZE (1 << RISCV_PGSHIFT)
317
318#ifndef __ASSEMBLER__
319
320#ifdef __GNUC__
321
322#define read_csr(reg) ({ unsigned long __tmp; \
323 asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \
324 __tmp; })
325
326#define write_csr(reg, val) ({ \
327 if (__builtin_constant_p(val) && (unsigned long)(val) < 32) \
328 asm volatile ("csrw " #reg ", %0" :: "i"(val)); \
329 else \
330 asm volatile ("csrw " #reg ", %0" :: "r"(val)); })
331
332#define swap_csr(reg, val) ({ unsigned long __tmp; \
333 if (__builtin_constant_p(val) && (unsigned long)(val) < 32) \
334 asm volatile ("csrrw %0, " #reg ", %1" : "=r"(__tmp) : "i"(val)); \
335 else \
336 asm volatile ("csrrw %0, " #reg ", %1" : "=r"(__tmp) : "r"(val)); \
337 __tmp; })
338
339#define set_csr(reg, bit) ({ unsigned long __tmp; \
340 if (__builtin_constant_p(bit) && (unsigned long)(bit) < 32) \
341 asm volatile ("csrrs %0, " #reg ", %1" : "=r"(__tmp) : "i"(bit)); \
342 else \
343 asm volatile ("csrrs %0, " #reg ", %1" : "=r"(__tmp) : "r"(bit)); \
344 __tmp; })
345
346#define clear_csr(reg, bit) ({ unsigned long __tmp; \
347 if (__builtin_constant_p(bit) && (unsigned long)(bit) < 32) \
348 asm volatile ("csrrc %0, " #reg ", %1" : "=r"(__tmp) : "i"(bit)); \
349 else \
350 asm volatile ("csrrc %0, " #reg ", %1" : "=r"(__tmp) : "r"(bit)); \
351 __tmp; })
352
353// rv_custom_csr
354#define read_custom_csr(reg) ({ unsigned long __tmp; \
355 asm volatile ("csrr %0, %1" : "=r"(__tmp) : "i"(reg)); \
356 __tmp; })
357
358#define write_custom_csr_val(reg_addr, val) ({ \
359 if (__builtin_constant_p(val)) \
360 asm volatile("li t0," "%0" : : "i"(val) : "%t0"); \
361 else \
362 asm volatile("mv t0," "%0" : : "r"(val) : "%t0"); \
363 asm volatile("csrw %0, t0" :: "i"(reg_addr) : "%t0"); \
364 })
365
366#define set_custom_csr(reg_addr, bit) ({ \
367 if (__builtin_constant_p(bit) && (unsigned long)(bit) < 32) \
368 asm volatile("li t0," "%0" : : "i"(bit) : "%t0"); \
369 else \
370 asm volatile("mv t0," "%0" : : "r"(bit) : "%t0"); \
371 asm volatile("csrs %0, t0" :: "i"(reg_addr) : "%t0"); \
372 })
373
374#define clear_custom_csr(reg_addr, bit) ({ \
375 if (__builtin_constant_p(bit) && (unsigned long)(bit) < 32) \
376 asm volatile("li t0," "%0" : : "i"(bit) : "%t0"); \
377 else \
378 asm volatile("mv t0," "%0" : : "r"(bit) : "%t0"); \
379 asm volatile("csrc %0, t0" :: "i"(reg_addr) : "%t0"); \
380 })
381
382#define rdtime() read_csr(time)
383#define rdcycle() read_csr(cycle)
384#define rdinstret() read_csr(instret)
385
386#endif
387
388#endif
389
390#endif
391
392#ifdef __cplusplus
393#if __cplusplus
394}
395#endif /* __cplusplus */
396#endif /* __cplusplus */
397
398#endif
399