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
13
extern
"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
src
drivers
chips
ws63
arch
riscv
riscv31
arch_encoding.h
由
William Goodspeed
维护 | E-mail: gongzl@stu.hebust.edu.cn | Wechat: a23333344 | ALSO CHECKOUT
WS63FLASH
!
生成于 2025年 一月 4日 星期六 17:47:12 , 为 WS63 SDK 文档使用
1.9.8