Module Name:    src
Committed By:   martin
Date:           Tue Aug 18 09:29:52 UTC 2020

Modified Files:
        src/sys/dev/nvmm [netbsd-9]: nvmm.c nvmm.h nvmm_internal.h
        src/sys/dev/nvmm/x86 [netbsd-9]: nvmm_x86.c nvmm_x86_svm.c
            nvmm_x86_vmx.c

Log Message:
Pull up following revision(s) (requested by maxv in ticket #1055):

        sys/dev/nvmm/nvmm.h: revision 1.13
        sys/dev/nvmm/nvmm.h: revision 1.14
        sys/dev/nvmm/nvmm.c: revision 1.33
        sys/dev/nvmm/x86/nvmm_x86_vmx.c: revision 1.67
        sys/dev/nvmm/nvmm_internal.h: revision 1.17
        sys/dev/nvmm/x86/nvmm_x86_svm.c: revision 1.67
        sys/dev/nvmm/x86/nvmm_x86.c: revision 1.10

Put the few x86-specific structures under #ifdef __x86_64__, for clarity.

Make it easier to understand what's going on, no functional change.

Add new field definitions.

Add new field definitions, and intercept everything, for future-proofness.

Add CTASSERT.


To generate a diff of this commit:
cvs rdiff -u -r1.22.2.5 -r1.22.2.6 src/sys/dev/nvmm/nvmm.c
cvs rdiff -u -r1.10.4.1 -r1.10.4.2 src/sys/dev/nvmm/nvmm.h
cvs rdiff -u -r1.12.2.4 -r1.12.2.5 src/sys/dev/nvmm/nvmm_internal.h
cvs rdiff -u -r1.7.4.2 -r1.7.4.3 src/sys/dev/nvmm/x86/nvmm_x86.c
cvs rdiff -u -r1.46.4.7 -r1.46.4.8 src/sys/dev/nvmm/x86/nvmm_x86_svm.c
cvs rdiff -u -r1.36.2.9 -r1.36.2.10 src/sys/dev/nvmm/x86/nvmm_x86_vmx.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/nvmm/nvmm.c
diff -u src/sys/dev/nvmm/nvmm.c:1.22.2.5 src/sys/dev/nvmm/nvmm.c:1.22.2.6
--- src/sys/dev/nvmm/nvmm.c:1.22.2.5	Sun Aug  2 08:49:08 2020
+++ src/sys/dev/nvmm/nvmm.c	Tue Aug 18 09:29:52 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: nvmm.c,v 1.22.2.5 2020/08/02 08:49:08 martin Exp $	*/
+/*	$NetBSD: nvmm.c,v 1.22.2.6 2020/08/18 09:29:52 martin Exp $	*/
 
 /*
  * Copyright (c) 2018-2020 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nvmm.c,v 1.22.2.5 2020/08/02 08:49:08 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nvmm.c,v 1.22.2.6 2020/08/18 09:29:52 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -59,8 +59,10 @@ static struct nvmm_machine machines[NVMM
 static volatile unsigned int nmachines __cacheline_aligned;
 
 static const struct nvmm_impl *nvmm_impl_list[] = {
+#if defined(__x86_64__)
 	&nvmm_x86_svm,	/* x86 AMD SVM */
 	&nvmm_x86_vmx	/* x86 Intel VMX */
+#endif
 };
 
 static const struct nvmm_impl *nvmm_impl = NULL;

Index: src/sys/dev/nvmm/nvmm.h
diff -u src/sys/dev/nvmm/nvmm.h:1.10.4.1 src/sys/dev/nvmm/nvmm.h:1.10.4.2
--- src/sys/dev/nvmm/nvmm.h:1.10.4.1	Sun Nov 10 12:58:30 2019
+++ src/sys/dev/nvmm/nvmm.h	Tue Aug 18 09:29:52 2020
@@ -1,7 +1,7 @@
-/*	$NetBSD: nvmm.h,v 1.10.4.1 2019/11/10 12:58:30 martin Exp $	*/
+/*	$NetBSD: nvmm.h,v 1.10.4.2 2020/08/18 09:29:52 martin Exp $	*/
 
 /*
- * Copyright (c) 2018-2019 The NetBSD Foundation, Inc.
+ * Copyright (c) 2018-2020 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -44,7 +44,7 @@ typedef uint64_t	gvaddr_t;
 typedef uint32_t	nvmm_machid_t;
 typedef uint32_t	nvmm_cpuid_t;
 
-#ifdef __x86_64__
+#if defined(__x86_64__)
 #include <dev/nvmm/x86/nvmm_x86.h>
 #endif
 
@@ -96,4 +96,9 @@ struct nvmm_comm_page {
 #define NVMM_COMM_CPUID(off)		\
 	((off >> 12) & 0xFF)
 
+#ifdef _KERNEL
+/* At most one page, for the NVMM_COMM_* macros. */
+CTASSERT(sizeof(struct nvmm_comm_page) <= PAGE_SIZE);
+#endif
+
 #endif

Index: src/sys/dev/nvmm/nvmm_internal.h
diff -u src/sys/dev/nvmm/nvmm_internal.h:1.12.2.4 src/sys/dev/nvmm/nvmm_internal.h:1.12.2.5
--- src/sys/dev/nvmm/nvmm_internal.h:1.12.2.4	Sun Aug  2 11:19:09 2020
+++ src/sys/dev/nvmm/nvmm_internal.h	Tue Aug 18 09:29:52 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: nvmm_internal.h,v 1.12.2.4 2020/08/02 11:19:09 martin Exp $	*/
+/*	$NetBSD: nvmm_internal.h,v 1.12.2.5 2020/08/18 09:29:52 martin Exp $	*/
 
 /*
  * Copyright (c) 2018-2020 The NetBSD Foundation, Inc.
@@ -119,8 +119,10 @@ struct nvmm_impl {
 	    struct nvmm_vcpu_exit *);
 };
 
+#if defined(__x86_64__)
 extern const struct nvmm_impl nvmm_x86_svm;
 extern const struct nvmm_impl nvmm_x86_vmx;
+#endif
 
 static inline bool
 nvmm_return_needed(void)

Index: src/sys/dev/nvmm/x86/nvmm_x86.c
diff -u src/sys/dev/nvmm/x86/nvmm_x86.c:1.7.4.2 src/sys/dev/nvmm/x86/nvmm_x86.c:1.7.4.3
--- src/sys/dev/nvmm/x86/nvmm_x86.c:1.7.4.2	Thu May 21 10:52:58 2020
+++ src/sys/dev/nvmm/x86/nvmm_x86.c	Tue Aug 18 09:29:52 2020
@@ -1,7 +1,7 @@
-/*	$NetBSD: nvmm_x86.c,v 1.7.4.2 2020/05/21 10:52:58 martin Exp $	*/
+/*	$NetBSD: nvmm_x86.c,v 1.7.4.3 2020/08/18 09:29:52 martin Exp $	*/
 
 /*
- * Copyright (c) 2018-2019 The NetBSD Foundation, Inc.
+ * Copyright (c) 2018-2020 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nvmm_x86.c,v 1.7.4.2 2020/05/21 10:52:58 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nvmm_x86.c,v 1.7.4.3 2020/08/18 09:29:52 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -233,85 +233,191 @@ const struct nvmm_x86_cpuid_mask nvmm_cp
 	.eax = ~0,
 	.ebx = ~0,
 	.ecx =
-	    /* Excluded: MONITOR, VMX, SMX, EST, TM2, PDCM, PCID, DCA, X2APIC,
-	     * DEADLINE, RAZ. */
-	    CPUID2_SSE3 | CPUID2_PCLMUL |
-	    CPUID2_DTES64 | CPUID2_DS_CPL |
-	    CPUID2_SSSE3 | CPUID2_CID |
-	    CPUID2_SDBG | CPUID2_FMA |
-	    CPUID2_CX16 | CPUID2_xTPR |
-	    CPUID2_SSE41 | CPUID2_SSE42 |
-	    CPUID2_MOVBE | CPUID2_POPCNT |
-	    CPUID2_AES | CPUID2_XSAVE |
-	    CPUID2_OSXSAVE | CPUID2_F16C |
+	    CPUID2_SSE3 |
+	    CPUID2_PCLMUL |
+	    CPUID2_DTES64 |
+	    /* CPUID2_MONITOR excluded */
+	    CPUID2_DS_CPL |
+	    /* CPUID2_VMX excluded */
+	    /* CPUID2_SMX excluded */
+	    /* CPUID2_EST excluded */
+	    /* CPUID2_TM2 excluded */
+	    CPUID2_SSSE3 |
+	    CPUID2_CID |
+	    CPUID2_SDBG |
+	    CPUID2_FMA |
+	    CPUID2_CX16 |
+	    CPUID2_xTPR |
+	    /* CPUID2_PDCM excluded */
+	    /* CPUID2_PCID excluded, but re-included in VMX */
+	    /* CPUID2_DCA excluded */
+	    CPUID2_SSE41 |
+	    CPUID2_SSE42 |
+	    /* CPUID2_X2APIC excluded */
+	    CPUID2_MOVBE |
+	    CPUID2_POPCNT |
+	    /* CPUID2_DEADLINE excluded */
+	    CPUID2_AES |
+	    CPUID2_XSAVE |
+	    CPUID2_OSXSAVE |
+	    /* CPUID2_AVX excluded */
+	    CPUID2_F16C |
 	    CPUID2_RDRAND,
+	    /* CPUID2_RAZ excluded */
 	.edx =
-	    /* Excluded: MCE, MTRR, MCA, DS, ACPI, TM. */
-	    CPUID_FPU | CPUID_VME |
-	    CPUID_DE | CPUID_PSE |
-	    CPUID_TSC | CPUID_MSR |
-	    CPUID_PAE | CPUID_CX8 |
-	    CPUID_APIC | CPUID_B10 |	
-	    CPUID_SEP | CPUID_PGE |
-	    CPUID_CMOV | CPUID_PAT |
-	    CPUID_PSE36 | CPUID_PN |
-	    CPUID_CFLUSH | CPUID_B20 |
-	    CPUID_MMX | CPUID_FXSR |
-	    CPUID_SSE | CPUID_SSE2 |
-	    CPUID_SS | CPUID_HTT |
-	    CPUID_IA64 | CPUID_SBF
+	    CPUID_FPU |
+	    CPUID_VME |
+	    CPUID_DE |
+	    CPUID_PSE |
+	    CPUID_TSC |
+	    CPUID_MSR |
+	    CPUID_PAE |
+	    /* CPUID_MCE excluded */
+	    CPUID_CX8 |
+	    CPUID_APIC |
+	    CPUID_B10 |	
+	    CPUID_SEP |
+	    /* CPUID_MTRR excluded */
+	    CPUID_PGE |
+	    /* CPUID_MCA excluded */
+	    CPUID_CMOV |
+	    CPUID_PAT |
+	    CPUID_PSE36 |
+	    CPUID_PN |
+	    CPUID_CFLUSH |
+	    CPUID_B20 |
+	    /* CPUID_DS excluded */
+	    /* CPUID_ACPI excluded */
+	    CPUID_MMX |
+	    CPUID_FXSR |
+	    CPUID_SSE |
+	    CPUID_SSE2 |
+	    CPUID_SS |
+	    CPUID_HTT |
+	    /* CPUID_TM excluded */
+	    CPUID_IA64 |
+	    CPUID_SBF
 };
 
 const struct nvmm_x86_cpuid_mask nvmm_cpuid_00000007 = {
 	.eax = ~0,
 	.ebx =
-	    /* Excluded: TSC_ADJUST, AVX2, INVPCID, QM, AVX512*, PT, SHA. */
 	    CPUID_SEF_FSGSBASE |
-	    CPUID_SEF_SGX | CPUID_SEF_BMI1 |
-	    CPUID_SEF_HLE | CPUID_SEF_FDPEXONLY |
-	    CPUID_SEF_SMEP | CPUID_SEF_BMI2 |
-	    CPUID_SEF_ERMS | CPUID_SEF_RTM |
-	    CPUID_SEF_FPUCSDS | CPUID_SEF_PQE |
-	    CPUID_SEF_RDSEED | CPUID_SEF_ADX |
-	    CPUID_SEF_SMAP | CPUID_SEF_CLFLUSHOPT |
+	    /* CPUID_SEF_TSC_ADJUST excluded */
+	    CPUID_SEF_SGX |
+	    CPUID_SEF_BMI1 |
+	    CPUID_SEF_HLE |
+	    /* CPUID_SEF_AVX2 excluded */
+	    CPUID_SEF_FDPEXONLY |
+	    CPUID_SEF_SMEP |
+	    CPUID_SEF_BMI2 |
+	    CPUID_SEF_ERMS |
+	    /* CPUID_SEF_INVPCID excluded, but re-included in VMX */
+	    CPUID_SEF_RTM |
+	    /* CPUID_SEF_QM excluded */
+	    CPUID_SEF_FPUCSDS |
+	    /* CPUID_SEF_MPX excluded */
+	    CPUID_SEF_PQE |
+	    /* CPUID_SEF_AVX512F excluded */
+	    /* CPUID_SEF_AVX512DQ excluded */
+	    CPUID_SEF_RDSEED |
+	    CPUID_SEF_ADX |
+	    CPUID_SEF_SMAP |
+	    /* CPUID_SEF_AVX512_IFMA excluded */
+	    CPUID_SEF_CLFLUSHOPT |
 	    CPUID_SEF_CLWB,
+	    /* CPUID_SEF_PT excluded */
+	    /* CPUID_SEF_AVX512PF excluded */
+	    /* CPUID_SEF_AVX512ER excluded */
+	    /* CPUID_SEF_AVX512CD excluded */
+	    /* CPUID_SEF_SHA excluded */
+	    /* CPUID_SEF_AVX512BW excluded */
+	    /* CPUID_SEF_AVX512VL excluded */
 	.ecx =
-	    /* Excluded: AVX512*, MAWAU, RDPID. */
-	    CPUID_SEF_PREFETCHWT1 | CPUID_SEF_UMIP |
-	    CPUID_SEF_PKU | CPUID_SEF_OSPKE |
-	    CPUID_SEF_WAITPKG | CPUID_SEF_GFNI |
-	    CPUID_SEF_VAES | CPUID_SEF_VPCLMULQDQ |
-	    CPUID_SEF_CLDEMOTE | CPUID_SEF_MOVDIRI |
-	    CPUID_SEF_MOVDIR64B | CPUID_SEF_SGXLC,
+	    CPUID_SEF_PREFETCHWT1 |
+	    /* CPUID_SEF_AVX512_VBMI excluded */
+	    CPUID_SEF_UMIP |
+	    CPUID_SEF_PKU |
+	    CPUID_SEF_OSPKE |
+	    CPUID_SEF_WAITPKG |
+	    /* CPUID_SEF_AVX512_VBMI2 excluded */
+	    /* CPUID_SEF_CET_SS excluded */
+	    CPUID_SEF_GFNI |
+	    CPUID_SEF_VAES |
+	    CPUID_SEF_VPCLMULQDQ |
+	    /* CPUID_SEF_AVX512_VNNI excluded */
+	    /* CPUID_SEF_AVX512_BITALG excluded */
+	    /* CPUID_SEF_AVX512_VPOPCNTDQ excluded */
+	    /* CPUID_SEF_MAWAU excluded */
+	    /* CPUID_SEF_RDPID excluded */
+	    CPUID_SEF_CLDEMOTE |
+	    CPUID_SEF_MOVDIRI |
+	    CPUID_SEF_MOVDIR64B |
+	    CPUID_SEF_SGXLC,
+	    /* CPUID_SEF_PKS excluded */
 	.edx =
-	    /* Excluded: all except MD_CLEAR and ARCH_CAP. */
-	    CPUID_SEF_MD_CLEAR | CPUID_SEF_ARCH_CAP
+	    /* CPUID_SEF_AVX512_4VNNIW excluded */
+	    /* CPUID_SEF_AVX512_4FMAPS excluded */
+	    /* CPUID_SEF_FSREP_MOV excluded */
+	    /* CPUID_SEF_AVX512_VP2INTERSECT excluded */
+	    /* CPUID_SEF_SRBDS_CTRL excluded */
+	    CPUID_SEF_MD_CLEAR |
+	    /* CPUID_SEF_TSX_FORCE_ABORT excluded */
+	    /* CPUID_SEF_SERIALIZE excluded */
+	    /* CPUID_SEF_HYBRID excluded */
+	    /* CPUID_SEF_TSXLDTRK excluded */
+	    /* CPUID_SEF_CET_IBT excluded */
+	    /* CPUID_SEF_IBRS excluded */
+	    /* CPUID_SEF_STIBP excluded */
+	    /* CPUID_SEF_L1D_FLUSH excluded */
+	    CPUID_SEF_ARCH_CAP
+	    /* CPUID_SEF_CORE_CAP excluded */
+	    /* CPUID_SEF_SSBD excluded */
 };
 
 const struct nvmm_x86_cpuid_mask nvmm_cpuid_80000001 = {
 	.eax = ~0,
 	.ebx = ~0,
 	.ecx =
-	    /* Excluded: SVM, EAPIC, OSVW, MWAITX. */
-	    CPUID_LAHF | CPUID_CMPLEGACY |
-	    CPUID_ALTMOVCR0 | CPUID_LZCNT |
-	    CPUID_SSE4A | CPUID_MISALIGNSSE |
-	    CPUID_3DNOWPF | CPUID_IBS |
-	    CPUID_XOP | CPUID_SKINIT |
-	    CPUID_WDT | CPUID_LWP |
-	    CPUID_FMA4 | CPUID_TCE |
-	    CPUID_NODEID | CPUID_TBM |
-	    CPUID_TOPOEXT | CPUID_PCEC |
-	    CPUID_PCENB | CPUID_SPM |
-	    CPUID_DBE | CPUID_PTSC |
+	    CPUID_LAHF |
+	    CPUID_CMPLEGACY |
+	    /* CPUID_SVM excluded */
+	    /* CPUID_EAPIC excluded */
+	    CPUID_ALTMOVCR0 |
+	    CPUID_LZCNT |
+	    CPUID_SSE4A |
+	    CPUID_MISALIGNSSE |
+	    CPUID_3DNOWPF |
+	    /* CPUID_OSVW excluded */
+	    CPUID_IBS |
+	    CPUID_XOP |
+	    CPUID_SKINIT |
+	    CPUID_WDT |
+	    CPUID_LWP |
+	    CPUID_FMA4 |
+	    CPUID_TCE |
+	    CPUID_NODEID |
+	    CPUID_TBM |
+	    CPUID_TOPOEXT |
+	    CPUID_PCEC |
+	    CPUID_PCENB |
+	    CPUID_SPM |
+	    CPUID_DBE |
+	    CPUID_PTSC |
 	    CPUID_L2IPERFC,
+	    /* CPUID_MWAITX excluded */
 	.edx =
-	    /* Excluded: RDTSCP. */
-	    CPUID_SYSCALL | CPUID_MPC |
-	    CPUID_XD | CPUID_MMXX |
-	    CPUID_MMX | CPUID_FXSR |
-	    CPUID_FFXSR | CPUID_P1GB |
-	    CPUID_EM64T | CPUID_3DNOW2 |
+	    CPUID_SYSCALL |
+	    CPUID_MPC |
+	    CPUID_XD |
+	    CPUID_MMXX |
+	    CPUID_MMX | 
+	    CPUID_FXSR |
+	    CPUID_FFXSR |
+	    CPUID_P1GB |
+	    /* CPUID_RDTSCP excluded */
+	    CPUID_EM64T |
+	    CPUID_3DNOW2 |
 	    CPUID_3DNOW
 };
 

Index: src/sys/dev/nvmm/x86/nvmm_x86_svm.c
diff -u src/sys/dev/nvmm/x86/nvmm_x86_svm.c:1.46.4.7 src/sys/dev/nvmm/x86/nvmm_x86_svm.c:1.46.4.8
--- src/sys/dev/nvmm/x86/nvmm_x86_svm.c:1.46.4.7	Wed Aug  5 15:18:24 2020
+++ src/sys/dev/nvmm/x86/nvmm_x86_svm.c	Tue Aug 18 09:29:52 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: nvmm_x86_svm.c,v 1.46.4.7 2020/08/05 15:18:24 martin Exp $	*/
+/*	$NetBSD: nvmm_x86_svm.c,v 1.46.4.8 2020/08/18 09:29:52 martin Exp $	*/
 
 /*
  * Copyright (c) 2018-2019 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_svm.c,v 1.46.4.7 2020/08/05 15:18:24 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_svm.c,v 1.46.4.8 2020/08/18 09:29:52 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -220,11 +220,16 @@ int svm_vmrun(paddr_t, uint64_t *);
 #define VMCB_EXITCODE_CR13_WRITE_TRAP	0x009D
 #define VMCB_EXITCODE_CR14_WRITE_TRAP	0x009E
 #define VMCB_EXITCODE_CR15_WRITE_TRAP	0x009F
+#define VMCB_EXITCODE_INVLPGB		0x00A0
+#define VMCB_EXITCODE_INVLPGB_ILLEGAL	0x00A1
+#define VMCB_EXITCODE_INVPCID		0x00A2
 #define VMCB_EXITCODE_MCOMMIT		0x00A3
+#define VMCB_EXITCODE_TLBSYNC		0x00A4
 #define VMCB_EXITCODE_NPF		0x0400
 #define VMCB_EXITCODE_AVIC_INCOMP_IPI	0x0401
 #define VMCB_EXITCODE_AVIC_NOACCEL	0x0402
 #define VMCB_EXITCODE_VMGEXIT		0x0403
+#define VMCB_EXITCODE_BUSY		-2ULL
 #define VMCB_EXITCODE_INVALID		-1ULL
 
 /* -------------------------------------------------------------------------- */
@@ -295,7 +300,11 @@ struct vmcb_ctrl {
 #define VMCB_CTRL_INTERCEPT_WCR_SPEC(x)	__BIT(16 + x)
 
 	uint32_t intercept_misc3;
+#define VMCB_CTRL_INTERCEPT_INVLPGB_ALL	__BIT(0)
+#define VMCB_CTRL_INTERCEPT_INVLPGB_ILL	__BIT(1)
+#define VMCB_CTRL_INTERCEPT_PCID	__BIT(2)
 #define VMCB_CTRL_INTERCEPT_MCOMMIT	__BIT(3)
+#define VMCB_CTRL_INTERCEPT_TLBSYNC	__BIT(4)
 
 	uint8_t  rsvd1[36];
 	uint16_t pause_filt_thresh;
@@ -323,6 +332,7 @@ struct vmcb_ctrl {
 
 	uint64_t intr;
 #define VMCB_CTRL_INTR_SHADOW		__BIT(0)
+#define VMCB_CTRL_INTR_MASK		__BIT(1)
 
 	uint64_t exitcode;
 	uint64_t exitinfo1;
@@ -387,7 +397,7 @@ struct vmcb_ctrl {
 #define VMCB_CTRL_AVIC_PHYS_MAX_INDEX	__BITS(7,0)
 
 	uint64_t rsvd4;
-	uint64_t vmcb_ptr;
+	uint64_t vmsa_ptr;
 
 	uint8_t	pad[752];
 } __packed;
@@ -1443,6 +1453,11 @@ svm_vcpu_run(struct nvmm_machine *mach, 
 		case VMCB_EXITCODE_CLGI:
 		case VMCB_EXITCODE_SKINIT:
 		case VMCB_EXITCODE_RDTSCP:
+		case VMCB_EXITCODE_RDPRU:
+		case VMCB_EXITCODE_INVLPGB:
+		case VMCB_EXITCODE_INVPCID:
+		case VMCB_EXITCODE_MCOMMIT:
+		case VMCB_EXITCODE_TLBSYNC:
 			svm_inject_ud(vcpu);
 			exit->reason = NVMM_VCPU_EXIT_NONE;
 			break;
@@ -2035,7 +2050,17 @@ svm_vcpu_init(struct nvmm_machine *mach,
 	    VMCB_CTRL_INTERCEPT_RDTSCP |
 	    VMCB_CTRL_INTERCEPT_MONITOR |
 	    VMCB_CTRL_INTERCEPT_MWAIT |
-	    VMCB_CTRL_INTERCEPT_XSETBV;
+	    VMCB_CTRL_INTERCEPT_XSETBV |
+	    VMCB_CTRL_INTERCEPT_RDPRU;
+
+	/*
+	 * Intercept everything.
+	 */
+	vmcb->ctrl.intercept_misc3 =
+	    VMCB_CTRL_INTERCEPT_INVLPGB_ALL |
+	    VMCB_CTRL_INTERCEPT_PCID |
+	    VMCB_CTRL_INTERCEPT_MCOMMIT |
+	    VMCB_CTRL_INTERCEPT_TLBSYNC;
 
 	/* Intercept all I/O accesses. */
 	memset(cpudata->iobm, 0xFF, IOBM_SIZE);

Index: src/sys/dev/nvmm/x86/nvmm_x86_vmx.c
diff -u src/sys/dev/nvmm/x86/nvmm_x86_vmx.c:1.36.2.9 src/sys/dev/nvmm/x86/nvmm_x86_vmx.c:1.36.2.10
--- src/sys/dev/nvmm/x86/nvmm_x86_vmx.c:1.36.2.9	Wed Aug  5 15:18:24 2020
+++ src/sys/dev/nvmm/x86/nvmm_x86_vmx.c	Tue Aug 18 09:29:52 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: nvmm_x86_vmx.c,v 1.36.2.9 2020/08/05 15:18:24 martin Exp $	*/
+/*	$NetBSD: nvmm_x86_vmx.c,v 1.36.2.10 2020/08/18 09:29:52 martin Exp $	*/
 
 /*
  * Copyright (c) 2018-2019 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_vmx.c,v 1.36.2.9 2020/08/05 15:18:24 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_vmx.c,v 1.36.2.10 2020/08/18 09:29:52 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -211,11 +211,16 @@ vmx_vmclear(paddr_t *pa)
 #define MSR_IA32_VMX_CR4_FIXED1			0x0489
 
 #define MSR_IA32_VMX_EPT_VPID_CAP	0x048C
+#define		IA32_VMX_EPT_VPID_XO			__BIT(0)
 #define		IA32_VMX_EPT_VPID_WALKLENGTH_4		__BIT(6)
 #define		IA32_VMX_EPT_VPID_UC			__BIT(8)
 #define		IA32_VMX_EPT_VPID_WB			__BIT(14)
+#define		IA32_VMX_EPT_VPID_2MB			__BIT(16)
+#define		IA32_VMX_EPT_VPID_1GB			__BIT(17)
 #define		IA32_VMX_EPT_VPID_INVEPT		__BIT(20)
 #define		IA32_VMX_EPT_VPID_FLAGS_AD		__BIT(21)
+#define		IA32_VMX_EPT_VPID_ADVANCED_VMEXIT_INFO	__BIT(22)
+#define		IA32_VMX_EPT_VPID_SHSTK			__BIT(23)
 #define		IA32_VMX_EPT_VPID_INVEPT_CONTEXT	__BIT(25)
 #define		IA32_VMX_EPT_VPID_INVEPT_ALL		__BIT(26)
 #define		IA32_VMX_EPT_VPID_INVVPID		__BIT(32)
@@ -269,6 +274,7 @@ vmx_vmclear(paddr_t *pa)
 #define			EPTP_TYPE_WB		6
 #define		EPTP_WALKLEN			__BITS(5,3)
 #define		EPTP_FLAGS_AD			__BIT(6)
+#define		EPTP_SSS			__BIT(7)
 #define		EPTP_PHYSADDR			__BITS(63,12)
 #define VMCS_EOI_EXIT0				0x0000201C
 #define VMCS_EOI_EXIT1				0x0000201E
@@ -282,6 +288,7 @@ vmx_vmclear(paddr_t *pa)
 #define VMCS_ENCLS_EXIT_BITMAP			0x0000202E
 #define VMCS_SUBPAGE_PERM_TABLE_PTR		0x00002030
 #define VMCS_TSC_MULTIPLIER			0x00002032
+#define VMCS_ENCLV_EXIT_BITMAP			0x00002036
 /* 64-bit read-only fields */
 #define VMCS_GUEST_PHYSICAL_ADDRESS		0x00002400
 /* 64-bit guest-state fields */
@@ -295,10 +302,13 @@ vmx_vmclear(paddr_t *pa)
 #define VMCS_GUEST_PDPTE2			0x0000280E
 #define VMCS_GUEST_PDPTE3			0x00002810
 #define VMCS_GUEST_BNDCFGS			0x00002812
+#define VMCS_GUEST_RTIT_CTL			0x00002814
+#define VMCS_GUEST_PKRS				0x00002818
 /* 64-bit host-state fields */
 #define VMCS_HOST_IA32_PAT			0x00002C00
 #define VMCS_HOST_IA32_EFER			0x00002C02
 #define VMCS_HOST_IA32_PERF_GLOBAL_CTRL		0x00002C04
+#define VMCS_HOST_IA32_PKRS			0x00002C06
 /* 32-bit control fields */
 #define VMCS_PINBASED_CTLS			0x00004000
 #define		PIN_CTLS_INT_EXITING		__BIT(0)
@@ -344,6 +354,9 @@ vmx_vmclear(paddr_t *pa)
 #define		EXIT_CTLS_SAVE_PREEMPT_TIMER	__BIT(22)
 #define		EXIT_CTLS_CLEAR_BNDCFGS		__BIT(23)
 #define		EXIT_CTLS_CONCEAL_PT		__BIT(24)
+#define		EXIT_CTLS_CLEAR_RTIT_CTL	__BIT(25)
+#define		EXIT_CTLS_LOAD_CET		__BIT(28)
+#define		EXIT_CTLS_LOAD_PKRS		__BIT(29)
 #define VMCS_EXIT_MSR_STORE_COUNT		0x0000400E
 #define VMCS_EXIT_MSR_LOAD_COUNT		0x00004010
 #define VMCS_ENTRY_CTLS				0x00004012
@@ -356,6 +369,9 @@ vmx_vmclear(paddr_t *pa)
 #define		ENTRY_CTLS_LOAD_EFER		__BIT(15)
 #define		ENTRY_CTLS_LOAD_BNDCFGS		__BIT(16)
 #define		ENTRY_CTLS_CONCEAL_PT		__BIT(17)
+#define		ENTRY_CTLS_LOAD_RTIT_CTL	__BIT(18)
+#define		ENTRY_CTLS_LOAD_CET		__BIT(20)
+#define		ENTRY_CTLS_LOAD_PKRS		__BIT(22)
 #define VMCS_ENTRY_MSR_LOAD_COUNT		0x00004014
 #define VMCS_ENTRY_INTR_INFO			0x00004016
 #define		INTR_INFO_VECTOR		__BITS(7,0)
@@ -396,7 +412,9 @@ vmx_vmclear(paddr_t *pa)
 #define		PROC_CTLS2_XSAVES_ENABLE	__BIT(20)
 #define		PROC_CTLS2_MODE_BASED_EXEC_EPT	__BIT(22)
 #define		PROC_CTLS2_SUBPAGE_PERMISSIONS	__BIT(23)
+#define		PROC_CTLS2_PT_USES_GPA		__BIT(24)
 #define		PROC_CTLS2_USE_TSC_SCALING	__BIT(25)
+#define		PROC_CTLS2_WAIT_PAUSE_ENABLE	__BIT(26)
 #define		PROC_CTLS2_ENCLV_EXITING	__BIT(28)
 #define VMCS_PLE_GAP				0x00004020
 #define VMCS_PLE_WINDOW				0x00004022
@@ -477,6 +495,9 @@ vmx_vmclear(paddr_t *pa)
 #define VMCS_GUEST_PENDING_DBG_EXCEPTIONS	0x00006822
 #define VMCS_GUEST_IA32_SYSENTER_ESP		0x00006824
 #define VMCS_GUEST_IA32_SYSENTER_EIP		0x00006826
+#define VMCS_GUEST_IA32_S_CET			0x00006828
+#define VMCS_GUEST_SSP				0x0000682A
+#define VMCS_GUEST_IA32_INTR_SSP_TABLE		0x0000682C
 /* Natural-Width host-state fields */
 #define VMCS_HOST_CR0				0x00006C00
 #define VMCS_HOST_CR3				0x00006C02
@@ -490,6 +511,9 @@ vmx_vmclear(paddr_t *pa)
 #define VMCS_HOST_IA32_SYSENTER_EIP		0x00006C12
 #define VMCS_HOST_RSP				0x00006C14
 #define VMCS_HOST_RIP				0x00006C16
+#define VMCS_HOST_IA32_S_CET			0x00006C18
+#define VMCS_HOST_SSP				0x00006C1A
+#define VMCS_HOST_IA32_INTR_SSP_TABLE		0x00006C1C
 
 /* VMX basic exit reasons. */
 #define VMCS_EXITCODE_EXC_NMI			0
@@ -554,6 +578,9 @@ vmx_vmclear(paddr_t *pa)
 #define VMCS_EXITCODE_PAGE_LOG_FULL		62
 #define VMCS_EXITCODE_XSAVES			63
 #define VMCS_EXITCODE_XRSTORS			64
+#define VMCS_EXITCODE_SPP			66
+#define VMCS_EXITCODE_UMWAIT			67
+#define VMCS_EXITCODE_TPAUSE			68
 
 /* -------------------------------------------------------------------------- */
 

Reply via email to