1
2
3
4
5
6
7#ifndef __ARM64_KVM_ARM_H__
8#define __ARM64_KVM_ARM_H__
9
10#include <asm/esr.h>
11#include <asm/memory.h>
12#include <asm/types.h>
13
14
15#define HCR_ATA (UL(1) << 56)
16#define HCR_FWB (UL(1) << 46)
17#define HCR_API (UL(1) << 41)
18#define HCR_APK (UL(1) << 40)
19#define HCR_TEA (UL(1) << 37)
20#define HCR_TERR (UL(1) << 36)
21#define HCR_TLOR (UL(1) << 35)
22#define HCR_E2H (UL(1) << 34)
23#define HCR_ID (UL(1) << 33)
24#define HCR_CD (UL(1) << 32)
25#define HCR_RW_SHIFT 31
26#define HCR_RW (UL(1) << HCR_RW_SHIFT)
27#define HCR_TRVM (UL(1) << 30)
28#define HCR_HCD (UL(1) << 29)
29#define HCR_TDZ (UL(1) << 28)
30#define HCR_TGE (UL(1) << 27)
31#define HCR_TVM (UL(1) << 26)
32#define HCR_TTLB (UL(1) << 25)
33#define HCR_TPU (UL(1) << 24)
34#define HCR_TPC (UL(1) << 23)
35#define HCR_TSW (UL(1) << 22)
36#define HCR_TAC (UL(1) << 21)
37#define HCR_TIDCP (UL(1) << 20)
38#define HCR_TSC (UL(1) << 19)
39#define HCR_TID3 (UL(1) << 18)
40#define HCR_TID2 (UL(1) << 17)
41#define HCR_TID1 (UL(1) << 16)
42#define HCR_TID0 (UL(1) << 15)
43#define HCR_TWE (UL(1) << 14)
44#define HCR_TWI (UL(1) << 13)
45#define HCR_DC (UL(1) << 12)
46#define HCR_BSU (3 << 10)
47#define HCR_BSU_IS (UL(1) << 10)
48#define HCR_FB (UL(1) << 9)
49#define HCR_VSE (UL(1) << 8)
50#define HCR_VI (UL(1) << 7)
51#define HCR_VF (UL(1) << 6)
52#define HCR_AMO (UL(1) << 5)
53#define HCR_IMO (UL(1) << 4)
54#define HCR_FMO (UL(1) << 3)
55#define HCR_PTW (UL(1) << 2)
56#define HCR_SWIO (UL(1) << 1)
57#define HCR_VM (UL(1) << 0)
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77#define HCR_GUEST_FLAGS (HCR_TSC | HCR_TSW | HCR_TWE | HCR_TWI | HCR_VM | \
78 HCR_BSU_IS | HCR_FB | HCR_TAC | \
79 HCR_AMO | HCR_SWIO | HCR_TIDCP | HCR_RW | HCR_TLOR | \
80 HCR_FMO | HCR_IMO | HCR_PTW )
81#define HCR_VIRT_EXCP_MASK (HCR_VSE | HCR_VI | HCR_VF)
82#define HCR_HOST_NVHE_FLAGS (HCR_RW | HCR_API | HCR_APK | HCR_ATA)
83#define HCR_HOST_VHE_FLAGS (HCR_RW | HCR_TGE | HCR_E2H)
84
85
86#define TCR_EL2_RES1 ((1 << 31) | (1 << 23))
87#define TCR_EL2_TBI (1 << 20)
88#define TCR_EL2_PS_SHIFT 16
89#define TCR_EL2_PS_MASK (7 << TCR_EL2_PS_SHIFT)
90#define TCR_EL2_PS_40B (2 << TCR_EL2_PS_SHIFT)
91#define TCR_EL2_TG0_MASK TCR_TG0_MASK
92#define TCR_EL2_SH0_MASK TCR_SH0_MASK
93#define TCR_EL2_ORGN0_MASK TCR_ORGN0_MASK
94#define TCR_EL2_IRGN0_MASK TCR_IRGN0_MASK
95#define TCR_EL2_T0SZ_MASK 0x3f
96#define TCR_EL2_MASK (TCR_EL2_TG0_MASK | TCR_EL2_SH0_MASK | \
97 TCR_EL2_ORGN0_MASK | TCR_EL2_IRGN0_MASK | TCR_EL2_T0SZ_MASK)
98
99
100#define VTCR_EL2_RES1 (1U << 31)
101#define VTCR_EL2_HD (1 << 22)
102#define VTCR_EL2_HA (1 << 21)
103#define VTCR_EL2_PS_SHIFT TCR_EL2_PS_SHIFT
104#define VTCR_EL2_PS_MASK TCR_EL2_PS_MASK
105#define VTCR_EL2_TG0_MASK TCR_TG0_MASK
106#define VTCR_EL2_TG0_4K TCR_TG0_4K
107#define VTCR_EL2_TG0_16K TCR_TG0_16K
108#define VTCR_EL2_TG0_64K TCR_TG0_64K
109#define VTCR_EL2_SH0_MASK TCR_SH0_MASK
110#define VTCR_EL2_SH0_INNER TCR_SH0_INNER
111#define VTCR_EL2_ORGN0_MASK TCR_ORGN0_MASK
112#define VTCR_EL2_ORGN0_WBWA TCR_ORGN0_WBWA
113#define VTCR_EL2_IRGN0_MASK TCR_IRGN0_MASK
114#define VTCR_EL2_IRGN0_WBWA TCR_IRGN0_WBWA
115#define VTCR_EL2_SL0_SHIFT 6
116#define VTCR_EL2_SL0_MASK (3 << VTCR_EL2_SL0_SHIFT)
117#define VTCR_EL2_T0SZ_MASK 0x3f
118#define VTCR_EL2_VS_SHIFT 19
119#define VTCR_EL2_VS_8BIT (0 << VTCR_EL2_VS_SHIFT)
120#define VTCR_EL2_VS_16BIT (1 << VTCR_EL2_VS_SHIFT)
121
122#define VTCR_EL2_T0SZ(x) TCR_T0SZ(x)
123
124
125
126
127
128
129
130
131
132
133
134
135
136#define VTCR_EL2_COMMON_BITS (VTCR_EL2_SH0_INNER | VTCR_EL2_ORGN0_WBWA | \
137 VTCR_EL2_IRGN0_WBWA | VTCR_EL2_RES1)
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168#ifdef CONFIG_ARM64_64K_PAGES
169
170#define VTCR_EL2_TGRAN VTCR_EL2_TG0_64K
171#define VTCR_EL2_TGRAN_SL0_BASE 3UL
172
173#elif defined(CONFIG_ARM64_16K_PAGES)
174
175#define VTCR_EL2_TGRAN VTCR_EL2_TG0_16K
176#define VTCR_EL2_TGRAN_SL0_BASE 3UL
177
178#else
179
180#define VTCR_EL2_TGRAN VTCR_EL2_TG0_4K
181#define VTCR_EL2_TGRAN_SL0_BASE 2UL
182
183#endif
184
185#define VTCR_EL2_LVLS_TO_SL0(levels) \
186 ((VTCR_EL2_TGRAN_SL0_BASE - (4 - (levels))) << VTCR_EL2_SL0_SHIFT)
187#define VTCR_EL2_SL0_TO_LVLS(sl0) \
188 ((sl0) + 4 - VTCR_EL2_TGRAN_SL0_BASE)
189#define VTCR_EL2_LVLS(vtcr) \
190 VTCR_EL2_SL0_TO_LVLS(((vtcr) & VTCR_EL2_SL0_MASK) >> VTCR_EL2_SL0_SHIFT)
191
192#define VTCR_EL2_FLAGS (VTCR_EL2_COMMON_BITS | VTCR_EL2_TGRAN)
193#define VTCR_EL2_IPA(vtcr) (64 - ((vtcr) & VTCR_EL2_T0SZ_MASK))
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258#define ARM64_VTTBR_X(ipa, levels) ((ipa) - ((levels) * (PAGE_SHIFT - 3)))
259
260#define VTTBR_CNP_BIT (UL(1))
261#define VTTBR_VMID_SHIFT (UL(48))
262#define VTTBR_VMID_MASK(size) (_AT(u64, (1 << size) - 1) << VTTBR_VMID_SHIFT)
263
264
265#define HSTR_EL2_T(x) (1 << x)
266
267
268#define CPTR_EL2_TFP_SHIFT 10
269
270
271#define CPTR_EL2_TCPAC (1 << 31)
272#define CPTR_EL2_TAM (1 << 30)
273#define CPTR_EL2_TTA (1 << 20)
274#define CPTR_EL2_TFP (1 << CPTR_EL2_TFP_SHIFT)
275#define CPTR_EL2_TZ (1 << 8)
276#define CPTR_EL2_RES1 0x000032ff
277#define CPTR_EL2_DEFAULT CPTR_EL2_RES1
278
279
280#define MDCR_EL2_TPMS (1 << 14)
281#define MDCR_EL2_E2PB_MASK (UL(0x3))
282#define MDCR_EL2_E2PB_SHIFT (UL(12))
283#define MDCR_EL2_TDRA (1 << 11)
284#define MDCR_EL2_TDOSA (1 << 10)
285#define MDCR_EL2_TDA (1 << 9)
286#define MDCR_EL2_TDE (1 << 8)
287#define MDCR_EL2_HPME (1 << 7)
288#define MDCR_EL2_TPM (1 << 6)
289#define MDCR_EL2_TPMCR (1 << 5)
290#define MDCR_EL2_HPMN_MASK (0x1F)
291
292
293#define FSC_FAULT ESR_ELx_FSC_FAULT
294#define FSC_ACCESS ESR_ELx_FSC_ACCESS
295#define FSC_PERM ESR_ELx_FSC_PERM
296#define FSC_SEA ESR_ELx_FSC_EXTABT
297#define FSC_SEA_TTW0 (0x14)
298#define FSC_SEA_TTW1 (0x15)
299#define FSC_SEA_TTW2 (0x16)
300#define FSC_SEA_TTW3 (0x17)
301#define FSC_SECC (0x18)
302#define FSC_SECC_TTW0 (0x1c)
303#define FSC_SECC_TTW1 (0x1d)
304#define FSC_SECC_TTW2 (0x1e)
305#define FSC_SECC_TTW3 (0x1f)
306
307
308#define HPFAR_MASK (~UL(0xf))
309
310
311
312
313
314#define PAR_TO_HPFAR(par) \
315 (((par) & GENMASK_ULL(PHYS_MASK_SHIFT - 1, 12)) >> 8)
316
317#define ECN(x) { ESR_ELx_EC_##x, #x }
318
319#define kvm_arm_exception_class \
320 ECN(UNKNOWN), ECN(WFx), ECN(CP15_32), ECN(CP15_64), ECN(CP14_MR), \
321 ECN(CP14_LS), ECN(FP_ASIMD), ECN(CP10_ID), ECN(PAC), ECN(CP14_64), \
322 ECN(SVC64), ECN(HVC64), ECN(SMC64), ECN(SYS64), ECN(SVE), \
323 ECN(IMP_DEF), ECN(IABT_LOW), ECN(IABT_CUR), \
324 ECN(PC_ALIGN), ECN(DABT_LOW), ECN(DABT_CUR), \
325 ECN(SP_ALIGN), ECN(FP_EXC32), ECN(FP_EXC64), ECN(SERROR), \
326 ECN(BREAKPT_LOW), ECN(BREAKPT_CUR), ECN(SOFTSTP_LOW), \
327 ECN(SOFTSTP_CUR), ECN(WATCHPT_LOW), ECN(WATCHPT_CUR), \
328 ECN(BKPT32), ECN(VECTOR32), ECN(BRK64)
329
330#define CPACR_EL1_FPEN (3 << 20)
331#define CPACR_EL1_TTA (1 << 28)
332#define CPACR_EL1_DEFAULT (CPACR_EL1_FPEN | CPACR_EL1_ZEN_EL1EN)
333
334#endif
335