1/*-
2 * Copyright (c) 2013, 2014 Andrew Turner
3 * Copyright (c) 2021 The FreeBSD Foundation
4 *
5 * Portions of this software were developed by Andrew Turner
6 * under sponsorship from the FreeBSD Foundation.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30#ifndef _MACHINE_HYPERVISOR_H_
31#define _MACHINE_HYPERVISOR_H_
32
33/*
34 * These registers are only useful when in hypervisor context,
35 * e.g. specific to EL2, or controlling the hypervisor.
36 */
37
38/* CNTHCTL_EL2 - Counter-timer Hypervisor Control register */
39#define CNTHCTL_EVNTI_MASK (0xf << 4) /* Bit to trigger event stream */
40/* Valid if HCR_EL2.E2H == 0 */
41#define CNTHCTL_EL1PCTEN (1 << 0) /* Allow physical counter access */
42#define CNTHCTL_EL1PCEN (1 << 1) /* Allow physical timer access */
43/* Valid if HCR_EL2.E2H == 1 */
44#define CNTHCTL_E2H_EL0PCTEN (1 << 0) /* Allow EL0 physical counter access */
45#define CNTHCTL_E2H_EL0VCTEN (1 << 1) /* Allow EL0 virtual counter access */
46#define CNTHCTL_E2H_EL0VTEN (1 << 8)
47#define CNTHCTL_E2H_EL0PTEN (1 << 9)
48#define CNTHCTL_E2H_EL1PCTEN (1 << 10) /* Allow physical counter access */
49#define CNTHCTL_E2H_EL1PTEN (1 << 11) /* Allow physical timer access */
50/* Unconditionally valid */
51#define CNTHCTL_EVNTDIR (1 << 3) /* Control transition trigger bit */
52#define CNTHCTL_EVNTEN (1 << 2) /* Enable event stream */
53
54/* CNTPOFF_EL2 - Counter-timer Physical Offset Register */
55#define CNTPOFF_EL2_REG MRS_REG_ALT_NAME(CNTPOFF_EL2)
56#define CNTPOFF_EL2_op0 3
57#define CNTPOFF_EL2_op1 4
58#define CNTPOFF_EL2_CRn 14
59#define CNTPOFF_EL2_CRm 0
60#define CNTPOFF_EL2_op2 6
61
62/* CPTR_EL2 - Architecture feature trap register */
63/* Valid if HCR_EL2.E2H == 0 */
64#define CPTR_TRAP_ALL 0xc01037ff /* Enable all traps */
65#define CPTR_RES0 0x7fefc800
66#define CPTR_RES1 0x000032ff
67#define CPTR_TZ 0x00000100
68#define CPTR_TFP 0x00000400
69#define CPTR_TTA 0x00100000
70/* Valid if HCR_EL2.E2H == 1 */
71#define CPTR_E2H_TRAP_ALL 0xd0000000
72#define CPTR_E2H_ZPEN 0x00030000
73#define CPTR_E2H_FPEN 0x00300000
74#define CPTR_E2H_TTA 0x10000000
75/* Unconditionally valid */
76#define CPTR_TCPAC 0x80000000
77
78/* HCR_EL2 - Hypervisor Config Register */
79#define HCR_VM (UL(0x1) << 0)
80#define HCR_SWIO (UL(0x1) << 1)
81#define HCR_PTW (UL(0x1) << 2)
82#define HCR_FMO (UL(0x1) << 3)
83#define HCR_IMO (UL(0x1) << 4)
84#define HCR_AMO (UL(0x1) << 5)
85#define HCR_VF (UL(0x1) << 6)
86#define HCR_VI (UL(0x1) << 7)
87#define HCR_VSE (UL(0x1) << 8)
88#define HCR_FB (UL(0x1) << 9)
89#define HCR_BSU_MASK (UL(0x3) << 10)
90#define HCR_BSU_IS (UL(0x1) << 10)
91#define HCR_BSU_OS (UL(0x2) << 10)
92#define HCR_BSU_FS (UL(0x3) << 10)
93#define HCR_DC (UL(0x1) << 12)
94#define HCR_TWI (UL(0x1) << 13)
95#define HCR_TWE (UL(0x1) << 14)
96#define HCR_TID0 (UL(0x1) << 15)
97#define HCR_TID1 (UL(0x1) << 16)
98#define HCR_TID2 (UL(0x1) << 17)
99#define HCR_TID3 (UL(0x1) << 18)
100#define HCR_TSC (UL(0x1) << 19)
101#define HCR_TIDCP (UL(0x1) << 20)
102#define HCR_TACR (UL(0x1) << 21)
103#define HCR_TSW (UL(0x1) << 22)
104#define HCR_TPCP (UL(0x1) << 23)
105#define HCR_TPU (UL(0x1) << 24)
106#define HCR_TTLB (UL(0x1) << 25)
107#define HCR_TVM (UL(0x1) << 26)
108#define HCR_TGE (UL(0x1) << 27)
109#define HCR_TDZ (UL(0x1) << 28)
110#define HCR_HCD (UL(0x1) << 29)
111#define HCR_TRVM (UL(0x1) << 30)
112#define HCR_RW (UL(0x1) << 31)
113#define HCR_CD (UL(0x1) << 32)
114#define HCR_ID (UL(0x1) << 33)
115#define HCR_E2H (UL(0x1) << 34)
116#define HCR_TLOR (UL(0x1) << 35)
117#define HCR_TERR (UL(0x1) << 36)
118#define HCR_TEA (UL(0x1) << 37)
119#define HCR_MIOCNCE (UL(0x1) << 38)
120/* Bit 39 is reserved */
121#define HCR_APK (UL(0x1) << 40)
122#define HCR_API (UL(0x1) << 41)
123#define HCR_NV (UL(0x1) << 42)
124#define HCR_NV1 (UL(0x1) << 43)
125#define HCR_AT (UL(0x1) << 44)
126#define HCR_NV2 (UL(0x1) << 45)
127#define HCR_FWB (UL(0x1) << 46)
128#define HCR_FIEN (UL(0x1) << 47)
129/* Bit 48 is reserved */
130#define HCR_TID4 (UL(0x1) << 49)
131#define HCR_TICAB (UL(0x1) << 50)
132#define HCR_AMVOFFEN (UL(0x1) << 51)
133#define HCR_TOCU (UL(0x1) << 52)
134#define HCR_EnSCXT (UL(0x1) << 53)
135#define HCR_TTLBIS (UL(0x1) << 54)
136#define HCR_TTLBOS (UL(0x1) << 55)
137#define HCR_ATA (UL(0x1) << 56)
138#define HCR_DCT (UL(0x1) << 57)
139#define HCR_TID5 (UL(0x1) << 58)
140#define HCR_TWEDEn (UL(0x1) << 59)
141#define HCR_TWEDEL_MASK (UL(0xf) << 60)
142
143/* HCRX_EL2 - Extended Hypervisor Configuration Register */
144#define HCRX_EL2_REG MRS_REG_ALT_NAME(HCRX_EL2)
145#define HCRX_EL2_op0 3
146#define HCRX_EL2_op1 4
147#define HCRX_EL2_CRn 1
148#define HCRX_EL2_CRm 2
149#define HCRX_EL2_op2 2
150
151#define HCRX_EnAS0 (UL(0x1) << 0)
152#define HCRX_EnALS (UL(0x1) << 1)
153#define HCRX_EnASR (UL(0x1) << 2)
154#define HCRX_FnXS (UL(0x1) << 3)
155#define HCRX_FGTnXS (UL(0x1) << 4)
156#define HCRX_SMPME (UL(0x1) << 5)
157#define HCRX_TALLINT (UL(0x1) << 6)
158#define HCRX_VINMI (UL(0x1) << 7)
159#define HCRX_VFNMI (UL(0x1) << 8)
160#define HCRX_CMOW (UL(0x1) << 9)
161#define HCRX_MCE2 (UL(0x1) << 10)
162#define HCRX_MSCEn (UL(0x1) << 11)
163/* Bits 12 & 13 are reserved */
164#define HCRX_TCR2En (UL(0x1) << 14)
165#define HCRX_SCTLR2En (UL(0x1) << 15)
166#define HCRX_PTTWI (UL(0x1) << 16)
167#define HCRX_D128En (UL(0x1) << 17)
168#define HCRX_EnSNERR (UL(0x1) << 18)
169#define HCRX_TMEA (UL(0x1) << 19)
170#define HCRX_EnSDERR (UL(0x1) << 20)
171#define HCRX_EnIDCP128 (UL(0x1) << 21)
172#define HCRX_GCSEn (UL(0x1) << 22)
173#define HCRX_EnFPM (UL(0x1) << 23)
174#define HCRX_PACMEn (UL(0x1) << 24)
175/* Bit 25 is reserved */
176#define HCRX_SRMASKEn (UL(0x1) << 26)
177
178/* HPFAR_EL2 - Hypervisor IPA Fault Address Register */
179#define HPFAR_EL2_FIPA_SHIFT 4
180#define HPFAR_EL2_FIPA_MASK 0xfffffffff0
181#define HPFAR_EL2_FIPA_GET(x) \
182 (((x) & HPFAR_EL2_FIPA_MASK) >> HPFAR_EL2_FIPA_SHIFT)
183/* HPFAR_EL2_FIPA holds the 4k page address */
184#define HPFAR_EL2_FIPA_ADDR(x) \
185 (HPFAR_EL2_FIPA_GET(x) << 12)
186/* The bits from FAR_EL2 we need to add to HPFAR_EL2_FIPA_ADDR */
187#define FAR_EL2_HPFAR_PAGE_MASK (0xffful)
188
189/* ICC_SRE_EL2 */
190#define ICC_SRE_EL2_SRE (1UL << 0)
191#define ICC_SRE_EL2_EN (1UL << 3)
192
193/* MDCR_EL2 - Hyp Debug Control Register */
194#define MDCR_EL2_HPMN_MASK 0x1f
195#define MDCR_EL2_HPMN_SHIFT 0
196#define MDCR_EL2_TPMCR_SHIFT 5
197#define MDCR_EL2_TPMCR (0x1UL << MDCR_EL2_TPMCR_SHIFT)
198#define MDCR_EL2_TPM_SHIFT 6
199#define MDCR_EL2_TPM (0x1UL << MDCR_EL2_TPM_SHIFT)
200#define MDCR_EL2_HPME_SHIFT 7
201#define MDCR_EL2_HPME (0x1UL << MDCR_EL2_HPME_SHIFT)
202#define MDCR_EL2_TDE_SHIFT 8
203#define MDCR_EL2_TDE (0x1UL << MDCR_EL2_TDE_SHIFT)
204#define MDCR_EL2_TDA_SHIFT 9
205#define MDCR_EL2_TDA (0x1UL << MDCR_EL2_TDA_SHIFT)
206#define MDCR_EL2_TDOSA_SHIFT 10
207#define MDCR_EL2_TDOSA (0x1UL << MDCR_EL2_TDOSA_SHIFT)
208#define MDCR_EL2_TDRA_SHIFT 11
209#define MDCR_EL2_TDRA (0x1UL << MDCR_EL2_TDRA_SHIFT)
210#define MDCR_EL2_E2PB_SHIFT 12
211#define MDCR_EL2_E2PB_MASK (0x3UL << MDCR_EL2_E2PB_SHIFT)
212#define MDCR_EL2_TPMS_SHIFT 14
213#define MDCR_EL2_TPMS (0x1UL << MDCR_EL2_TPMS_SHIFT)
214#define MDCR_EL2_EnSPM_SHIFT 15
215#define MDCR_EL2_EnSPM (0x1UL << MDCR_EL2_EnSPM_SHIFT)
216#define MDCR_EL2_HPMD_SHIFT 17
217#define MDCR_EL2_HPMD (0x1UL << MDCR_EL2_HPMD_SHIFT)
218#define MDCR_EL2_TTRF_SHIFT 19
219#define MDCR_EL2_TTRF (0x1UL << MDCR_EL2_TTRF_SHIFT)
220#define MDCR_EL2_HCCD_SHIFT 23
221#define MDCR_EL2_HCCD (0x1UL << MDCR_EL2_HCCD_SHIFT)
222#define MDCR_EL2_E2TB_SHIFT 24
223#define MDCR_EL2_E2TB_MASK (0x3UL << MDCR_EL2_E2TB_SHIFT)
224#define MDCR_EL2_HLP_SHIFT 26
225#define MDCR_EL2_HLP (0x1UL << MDCR_EL2_HLP_SHIFT)
226#define MDCR_EL2_TDCC_SHIFT 27
227#define MDCR_EL2_TDCC (0x1UL << MDCR_EL2_TDCC_SHIFT)
228#define MDCR_EL2_MTPME_SHIFT 28
229#define MDCR_EL2_MTPME (0x1UL << MDCR_EL2_MTPME_SHIFT)
230#define MDCR_EL2_HPMFZO_SHIFT 29
231#define MDCR_EL2_HPMFZO (0x1UL << MDCR_EL2_HPMFZO_SHIFT)
232#define MDCR_EL2_PMSSE_SHIFT 30
233#define MDCR_EL2_PMSSE_MASK (0x3UL << MDCR_EL2_PMSSE_SHIFT)
234#define MDCR_EL2_HPMFZS_SHIFT 36
235#define MDCR_EL2_HPMFZS (0x1UL << MDCR_EL2_HPMFZS_SHIFT)
236#define MDCR_EL2_PMEE_SHIFT 40
237#define MDCR_EL2_PMEE_MASK (0x3UL << MDCR_EL2_PMEE_SHIFT)
238#define MDCR_EL2_EBWE_SHIFT 43
239#define MDCR_EL2_EBWE (0x1UL << MDCR_EL2_EBWE_SHIFT)
240
241/* SCTLR_EL2 - System Control Register */
242#define SCTLR_EL2_RES1 0x30c50830
243#define SCTLR_EL2_M_SHIFT 0
244#define SCTLR_EL2_M (0x1UL << SCTLR_EL2_M_SHIFT)
245#define SCTLR_EL2_A_SHIFT 1
246#define SCTLR_EL2_A (0x1UL << SCTLR_EL2_A_SHIFT)
247#define SCTLR_EL2_C_SHIFT 2
248#define SCTLR_EL2_C (0x1UL << SCTLR_EL2_C_SHIFT)
249#define SCTLR_EL2_SA_SHIFT 3
250#define SCTLR_EL2_SA (0x1UL << SCTLR_EL2_SA_SHIFT)
251#define SCTLR_EL2_EOS_SHIFT 11
252#define SCTLR_EL2_EOS (0x1UL << SCTLR_EL2_EOS_SHIFT)
253#define SCTLR_EL2_I_SHIFT 12
254#define SCTLR_EL2_I (0x1UL << SCTLR_EL2_I_SHIFT)
255#define SCTLR_EL2_WXN_SHIFT 19
256#define SCTLR_EL2_WXN (0x1UL << SCTLR_EL2_WXN_SHIFT)
257#define SCTLR_EL2_EIS_SHIFT 22
258#define SCTLR_EL2_EIS (0x1UL << SCTLR_EL2_EIS_SHIFT)
259#define SCTLR_EL2_EE_SHIFT 25
260#define SCTLR_EL2_EE (0x1UL << SCTLR_EL2_EE_SHIFT)
261
262/* TCR_EL2 - Translation Control Register */
263#define TCR_EL2_RES1 ((0x1UL << 31) | (0x1UL << 23))
264#define TCR_EL2_T0SZ_SHIFT 0
265#define TCR_EL2_T0SZ_MASK (0x3fUL << TCR_EL2_T0SZ_SHIFT)
266#define TCR_EL2_T0SZ(x) ((x) << TCR_EL2_T0SZ_SHIFT)
267/* Bits 7:6 are reserved */
268#define TCR_EL2_IRGN0_SHIFT 8
269#define TCR_EL2_IRGN0_MASK (0x3UL << TCR_EL2_IRGN0_SHIFT)
270#define TCR_EL2_IRGN0_WBWA (1UL << TCR_EL2_IRGN0_SHIFT)
271#define TCR_EL2_ORGN0_SHIFT 10
272#define TCR_EL2_ORGN0_MASK (0x3UL << TCR_EL2_ORGN0_SHIFT)
273#define TCR_EL2_ORGN0_WBWA (1UL << TCR_EL2_ORGN0_SHIFT)
274#define TCR_EL2_SH0_SHIFT 12
275#define TCR_EL2_SH0_MASK (0x3UL << TCR_EL2_SH0_SHIFT)
276#define TCR_EL2_SH0_IS (3UL << TCR_EL2_SH0_SHIFT)
277#define TCR_EL2_TG0_SHIFT 14
278#define TCR_EL2_TG0_MASK (0x3UL << TCR_EL2_TG0_SHIFT)
279#define TCR_EL2_TG0_4K (0x0UL << TCR_EL2_TG0_SHIFT)
280#define TCR_EL2_TG0_64K (0x1UL << TCR_EL2_TG0_SHIFT)
281#define TCR_EL2_TG0_16K (0x2UL << TCR_EL2_TG0_SHIFT)
282#define TCR_EL2_PS_SHIFT 16
283#define TCR_EL2_PS_MASK (0xfUL << TCR_EL2_PS_SHIFT)
284#define TCR_EL2_PS_32BITS (0UL << TCR_EL2_PS_SHIFT)
285#define TCR_EL2_PS_36BITS (1UL << TCR_EL2_PS_SHIFT)
286#define TCR_EL2_PS_40BITS (2UL << TCR_EL2_PS_SHIFT)
287#define TCR_EL2_PS_42BITS (3UL << TCR_EL2_PS_SHIFT)
288#define TCR_EL2_PS_44BITS (4UL << TCR_EL2_PS_SHIFT)
289#define TCR_EL2_PS_48BITS (5UL << TCR_EL2_PS_SHIFT)
290#define TCR_EL2_PS_52BITS (6UL << TCR_EL2_PS_SHIFT)
291#define TCR_EL2_HPD_SHIFT 24
292#define TCR_EL2_HPD (1UL << TCR_EL2_HPD_SHIFT)
293#define TCR_EL2_HWU59_SHIFT 25
294#define TCR_EL2_HWU59 (1UL << TCR_EL2_HWU59_SHIFT)
295#define TCR_EL2_HWU60_SHIFT 26
296#define TCR_EL2_HWU60 (1UL << TCR_EL2_HWU60_SHIFT)
297#define TCR_EL2_HWU61_SHIFT 27
298#define TCR_EL2_HWU61 (1UL << TCR_EL2_HWU61_SHIFT)
299#define TCR_EL2_HWU62_SHIFT 28
300#define TCR_EL2_HWU62 (1UL << TCR_EL2_HWU62_SHIFT)
301#define TCR_EL2_HWU \
302 (TCR_EL2_HWU59 | TCR_EL2_HWU60 | TCR_EL2_HWU61 | TCR_EL2_HWU62)
303
304/* VMPDIR_EL2 - Virtualization Multiprocessor ID Register */
305#define VMPIDR_EL2_U 0x0000000040000000
306#define VMPIDR_EL2_MT 0x0000000001000000
307#define VMPIDR_EL2_RES1 0x0000000080000000
308
309/* VTCR_EL2 - Virtualization Translation Control Register */
310#define VTCR_EL2_RES1 (0x1UL << 31)
311#define VTCR_EL2_T0SZ_SHIFT 0
312#define VTCR_EL2_T0SZ_MASK (0x3fUL << VTCR_EL2_T0SZ_SHIFT)
313#define VTCR_EL2_T0SZ(x) ((x) << VTCR_EL2_T0SZ_SHIFT)
314#define VTCR_EL2_SL0_SHIFT 6
315#define VTCR_EL2_SL0_4K_LVL2 (0x0UL << VTCR_EL2_SL0_SHIFT)
316#define VTCR_EL2_SL0_4K_LVL1 (0x1UL << VTCR_EL2_SL0_SHIFT)
317#define VTCR_EL2_SL0_4K_LVL0 (0x2UL << VTCR_EL2_SL0_SHIFT)
318#define VTCR_EL2_SL0_16K_LVL2 (0x1UL << VTCR_EL2_SL0_SHIFT)
319#define VTCR_EL2_SL0_16K_LVL1 (0x2UL << VTCR_EL2_SL0_SHIFT)
320#define VTCR_EL2_SL0_16K_LVL0 (0x3UL << VTCR_EL2_SL0_SHIFT)
321#define VTCR_EL2_IRGN0_SHIFT 8
322#define VTCR_EL2_IRGN0_WBWA (0x1UL << VTCR_EL2_IRGN0_SHIFT)
323#define VTCR_EL2_ORGN0_SHIFT 10
324#define VTCR_EL2_ORGN0_WBWA (0x1UL << VTCR_EL2_ORGN0_SHIFT)
325#define VTCR_EL2_SH0_SHIFT 12
326#define VTCR_EL2_SH0_NS (0x0UL << VTCR_EL2_SH0_SHIFT)
327#define VTCR_EL2_SH0_OS (0x2UL << VTCR_EL2_SH0_SHIFT)
328#define VTCR_EL2_SH0_IS (0x3UL << VTCR_EL2_SH0_SHIFT)
329#define VTCR_EL2_TG0_SHIFT 14
330#define VTCR_EL2_TG0_4K (0x0UL << VTCR_EL2_TG0_SHIFT)
331#define VTCR_EL2_TG0_64K (0x1UL << VTCR_EL2_TG0_SHIFT)
332#define VTCR_EL2_TG0_16K (0x2UL << VTCR_EL2_TG0_SHIFT)
333#define VTCR_EL2_PS_SHIFT 16
334#define VTCR_EL2_PS_32BIT (0x0UL << VTCR_EL2_PS_SHIFT)
335#define VTCR_EL2_PS_36BIT (0x1UL << VTCR_EL2_PS_SHIFT)
336#define VTCR_EL2_PS_40BIT (0x2UL << VTCR_EL2_PS_SHIFT)
337#define VTCR_EL2_PS_42BIT (0x3UL << VTCR_EL2_PS_SHIFT)
338#define VTCR_EL2_PS_44BIT (0x4UL << VTCR_EL2_PS_SHIFT)
339#define VTCR_EL2_PS_48BIT (0x5UL << VTCR_EL2_PS_SHIFT)
340#define VTCR_EL2_PS_52BIT (0x6UL << VTCR_EL2_PS_SHIFT)
341#define VTCR_EL2_DS_SHIFT 32
342#define VTCR_EL2_DS (0x1UL << VTCR_EL2_DS_SHIFT)
343
344/* VTTBR_EL2 - Virtualization Translation Table Base Register */
345#define VTTBR_VMID_MASK 0xffff000000000000
346#define VTTBR_VMID_SHIFT 48
347/* Assumed to be 0 by locore.S */
348#define VTTBR_HOST 0x0000000000000000
349
350#endif /* !_MACHINE_HYPERVISOR_H_ */