xref: /linux/tools/testing/selftests/kvm/include/loongarch/processor.h (revision 43db1111073049220381944af4a3b8a5400eda71)
1*21872c74SBibo Mao /* SPDX-License-Identifier: GPL-2.0-only */
2*21872c74SBibo Mao 
3*21872c74SBibo Mao #ifndef SELFTEST_KVM_PROCESSOR_H
4*21872c74SBibo Mao #define SELFTEST_KVM_PROCESSOR_H
5*21872c74SBibo Mao 
6*21872c74SBibo Mao #ifndef __ASSEMBLER__
7*21872c74SBibo Mao #include "ucall_common.h"
8*21872c74SBibo Mao 
9*21872c74SBibo Mao #else
10*21872c74SBibo Mao /* general registers */
11*21872c74SBibo Mao #define zero				$r0
12*21872c74SBibo Mao #define ra				$r1
13*21872c74SBibo Mao #define tp				$r2
14*21872c74SBibo Mao #define sp				$r3
15*21872c74SBibo Mao #define a0				$r4
16*21872c74SBibo Mao #define a1				$r5
17*21872c74SBibo Mao #define a2				$r6
18*21872c74SBibo Mao #define a3				$r7
19*21872c74SBibo Mao #define a4				$r8
20*21872c74SBibo Mao #define a5				$r9
21*21872c74SBibo Mao #define a6				$r10
22*21872c74SBibo Mao #define a7				$r11
23*21872c74SBibo Mao #define t0				$r12
24*21872c74SBibo Mao #define t1				$r13
25*21872c74SBibo Mao #define t2				$r14
26*21872c74SBibo Mao #define t3				$r15
27*21872c74SBibo Mao #define t4				$r16
28*21872c74SBibo Mao #define t5				$r17
29*21872c74SBibo Mao #define t6				$r18
30*21872c74SBibo Mao #define t7				$r19
31*21872c74SBibo Mao #define t8				$r20
32*21872c74SBibo Mao #define u0				$r21
33*21872c74SBibo Mao #define fp				$r22
34*21872c74SBibo Mao #define s0				$r23
35*21872c74SBibo Mao #define s1				$r24
36*21872c74SBibo Mao #define s2				$r25
37*21872c74SBibo Mao #define s3				$r26
38*21872c74SBibo Mao #define s4				$r27
39*21872c74SBibo Mao #define s5				$r28
40*21872c74SBibo Mao #define s6				$r29
41*21872c74SBibo Mao #define s7				$r30
42*21872c74SBibo Mao #define s8				$r31
43*21872c74SBibo Mao #endif
44*21872c74SBibo Mao 
45*21872c74SBibo Mao /*
46*21872c74SBibo Mao  * LoongArch page table entry definition
47*21872c74SBibo Mao  * Original header file arch/loongarch/include/asm/loongarch.h
48*21872c74SBibo Mao  */
49*21872c74SBibo Mao #define _PAGE_VALID_SHIFT		0
50*21872c74SBibo Mao #define _PAGE_DIRTY_SHIFT		1
51*21872c74SBibo Mao #define _PAGE_PLV_SHIFT			2  /* 2~3, two bits */
52*21872c74SBibo Mao #define  PLV_KERN			0
53*21872c74SBibo Mao #define  PLV_USER			3
54*21872c74SBibo Mao #define  PLV_MASK			0x3
55*21872c74SBibo Mao #define _CACHE_SHIFT			4  /* 4~5, two bits */
56*21872c74SBibo Mao #define _PAGE_PRESENT_SHIFT		7
57*21872c74SBibo Mao #define _PAGE_WRITE_SHIFT		8
58*21872c74SBibo Mao 
59*21872c74SBibo Mao #define _PAGE_VALID			BIT_ULL(_PAGE_VALID_SHIFT)
60*21872c74SBibo Mao #define _PAGE_PRESENT			BIT_ULL(_PAGE_PRESENT_SHIFT)
61*21872c74SBibo Mao #define _PAGE_WRITE			BIT_ULL(_PAGE_WRITE_SHIFT)
62*21872c74SBibo Mao #define _PAGE_DIRTY			BIT_ULL(_PAGE_DIRTY_SHIFT)
63*21872c74SBibo Mao #define _PAGE_USER			(PLV_USER << _PAGE_PLV_SHIFT)
64*21872c74SBibo Mao #define   __READABLE			(_PAGE_VALID)
65*21872c74SBibo Mao #define   __WRITEABLE			(_PAGE_DIRTY | _PAGE_WRITE)
66*21872c74SBibo Mao /* Coherent Cached */
67*21872c74SBibo Mao #define _CACHE_CC			BIT_ULL(_CACHE_SHIFT)
68*21872c74SBibo Mao #define PS_4K				0x0000000c
69*21872c74SBibo Mao #define PS_16K				0x0000000e
70*21872c74SBibo Mao #define PS_64K				0x00000010
71*21872c74SBibo Mao #define PS_DEFAULT_SIZE			PS_16K
72*21872c74SBibo Mao 
73*21872c74SBibo Mao /* LoongArch Basic CSR registers */
74*21872c74SBibo Mao #define LOONGARCH_CSR_CRMD		0x0 /* Current mode info */
75*21872c74SBibo Mao #define  CSR_CRMD_PG_SHIFT		4
76*21872c74SBibo Mao #define  CSR_CRMD_PG			BIT_ULL(CSR_CRMD_PG_SHIFT)
77*21872c74SBibo Mao #define  CSR_CRMD_IE_SHIFT		2
78*21872c74SBibo Mao #define  CSR_CRMD_IE			BIT_ULL(CSR_CRMD_IE_SHIFT)
79*21872c74SBibo Mao #define  CSR_CRMD_PLV_SHIFT		0
80*21872c74SBibo Mao #define  CSR_CRMD_PLV_WIDTH		2
81*21872c74SBibo Mao #define  CSR_CRMD_PLV			(0x3UL << CSR_CRMD_PLV_SHIFT)
82*21872c74SBibo Mao #define  PLV_MASK			0x3
83*21872c74SBibo Mao #define LOONGARCH_CSR_PRMD		0x1
84*21872c74SBibo Mao #define LOONGARCH_CSR_EUEN		0x2
85*21872c74SBibo Mao #define LOONGARCH_CSR_ECFG		0x4
86*21872c74SBibo Mao #define LOONGARCH_CSR_ESTAT		0x5  /* Exception status */
87*21872c74SBibo Mao #define LOONGARCH_CSR_ERA		0x6  /* ERA */
88*21872c74SBibo Mao #define LOONGARCH_CSR_BADV		0x7  /* Bad virtual address */
89*21872c74SBibo Mao #define LOONGARCH_CSR_EENTRY		0xc
90*21872c74SBibo Mao #define LOONGARCH_CSR_TLBIDX		0x10 /* TLB Index, EHINV, PageSize */
91*21872c74SBibo Mao #define  CSR_TLBIDX_PS_SHIFT		24
92*21872c74SBibo Mao #define  CSR_TLBIDX_PS_WIDTH		6
93*21872c74SBibo Mao #define  CSR_TLBIDX_PS			(0x3fUL << CSR_TLBIDX_PS_SHIFT)
94*21872c74SBibo Mao #define  CSR_TLBIDX_SIZEM		0x3f000000
95*21872c74SBibo Mao #define  CSR_TLBIDX_SIZE		CSR_TLBIDX_PS_SHIFT
96*21872c74SBibo Mao #define LOONGARCH_CSR_ASID		0x18 /* ASID */
97*21872c74SBibo Mao #define LOONGARCH_CSR_PGDL		0x19
98*21872c74SBibo Mao #define LOONGARCH_CSR_PGDH		0x1a
99*21872c74SBibo Mao /* Page table base */
100*21872c74SBibo Mao #define LOONGARCH_CSR_PGD		0x1b
101*21872c74SBibo Mao #define LOONGARCH_CSR_PWCTL0		0x1c
102*21872c74SBibo Mao #define LOONGARCH_CSR_PWCTL1		0x1d
103*21872c74SBibo Mao #define LOONGARCH_CSR_STLBPGSIZE	0x1e
104*21872c74SBibo Mao #define LOONGARCH_CSR_CPUID		0x20
105*21872c74SBibo Mao #define LOONGARCH_CSR_KS0		0x30
106*21872c74SBibo Mao #define LOONGARCH_CSR_KS1		0x31
107*21872c74SBibo Mao #define LOONGARCH_CSR_TMID		0x40
108*21872c74SBibo Mao #define LOONGARCH_CSR_TCFG		0x41
109*21872c74SBibo Mao /* TLB refill exception entry */
110*21872c74SBibo Mao #define LOONGARCH_CSR_TLBRENTRY		0x88
111*21872c74SBibo Mao #define LOONGARCH_CSR_TLBRSAVE		0x8b
112*21872c74SBibo Mao #define LOONGARCH_CSR_TLBREHI		0x8e
113*21872c74SBibo Mao #define  CSR_TLBREHI_PS_SHIFT		0
114*21872c74SBibo Mao #define  CSR_TLBREHI_PS			(0x3fUL << CSR_TLBREHI_PS_SHIFT)
115*21872c74SBibo Mao 
116*21872c74SBibo Mao #define EXREGS_GPRS			(32)
117*21872c74SBibo Mao 
118*21872c74SBibo Mao #ifndef __ASSEMBLER__
119*21872c74SBibo Mao void handle_tlb_refill(void);
120*21872c74SBibo Mao void handle_exception(void);
121*21872c74SBibo Mao 
122*21872c74SBibo Mao struct ex_regs {
123*21872c74SBibo Mao 	unsigned long regs[EXREGS_GPRS];
124*21872c74SBibo Mao 	unsigned long pc;
125*21872c74SBibo Mao 	unsigned long estat;
126*21872c74SBibo Mao 	unsigned long badv;
127*21872c74SBibo Mao };
128*21872c74SBibo Mao 
129*21872c74SBibo Mao #define PC_OFFSET_EXREGS		offsetof(struct ex_regs, pc)
130*21872c74SBibo Mao #define ESTAT_OFFSET_EXREGS		offsetof(struct ex_regs, estat)
131*21872c74SBibo Mao #define BADV_OFFSET_EXREGS		offsetof(struct ex_regs, badv)
132*21872c74SBibo Mao #define EXREGS_SIZE			sizeof(struct ex_regs)
133*21872c74SBibo Mao 
134*21872c74SBibo Mao #else
135*21872c74SBibo Mao #define PC_OFFSET_EXREGS		((EXREGS_GPRS + 0) * 8)
136*21872c74SBibo Mao #define ESTAT_OFFSET_EXREGS		((EXREGS_GPRS + 1) * 8)
137*21872c74SBibo Mao #define BADV_OFFSET_EXREGS		((EXREGS_GPRS + 2) * 8)
138*21872c74SBibo Mao #define EXREGS_SIZE			((EXREGS_GPRS + 3) * 8)
139*21872c74SBibo Mao #endif
140*21872c74SBibo Mao 
141*21872c74SBibo Mao #endif /* SELFTEST_KVM_PROCESSOR_H */
142