blob: 93bba2b953262f2a06397dff4bc25329d4488707 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
#ifndef APOS_CSR_H
#define APOS_CSR_H
/**
* @file csr.h
* riscv64-specific header for CSR handling
*/
#define SATP_MODE_Sv32 0x80000000
#define SATP_MODE_Sv39 0x8000000000000000
#define SATP_MODE_Sv48 0x9000000000000000
/* unprivileged CSR registers */
#define CSR_TIME 0xc01
#define CSR_TIMEH 0xc81
/* supervisor CSR registers */
#define CSR_SSTATUS 0x100
#define CSR_SIE 0x104
#define CSR_STVEC 0x105
#define CSR_SCOUNTEREN 0x106
#define CSR_SENVCFG 0x10A
#define CSR_SSCRATCH 0x140
#define CSR_SEPC 0x141
#define CSR_SCAUSE 0x142
#define CSR_STVAL 0x143
#define CSR_SIP 0x144
#define CSR_SATP 0x180
#define CSR_SCONTEXT 0x5A8
/* Exception causes */
#define EXC_INST_MISALIGNED 0
#define EXC_INST_ACCESS 1
#define EXC_BREAKPOINT 3
#define EXC_LOAD_ACCESS 5
#define EXC_STORE_ACCESS 7
#define EXC_SYSCALL 8
#define EXC_INST_PAGE_FAULT 12
#define EXC_LOAD_PAGE_FAULT 13
#define EXC_STORE_PAGE_FAULT 15
/* status CSR bits */
#define SSTATUS_SUM (1 << 18)
#define SSTATUS_SPP (1 << 8)
/* directly lifted from Linux:/arch/riscv/include/asm/asm.h:9-13 */
#if defined(__ASSEMBLY__)
#define __ASM_STR(x) x
#else
#define __ASM_STR(x) #x
#endif
#define csr_read(csr, res) \
__asm__ volatile("csrr %0, " __ASM_STR(csr) : "=r"(res) : : "memory")
#define csr_write(csr, val) \
__asm__ volatile("csrw " __ASM_STR(csr) ", %0" : : "r"(val) : "memory")
#define csr_set(csr, val) \
__asm__ volatile("csrs " __ASM_STR(csr) ", %0" : : "r"(val) : "memory")
#define csr_clear(csr, val) \
__asm__ volatile("csrc " __ASM_STR(csr) ", %0" : : "r"(val) : "memory")
#endif /* APOS_CSR_H */
|