xref: /freebsd-src/sys/riscv/include/riscvreg.h (revision d3916eace506b8ab23537223f5c92924636a1c41)
18d7e7a98SRuslan Bukin /*-
2e29afe64SRuslan Bukin  * Copyright (c) 2015-2024 Ruslan Bukin <br@bsdpad.com>
38d7e7a98SRuslan Bukin  * All rights reserved.
48d7e7a98SRuslan Bukin  *
58d7e7a98SRuslan Bukin  * Portions of this software were developed by SRI International and the
68d7e7a98SRuslan Bukin  * University of Cambridge Computer Laboratory under DARPA/AFRL contract
78d7e7a98SRuslan Bukin  * FA8750-10-C-0237 ("CTSRD"), as part of the DARPA CRASH research programme.
88d7e7a98SRuslan Bukin  *
98d7e7a98SRuslan Bukin  * Portions of this software were developed by the University of Cambridge
108d7e7a98SRuslan Bukin  * Computer Laboratory as part of the CTSRD Project, with support from the
118d7e7a98SRuslan Bukin  * UK Higher Education Innovation Fund (HEIF).
128d7e7a98SRuslan Bukin  *
138d7e7a98SRuslan Bukin  * Redistribution and use in source and binary forms, with or without
148d7e7a98SRuslan Bukin  * modification, are permitted provided that the following conditions
158d7e7a98SRuslan Bukin  * are met:
168d7e7a98SRuslan Bukin  * 1. Redistributions of source code must retain the above copyright
178d7e7a98SRuslan Bukin  *    notice, this list of conditions and the following disclaimer.
188d7e7a98SRuslan Bukin  * 2. Redistributions in binary form must reproduce the above copyright
198d7e7a98SRuslan Bukin  *    notice, this list of conditions and the following disclaimer in the
208d7e7a98SRuslan Bukin  *    documentation and/or other materials provided with the distribution.
218d7e7a98SRuslan Bukin  *
228d7e7a98SRuslan Bukin  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
238d7e7a98SRuslan Bukin  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
248d7e7a98SRuslan Bukin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
258d7e7a98SRuslan Bukin  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
268d7e7a98SRuslan Bukin  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
278d7e7a98SRuslan Bukin  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
288d7e7a98SRuslan Bukin  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
298d7e7a98SRuslan Bukin  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
308d7e7a98SRuslan Bukin  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
318d7e7a98SRuslan Bukin  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
328d7e7a98SRuslan Bukin  * SUCH DAMAGE.
338d7e7a98SRuslan Bukin  */
348d7e7a98SRuslan Bukin 
358d7e7a98SRuslan Bukin #ifndef _MACHINE_RISCVREG_H_
368d7e7a98SRuslan Bukin #define	_MACHINE_RISCVREG_H_
378d7e7a98SRuslan Bukin 
38cb8e0678SMitchell Horne #define	SCAUSE_INTR			(1ul << 63)
39cb8e0678SMitchell Horne #define	SCAUSE_CODE			(~SCAUSE_INTR)
40cb8e0678SMitchell Horne #define	SCAUSE_INST_MISALIGNED		0
41cb8e0678SMitchell Horne #define	SCAUSE_INST_ACCESS_FAULT	1
42cb8e0678SMitchell Horne #define	SCAUSE_ILLEGAL_INSTRUCTION	2
43cb8e0678SMitchell Horne #define	SCAUSE_BREAKPOINT		3
44cb8e0678SMitchell Horne #define	SCAUSE_LOAD_MISALIGNED		4
45cb8e0678SMitchell Horne #define	SCAUSE_LOAD_ACCESS_FAULT	5
46cb8e0678SMitchell Horne #define	SCAUSE_STORE_MISALIGNED		6
47cb8e0678SMitchell Horne #define	SCAUSE_STORE_ACCESS_FAULT	7
48cb8e0678SMitchell Horne #define	SCAUSE_ECALL_USER		8
49cb8e0678SMitchell Horne #define	SCAUSE_ECALL_SUPERVISOR		9
50*d3916eacSRuslan Bukin #define	SCAUSE_VIRTUAL_SUPERVISOR_ECALL	10
51*d3916eacSRuslan Bukin #define	SCAUSE_MACHINE_ECALL		11
52cb8e0678SMitchell Horne #define	SCAUSE_INST_PAGE_FAULT		12
53cb8e0678SMitchell Horne #define	SCAUSE_LOAD_PAGE_FAULT		13
54cb8e0678SMitchell Horne #define	SCAUSE_STORE_PAGE_FAULT		15
55*d3916eacSRuslan Bukin #define	SCAUSE_FETCH_GUEST_PAGE_FAULT	20
56*d3916eacSRuslan Bukin #define	SCAUSE_LOAD_GUEST_PAGE_FAULT	21
57*d3916eacSRuslan Bukin #define	SCAUSE_VIRTUAL_INSTRUCTION	22
58*d3916eacSRuslan Bukin #define	SCAUSE_STORE_GUEST_PAGE_FAULT	23
598d7e7a98SRuslan Bukin 
6098f50c44SRuslan Bukin #define	SSTATUS_UIE			(1 << 0)
6198f50c44SRuslan Bukin #define	SSTATUS_SIE			(1 << 1)
6298f50c44SRuslan Bukin #define	SSTATUS_UPIE			(1 << 4)
6398f50c44SRuslan Bukin #define	SSTATUS_SPIE			(1 << 5)
6498f50c44SRuslan Bukin #define	SSTATUS_SPIE_SHIFT		5
6598f50c44SRuslan Bukin #define	SSTATUS_SPP			(1 << 8)
6698f50c44SRuslan Bukin #define	SSTATUS_SPP_SHIFT		8
6798f50c44SRuslan Bukin #define	SSTATUS_FS_SHIFT		13
687804dd52SRuslan Bukin #define	SSTATUS_FS_OFF			(0x0 << SSTATUS_FS_SHIFT)
697804dd52SRuslan Bukin #define	SSTATUS_FS_INITIAL		(0x1 << SSTATUS_FS_SHIFT)
707804dd52SRuslan Bukin #define	SSTATUS_FS_CLEAN		(0x2 << SSTATUS_FS_SHIFT)
717804dd52SRuslan Bukin #define	SSTATUS_FS_DIRTY		(0x3 << SSTATUS_FS_SHIFT)
727804dd52SRuslan Bukin #define	SSTATUS_FS_MASK			(0x3 << SSTATUS_FS_SHIFT)
7398f50c44SRuslan Bukin #define	SSTATUS_XS_SHIFT		15
747804dd52SRuslan Bukin #define	SSTATUS_XS_MASK			(0x3 << SSTATUS_XS_SHIFT)
75af19cc59SRuslan Bukin #define	SSTATUS_SUM			(1 << 18)
76741ba007SMitchell Horne #if __riscv_xlen == 64
77cca117a1SJohn Baldwin #define	SSTATUS_SD			(1ul << 63)
78741ba007SMitchell Horne #else
79741ba007SMitchell Horne #define	SSTATUS_SD			(1 << 31)
80741ba007SMitchell Horne #endif
818d7e7a98SRuslan Bukin 
8298f50c44SRuslan Bukin #define	MSTATUS_UIE			(1 << 0)
8398f50c44SRuslan Bukin #define	MSTATUS_SIE			(1 << 1)
8498f50c44SRuslan Bukin #define	MSTATUS_HIE			(1 << 2)
8598f50c44SRuslan Bukin #define	MSTATUS_MIE			(1 << 3)
8698f50c44SRuslan Bukin #define	MSTATUS_UPIE			(1 << 4)
8798f50c44SRuslan Bukin #define	MSTATUS_SPIE			(1 << 5)
8898f50c44SRuslan Bukin #define	MSTATUS_SPIE_SHIFT		5
8998f50c44SRuslan Bukin #define	MSTATUS_HPIE			(1 << 6)
9098f50c44SRuslan Bukin #define	MSTATUS_MPIE			(1 << 7)
9198f50c44SRuslan Bukin #define	MSTATUS_MPIE_SHIFT		7
9298f50c44SRuslan Bukin #define	MSTATUS_SPP			(1 << 8)
9398f50c44SRuslan Bukin #define	MSTATUS_SPP_SHIFT		8
9498f50c44SRuslan Bukin #define	MSTATUS_HPP_MASK		0x3
9598f50c44SRuslan Bukin #define	MSTATUS_HPP_SHIFT		9
9698f50c44SRuslan Bukin #define	MSTATUS_MPP_MASK		0x3
9798f50c44SRuslan Bukin #define	MSTATUS_MPP_SHIFT		11
9898f50c44SRuslan Bukin #define	MSTATUS_FS_MASK			0x3
9998f50c44SRuslan Bukin #define	MSTATUS_FS_SHIFT		13
10098f50c44SRuslan Bukin #define	MSTATUS_XS_MASK			0x3
10198f50c44SRuslan Bukin #define	MSTATUS_XS_SHIFT		15
10298f50c44SRuslan Bukin #define	MSTATUS_MPRV			(1 << 17)
10398f50c44SRuslan Bukin #define	MSTATUS_PUM			(1 << 18)
1048d7e7a98SRuslan Bukin #define	MSTATUS_VM_MASK			0x1f
10598f50c44SRuslan Bukin #define	MSTATUS_VM_SHIFT		24
1068d7e7a98SRuslan Bukin #define	 MSTATUS_VM_MBARE		0
1078d7e7a98SRuslan Bukin #define	 MSTATUS_VM_MBB			1
1088d7e7a98SRuslan Bukin #define	 MSTATUS_VM_MBBID		2
1098d7e7a98SRuslan Bukin #define	 MSTATUS_VM_SV32		8
1108d7e7a98SRuslan Bukin #define	 MSTATUS_VM_SV39		9
1118d7e7a98SRuslan Bukin #define	 MSTATUS_VM_SV48		10
11298f50c44SRuslan Bukin #define	 MSTATUS_VM_SV57		11
11398f50c44SRuslan Bukin #define	 MSTATUS_VM_SV64		12
114cca117a1SJohn Baldwin #if __riscv_xlen == 64
115cca117a1SJohn Baldwin #define	MSTATUS_SD			(1ul << 63)
116cca117a1SJohn Baldwin #else
117cca117a1SJohn Baldwin #define	MSTATUS_SD			(1 << 31)
118cca117a1SJohn Baldwin #endif
1198d7e7a98SRuslan Bukin 
12098f50c44SRuslan Bukin #define	MSTATUS_PRV_U			0	/* user */
12198f50c44SRuslan Bukin #define	MSTATUS_PRV_S			1	/* supervisor */
12298f50c44SRuslan Bukin #define	MSTATUS_PRV_H			2	/* hypervisor */
12398f50c44SRuslan Bukin #define	MSTATUS_PRV_M			3	/* machine */
12498f50c44SRuslan Bukin 
125*d3916eacSRuslan Bukin #define	HSTATUS_VSBE	(1 << 5)
126*d3916eacSRuslan Bukin #define	HSTATUS_GVA	(1 << 6)
127*d3916eacSRuslan Bukin #define	HSTATUS_SPV	(1 << 7)
128*d3916eacSRuslan Bukin #define	HSTATUS_SPVP	(1 << 8)
129*d3916eacSRuslan Bukin #define	HSTATUS_HU	(1 << 9)
130*d3916eacSRuslan Bukin #define	HSTATUS_VGEIN_S	12
131*d3916eacSRuslan Bukin #define	HSTATUS_VGEIN_M	(0xf << HSTATUS_VGEIN_S)
132*d3916eacSRuslan Bukin #define	HSTATUS_VTVM	(1 << 20)
133*d3916eacSRuslan Bukin #define	HSTATUS_VTW	(1 << 21)
134*d3916eacSRuslan Bukin #define	HSTATUS_VTSR	(1 << 22)
135*d3916eacSRuslan Bukin 
13698f50c44SRuslan Bukin #define	MIE_USIE	(1 << 0)
1378d7e7a98SRuslan Bukin #define	MIE_SSIE	(1 << 1)
1388d7e7a98SRuslan Bukin #define	MIE_HSIE	(1 << 2)
1398d7e7a98SRuslan Bukin #define	MIE_MSIE	(1 << 3)
14098f50c44SRuslan Bukin #define	MIE_UTIE	(1 << 4)
1418d7e7a98SRuslan Bukin #define	MIE_STIE	(1 << 5)
1428d7e7a98SRuslan Bukin #define	MIE_HTIE	(1 << 6)
1438d7e7a98SRuslan Bukin #define	MIE_MTIE	(1 << 7)
1448d7e7a98SRuslan Bukin 
14598f50c44SRuslan Bukin #define	MIP_USIP	(1 << 0)
1468d7e7a98SRuslan Bukin #define	MIP_SSIP	(1 << 1)
1478d7e7a98SRuslan Bukin #define	MIP_HSIP	(1 << 2)
1488d7e7a98SRuslan Bukin #define	MIP_MSIP	(1 << 3)
14998f50c44SRuslan Bukin #define	MIP_UTIP	(1 << 4)
1508d7e7a98SRuslan Bukin #define	MIP_STIP	(1 << 5)
1518d7e7a98SRuslan Bukin #define	MIP_HTIP	(1 << 6)
1528d7e7a98SRuslan Bukin #define	MIP_MTIP	(1 << 7)
1538d7e7a98SRuslan Bukin 
15498f50c44SRuslan Bukin #define	SIE_USIE	(1 << 0)
1558d7e7a98SRuslan Bukin #define	SIE_SSIE	(1 << 1)
15698f50c44SRuslan Bukin #define	SIE_UTIE	(1 << 4)
1578d7e7a98SRuslan Bukin #define	SIE_STIE	(1 << 5)
1582d53a67cSRuslan Bukin #define	SIE_UEIE	(1 << 8)
1592d53a67cSRuslan Bukin #define	SIE_SEIE	(1 << 9)
1608d7e7a98SRuslan Bukin 
16198f50c44SRuslan Bukin #define	MIP_SEIP	(1 << 9)
16298f50c44SRuslan Bukin 
163*d3916eacSRuslan Bukin #define	HVIP_VSSIP	(1 << 2)
164*d3916eacSRuslan Bukin #define	HVIP_VSTIP	(1 << 6)
165*d3916eacSRuslan Bukin #define	HVIP_VSEIP	(1 << 10)
166*d3916eacSRuslan Bukin 
167*d3916eacSRuslan Bukin #define	HIE_VSSIE	(1 << 2)
168*d3916eacSRuslan Bukin #define	HIE_VSTIE	(1 << 6)
169*d3916eacSRuslan Bukin #define	HIE_VSEIE	(1 << 10)
170*d3916eacSRuslan Bukin #define	HIE_SGEIE	(1 << 12)
171*d3916eacSRuslan Bukin 
17217696c12SRuslan Bukin /* Note: sip register has no SIP_STIP bit in Spike simulator */
17317696c12SRuslan Bukin #define	SIP_SSIP	(1 << 1)
1748d7e7a98SRuslan Bukin #define	SIP_STIP	(1 << 5)
1758d7e7a98SRuslan Bukin 
176*d3916eacSRuslan Bukin #define	HENVCFG_STCE	(1UL << 63)
177*d3916eacSRuslan Bukin #define	HENVCFG_PBMTE	(1UL << 62)
178*d3916eacSRuslan Bukin #define	HENVCFG_CBZE	(1UL << 7)
179*d3916eacSRuslan Bukin #define	HENVCFG_CBCFE	(1UL << 6)
180*d3916eacSRuslan Bukin #define	HENVCFG_CBIE_S	4
181*d3916eacSRuslan Bukin #define	HENVCFG_CBIE_M	(0x3 << HENVCFG_CBIE_S)
182*d3916eacSRuslan Bukin #define	HENVCFG_FIOM	(1UL << 0)
183*d3916eacSRuslan Bukin 
184*d3916eacSRuslan Bukin #define	HCOUNTEREN_CY	(1UL << 0) /* Cycle */
185*d3916eacSRuslan Bukin #define	HCOUNTEREN_TM	(1UL << 1) /* Time */
186*d3916eacSRuslan Bukin #define	HCOUNTEREN_IR	(1UL << 2) /* Instret */
187*d3916eacSRuslan Bukin 
188af19cc59SRuslan Bukin #define	SATP_PPN_S	0
18931218f32SMark Johnston #define	SATP_PPN_M	(0xfffffffffffUL << SATP_PPN_S)
190af19cc59SRuslan Bukin #define	SATP_ASID_S	44
19131218f32SMark Johnston #define	SATP_ASID_M	(0xffffUL << SATP_ASID_S)
192af19cc59SRuslan Bukin #define	SATP_MODE_S	60
19331218f32SMark Johnston #define	SATP_MODE_M	(0xfUL << SATP_MODE_S)
194af19cc59SRuslan Bukin #define	SATP_MODE_SV39	(8ULL << SATP_MODE_S)
195af19cc59SRuslan Bukin #define	SATP_MODE_SV48	(9ULL << SATP_MODE_S)
196af19cc59SRuslan Bukin 
19780fe2359SMark Johnston #define	XLEN		__riscv_xlen
19880fe2359SMark Johnston #define	XLEN_BYTES	(XLEN / 8)
199d52d6d7cSRuslan Bukin #define	INSN_SIZE	4
200378a4956SRuslan Bukin #define	INSN_C_SIZE	2
20117696c12SRuslan Bukin 
202378a4956SRuslan Bukin #define	X_RA	1
203378a4956SRuslan Bukin #define	X_SP	2
204378a4956SRuslan Bukin #define	X_GP	3
205378a4956SRuslan Bukin #define	X_TP	4
206378a4956SRuslan Bukin #define	X_T0	5
207378a4956SRuslan Bukin #define	X_T1	6
208378a4956SRuslan Bukin #define	X_T2	7
209378a4956SRuslan Bukin #define	X_T3	28
210378a4956SRuslan Bukin 
211378a4956SRuslan Bukin #define	RD_SHIFT	7
212378a4956SRuslan Bukin #define	RD_MASK		(0x1f << RD_SHIFT)
213378a4956SRuslan Bukin #define	RS1_SHIFT	15
214378a4956SRuslan Bukin #define	RS1_MASK	(0x1f << RS1_SHIFT)
215378a4956SRuslan Bukin #define	RS1_SP		(X_SP << RS1_SHIFT)
216378a4956SRuslan Bukin #define	RS2_SHIFT	20
217378a4956SRuslan Bukin #define	RS2_MASK	(0x1f << RS2_SHIFT)
218378a4956SRuslan Bukin #define	RS2_RA		(X_RA << RS2_SHIFT)
219378a4956SRuslan Bukin #define	IMM_SHIFT	20
220378a4956SRuslan Bukin #define	IMM_MASK	(0xfff << IMM_SHIFT)
221378a4956SRuslan Bukin 
222378a4956SRuslan Bukin #define	RS2_C_SHIFT	2
223378a4956SRuslan Bukin #define	RS2_C_MASK	(0x1f << RS2_C_SHIFT)
224378a4956SRuslan Bukin #define	RS2_C_RA	(X_RA << RS2_C_SHIFT)
225fed1ca4bSRuslan Bukin 
2268d7e7a98SRuslan Bukin #define	CSR_ZIMM(val)							\
2278d7e7a98SRuslan Bukin 	(__builtin_constant_p(val) && ((u_long)(val) < 32))
2288d7e7a98SRuslan Bukin 
2298d7e7a98SRuslan Bukin #define	csr_swap(csr, val)						\
230e29afe64SRuslan Bukin ({	u_long ret;							\
231e29afe64SRuslan Bukin 	if (CSR_ZIMM(val))  						\
2328d7e7a98SRuslan Bukin 		__asm __volatile("csrrwi %0, " #csr ", %1"		\
233e29afe64SRuslan Bukin 				: "=r" (ret) : "i" (val));		\
2348d7e7a98SRuslan Bukin 	else 								\
2358d7e7a98SRuslan Bukin 		__asm __volatile("csrrw %0, " #csr ", %1"		\
236e29afe64SRuslan Bukin 				: "=r" (ret) : "r" (val));		\
237e29afe64SRuslan Bukin 	ret;								\
2388d7e7a98SRuslan Bukin })
2398d7e7a98SRuslan Bukin 
2408d7e7a98SRuslan Bukin #define	csr_write(csr, val)						\
2418d7e7a98SRuslan Bukin ({	if (CSR_ZIMM(val)) 						\
2428d7e7a98SRuslan Bukin 		__asm __volatile("csrwi " #csr ", %0" :: "i" (val));	\
2438d7e7a98SRuslan Bukin 	else 								\
2448d7e7a98SRuslan Bukin 		__asm __volatile("csrw " #csr ", %0" ::  "r" (val));	\
2458d7e7a98SRuslan Bukin })
2468d7e7a98SRuslan Bukin 
2478d7e7a98SRuslan Bukin #define	csr_set(csr, val)						\
2488d7e7a98SRuslan Bukin ({	if (CSR_ZIMM(val)) 						\
2498d7e7a98SRuslan Bukin 		__asm __volatile("csrsi " #csr ", %0" :: "i" (val));	\
2508d7e7a98SRuslan Bukin 	else								\
2518d7e7a98SRuslan Bukin 		__asm __volatile("csrs " #csr ", %0" :: "r" (val));	\
2528d7e7a98SRuslan Bukin })
2538d7e7a98SRuslan Bukin 
2548d7e7a98SRuslan Bukin #define	csr_clear(csr, val)						\
2558d7e7a98SRuslan Bukin ({	if (CSR_ZIMM(val))						\
2568d7e7a98SRuslan Bukin 		__asm __volatile("csrci " #csr ", %0" :: "i" (val));	\
2578d7e7a98SRuslan Bukin 	else								\
2588d7e7a98SRuslan Bukin 		__asm __volatile("csrc " #csr ", %0" :: "r" (val));	\
2598d7e7a98SRuslan Bukin })
2608d7e7a98SRuslan Bukin 
2618d7e7a98SRuslan Bukin #define	csr_read(csr)							\
2628d7e7a98SRuslan Bukin ({	u_long val;							\
2638d7e7a98SRuslan Bukin 	__asm __volatile("csrr %0, " #csr : "=r" (val));		\
2648d7e7a98SRuslan Bukin 	val;								\
2658d7e7a98SRuslan Bukin })
2668d7e7a98SRuslan Bukin 
2671e2ceeb1SMark Johnston #if __riscv_xlen == 32
2681e2ceeb1SMark Johnston #define	csr_read64(csr)							\
2691e2ceeb1SMark Johnston ({	uint64_t val;							\
2701e2ceeb1SMark Johnston 	uint32_t high, low;						\
2711e2ceeb1SMark Johnston 	__asm __volatile("1: "						\
2721e2ceeb1SMark Johnston 			 "csrr t0, " #csr "h\n"				\
2731e2ceeb1SMark Johnston 			 "csrr %0, " #csr "\n"				\
2741e2ceeb1SMark Johnston 			 "csrr %1, " #csr "h\n"				\
2751e2ceeb1SMark Johnston 			 "bne t0, %1, 1b"				\
2761e2ceeb1SMark Johnston 			 : "=r" (low), "=r" (high)			\
2771e2ceeb1SMark Johnston 			 :						\
2781e2ceeb1SMark Johnston 			 : "t0");					\
2791e2ceeb1SMark Johnston 	val = (low | ((uint64_t)high << 32));				\
2801e2ceeb1SMark Johnston 	val;								\
2811e2ceeb1SMark Johnston })
2821e2ceeb1SMark Johnston #else
2831e2ceeb1SMark Johnston #define	csr_read64(csr)		((uint64_t)csr_read(csr))
2841e2ceeb1SMark Johnston #endif
2851e2ceeb1SMark Johnston 
2868d7e7a98SRuslan Bukin #endif /* !_MACHINE_RISCVREG_H_ */
287