xref: /kvm-unit-tests/lib/riscv/asm/csr.h (revision 386561f8cd050f58e9dc2ec7562014c8f1680de3)
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 
6*386561f8SAndrew Jones #define CSR_SSTATUS		0x100
7*386561f8SAndrew Jones #define CSR_STVEC		0x105
8bd744d46SAndrew Jones #define CSR_SSCRATCH		0x140
9*386561f8SAndrew Jones #define CSR_SEPC		0x141
10*386561f8SAndrew Jones #define CSR_SCAUSE		0x142
11*386561f8SAndrew Jones #define CSR_STVAL		0x143
12*386561f8SAndrew Jones 
13*386561f8SAndrew Jones /* Exception cause high bit - is an interrupt if set */
14*386561f8SAndrew Jones #define CAUSE_IRQ_FLAG		(_AC(1, UL) << (__riscv_xlen - 1))
15*386561f8SAndrew Jones 
16*386561f8SAndrew Jones /* Exception causes */
17*386561f8SAndrew Jones #define EXC_INST_MISALIGNED	0
18*386561f8SAndrew Jones #define EXC_INST_ACCESS		1
19*386561f8SAndrew Jones #define EXC_INST_ILLEGAL	2
20*386561f8SAndrew Jones #define EXC_BREAKPOINT		3
21*386561f8SAndrew Jones #define EXC_LOAD_MISALIGNED	4
22*386561f8SAndrew Jones #define EXC_LOAD_ACCESS		5
23*386561f8SAndrew Jones #define EXC_STORE_MISALIGNED	6
24*386561f8SAndrew Jones #define EXC_STORE_ACCESS	7
25*386561f8SAndrew Jones #define EXC_SYSCALL		8
26*386561f8SAndrew Jones #define EXC_HYPERVISOR_SYSCALL	9
27*386561f8SAndrew Jones #define EXC_SUPERVISOR_SYSCALL	10
28*386561f8SAndrew Jones #define EXC_INST_PAGE_FAULT	12
29*386561f8SAndrew Jones #define EXC_LOAD_PAGE_FAULT	13
30*386561f8SAndrew Jones #define EXC_STORE_PAGE_FAULT	15
31*386561f8SAndrew Jones #define EXC_INST_GUEST_PAGE_FAULT	20
32*386561f8SAndrew Jones #define EXC_LOAD_GUEST_PAGE_FAULT	21
33*386561f8SAndrew Jones #define EXC_VIRTUAL_INST_FAULT		22
34*386561f8SAndrew Jones #define EXC_STORE_GUEST_PAGE_FAULT	23
35bd744d46SAndrew Jones 
3622f287f4SAndrew Jones #ifndef __ASSEMBLY__
3722f287f4SAndrew Jones 
3822f287f4SAndrew Jones #define csr_swap(csr, val)					\
3922f287f4SAndrew Jones ({								\
4022f287f4SAndrew Jones 	unsigned long __v = (unsigned long)(val);		\
4122f287f4SAndrew Jones 	__asm__ __volatile__ ("csrrw %0, " __ASM_STR(csr) ", %1"\
4222f287f4SAndrew Jones 				: "=r" (__v) : "rK" (__v)	\
4322f287f4SAndrew Jones 				: "memory");			\
4422f287f4SAndrew Jones 	__v;							\
4522f287f4SAndrew Jones })
4622f287f4SAndrew Jones 
4722f287f4SAndrew Jones #define csr_read(csr)						\
4822f287f4SAndrew Jones ({								\
4922f287f4SAndrew Jones 	register unsigned long __v;				\
5022f287f4SAndrew Jones 	__asm__ __volatile__ ("csrr %0, " __ASM_STR(csr)	\
5122f287f4SAndrew Jones 				: "=r" (__v) :			\
5222f287f4SAndrew Jones 				: "memory");			\
5322f287f4SAndrew Jones 	__v;							\
5422f287f4SAndrew Jones })
5522f287f4SAndrew Jones 
5622f287f4SAndrew Jones #define csr_write(csr, val)					\
5722f287f4SAndrew Jones ({								\
5822f287f4SAndrew Jones 	unsigned long __v = (unsigned long)(val);		\
5922f287f4SAndrew Jones 	__asm__ __volatile__ ("csrw " __ASM_STR(csr) ", %0"	\
6022f287f4SAndrew Jones 				: : "rK" (__v)			\
6122f287f4SAndrew Jones 				: "memory");			\
6222f287f4SAndrew Jones })
6322f287f4SAndrew Jones 
6422f287f4SAndrew Jones #define csr_read_set(csr, val)					\
6522f287f4SAndrew Jones ({								\
6622f287f4SAndrew Jones 	unsigned long __v = (unsigned long)(val);		\
6722f287f4SAndrew Jones 	__asm__ __volatile__ ("csrrs %0, " __ASM_STR(csr) ", %1"\
6822f287f4SAndrew Jones 				: "=r" (__v) : "rK" (__v)	\
6922f287f4SAndrew Jones 				: "memory");			\
7022f287f4SAndrew Jones 	__v;							\
7122f287f4SAndrew Jones })
7222f287f4SAndrew Jones 
7322f287f4SAndrew Jones #define csr_set(csr, val)					\
7422f287f4SAndrew Jones ({								\
7522f287f4SAndrew Jones 	unsigned long __v = (unsigned long)(val);		\
7622f287f4SAndrew Jones 	__asm__ __volatile__ ("csrs " __ASM_STR(csr) ", %0"	\
7722f287f4SAndrew Jones 				: : "rK" (__v)			\
7822f287f4SAndrew Jones 				: "memory");			\
7922f287f4SAndrew Jones })
8022f287f4SAndrew Jones 
8122f287f4SAndrew Jones #define csr_read_clear(csr, val)				\
8222f287f4SAndrew Jones ({								\
8322f287f4SAndrew Jones 	unsigned long __v = (unsigned long)(val);		\
8422f287f4SAndrew Jones 	__asm__ __volatile__ ("csrrc %0, " __ASM_STR(csr) ", %1"\
8522f287f4SAndrew Jones 				: "=r" (__v) : "rK" (__v)	\
8622f287f4SAndrew Jones 				: "memory");			\
8722f287f4SAndrew Jones 	__v;							\
8822f287f4SAndrew Jones })
8922f287f4SAndrew Jones 
9022f287f4SAndrew Jones #define csr_clear(csr, val)					\
9122f287f4SAndrew Jones ({								\
9222f287f4SAndrew Jones 	unsigned long __v = (unsigned long)(val);		\
9322f287f4SAndrew Jones 	__asm__ __volatile__ ("csrc " __ASM_STR(csr) ", %0"	\
9422f287f4SAndrew Jones 				: : "rK" (__v)			\
9522f287f4SAndrew Jones 				: "memory");			\
9622f287f4SAndrew Jones })
9722f287f4SAndrew Jones 
9822f287f4SAndrew Jones #endif /* !__ASSEMBLY__ */
99bd744d46SAndrew Jones #endif /* _ASMRISCV_CSR_H_ */
100