-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathriscv.h
96 lines (78 loc) · 1.7 KB
/
riscv.h
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#ifndef __RISCV_H__
#define __RISCV_H__
#include "types.h"
static inline reg_t r_tp()
{
reg_t x;
asm volatile("mv %0, tp" : "=r"(x));
return x;
}
static inline reg_t r_mhartid()
{
reg_t x;
asm volatile("csrr %0, mhartid" : "=r"(x));
return x;
}
/* Machine Status Register */
#define MSTATUS_MPP (3 << 11)
#define MSTATUS_SPP (1 << 8)
#define MSTATUS_MPIE (1 << 7)
#define MSTATUS_SPIE (1 << 5)
#define MSTATUS_UPIE (1 << 4)
#define MSTATUS_MIE (1 << 3)
#define MSTATUS_SIE (1 << 1)
#define MSTATUS_UIE (1 << 0)
static inline reg_t r_mstatus()
{
reg_t x;
asm volatile("csrr %0, mstatus" : "=r"(x));
return x;
}
static inline void w_mstatus(reg_t x)
{
asm volatile("csrw mstatus, %0" : : "r"(x));
}
static inline void w_mepc(reg_t x)
{
asm volatile("csrw mepc, %0" : : "r"(x));
}
static inline reg_t r_mepc()
{
reg_t x;
asm volatile("csrr %0, mepc" : "=r"(x));
return x;
}
/* Machine Scratch register */
static inline void w_mscratch(reg_t x)
{
asm volatile("csrw mscratch, %0" : : "r"(x));
}
/* Machine-mode interrupt vector */
static inline void w_mtvec(reg_t x)
{
asm volatile("csrw mtvec, %0" : : "r"(x));
}
/* Machine-mode Interrupt Enable */
#define MIE_MEIE (1 << 11) // external
#define MIE_MTIE (1 << 7) // timer
#define MIE_MSIE (1 << 3) // software
static inline reg_t r_mie()
{
reg_t x;
asm volatile("csrr %0, mie" : "=r"(x));
return x;
}
static inline void w_mie(reg_t x)
{
asm volatile("csrw mie, %0" : : "r"(x));
}
/* Machine-mode Cause Masks */
#define MCAUSE_MASK_INTERRUPT (reg_t)0x80000000
#define MCAUSE_MASK_ECODE (reg_t)0x7FFFFFFF
static inline reg_t r_mcause()
{
reg_t x;
asm volatile("csrr %0, mcause" : "=r"(x));
return x;
}
#endif /* __RISCV_H__*/