xref: /kvm-unit-tests/lib/riscv/asm/csr.h (revision 0182459af36445327a0a4f6e724e550e27863168)
1bd744d46SAndrew Jones /* SPDX-License-Identifier: GPL-2.0-only */
2bd744d46SAndrew Jones #ifndef _ASMRISCV_CSR_H_
3bd744d46SAndrew Jones #define _ASMRISCV_CSR_H_
422f287f4SAndrew Jones #include <linux/const.h>
5bd744d46SAndrew Jones 
6386561f8SAndrew Jones #define CSR_SSTATUS		0x100
714fa12b1SJames Raphael Tiovalen #define CSR_SIE			0x104
8386561f8SAndrew Jones #define CSR_STVEC		0x105
9bd744d46SAndrew Jones #define CSR_SSCRATCH		0x140
10386561f8SAndrew Jones #define CSR_SEPC		0x141
11386561f8SAndrew Jones #define CSR_SCAUSE		0x142
12386561f8SAndrew Jones #define CSR_STVAL		0x143
1314fa12b1SJames Raphael Tiovalen #define CSR_SIP			0x144
1414fa12b1SJames Raphael Tiovalen #define CSR_STIMECMP		0x14d
1514fa12b1SJames Raphael Tiovalen #define CSR_STIMECMPH		0x15d
16ad435a71SAndrew Jones #define CSR_SATP		0x180
1793bcbb09SJames Raphael Tiovalen #define CSR_TIME		0xc01
18386561f8SAndrew Jones 
19a3c0b550SAndrew Jones #define SR_SIE			_AC(0x00000002, UL)
2098ea1f96SClément Léger #define SR_SPP			_AC(0x00000100, UL)
21*e844ca0cSClément Léger #define SR_SDT			_AC(0x01000000, UL) /* Supervisor Double Trap */
22a3c0b550SAndrew Jones 
23386561f8SAndrew Jones /* Exception cause high bit - is an interrupt if set */
24386561f8SAndrew Jones #define CAUSE_IRQ_FLAG		(_AC(1, UL) << (__riscv_xlen - 1))
25386561f8SAndrew Jones 
26386561f8SAndrew Jones /* Exception causes */
27386561f8SAndrew Jones #define EXC_INST_MISALIGNED	0
28386561f8SAndrew Jones #define EXC_INST_ACCESS		1
29386561f8SAndrew Jones #define EXC_INST_ILLEGAL	2
30386561f8SAndrew Jones #define EXC_BREAKPOINT		3
31386561f8SAndrew Jones #define EXC_LOAD_MISALIGNED	4
32386561f8SAndrew Jones #define EXC_LOAD_ACCESS		5
33386561f8SAndrew Jones #define EXC_STORE_MISALIGNED	6
34386561f8SAndrew Jones #define EXC_STORE_ACCESS	7
35386561f8SAndrew Jones #define EXC_SYSCALL		8
36386561f8SAndrew Jones #define EXC_HYPERVISOR_SYSCALL	9
37386561f8SAndrew Jones #define EXC_SUPERVISOR_SYSCALL	10
38386561f8SAndrew Jones #define EXC_INST_PAGE_FAULT	12
39386561f8SAndrew Jones #define EXC_LOAD_PAGE_FAULT	13
40386561f8SAndrew Jones #define EXC_STORE_PAGE_FAULT	15
41386561f8SAndrew Jones #define EXC_INST_GUEST_PAGE_FAULT	20
42386561f8SAndrew Jones #define EXC_LOAD_GUEST_PAGE_FAULT	21
43386561f8SAndrew Jones #define EXC_VIRTUAL_INST_FAULT		22
44386561f8SAndrew Jones #define EXC_STORE_GUEST_PAGE_FAULT	23
45bd744d46SAndrew Jones 
46c20c0aa7SJames Raphael Tiovalen /* Interrupt causes */
47c20c0aa7SJames Raphael Tiovalen #define IRQ_S_SOFT		1
48c20c0aa7SJames Raphael Tiovalen #define IRQ_VS_SOFT		2
49c20c0aa7SJames Raphael Tiovalen #define IRQ_S_TIMER		5
50c20c0aa7SJames Raphael Tiovalen #define IRQ_VS_TIMER		6
51c20c0aa7SJames Raphael Tiovalen #define IRQ_S_EXT		9
52c20c0aa7SJames Raphael Tiovalen #define IRQ_VS_EXT		10
53c20c0aa7SJames Raphael Tiovalen #define IRQ_S_GEXT		12
54c20c0aa7SJames Raphael Tiovalen #define IRQ_PMU_OVF		13
55c20c0aa7SJames Raphael Tiovalen 
5670df1827SAndrew Jones #define IE_SSIE			(_AC(1, UL) << IRQ_S_SOFT)
5770df1827SAndrew Jones #define IE_TIE			(_AC(1, UL) << IRQ_S_TIMER)
5814fa12b1SJames Raphael Tiovalen 
5914fa12b1SJames Raphael Tiovalen #define IP_TIP			IE_TIE
6014fa12b1SJames Raphael Tiovalen 
610cc3a351SSean Christopherson #ifndef __ASSEMBLER__
6222f287f4SAndrew Jones 
6322f287f4SAndrew Jones #define csr_swap(csr, val)					\
6422f287f4SAndrew Jones ({								\
6522f287f4SAndrew Jones 	unsigned long __v = (unsigned long)(val);		\
6622f287f4SAndrew Jones 	__asm__ __volatile__ ("csrrw %0, " __ASM_STR(csr) ", %1"\
6722f287f4SAndrew Jones 				: "=r" (__v) : "rK" (__v)	\
6822f287f4SAndrew Jones 				: "memory");			\
6922f287f4SAndrew Jones 	__v;							\
7022f287f4SAndrew Jones })
7122f287f4SAndrew Jones 
7222f287f4SAndrew Jones #define csr_read(csr)						\
7322f287f4SAndrew Jones ({								\
7422f287f4SAndrew Jones 	register unsigned long __v;				\
7522f287f4SAndrew Jones 	__asm__ __volatile__ ("csrr %0, " __ASM_STR(csr)	\
7622f287f4SAndrew Jones 				: "=r" (__v) :			\
7722f287f4SAndrew Jones 				: "memory");			\
7822f287f4SAndrew Jones 	__v;							\
7922f287f4SAndrew Jones })
8022f287f4SAndrew Jones 
8122f287f4SAndrew Jones #define csr_write(csr, val)					\
8222f287f4SAndrew Jones ({								\
8322f287f4SAndrew Jones 	unsigned long __v = (unsigned long)(val);		\
8422f287f4SAndrew Jones 	__asm__ __volatile__ ("csrw " __ASM_STR(csr) ", %0"	\
8522f287f4SAndrew Jones 				: : "rK" (__v)			\
8622f287f4SAndrew Jones 				: "memory");			\
8722f287f4SAndrew Jones })
8822f287f4SAndrew Jones 
8922f287f4SAndrew Jones #define csr_read_set(csr, val)					\
9022f287f4SAndrew Jones ({								\
9122f287f4SAndrew Jones 	unsigned long __v = (unsigned long)(val);		\
9222f287f4SAndrew Jones 	__asm__ __volatile__ ("csrrs %0, " __ASM_STR(csr) ", %1"\
9322f287f4SAndrew Jones 				: "=r" (__v) : "rK" (__v)	\
9422f287f4SAndrew Jones 				: "memory");			\
9522f287f4SAndrew Jones 	__v;							\
9622f287f4SAndrew Jones })
9722f287f4SAndrew Jones 
9822f287f4SAndrew Jones #define csr_set(csr, val)					\
9922f287f4SAndrew Jones ({								\
10022f287f4SAndrew Jones 	unsigned long __v = (unsigned long)(val);		\
10122f287f4SAndrew Jones 	__asm__ __volatile__ ("csrs " __ASM_STR(csr) ", %0"	\
10222f287f4SAndrew Jones 				: : "rK" (__v)			\
10322f287f4SAndrew Jones 				: "memory");			\
10422f287f4SAndrew Jones })
10522f287f4SAndrew Jones 
10622f287f4SAndrew Jones #define csr_read_clear(csr, val)				\
10722f287f4SAndrew Jones ({								\
10822f287f4SAndrew Jones 	unsigned long __v = (unsigned long)(val);		\
10922f287f4SAndrew Jones 	__asm__ __volatile__ ("csrrc %0, " __ASM_STR(csr) ", %1"\
11022f287f4SAndrew Jones 				: "=r" (__v) : "rK" (__v)	\
11122f287f4SAndrew Jones 				: "memory");			\
11222f287f4SAndrew Jones 	__v;							\
11322f287f4SAndrew Jones })
11422f287f4SAndrew Jones 
11522f287f4SAndrew Jones #define csr_clear(csr, val)					\
11622f287f4SAndrew Jones ({								\
11722f287f4SAndrew Jones 	unsigned long __v = (unsigned long)(val);		\
11822f287f4SAndrew Jones 	__asm__ __volatile__ ("csrc " __ASM_STR(csr) ", %0"	\
11922f287f4SAndrew Jones 				: : "rK" (__v)			\
12022f287f4SAndrew Jones 				: "memory");			\
12122f287f4SAndrew Jones })
12222f287f4SAndrew Jones 
1230cc3a351SSean Christopherson #endif /* !__ASSEMBLER__ */
124bd744d46SAndrew Jones #endif /* _ASMRISCV_CSR_H_ */
125