1 1.21 reinoud /* $NetBSD: nvmm_x86.h,v 1.21 2021/03/26 15:59:53 reinoud Exp $ */ 2 1.1 maxv 3 1.1 maxv /* 4 1.20 maxv * Copyright (c) 2018-2020 Maxime Villard, m00nbsd.net 5 1.1 maxv * All rights reserved. 6 1.1 maxv * 7 1.20 maxv * This code is part of the NVMM hypervisor. 8 1.1 maxv * 9 1.1 maxv * Redistribution and use in source and binary forms, with or without 10 1.1 maxv * modification, are permitted provided that the following conditions 11 1.1 maxv * are met: 12 1.1 maxv * 1. Redistributions of source code must retain the above copyright 13 1.1 maxv * notice, this list of conditions and the following disclaimer. 14 1.1 maxv * 2. Redistributions in binary form must reproduce the above copyright 15 1.1 maxv * notice, this list of conditions and the following disclaimer in the 16 1.1 maxv * documentation and/or other materials provided with the distribution. 17 1.1 maxv * 18 1.20 maxv * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19 1.20 maxv * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20 1.20 maxv * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21 1.20 maxv * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22 1.20 maxv * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 23 1.20 maxv * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 24 1.20 maxv * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 25 1.20 maxv * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 26 1.20 maxv * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 1.20 maxv * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 1.20 maxv * SUCH DAMAGE. 29 1.1 maxv */ 30 1.1 maxv 31 1.1 maxv #ifndef _NVMM_X86_H_ 32 1.1 maxv #define _NVMM_X86_H_ 33 1.1 maxv 34 1.16 maxv /* -------------------------------------------------------------------------- */ 35 1.12 maxv 36 1.12 maxv #ifndef ASM_NVMM 37 1.12 maxv 38 1.16 maxv struct nvmm_x86_exit_memory { 39 1.12 maxv int prot; 40 1.12 maxv gpaddr_t gpa; 41 1.12 maxv uint8_t inst_len; 42 1.12 maxv uint8_t inst_bytes[15]; 43 1.12 maxv }; 44 1.12 maxv 45 1.16 maxv struct nvmm_x86_exit_io { 46 1.16 maxv bool in; 47 1.12 maxv uint16_t port; 48 1.16 maxv int8_t seg; 49 1.12 maxv uint8_t address_size; 50 1.12 maxv uint8_t operand_size; 51 1.12 maxv bool rep; 52 1.12 maxv bool str; 53 1.12 maxv uint64_t npc; 54 1.12 maxv }; 55 1.12 maxv 56 1.16 maxv struct nvmm_x86_exit_rdmsr { 57 1.16 maxv uint32_t msr; 58 1.16 maxv uint64_t npc; 59 1.12 maxv }; 60 1.12 maxv 61 1.16 maxv struct nvmm_x86_exit_wrmsr { 62 1.16 maxv uint32_t msr; 63 1.12 maxv uint64_t val; 64 1.12 maxv uint64_t npc; 65 1.12 maxv }; 66 1.12 maxv 67 1.16 maxv struct nvmm_x86_exit_insn { 68 1.12 maxv uint64_t npc; 69 1.12 maxv }; 70 1.12 maxv 71 1.16 maxv struct nvmm_x86_exit_invalid { 72 1.12 maxv uint64_t hwcode; 73 1.12 maxv }; 74 1.12 maxv 75 1.16 maxv /* Generic. */ 76 1.16 maxv #define NVMM_VCPU_EXIT_NONE 0x0000000000000000ULL 77 1.21 reinoud #define NVMM_VCPU_EXIT_STOPPED 0xFFFFFFFFFFFFFFFEULL 78 1.16 maxv #define NVMM_VCPU_EXIT_INVALID 0xFFFFFFFFFFFFFFFFULL 79 1.16 maxv /* x86: operations. */ 80 1.16 maxv #define NVMM_VCPU_EXIT_MEMORY 0x0000000000000001ULL 81 1.16 maxv #define NVMM_VCPU_EXIT_IO 0x0000000000000002ULL 82 1.16 maxv /* x86: changes in VCPU state. */ 83 1.16 maxv #define NVMM_VCPU_EXIT_SHUTDOWN 0x0000000000001000ULL 84 1.16 maxv #define NVMM_VCPU_EXIT_INT_READY 0x0000000000001001ULL 85 1.16 maxv #define NVMM_VCPU_EXIT_NMI_READY 0x0000000000001002ULL 86 1.16 maxv #define NVMM_VCPU_EXIT_HALTED 0x0000000000001003ULL 87 1.17 maxv #define NVMM_VCPU_EXIT_TPR_CHANGED 0x0000000000001004ULL 88 1.16 maxv /* x86: instructions. */ 89 1.16 maxv #define NVMM_VCPU_EXIT_RDMSR 0x0000000000002000ULL 90 1.16 maxv #define NVMM_VCPU_EXIT_WRMSR 0x0000000000002001ULL 91 1.16 maxv #define NVMM_VCPU_EXIT_MONITOR 0x0000000000002002ULL 92 1.16 maxv #define NVMM_VCPU_EXIT_MWAIT 0x0000000000002003ULL 93 1.16 maxv #define NVMM_VCPU_EXIT_CPUID 0x0000000000002004ULL 94 1.16 maxv 95 1.16 maxv struct nvmm_x86_exit { 96 1.16 maxv uint64_t reason; 97 1.16 maxv union { 98 1.16 maxv struct nvmm_x86_exit_memory mem; 99 1.16 maxv struct nvmm_x86_exit_io io; 100 1.16 maxv struct nvmm_x86_exit_rdmsr rdmsr; 101 1.16 maxv struct nvmm_x86_exit_wrmsr wrmsr; 102 1.16 maxv struct nvmm_x86_exit_insn insn; 103 1.16 maxv struct nvmm_x86_exit_invalid inv; 104 1.16 maxv } u; 105 1.18 maxv struct { 106 1.18 maxv uint64_t rflags; 107 1.18 maxv uint64_t cr8; 108 1.18 maxv uint64_t int_shadow:1; 109 1.18 maxv uint64_t int_window_exiting:1; 110 1.18 maxv uint64_t nmi_window_exiting:1; 111 1.18 maxv uint64_t evt_pending:1; 112 1.18 maxv uint64_t rsvd:60; 113 1.18 maxv } exitstate; 114 1.16 maxv }; 115 1.16 maxv 116 1.16 maxv #define NVMM_VCPU_EVENT_EXCP 0 117 1.16 maxv #define NVMM_VCPU_EVENT_INTR 1 118 1.16 maxv 119 1.16 maxv struct nvmm_x86_event { 120 1.16 maxv u_int type; 121 1.16 maxv uint8_t vector; 122 1.16 maxv union { 123 1.16 maxv struct { 124 1.16 maxv uint64_t error; 125 1.16 maxv } excp; 126 1.16 maxv } u; 127 1.12 maxv }; 128 1.12 maxv 129 1.12 maxv struct nvmm_cap_md { 130 1.17 maxv uint64_t mach_conf_support; 131 1.17 maxv 132 1.17 maxv uint64_t vcpu_conf_support; 133 1.17 maxv #define NVMM_CAP_ARCH_VCPU_CONF_CPUID __BIT(0) 134 1.17 maxv #define NVMM_CAP_ARCH_VCPU_CONF_TPR __BIT(1) 135 1.17 maxv 136 1.12 maxv uint64_t xcr0_mask; 137 1.16 maxv uint32_t mxcsr_mask; 138 1.16 maxv uint32_t conf_cpuid_maxops; 139 1.18 maxv uint64_t rsvd[6]; 140 1.12 maxv }; 141 1.12 maxv 142 1.12 maxv #endif 143 1.12 maxv 144 1.16 maxv /* -------------------------------------------------------------------------- */ 145 1.16 maxv 146 1.16 maxv /* 147 1.16 maxv * Segment state indexes. We use X64 as naming convention, not to confuse with 148 1.16 maxv * X86 which originally implied 32bit. 149 1.16 maxv */ 150 1.12 maxv 151 1.1 maxv /* Segments. */ 152 1.7 maxv #define NVMM_X64_SEG_ES 0 153 1.7 maxv #define NVMM_X64_SEG_CS 1 154 1.7 maxv #define NVMM_X64_SEG_SS 2 155 1.7 maxv #define NVMM_X64_SEG_DS 3 156 1.7 maxv #define NVMM_X64_SEG_FS 4 157 1.7 maxv #define NVMM_X64_SEG_GS 5 158 1.1 maxv #define NVMM_X64_SEG_GDT 6 159 1.1 maxv #define NVMM_X64_SEG_IDT 7 160 1.1 maxv #define NVMM_X64_SEG_LDT 8 161 1.1 maxv #define NVMM_X64_SEG_TR 9 162 1.1 maxv #define NVMM_X64_NSEG 10 163 1.1 maxv 164 1.1 maxv /* General Purpose Registers. */ 165 1.1 maxv #define NVMM_X64_GPR_RAX 0 166 1.4 maxv #define NVMM_X64_GPR_RCX 1 167 1.4 maxv #define NVMM_X64_GPR_RDX 2 168 1.4 maxv #define NVMM_X64_GPR_RBX 3 169 1.4 maxv #define NVMM_X64_GPR_RSP 4 170 1.4 maxv #define NVMM_X64_GPR_RBP 5 171 1.4 maxv #define NVMM_X64_GPR_RSI 6 172 1.4 maxv #define NVMM_X64_GPR_RDI 7 173 1.4 maxv #define NVMM_X64_GPR_R8 8 174 1.4 maxv #define NVMM_X64_GPR_R9 9 175 1.4 maxv #define NVMM_X64_GPR_R10 10 176 1.4 maxv #define NVMM_X64_GPR_R11 11 177 1.4 maxv #define NVMM_X64_GPR_R12 12 178 1.4 maxv #define NVMM_X64_GPR_R13 13 179 1.4 maxv #define NVMM_X64_GPR_R14 14 180 1.4 maxv #define NVMM_X64_GPR_R15 15 181 1.1 maxv #define NVMM_X64_GPR_RIP 16 182 1.1 maxv #define NVMM_X64_GPR_RFLAGS 17 183 1.1 maxv #define NVMM_X64_NGPR 18 184 1.1 maxv 185 1.1 maxv /* Control Registers. */ 186 1.1 maxv #define NVMM_X64_CR_CR0 0 187 1.1 maxv #define NVMM_X64_CR_CR2 1 188 1.1 maxv #define NVMM_X64_CR_CR3 2 189 1.1 maxv #define NVMM_X64_CR_CR4 3 190 1.1 maxv #define NVMM_X64_CR_CR8 4 191 1.1 maxv #define NVMM_X64_CR_XCR0 5 192 1.1 maxv #define NVMM_X64_NCR 6 193 1.1 maxv 194 1.1 maxv /* Debug Registers. */ 195 1.1 maxv #define NVMM_X64_DR_DR0 0 196 1.1 maxv #define NVMM_X64_DR_DR1 1 197 1.1 maxv #define NVMM_X64_DR_DR2 2 198 1.1 maxv #define NVMM_X64_DR_DR3 3 199 1.1 maxv #define NVMM_X64_DR_DR6 4 200 1.1 maxv #define NVMM_X64_DR_DR7 5 201 1.1 maxv #define NVMM_X64_NDR 6 202 1.1 maxv 203 1.1 maxv /* MSRs. */ 204 1.1 maxv #define NVMM_X64_MSR_EFER 0 205 1.1 maxv #define NVMM_X64_MSR_STAR 1 206 1.1 maxv #define NVMM_X64_MSR_LSTAR 2 207 1.1 maxv #define NVMM_X64_MSR_CSTAR 3 208 1.1 maxv #define NVMM_X64_MSR_SFMASK 4 209 1.1 maxv #define NVMM_X64_MSR_KERNELGSBASE 5 210 1.1 maxv #define NVMM_X64_MSR_SYSENTER_CS 6 211 1.1 maxv #define NVMM_X64_MSR_SYSENTER_ESP 7 212 1.1 maxv #define NVMM_X64_MSR_SYSENTER_EIP 8 213 1.1 maxv #define NVMM_X64_MSR_PAT 9 214 1.9 maxv #define NVMM_X64_MSR_TSC 10 215 1.9 maxv #define NVMM_X64_NMSR 11 216 1.1 maxv 217 1.1 maxv #ifndef ASM_NVMM 218 1.1 maxv 219 1.1 maxv #include <sys/types.h> 220 1.1 maxv #include <x86/cpu_extended_state.h> 221 1.1 maxv 222 1.1 maxv struct nvmm_x64_state_seg { 223 1.7 maxv uint16_t selector; 224 1.1 maxv struct { /* hidden */ 225 1.7 maxv uint16_t type:4; 226 1.7 maxv uint16_t s:1; 227 1.7 maxv uint16_t dpl:2; 228 1.7 maxv uint16_t p:1; 229 1.7 maxv uint16_t avl:1; 230 1.7 maxv uint16_t l:1; 231 1.7 maxv uint16_t def:1; 232 1.7 maxv uint16_t g:1; 233 1.7 maxv uint16_t rsvd:4; 234 1.1 maxv } attrib; 235 1.7 maxv uint32_t limit; /* hidden */ 236 1.1 maxv uint64_t base; /* hidden */ 237 1.1 maxv }; 238 1.1 maxv 239 1.11 maxv struct nvmm_x64_state_intr { 240 1.11 maxv uint64_t int_shadow:1; 241 1.11 maxv uint64_t int_window_exiting:1; 242 1.11 maxv uint64_t nmi_window_exiting:1; 243 1.11 maxv uint64_t evt_pending:1; 244 1.11 maxv uint64_t rsvd:60; 245 1.11 maxv }; 246 1.11 maxv 247 1.1 maxv /* Flags. */ 248 1.1 maxv #define NVMM_X64_STATE_SEGS 0x01 249 1.1 maxv #define NVMM_X64_STATE_GPRS 0x02 250 1.1 maxv #define NVMM_X64_STATE_CRS 0x04 251 1.1 maxv #define NVMM_X64_STATE_DRS 0x08 252 1.1 maxv #define NVMM_X64_STATE_MSRS 0x10 253 1.11 maxv #define NVMM_X64_STATE_INTR 0x20 254 1.1 maxv #define NVMM_X64_STATE_FPU 0x40 255 1.1 maxv #define NVMM_X64_STATE_ALL \ 256 1.1 maxv (NVMM_X64_STATE_SEGS | NVMM_X64_STATE_GPRS | NVMM_X64_STATE_CRS | \ 257 1.11 maxv NVMM_X64_STATE_DRS | NVMM_X64_STATE_MSRS | NVMM_X64_STATE_INTR | \ 258 1.1 maxv NVMM_X64_STATE_FPU) 259 1.1 maxv 260 1.1 maxv struct nvmm_x64_state { 261 1.1 maxv struct nvmm_x64_state_seg segs[NVMM_X64_NSEG]; 262 1.1 maxv uint64_t gprs[NVMM_X64_NGPR]; 263 1.1 maxv uint64_t crs[NVMM_X64_NCR]; 264 1.1 maxv uint64_t drs[NVMM_X64_NDR]; 265 1.1 maxv uint64_t msrs[NVMM_X64_NMSR]; 266 1.11 maxv struct nvmm_x64_state_intr intr; 267 1.1 maxv struct fxsave fpu; 268 1.1 maxv }; 269 1.1 maxv 270 1.16 maxv #define NVMM_VCPU_CONF_CPUID NVMM_VCPU_CONF_MD_BEGIN 271 1.17 maxv #define NVMM_VCPU_CONF_TPR (NVMM_VCPU_CONF_MD_BEGIN + 1) 272 1.14 maxv 273 1.16 maxv struct nvmm_vcpu_conf_cpuid { 274 1.16 maxv /* The options. */ 275 1.16 maxv uint32_t mask:1; 276 1.16 maxv uint32_t exit:1; 277 1.16 maxv uint32_t rsvd:30; 278 1.1 maxv 279 1.16 maxv /* The leaf. */ 280 1.1 maxv uint32_t leaf; 281 1.16 maxv 282 1.16 maxv /* The params. */ 283 1.16 maxv union { 284 1.16 maxv struct { 285 1.16 maxv struct { 286 1.16 maxv uint32_t eax; 287 1.16 maxv uint32_t ebx; 288 1.16 maxv uint32_t ecx; 289 1.16 maxv uint32_t edx; 290 1.16 maxv } set; 291 1.16 maxv struct { 292 1.16 maxv uint32_t eax; 293 1.16 maxv uint32_t ebx; 294 1.16 maxv uint32_t ecx; 295 1.16 maxv uint32_t edx; 296 1.16 maxv } del; 297 1.16 maxv } mask; 298 1.16 maxv } u; 299 1.16 maxv }; 300 1.16 maxv 301 1.17 maxv struct nvmm_vcpu_conf_tpr { 302 1.17 maxv uint32_t exit_changed:1; 303 1.17 maxv uint32_t rsvd:31; 304 1.17 maxv }; 305 1.17 maxv 306 1.16 maxv #define nvmm_vcpu_exit nvmm_x86_exit 307 1.16 maxv #define nvmm_vcpu_event nvmm_x86_event 308 1.16 maxv #define nvmm_vcpu_state nvmm_x64_state 309 1.1 maxv 310 1.6 maxv #ifdef _KERNEL 311 1.16 maxv #define NVMM_X86_MACH_NCONF 0 312 1.17 maxv #define NVMM_X86_VCPU_NCONF 2 313 1.8 maxv struct nvmm_x86_cpuid_mask { 314 1.8 maxv uint32_t eax; 315 1.8 maxv uint32_t ebx; 316 1.8 maxv uint32_t ecx; 317 1.8 maxv uint32_t edx; 318 1.8 maxv }; 319 1.6 maxv extern const struct nvmm_x64_state nvmm_x86_reset_state; 320 1.8 maxv extern const struct nvmm_x86_cpuid_mask nvmm_cpuid_00000001; 321 1.8 maxv extern const struct nvmm_x86_cpuid_mask nvmm_cpuid_00000007; 322 1.8 maxv extern const struct nvmm_x86_cpuid_mask nvmm_cpuid_80000001; 323 1.19 maxv extern const struct nvmm_x86_cpuid_mask nvmm_cpuid_80000007; 324 1.19 maxv extern const struct nvmm_x86_cpuid_mask nvmm_cpuid_80000008; 325 1.10 maxv bool nvmm_x86_pat_validate(uint64_t); 326 1.6 maxv #endif 327 1.6 maxv 328 1.1 maxv #endif /* ASM_NVMM */ 329 1.1 maxv 330 1.1 maxv #endif /* _NVMM_X86_H_ */ 331