1a9643ea8Slogwang /*- 2a9643ea8Slogwang * Copyright (c) 2013, 2014 Andrew Turner 3a9643ea8Slogwang * All rights reserved. 4a9643ea8Slogwang * 5a9643ea8Slogwang * Redistribution and use in source and binary forms, with or without 6a9643ea8Slogwang * modification, are permitted provided that the following conditions 7a9643ea8Slogwang * are met: 8a9643ea8Slogwang * 1. Redistributions of source code must retain the above copyright 9a9643ea8Slogwang * notice, this list of conditions and the following disclaimer. 10a9643ea8Slogwang * 2. Redistributions in binary form must reproduce the above copyright 11a9643ea8Slogwang * notice, this list of conditions and the following disclaimer in the 12a9643ea8Slogwang * documentation and/or other materials provided with the distribution. 13a9643ea8Slogwang * 14a9643ea8Slogwang * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15a9643ea8Slogwang * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16a9643ea8Slogwang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17a9643ea8Slogwang * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18a9643ea8Slogwang * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19a9643ea8Slogwang * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20a9643ea8Slogwang * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21a9643ea8Slogwang * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22a9643ea8Slogwang * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23a9643ea8Slogwang * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24a9643ea8Slogwang * SUCH DAMAGE. 25a9643ea8Slogwang * 26a9643ea8Slogwang * $FreeBSD$ 27a9643ea8Slogwang */ 28a9643ea8Slogwang 29a9643ea8Slogwang #ifndef _MACHINE_HYPERVISOR_H_ 30a9643ea8Slogwang #define _MACHINE_HYPERVISOR_H_ 31a9643ea8Slogwang 32a9643ea8Slogwang /* 33a9643ea8Slogwang * These registers are only useful when in hypervisor context, 34a9643ea8Slogwang * e.g. specific to EL2, or controlling the hypervisor. 35a9643ea8Slogwang */ 36a9643ea8Slogwang 37*22ce4affSfengbojiang /* CNTHCTL_EL2 - Counter-timer Hypervisor Control register */ 38*22ce4affSfengbojiang #define CNTHCTL_EVNTI_MASK (0xf << 4) /* Bit to trigger event stream */ 39*22ce4affSfengbojiang #define CNTHCTL_EVNTDIR (1 << 3) /* Control transition trigger bit */ 40*22ce4affSfengbojiang #define CNTHCTL_EVNTEN (1 << 2) /* Enable event stream */ 41*22ce4affSfengbojiang #define CNTHCTL_EL1PCEN (1 << 1) /* Allow EL0/1 physical timer access */ 42*22ce4affSfengbojiang #define CNTHCTL_EL1PCTEN (1 << 0) /*Allow EL0/1 physical counter access*/ 43*22ce4affSfengbojiang 44*22ce4affSfengbojiang /* CPTR_EL2 - Architecture feature trap register */ 45a9643ea8Slogwang #define CPTR_RES0 0x7fefc800 46a9643ea8Slogwang #define CPTR_RES1 0x000033ff 47a9643ea8Slogwang #define CPTR_TFP 0x00000400 48a9643ea8Slogwang #define CPTR_TTA 0x00100000 49a9643ea8Slogwang #define CPTR_TCPAC 0x80000000 50a9643ea8Slogwang 51*22ce4affSfengbojiang /* HCR_EL2 - Hypervisor Config Register */ 52a9643ea8Slogwang #define HCR_VM 0x0000000000000001 53a9643ea8Slogwang #define HCR_SWIO 0x0000000000000002 54a9643ea8Slogwang #define HCR_PTW 0x0000000000000004 55a9643ea8Slogwang #define HCR_FMO 0x0000000000000008 56a9643ea8Slogwang #define HCR_IMO 0x0000000000000010 57a9643ea8Slogwang #define HCR_AMO 0x0000000000000020 58a9643ea8Slogwang #define HCR_VF 0x0000000000000040 59a9643ea8Slogwang #define HCR_VI 0x0000000000000080 60a9643ea8Slogwang #define HCR_VSE 0x0000000000000100 61a9643ea8Slogwang #define HCR_FB 0x0000000000000200 62a9643ea8Slogwang #define HCR_BSU_MASK 0x0000000000000c00 63*22ce4affSfengbojiang #define HCR_BSU_IS 0x0000000000000400 64*22ce4affSfengbojiang #define HCR_BSU_OS 0x0000000000000800 65*22ce4affSfengbojiang #define HCR_BSU_FS 0x0000000000000c00 66a9643ea8Slogwang #define HCR_DC 0x0000000000001000 67a9643ea8Slogwang #define HCR_TWI 0x0000000000002000 68a9643ea8Slogwang #define HCR_TWE 0x0000000000004000 69a9643ea8Slogwang #define HCR_TID0 0x0000000000008000 70a9643ea8Slogwang #define HCR_TID1 0x0000000000010000 71a9643ea8Slogwang #define HCR_TID2 0x0000000000020000 72a9643ea8Slogwang #define HCR_TID3 0x0000000000040000 73a9643ea8Slogwang #define HCR_TSC 0x0000000000080000 74a9643ea8Slogwang #define HCR_TIDCP 0x0000000000100000 75a9643ea8Slogwang #define HCR_TACR 0x0000000000200000 76a9643ea8Slogwang #define HCR_TSW 0x0000000000400000 77*22ce4affSfengbojiang #define HCR_TPCP 0x0000000000800000 78a9643ea8Slogwang #define HCR_TPU 0x0000000001000000 79a9643ea8Slogwang #define HCR_TTLB 0x0000000002000000 80a9643ea8Slogwang #define HCR_TVM 0x0000000004000000 81a9643ea8Slogwang #define HCR_TGE 0x0000000008000000 82a9643ea8Slogwang #define HCR_TDZ 0x0000000010000000 83a9643ea8Slogwang #define HCR_HCD 0x0000000020000000 84a9643ea8Slogwang #define HCR_TRVM 0x0000000040000000 85a9643ea8Slogwang #define HCR_RW 0x0000000080000000 86a9643ea8Slogwang #define HCR_CD 0x0000000100000000 87a9643ea8Slogwang #define HCR_ID 0x0000000200000000 88*22ce4affSfengbojiang #define HCR_E2H 0x0000000400000000 89*22ce4affSfengbojiang #define HCR_TLOR 0x0000000800000000 90*22ce4affSfengbojiang #define HCR_TERR 0x0000001000000000 91*22ce4affSfengbojiang #define HCR_TEA 0x0000002000000000 92*22ce4affSfengbojiang #define HCR_MIOCNCE 0x0000004000000000 93*22ce4affSfengbojiang /* Bit 39 is reserved */ 94*22ce4affSfengbojiang #define HCR_APK 0x0000010000000000 95*22ce4affSfengbojiang #define HCR_API 0x0000020000000000 96*22ce4affSfengbojiang #define HCR_NV 0x0000040000000000 97*22ce4affSfengbojiang #define HCR_NV1 0x0000080000000000 98*22ce4affSfengbojiang #define HCR_AT 0x0000100000000000 99a9643ea8Slogwang 100*22ce4affSfengbojiang /* HPFAR_EL2 - Hypervisor IPA Fault Address Register */ 101*22ce4affSfengbojiang #define HPFAR_EL2_FIPA_SHIFT 4 102*22ce4affSfengbojiang #define HPFAR_EL2_FIPA_MASK 0xfffffffff0 103a9643ea8Slogwang 104*22ce4affSfengbojiang /* ICC_SRE_EL2 */ 105*22ce4affSfengbojiang #define ICC_SRE_EL2_SRE (1U << 0) 106*22ce4affSfengbojiang #define ICC_SRE_EL2_EN (1U << 3) 107*22ce4affSfengbojiang 108*22ce4affSfengbojiang /* SCTLR_EL2 - System Control Register */ 109*22ce4affSfengbojiang #define SCTLR_EL2_RES1 0x30c50830 110*22ce4affSfengbojiang #define SCTLR_EL2_M_SHIFT 0 111*22ce4affSfengbojiang #define SCTLR_EL2_M (0x1 << SCTLR_EL2_M_SHIFT) 112*22ce4affSfengbojiang #define SCTLR_EL2_A_SHIFT 1 113*22ce4affSfengbojiang #define SCTLR_EL2_A (0x1 << SCTLR_EL2_A_SHIFT) 114*22ce4affSfengbojiang #define SCTLR_EL2_C_SHIFT 2 115*22ce4affSfengbojiang #define SCTLR_EL2_C (0x1 << SCTLR_EL2_C_SHIFT) 116*22ce4affSfengbojiang #define SCTLR_EL2_SA_SHIFT 3 117*22ce4affSfengbojiang #define SCTLR_EL2_SA (0x1 << SCTLR_EL2_SA_SHIFT) 118*22ce4affSfengbojiang #define SCTLR_EL2_I_SHIFT 12 119*22ce4affSfengbojiang #define SCTLR_EL2_I (0x1 << SCTLR_EL2_I_SHIFT) 120*22ce4affSfengbojiang #define SCTLR_EL2_WXN_SHIFT 19 121*22ce4affSfengbojiang #define SCTLR_EL2_WXN (0x1 << SCTLR_EL2_WXN_SHIFT) 122*22ce4affSfengbojiang #define SCTLR_EL2_EE_SHIFT 25 123*22ce4affSfengbojiang #define SCTLR_EL2_EE (0x1 << SCTLR_EL2_EE_SHIFT) 124*22ce4affSfengbojiang 125*22ce4affSfengbojiang /* TCR_EL2 - Translation Control Register */ 126*22ce4affSfengbojiang #define TCR_EL2_RES1 ((0x1UL << 31) | (0x1UL << 23)) 127*22ce4affSfengbojiang #define TCR_EL2_T0SZ_SHIFT 0 128*22ce4affSfengbojiang #define TCR_EL2_T0SZ_MASK (0x3f << TCR_EL2_T0SZ_SHIFT) 129*22ce4affSfengbojiang #define TCR_EL2_T0SZ(x) ((x) << TCR_EL2_T0SZ_SHIFT) 130*22ce4affSfengbojiang /* Bits 7:6 are reserved */ 131*22ce4affSfengbojiang #define TCR_EL2_IRGN0_SHIFT 8 132*22ce4affSfengbojiang #define TCR_EL2_IRGN0_MASK (0x3 << TCR_EL2_IRGN0_SHIFT) 133*22ce4affSfengbojiang #define TCR_EL2_ORGN0_SHIFT 10 134*22ce4affSfengbojiang #define TCR_EL2_ORGN0_MASK (0x3 << TCR_EL2_ORGN0_SHIFT) 135*22ce4affSfengbojiang #define TCR_EL2_SH0_SHIFT 12 136*22ce4affSfengbojiang #define TCR_EL2_SH0_MASK (0x3 << TCR_EL2_SH0_SHIFT) 137*22ce4affSfengbojiang #define TCR_EL2_TG0_SHIFT 14 138*22ce4affSfengbojiang #define TCR_EL2_TG0_MASK (0x3 << TCR_EL2_TG0_SHIFT) 139*22ce4affSfengbojiang #define TCR_EL2_PS_SHIFT 16 140*22ce4affSfengbojiang #define TCR_EL2_PS_32BITS (0 << TCR_EL2_PS_SHIFT) 141*22ce4affSfengbojiang #define TCR_EL2_PS_36BITS (1 << TCR_EL2_PS_SHIFT) 142*22ce4affSfengbojiang #define TCR_EL2_PS_40BITS (2 << TCR_EL2_PS_SHIFT) 143*22ce4affSfengbojiang #define TCR_EL2_PS_42BITS (3 << TCR_EL2_PS_SHIFT) 144*22ce4affSfengbojiang #define TCR_EL2_PS_44BITS (4 << TCR_EL2_PS_SHIFT) 145*22ce4affSfengbojiang #define TCR_EL2_PS_48BITS (5 << TCR_EL2_PS_SHIFT) 146*22ce4affSfengbojiang #define TCR_EL2_PS_52BITS (6 << TCR_EL2_PS_SHIFT) /* ARMv8.2-LPA */ 147*22ce4affSfengbojiang 148*22ce4affSfengbojiang /* VMPDIR_EL2 - Virtualization Multiprocessor ID Register */ 149*22ce4affSfengbojiang #define VMPIDR_EL2_U 0x0000000040000000 150*22ce4affSfengbojiang #define VMPIDR_EL2_MT 0x0000000001000000 151*22ce4affSfengbojiang #define VMPIDR_EL2_RES1 0x0000000080000000 152*22ce4affSfengbojiang 153*22ce4affSfengbojiang /* VTCR_EL2 - Virtualization Translation Control Register */ 154*22ce4affSfengbojiang #define VTCR_EL2_RES1 (0x1 << 31) 155*22ce4affSfengbojiang #define VTCR_EL2_T0SZ_MASK 0x3f 156*22ce4affSfengbojiang #define VTCR_EL2_SL0_SHIFT 6 157*22ce4affSfengbojiang #define VTCR_EL2_SL0_4K_LVL2 (0x0 << VTCR_EL2_SL0_SHIFT) 158*22ce4affSfengbojiang #define VTCR_EL2_SL0_4K_LVL1 (0x1 << VTCR_EL2_SL0_SHIFT) 159*22ce4affSfengbojiang #define VTCR_EL2_SL0_4K_LVL0 (0x2 << VTCR_EL2_SL0_SHIFT) 160*22ce4affSfengbojiang #define VTCR_EL2_IRGN0_SHIFT 8 161*22ce4affSfengbojiang #define VTCR_EL2_IRGN0_WBWA (0x1 << VTCR_EL2_IRGN0_SHIFT) 162*22ce4affSfengbojiang #define VTCR_EL2_ORGN0_SHIFT 10 163*22ce4affSfengbojiang #define VTCR_EL2_ORGN0_WBWA (0x1 << VTCR_EL2_ORGN0_SHIFT) 164*22ce4affSfengbojiang #define VTCR_EL2_SH0_SHIFT 12 165*22ce4affSfengbojiang #define VTCR_EL2_SH0_NS (0x0 << VTCR_EL2_SH0_SHIFT) 166*22ce4affSfengbojiang #define VTCR_EL2_SH0_OS (0x2 << VTCR_EL2_SH0_SHIFT) 167*22ce4affSfengbojiang #define VTCR_EL2_SH0_IS (0x3 << VTCR_EL2_SH0_SHIFT) 168*22ce4affSfengbojiang #define VTCR_EL2_TG0_SHIFT 14 169*22ce4affSfengbojiang #define VTCR_EL2_TG0_4K (0x0 << VTCR_EL2_TG0_SHIFT) 170*22ce4affSfengbojiang #define VTCR_EL2_TG0_64K (0x1 << VTCR_EL2_TG0_SHIFT) 171*22ce4affSfengbojiang #define VTCR_EL2_TG0_16K (0x2 << VTCR_EL2_TG0_SHIFT) 172*22ce4affSfengbojiang #define VTCR_EL2_PS_SHIFT 16 173*22ce4affSfengbojiang #define VTCR_EL2_PS_32BIT (0x0 << VTCR_EL2_PS_SHIFT) 174*22ce4affSfengbojiang #define VTCR_EL2_PS_36BIT (0x1 << VTCR_EL2_PS_SHIFT) 175*22ce4affSfengbojiang #define VTCR_EL2_PS_40BIT (0x2 << VTCR_EL2_PS_SHIFT) 176*22ce4affSfengbojiang #define VTCR_EL2_PS_42BIT (0x3 << VTCR_EL2_PS_SHIFT) 177*22ce4affSfengbojiang #define VTCR_EL2_PS_44BIT (0x4 << VTCR_EL2_PS_SHIFT) 178*22ce4affSfengbojiang #define VTCR_EL2_PS_48BIT (0x5 << VTCR_EL2_PS_SHIFT) 179*22ce4affSfengbojiang 180*22ce4affSfengbojiang /* VTTBR_EL2 - Virtualization Translation Table Base Register */ 181*22ce4affSfengbojiang #define VTTBR_VMID_MASK 0xffff000000000000 182*22ce4affSfengbojiang #define VTTBR_VMID_SHIFT 48 183*22ce4affSfengbojiang #define VTTBR_HOST 0x0000000000000000 184*22ce4affSfengbojiang 185*22ce4affSfengbojiang #endif /* !_MACHINE_HYPERVISOR_H_ */ 186