xref: /dragonfly/sys/dev/virtual/nvmm/x86/nvmm_x86.c (revision 42862644)
16d65b43dSAaron LI /*
2*bfc69df0SAaron LI  * Copyright (c) 2018-2021 Maxime Villard, m00nbsd.net
36d65b43dSAaron LI  * All rights reserved.
46d65b43dSAaron LI  *
57f0e1ce2SAaron LI  * This code is part of the NVMM hypervisor.
66d65b43dSAaron LI  *
76d65b43dSAaron LI  * Redistribution and use in source and binary forms, with or without
86d65b43dSAaron LI  * modification, are permitted provided that the following conditions
96d65b43dSAaron LI  * are met:
106d65b43dSAaron LI  * 1. Redistributions of source code must retain the above copyright
116d65b43dSAaron LI  *    notice, this list of conditions and the following disclaimer.
126d65b43dSAaron LI  * 2. Redistributions in binary form must reproduce the above copyright
136d65b43dSAaron LI  *    notice, this list of conditions and the following disclaimer in the
146d65b43dSAaron LI  *    documentation and/or other materials provided with the distribution.
156d65b43dSAaron LI  *
167f0e1ce2SAaron LI  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
177f0e1ce2SAaron LI  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
187f0e1ce2SAaron LI  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
197f0e1ce2SAaron LI  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
207f0e1ce2SAaron LI  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
217f0e1ce2SAaron LI  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
227f0e1ce2SAaron LI  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
237f0e1ce2SAaron LI  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
247f0e1ce2SAaron LI  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
257f0e1ce2SAaron LI  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
267f0e1ce2SAaron LI  * SUCH DAMAGE.
276d65b43dSAaron LI  */
286d65b43dSAaron LI 
29*bfc69df0SAaron LI #include "../nvmm.h"
30*bfc69df0SAaron LI #include "../nvmm_internal.h"
31*bfc69df0SAaron LI #include "nvmm_x86.h"
326d65b43dSAaron LI 
336d65b43dSAaron LI /*
346d65b43dSAaron LI  * Code shared between x86-SVM and x86-VMX.
356d65b43dSAaron LI  */
366d65b43dSAaron LI 
376d65b43dSAaron LI const struct nvmm_x64_state nvmm_x86_reset_state = {
386d65b43dSAaron LI 	.segs = {
396d65b43dSAaron LI 		[NVMM_X64_SEG_ES] = {
406d65b43dSAaron LI 			.selector = 0x0000,
416d65b43dSAaron LI 			.base = 0x00000000,
426d65b43dSAaron LI 			.limit = 0xFFFF,
436d65b43dSAaron LI 			.attrib = {
446d65b43dSAaron LI 				.type = 3,
456d65b43dSAaron LI 				.s = 1,
466d65b43dSAaron LI 				.p = 1,
476d65b43dSAaron LI 			}
486d65b43dSAaron LI 		},
496d65b43dSAaron LI 		[NVMM_X64_SEG_CS] = {
506d65b43dSAaron LI 			.selector = 0xF000,
516d65b43dSAaron LI 			.base = 0xFFFF0000,
526d65b43dSAaron LI 			.limit = 0xFFFF,
536d65b43dSAaron LI 			.attrib = {
546d65b43dSAaron LI 				.type = 3,
556d65b43dSAaron LI 				.s = 1,
566d65b43dSAaron LI 				.p = 1,
576d65b43dSAaron LI 			}
586d65b43dSAaron LI 		},
596d65b43dSAaron LI 		[NVMM_X64_SEG_SS] = {
606d65b43dSAaron LI 			.selector = 0x0000,
616d65b43dSAaron LI 			.base = 0x00000000,
626d65b43dSAaron LI 			.limit = 0xFFFF,
636d65b43dSAaron LI 			.attrib = {
646d65b43dSAaron LI 				.type = 3,
656d65b43dSAaron LI 				.s = 1,
666d65b43dSAaron LI 				.p = 1,
676d65b43dSAaron LI 			}
686d65b43dSAaron LI 		},
696d65b43dSAaron LI 		[NVMM_X64_SEG_DS] = {
706d65b43dSAaron LI 			.selector = 0x0000,
716d65b43dSAaron LI 			.base = 0x00000000,
726d65b43dSAaron LI 			.limit = 0xFFFF,
736d65b43dSAaron LI 			.attrib = {
746d65b43dSAaron LI 				.type = 3,
756d65b43dSAaron LI 				.s = 1,
766d65b43dSAaron LI 				.p = 1,
776d65b43dSAaron LI 			}
786d65b43dSAaron LI 		},
796d65b43dSAaron LI 		[NVMM_X64_SEG_FS] = {
806d65b43dSAaron LI 			.selector = 0x0000,
816d65b43dSAaron LI 			.base = 0x00000000,
826d65b43dSAaron LI 			.limit = 0xFFFF,
836d65b43dSAaron LI 			.attrib = {
846d65b43dSAaron LI 				.type = 3,
856d65b43dSAaron LI 				.s = 1,
866d65b43dSAaron LI 				.p = 1,
876d65b43dSAaron LI 			}
886d65b43dSAaron LI 		},
896d65b43dSAaron LI 		[NVMM_X64_SEG_GS] = {
906d65b43dSAaron LI 			.selector = 0x0000,
916d65b43dSAaron LI 			.base = 0x00000000,
926d65b43dSAaron LI 			.limit = 0xFFFF,
936d65b43dSAaron LI 			.attrib = {
946d65b43dSAaron LI 				.type = 3,
956d65b43dSAaron LI 				.s = 1,
966d65b43dSAaron LI 				.p = 1,
976d65b43dSAaron LI 			}
986d65b43dSAaron LI 		},
996d65b43dSAaron LI 		[NVMM_X64_SEG_GDT] = {
1006d65b43dSAaron LI 			.selector = 0x0000,
1016d65b43dSAaron LI 			.base = 0x00000000,
1026d65b43dSAaron LI 			.limit = 0xFFFF,
1036d65b43dSAaron LI 			.attrib = {
1046d65b43dSAaron LI 				.type = 2,
1056d65b43dSAaron LI 				.s = 1,
1066d65b43dSAaron LI 				.p = 1,
1076d65b43dSAaron LI 			}
1086d65b43dSAaron LI 		},
1096d65b43dSAaron LI 		[NVMM_X64_SEG_IDT] = {
1106d65b43dSAaron LI 			.selector = 0x0000,
1116d65b43dSAaron LI 			.base = 0x00000000,
1126d65b43dSAaron LI 			.limit = 0xFFFF,
1136d65b43dSAaron LI 			.attrib = {
1146d65b43dSAaron LI 				.type = 2,
1156d65b43dSAaron LI 				.s = 1,
1166d65b43dSAaron LI 				.p = 1,
1176d65b43dSAaron LI 			}
1186d65b43dSAaron LI 		},
1196d65b43dSAaron LI 		[NVMM_X64_SEG_LDT] = {
1206d65b43dSAaron LI 			.selector = 0x0000,
1216d65b43dSAaron LI 			.base = 0x00000000,
1226d65b43dSAaron LI 			.limit = 0xFFFF,
1236d65b43dSAaron LI 			.attrib = {
12438c91b8cSAaron LI 				.type = 2,
1256d65b43dSAaron LI 				.s = 0,
1266d65b43dSAaron LI 				.p = 1,
1276d65b43dSAaron LI 			}
1286d65b43dSAaron LI 		},
1296d65b43dSAaron LI 		[NVMM_X64_SEG_TR] = {
1306d65b43dSAaron LI 			.selector = 0x0000,
1316d65b43dSAaron LI 			.base = 0x00000000,
1326d65b43dSAaron LI 			.limit = 0xFFFF,
1336d65b43dSAaron LI 			.attrib = {
13438c91b8cSAaron LI 				.type = 3,
1356d65b43dSAaron LI 				.s = 0,
1366d65b43dSAaron LI 				.p = 1,
1376d65b43dSAaron LI 			}
1386d65b43dSAaron LI 		},
1396d65b43dSAaron LI 	},
1406d65b43dSAaron LI 
1416d65b43dSAaron LI 	.gprs = {
1426d65b43dSAaron LI 		[NVMM_X64_GPR_RAX] = 0x00000000,
1436d65b43dSAaron LI 		[NVMM_X64_GPR_RCX] = 0x00000000,
1446d65b43dSAaron LI 		[NVMM_X64_GPR_RDX] = 0x00000600,
1456d65b43dSAaron LI 		[NVMM_X64_GPR_RBX] = 0x00000000,
1466d65b43dSAaron LI 		[NVMM_X64_GPR_RSP] = 0x00000000,
1476d65b43dSAaron LI 		[NVMM_X64_GPR_RBP] = 0x00000000,
1486d65b43dSAaron LI 		[NVMM_X64_GPR_RSI] = 0x00000000,
1496d65b43dSAaron LI 		[NVMM_X64_GPR_RDI] = 0x00000000,
1506d65b43dSAaron LI 		[NVMM_X64_GPR_R8] = 0x00000000,
1516d65b43dSAaron LI 		[NVMM_X64_GPR_R9] = 0x00000000,
1526d65b43dSAaron LI 		[NVMM_X64_GPR_R10] = 0x00000000,
1536d65b43dSAaron LI 		[NVMM_X64_GPR_R11] = 0x00000000,
1546d65b43dSAaron LI 		[NVMM_X64_GPR_R12] = 0x00000000,
1556d65b43dSAaron LI 		[NVMM_X64_GPR_R13] = 0x00000000,
1566d65b43dSAaron LI 		[NVMM_X64_GPR_R14] = 0x00000000,
1576d65b43dSAaron LI 		[NVMM_X64_GPR_R15] = 0x00000000,
1586d65b43dSAaron LI 		[NVMM_X64_GPR_RIP] = 0x0000FFF0,
1596d65b43dSAaron LI 		[NVMM_X64_GPR_RFLAGS] = 0x00000002,
1606d65b43dSAaron LI 	},
1616d65b43dSAaron LI 
1626d65b43dSAaron LI 	.crs = {
1636d65b43dSAaron LI 		[NVMM_X64_CR_CR0] = 0x60000010,
1646d65b43dSAaron LI 		[NVMM_X64_CR_CR2] = 0x00000000,
1656d65b43dSAaron LI 		[NVMM_X64_CR_CR3] = 0x00000000,
1666d65b43dSAaron LI 		[NVMM_X64_CR_CR4] = 0x00000000,
1676d65b43dSAaron LI 		[NVMM_X64_CR_CR8] = 0x00000000,
1686d65b43dSAaron LI 		[NVMM_X64_CR_XCR0] = 0x00000001,
1696d65b43dSAaron LI 	},
1706d65b43dSAaron LI 
1716d65b43dSAaron LI 	.drs = {
1726d65b43dSAaron LI 		[NVMM_X64_DR_DR0] = 0x00000000,
1736d65b43dSAaron LI 		[NVMM_X64_DR_DR1] = 0x00000000,
1746d65b43dSAaron LI 		[NVMM_X64_DR_DR2] = 0x00000000,
1756d65b43dSAaron LI 		[NVMM_X64_DR_DR3] = 0x00000000,
1766d65b43dSAaron LI 		[NVMM_X64_DR_DR6] = 0xFFFF0FF0,
1776d65b43dSAaron LI 		[NVMM_X64_DR_DR7] = 0x00000400,
1786d65b43dSAaron LI 	},
1796d65b43dSAaron LI 
1806d65b43dSAaron LI 	.msrs = {
1816d65b43dSAaron LI 		[NVMM_X64_MSR_EFER] = 0x00000000,
1826d65b43dSAaron LI 		[NVMM_X64_MSR_STAR] = 0x00000000,
1836d65b43dSAaron LI 		[NVMM_X64_MSR_LSTAR] = 0x00000000,
1846d65b43dSAaron LI 		[NVMM_X64_MSR_CSTAR] = 0x00000000,
1856d65b43dSAaron LI 		[NVMM_X64_MSR_SFMASK] = 0x00000000,
1866d65b43dSAaron LI 		[NVMM_X64_MSR_KERNELGSBASE] = 0x00000000,
1876d65b43dSAaron LI 		[NVMM_X64_MSR_SYSENTER_CS] = 0x00000000,
1886d65b43dSAaron LI 		[NVMM_X64_MSR_SYSENTER_ESP] = 0x00000000,
1896d65b43dSAaron LI 		[NVMM_X64_MSR_SYSENTER_EIP] = 0x00000000,
19038c91b8cSAaron LI 		[NVMM_X64_MSR_PAT] = 0x0007040600070406,
1916d65b43dSAaron LI 		[NVMM_X64_MSR_TSC] = 0,
1926d65b43dSAaron LI 	},
1936d65b43dSAaron LI 
1946d65b43dSAaron LI 	.intr = {
1956d65b43dSAaron LI 		.int_shadow = 0,
1966d65b43dSAaron LI 		.int_window_exiting = 0,
1976d65b43dSAaron LI 		.nmi_window_exiting = 0,
1986d65b43dSAaron LI 		.evt_pending = 0,
1996d65b43dSAaron LI 	},
2006d65b43dSAaron LI 
201e809d733SAaron LI 	.fpu = {
202e809d733SAaron LI 		.fx_cw = 0x0040,
203e809d733SAaron LI 		.fx_sw = 0x0000,
204e809d733SAaron LI 		.fx_tw = 0x55,
205e809d733SAaron LI 		.fx_zero = 0x55,
206e809d733SAaron LI 		.fx_mxcsr = 0x1F80,
2076d65b43dSAaron LI 	}
2086d65b43dSAaron LI };
2096d65b43dSAaron LI 
2106d65b43dSAaron LI const struct nvmm_x86_cpuid_mask nvmm_cpuid_00000001 = {
2116d65b43dSAaron LI 	.eax = ~0,
2126d65b43dSAaron LI 	.ebx = ~0,
2136d65b43dSAaron LI 	.ecx =
214c1d369d5SAaron LI 	    CPUID_0_01_ECX_SSE3 |
215c1d369d5SAaron LI 	    CPUID_0_01_ECX_PCLMULQDQ |
216c1d369d5SAaron LI 	    /* CPUID_0_01_ECX_DTES64 excluded */
217c1d369d5SAaron LI 	    /* CPUID_0_01_ECX_MONITOR excluded */
218c1d369d5SAaron LI 	    /* CPUID_0_01_ECX_DS_CPL excluded */
219c1d369d5SAaron LI 	    /* CPUID_0_01_ECX_VMX excluded */
220c1d369d5SAaron LI 	    /* CPUID_0_01_ECX_SMX excluded */
221c1d369d5SAaron LI 	    /* CPUID_0_01_ECX_EIST excluded */
222c1d369d5SAaron LI 	    /* CPUID_0_01_ECX_TM2 excluded */
223c1d369d5SAaron LI 	    CPUID_0_01_ECX_SSSE3 |
224c1d369d5SAaron LI 	    /* CPUID_0_01_ECX_CNXTID excluded */
225c1d369d5SAaron LI 	    /* CPUID_0_01_ECX_SDBG excluded */
226c1d369d5SAaron LI 	    CPUID_0_01_ECX_FMA |
227c1d369d5SAaron LI 	    CPUID_0_01_ECX_CX16 |
228c1d369d5SAaron LI 	    /* CPUID_0_01_ECX_XTPR excluded */
229c1d369d5SAaron LI 	    /* CPUID_0_01_ECX_PDCM excluded */
230c1d369d5SAaron LI 	    /* CPUID_0_01_ECX_PCID excluded, but re-included in VMX */
231c1d369d5SAaron LI 	    /* CPUID_0_01_ECX_DCA excluded */
232c1d369d5SAaron LI 	    CPUID_0_01_ECX_SSE41 |
233c1d369d5SAaron LI 	    CPUID_0_01_ECX_SSE42 |
234c1d369d5SAaron LI 	    /* CPUID_0_01_ECX_X2APIC excluded */
235c1d369d5SAaron LI 	    CPUID_0_01_ECX_MOVBE |
236c1d369d5SAaron LI 	    CPUID_0_01_ECX_POPCNT |
237c1d369d5SAaron LI 	    /* CPUID_0_01_ECX_TSC_DEADLINE excluded */
238c1d369d5SAaron LI 	    CPUID_0_01_ECX_AESNI |
239c1d369d5SAaron LI 	    CPUID_0_01_ECX_XSAVE |
240c1d369d5SAaron LI 	    CPUID_0_01_ECX_OSXSAVE |
241c1d369d5SAaron LI 	    /* CPUID_0_01_ECX_AVX excluded */
242c1d369d5SAaron LI 	    CPUID_0_01_ECX_F16C |
243c1d369d5SAaron LI 	    CPUID_0_01_ECX_RDRAND,
244c1d369d5SAaron LI 	    /* CPUID_0_01_ECX_RAZ excluded */
2456d65b43dSAaron LI 	.edx =
246c1d369d5SAaron LI 	    CPUID_0_01_EDX_FPU |
247c1d369d5SAaron LI 	    CPUID_0_01_EDX_VME |
248c1d369d5SAaron LI 	    CPUID_0_01_EDX_DE |
249c1d369d5SAaron LI 	    CPUID_0_01_EDX_PSE |
250c1d369d5SAaron LI 	    CPUID_0_01_EDX_TSC |
251c1d369d5SAaron LI 	    CPUID_0_01_EDX_MSR |
252c1d369d5SAaron LI 	    CPUID_0_01_EDX_PAE |
253c1d369d5SAaron LI 	    /* CPUID_0_01_EDX_MCE excluded */
254c1d369d5SAaron LI 	    CPUID_0_01_EDX_CX8 |
255c1d369d5SAaron LI 	    CPUID_0_01_EDX_APIC |
256c1d369d5SAaron LI 	    CPUID_0_01_EDX_SEP |
257c1d369d5SAaron LI 	    /* CPUID_0_01_EDX_MTRR excluded */
258c1d369d5SAaron LI 	    CPUID_0_01_EDX_PGE |
259c1d369d5SAaron LI 	    /* CPUID_0_01_EDX_MCA excluded */
260c1d369d5SAaron LI 	    CPUID_0_01_EDX_CMOV |
261c1d369d5SAaron LI 	    CPUID_0_01_EDX_PAT |
262c1d369d5SAaron LI 	    CPUID_0_01_EDX_PSE36 |
263c1d369d5SAaron LI 	    /* CPUID_0_01_EDX_PSN excluded */
264c1d369d5SAaron LI 	    CPUID_0_01_EDX_CLFSH |
265c1d369d5SAaron LI 	    /* CPUID_0_01_EDX_DS excluded */
266c1d369d5SAaron LI 	    /* CPUID_0_01_EDX_ACPI excluded */
267c1d369d5SAaron LI 	    CPUID_0_01_EDX_MMX |
268c1d369d5SAaron LI 	    CPUID_0_01_EDX_FXSR |
269c1d369d5SAaron LI 	    CPUID_0_01_EDX_SSE |
270c1d369d5SAaron LI 	    CPUID_0_01_EDX_SSE2 |
271c1d369d5SAaron LI 	    CPUID_0_01_EDX_SS |
272c1d369d5SAaron LI 	    CPUID_0_01_EDX_HTT |
273c1d369d5SAaron LI 	    /* CPUID_0_01_EDX_TM excluded */
274c1d369d5SAaron LI 	    CPUID_0_01_EDX_PBE
2756d65b43dSAaron LI };
2766d65b43dSAaron LI 
2776d65b43dSAaron LI const struct nvmm_x86_cpuid_mask nvmm_cpuid_00000007 = {
2786d65b43dSAaron LI 	.eax = ~0,
2796d65b43dSAaron LI 	.ebx =
280c1d369d5SAaron LI 	    CPUID_0_07_EBX_FSGSBASE |
281c1d369d5SAaron LI 	    /* CPUID_0_07_EBX_TSC_ADJUST excluded */
282c1d369d5SAaron LI 	    /* CPUID_0_07_EBX_SGX excluded */
283c1d369d5SAaron LI 	    CPUID_0_07_EBX_BMI1 |
284c1d369d5SAaron LI 	    /* CPUID_0_07_EBX_HLE excluded */
285c1d369d5SAaron LI 	    /* CPUID_0_07_EBX_AVX2 excluded */
286c1d369d5SAaron LI 	    CPUID_0_07_EBX_FDPEXONLY |
287c1d369d5SAaron LI 	    CPUID_0_07_EBX_SMEP |
288c1d369d5SAaron LI 	    CPUID_0_07_EBX_BMI2 |
289c1d369d5SAaron LI 	    CPUID_0_07_EBX_ERMS |
290c1d369d5SAaron LI 	    /* CPUID_0_07_EBX_INVPCID excluded, but re-included in VMX */
291c1d369d5SAaron LI 	    /* CPUID_0_07_EBX_RTM excluded */
292c1d369d5SAaron LI 	    /* CPUID_0_07_EBX_QM excluded */
293c1d369d5SAaron LI 	    CPUID_0_07_EBX_FPUCSDS |
294c1d369d5SAaron LI 	    /* CPUID_0_07_EBX_MPX excluded */
295c1d369d5SAaron LI 	    /* CPUID_0_07_EBX_PQE excluded */
296c1d369d5SAaron LI 	    /* CPUID_0_07_EBX_AVX512F excluded */
297c1d369d5SAaron LI 	    /* CPUID_0_07_EBX_AVX512DQ excluded */
298c1d369d5SAaron LI 	    CPUID_0_07_EBX_RDSEED |
299c1d369d5SAaron LI 	    CPUID_0_07_EBX_ADX |
300c1d369d5SAaron LI 	    CPUID_0_07_EBX_SMAP |
301c1d369d5SAaron LI 	    /* CPUID_0_07_EBX_AVX512_IFMA excluded */
302c1d369d5SAaron LI 	    CPUID_0_07_EBX_CLFLUSHOPT |
303c1d369d5SAaron LI 	    CPUID_0_07_EBX_CLWB,
304c1d369d5SAaron LI 	    /* CPUID_0_07_EBX_PT excluded */
305c1d369d5SAaron LI 	    /* CPUID_0_07_EBX_AVX512PF excluded */
306c1d369d5SAaron LI 	    /* CPUID_0_07_EBX_AVX512ER excluded */
307c1d369d5SAaron LI 	    /* CPUID_0_07_EBX_AVX512CD excluded */
308c1d369d5SAaron LI 	    /* CPUID_0_07_EBX_SHA excluded */
309c1d369d5SAaron LI 	    /* CPUID_0_07_EBX_AVX512BW excluded */
310c1d369d5SAaron LI 	    /* CPUID_0_07_EBX_AVX512VL excluded */
3116d65b43dSAaron LI 	.ecx =
312c1d369d5SAaron LI 	    CPUID_0_07_ECX_PREFETCHWT1 |
313c1d369d5SAaron LI 	    /* CPUID_0_07_ECX_AVX512_VBMI excluded */
314c1d369d5SAaron LI 	    CPUID_0_07_ECX_UMIP |
315c1d369d5SAaron LI 	    /* CPUID_0_07_ECX_PKU excluded */
316c1d369d5SAaron LI 	    /* CPUID_0_07_ECX_OSPKE excluded */
317c1d369d5SAaron LI 	    /* CPUID_0_07_ECX_WAITPKG excluded */
318c1d369d5SAaron LI 	    /* CPUID_0_07_ECX_AVX512_VBMI2 excluded */
319c1d369d5SAaron LI 	    /* CPUID_0_07_ECX_CET_SS excluded */
320c1d369d5SAaron LI 	    CPUID_0_07_ECX_GFNI |
321c1d369d5SAaron LI 	    CPUID_0_07_ECX_VAES |
322c1d369d5SAaron LI 	    CPUID_0_07_ECX_VPCLMULQDQ |
323c1d369d5SAaron LI 	    /* CPUID_0_07_ECX_AVX512_VNNI excluded */
324c1d369d5SAaron LI 	    /* CPUID_0_07_ECX_AVX512_BITALG excluded */
325c1d369d5SAaron LI 	    /* CPUID_0_07_ECX_AVX512_VPOPCNTDQ excluded */
326c1d369d5SAaron LI 	    /* CPUID_0_07_ECX_LA57 excluded */
327c1d369d5SAaron LI 	    /* CPUID_0_07_ECX_MAWAU excluded */
328c1d369d5SAaron LI 	    /* CPUID_0_07_ECX_RDPID excluded */
329c1d369d5SAaron LI 	    CPUID_0_07_ECX_CLDEMOTE |
330c1d369d5SAaron LI 	    CPUID_0_07_ECX_MOVDIRI |
331c1d369d5SAaron LI 	    CPUID_0_07_ECX_MOVDIR64B,
332c1d369d5SAaron LI 	    /* CPUID_0_07_ECX_SGXLC excluded */
333c1d369d5SAaron LI 	    /* CPUID_0_07_ECX_PKS excluded */
3346d65b43dSAaron LI 	.edx =
335c1d369d5SAaron LI 	    /* CPUID_0_07_EDX_AVX512_4VNNIW excluded */
336c1d369d5SAaron LI 	    /* CPUID_0_07_EDX_AVX512_4FMAPS excluded */
337c1d369d5SAaron LI 	    CPUID_0_07_EDX_FSREP_MOV |
338c1d369d5SAaron LI 	    /* CPUID_0_07_EDX_AVX512_VP2INTERSECT excluded */
339c1d369d5SAaron LI 	    /* CPUID_0_07_EDX_SRBDS_CTRL excluded */
340c1d369d5SAaron LI 	    CPUID_0_07_EDX_MD_CLEAR |
341c1d369d5SAaron LI 	    /* CPUID_0_07_EDX_TSX_FORCE_ABORT excluded */
342c1d369d5SAaron LI 	    CPUID_0_07_EDX_SERIALIZE |
343c1d369d5SAaron LI 	    /* CPUID_0_07_EDX_HYBRID excluded */
344c1d369d5SAaron LI 	    /* CPUID_0_07_EDX_TSXLDTRK excluded */
345c1d369d5SAaron LI 	    /* CPUID_0_07_EDX_CET_IBT excluded */
346c1d369d5SAaron LI 	    /* CPUID_0_07_EDX_IBRS excluded */
347c1d369d5SAaron LI 	    /* CPUID_0_07_EDX_STIBP excluded */
348c1d369d5SAaron LI 	    /* CPUID_0_07_EDX_L1D_FLUSH excluded */
349c1d369d5SAaron LI 	    CPUID_0_07_EDX_ARCH_CAP
350c1d369d5SAaron LI 	    /* CPUID_0_07_EDX_CORE_CAP excluded */
351c1d369d5SAaron LI 	    /* CPUID_0_07_EDX_SSBD excluded */
3526d65b43dSAaron LI };
3536d65b43dSAaron LI 
3546d65b43dSAaron LI const struct nvmm_x86_cpuid_mask nvmm_cpuid_80000001 = {
3556d65b43dSAaron LI 	.eax = ~0,
3566d65b43dSAaron LI 	.ebx = ~0,
3576d65b43dSAaron LI 	.ecx =
358c1d369d5SAaron LI 	    CPUID_8_01_ECX_LAHF |
359c1d369d5SAaron LI 	    CPUID_8_01_ECX_CMPLEGACY |
360c1d369d5SAaron LI 	    /* CPUID_8_01_ECX_SVM excluded */
361c1d369d5SAaron LI 	    /* CPUID_8_01_ECX_EAPIC excluded */
362c1d369d5SAaron LI 	    CPUID_8_01_ECX_ALTMOVCR8 |
363c1d369d5SAaron LI 	    CPUID_8_01_ECX_ABM |
364c1d369d5SAaron LI 	    CPUID_8_01_ECX_SSE4A |
365c1d369d5SAaron LI 	    CPUID_8_01_ECX_MISALIGNSSE |
366c1d369d5SAaron LI 	    CPUID_8_01_ECX_3DNOWPF |
367c1d369d5SAaron LI 	    /* CPUID_8_01_ECX_OSVW excluded */
368c1d369d5SAaron LI 	    /* CPUID_8_01_ECX_IBS excluded */
369c1d369d5SAaron LI 	    CPUID_8_01_ECX_XOP |
370c1d369d5SAaron LI 	    /* CPUID_8_01_ECX_SKINIT excluded */
371c1d369d5SAaron LI 	    /* CPUID_8_01_ECX_WDT excluded */
372c1d369d5SAaron LI 	    /* CPUID_8_01_ECX_LWP excluded */
373c1d369d5SAaron LI 	    CPUID_8_01_ECX_FMA4 |
374c1d369d5SAaron LI 	    CPUID_8_01_ECX_TCE |
375c1d369d5SAaron LI 	    /* CPUID_8_01_ECX_NODEID excluded */
376c1d369d5SAaron LI 	    CPUID_8_01_ECX_TBM |
377c1d369d5SAaron LI 	    CPUID_8_01_ECX_TOPOEXT,
378c1d369d5SAaron LI 	    /* CPUID_8_01_ECX_PCEC excluded */
379c1d369d5SAaron LI 	    /* CPUID_8_01_ECX_PCENB excluded */
380c1d369d5SAaron LI 	    /* CPUID_8_01_ECX_DBE excluded */
381c1d369d5SAaron LI 	    /* CPUID_8_01_ECX_PERFTSC excluded */
382c1d369d5SAaron LI 	    /* CPUID_8_01_ECX_PERFEXTLLC excluded */
383c1d369d5SAaron LI 	    /* CPUID_8_01_ECX_MWAITX excluded */
3846d65b43dSAaron LI 	.edx =
385c1d369d5SAaron LI 	    CPUID_8_01_EDX_FPU |
386c1d369d5SAaron LI 	    CPUID_8_01_EDX_VME |
387c1d369d5SAaron LI 	    CPUID_8_01_EDX_DE |
388c1d369d5SAaron LI 	    CPUID_8_01_EDX_PSE |
389c1d369d5SAaron LI 	    CPUID_8_01_EDX_TSC |
390c1d369d5SAaron LI 	    CPUID_8_01_EDX_MSR |
391c1d369d5SAaron LI 	    CPUID_8_01_EDX_PAE |
392c1d369d5SAaron LI 	    /* CPUID_8_01_EDX_MCE excluded */
393c1d369d5SAaron LI 	    CPUID_8_01_EDX_CX8 |
394c1d369d5SAaron LI 	    CPUID_8_01_EDX_APIC |
395c1d369d5SAaron LI 	    CPUID_8_01_EDX_SYSCALL |
396c1d369d5SAaron LI 	    /* CPUID_8_01_EDX_MTRR excluded */
397c1d369d5SAaron LI 	    CPUID_8_01_EDX_PGE |
398c1d369d5SAaron LI 	    /* CPUID_8_01_EDX_MCA excluded */
399c1d369d5SAaron LI 	    CPUID_8_01_EDX_CMOV |
400c1d369d5SAaron LI 	    CPUID_8_01_EDX_PAT |
401c1d369d5SAaron LI 	    CPUID_8_01_EDX_PSE36 |
402c1d369d5SAaron LI 	    CPUID_8_01_EDX_XD |
403c1d369d5SAaron LI 	    CPUID_8_01_EDX_MMXEXT |
404c1d369d5SAaron LI 	    CPUID_8_01_EDX_MMX |
405c1d369d5SAaron LI 	    CPUID_8_01_EDX_FXSR |
406c1d369d5SAaron LI 	    CPUID_8_01_EDX_FFXSR |
407c1d369d5SAaron LI 	    CPUID_8_01_EDX_PAGE1GB |
408c1d369d5SAaron LI 	    /* CPUID_8_01_EDX_RDTSCP excluded */
409c1d369d5SAaron LI 	    CPUID_8_01_EDX_LM |
410c1d369d5SAaron LI 	    CPUID_8_01_EDX_3DNOWEXT |
411c1d369d5SAaron LI 	    CPUID_8_01_EDX_3DNOW
4126d65b43dSAaron LI };
4136d65b43dSAaron LI 
4146d65b43dSAaron LI const struct nvmm_x86_cpuid_mask nvmm_cpuid_80000007 = {
4156d65b43dSAaron LI 	.eax = 0,
4166d65b43dSAaron LI 	.ebx = 0,
4176d65b43dSAaron LI 	.ecx = 0,
418c1d369d5SAaron LI 	.edx =
419c1d369d5SAaron LI 	    /* CPUID_8_07_EDX_TS excluded */
420c1d369d5SAaron LI 	    /* CPUID_8_07_EDX_FID excluded */
421c1d369d5SAaron LI 	    /* CPUID_8_07_EDX_VID excluded */
422c1d369d5SAaron LI 	    /* CPUID_8_07_EDX_TTP excluded */
423c1d369d5SAaron LI 	    /* CPUID_8_07_EDX_TM excluded */
424c1d369d5SAaron LI 	    /* CPUID_8_07_EDX_100MHzSteps excluded */
425c1d369d5SAaron LI 	    /* CPUID_8_07_EDX_HwPstate excluded */
426c1d369d5SAaron LI 	    CPUID_8_07_EDX_TscInvariant,
427c1d369d5SAaron LI 	    /* CPUID_8_07_EDX_CPB excluded */
428c1d369d5SAaron LI 	    /* CPUID_8_07_EDX_EffFreqRO excluded */
429c1d369d5SAaron LI 	    /* CPUID_8_07_EDX_ProcFeedbackIntf excluded */
430c1d369d5SAaron LI 	    /* CPUID_8_07_EDX_ProcPowerReport excluded */
4316d65b43dSAaron LI };
4326d65b43dSAaron LI 
4336d65b43dSAaron LI const struct nvmm_x86_cpuid_mask nvmm_cpuid_80000008 = {
4346d65b43dSAaron LI 	.eax = ~0,
4356d65b43dSAaron LI 	.ebx =
436c1d369d5SAaron LI 	    CPUID_8_08_EBX_CLZERO |
437c1d369d5SAaron LI 	    /* CPUID_8_08_EBX_InstRetCntMsr excluded */
438c1d369d5SAaron LI 	    CPUID_8_08_EBX_RstrFpErrPtrs |
439c1d369d5SAaron LI 	    /* CPUID_8_08_EBX_INVLPGB excluded */
440c1d369d5SAaron LI 	    /* CPUID_8_08_EBX_RDPRU excluded */
441c1d369d5SAaron LI 	    /* CPUID_8_08_EBX_MCOMMIT excluded */
442c1d369d5SAaron LI 	    CPUID_8_08_EBX_WBNOINVD,
443c1d369d5SAaron LI 	    /* CPUID_8_08_EBX_IBPB excluded */
444c1d369d5SAaron LI 	    /* CPUID_8_08_EBX_INT_WBINVD excluded */
445c1d369d5SAaron LI 	    /* CPUID_8_08_EBX_IBRS excluded */
446c1d369d5SAaron LI 	    /* CPUID_8_08_EBX_EferLmsleUnsupp excluded */
447c1d369d5SAaron LI 	    /* CPUID_8_08_EBX_INVLPGBnestedPg excluded */
448c1d369d5SAaron LI 	    /* CPUID_8_08_EBX_STIBP excluded */
449c1d369d5SAaron LI 	    /* CPUID_8_08_EBX_IBRS_ALWAYSON excluded */
450c1d369d5SAaron LI 	    /* CPUID_8_08_EBX_STIBP_ALWAYSON excluded */
451c1d369d5SAaron LI 	    /* CPUID_8_08_EBX_PREFER_IBRS excluded */
452c1d369d5SAaron LI 	    /* CPUID_8_08_EBX_SSBD excluded */
453c1d369d5SAaron LI 	    /* CPUID_8_08_EBX_VIRT_SSBD excluded */
454c1d369d5SAaron LI 	    /* CPUID_8_08_EBX_SSB_NO excluded */
455a6f61d61SAaron LI 	.ecx = 0,
4566d65b43dSAaron LI 	.edx = 0
4576d65b43dSAaron LI };
4586d65b43dSAaron LI 
4596d65b43dSAaron LI bool
nvmm_x86_pat_validate(uint64_t val)4606d65b43dSAaron LI nvmm_x86_pat_validate(uint64_t val)
4616d65b43dSAaron LI {
4626d65b43dSAaron LI 	uint8_t *pat = (uint8_t *)&val;
4636d65b43dSAaron LI 	size_t i;
4646d65b43dSAaron LI 
4656d65b43dSAaron LI 	for (i = 0; i < 8; i++) {
4666d65b43dSAaron LI 		if (__predict_false(pat[i] & ~__BITS(2,0)))
4676d65b43dSAaron LI 			return false;
4686d65b43dSAaron LI 		if (__predict_false(pat[i] == 2 || pat[i] == 3))
4696d65b43dSAaron LI 			return false;
4706d65b43dSAaron LI 	}
4716d65b43dSAaron LI 
4726d65b43dSAaron LI 	return true;
4736d65b43dSAaron LI }
47423b2397dSAaron LI 
47523b2397dSAaron LI uint32_t
nvmm_x86_xsave_size(uint64_t xcr0)47623b2397dSAaron LI nvmm_x86_xsave_size(uint64_t xcr0)
47723b2397dSAaron LI {
47823b2397dSAaron LI 	uint32_t size;
47923b2397dSAaron LI 
48023b2397dSAaron LI 	if (xcr0 & XCR0_SSE) {
48123b2397dSAaron LI 		size = 512; /* x87 + SSE */
48223b2397dSAaron LI 	} else {
48323b2397dSAaron LI 		size = 108; /* x87 */
48423b2397dSAaron LI 	}
48523b2397dSAaron LI 	size += 64; /* XSAVE header */
48623b2397dSAaron LI 
48723b2397dSAaron LI 	return size;
48823b2397dSAaron LI }
489