Hide WAITPKG cpu feature from vmm(4) guests.
authordv <dv@openbsd.org>
Tue, 10 Jan 2023 01:09:14 +0000 (01:09 +0000)
committerdv <dv@openbsd.org>
Tue, 10 Jan 2023 01:09:14 +0000 (01:09 +0000)
Alder Lake and similar-era Intel platforms introduced new userland
wait instructions. Since vmm was passing this cpuid bit into guests,
some would attempt TPAUSE instructions and trigger invalid instruction
exceptions because VMX requires additional configuration to support
emulation.

This also adds WAITPKG to i386 and amd64 cpu feature identification.

Input from anton@, cheloha@, and guenther@. Tested by jmatthew@.

OK deraadt.

sys/arch/amd64/amd64/identcpu.c
sys/arch/amd64/include/specialreg.h
sys/arch/amd64/include/vmmvar.h
sys/arch/i386/i386/machdep.c
sys/arch/i386/include/specialreg.h

index 001a437..3d650a0 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: identcpu.c,v 1.129 2022/09/22 04:36:38 robert Exp $   */
+/*     $OpenBSD: identcpu.c,v 1.130 2023/01/10 01:09:14 dv Exp $       */
 /*     $NetBSD: identcpu.c,v 1.1 2003/04/26 18:39:28 fvdl Exp $        */
 
 /*
@@ -208,6 +208,7 @@ const struct {
        { SEFF0ECX_AVX512VBMI,  "AVX512VBMI" },
        { SEFF0ECX_UMIP,        "UMIP" },
        { SEFF0ECX_PKU,         "PKU" },
+       { SEFF0ECX_WAITPKG,     "WAITPKG" },
 }, cpu_seff0_edxfeatures[] = {
        { SEFF0EDX_AVX512_4FNNIW, "AVX512FNNIW" },
        { SEFF0EDX_AVX512_4FMAPS, "AVX512FMAPS" },
index cbde6cf..14010a5 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: specialreg.h,v 1.95 2022/10/24 00:56:33 cheloha Exp $ */
+/*     $OpenBSD: specialreg.h,v 1.96 2023/01/10 01:09:14 dv Exp $      */
 /*     $NetBSD: specialreg.h,v 1.1 2003/04/26 18:39:48 fvdl Exp $      */
 /*     $NetBSD: x86/specialreg.h,v 1.2 2003/04/25 21:54:30 fvdl Exp $  */
 
 #define SEFF0ECX_AVX512VBMI    0x00000002 /* AVX-512 vector bit inst */
 #define SEFF0ECX_UMIP          0x00000004 /* UMIP support */
 #define SEFF0ECX_PKU           0x00000008 /* Page prot keys for user mode */
+#define SEFF0ECX_WAITPKG       0x00000010 /* UMONITOR/UMWAIT/TPAUSE insns */
 /* SEFF EDX bits */
 #define SEFF0EDX_AVX512_4FNNIW 0x00000004 /* AVX-512 neural network insns */
 #define SEFF0EDX_AVX512_4FMAPS 0x00000008 /* AVX-512 mult accum single prec */
index 6b4802a..7897c77 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: vmmvar.h,v 1.85 2022/12/26 23:50:20 dv Exp $  */
+/*     $OpenBSD: vmmvar.h,v 1.86 2023/01/10 01:09:14 dv Exp $  */
 /*
  * Copyright (c) 2014 Mike Larkin <mlarkin@openbsd.org>
  *
@@ -672,7 +672,9 @@ struct vm_mprotect_ept_params {
     SEFF0EBX_AVX512IFMA | SEFF0EBX_AVX512PF | \
     SEFF0EBX_AVX512ER | SEFF0EBX_AVX512CD | \
     SEFF0EBX_AVX512BW | SEFF0EBX_AVX512VL)
-#define VMM_SEFF0ECX_MASK ~(SEFF0ECX_AVX512VBMI)
+
+/* ECX mask contains the bits to include */
+#define VMM_SEFF0ECX_MASK (SEFF0ECX_PREFETCHWT1 | SEFF0ECX_UMIP | SEFF0ECX_PKU)
 
 /* EDX mask contains the bits to include */
 #define VMM_SEFF0EDX_MASK (SEFF0EDX_MD_CLEAR)
index 708893b..43ab182 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: machdep.c,v 1.660 2023/01/10 01:01:18 cheloha Exp $   */
+/*     $OpenBSD: machdep.c,v 1.661 2023/01/10 01:09:14 dv Exp $        */
 /*     $NetBSD: machdep.c,v 1.214 1996/11/10 03:16:17 thorpej Exp $    */
 
 /*-
@@ -1038,6 +1038,7 @@ const struct cpu_cpuid_feature cpu_seff0_ecxfeatures[] = {
        { SEFF0ECX_UMIP,        "UMIP" },
        { SEFF0ECX_AVX512VBMI,  "AVX512VBMI" },
        { SEFF0ECX_PKU,         "PKU" },
+       { SEFF0ECX_WAITPKG,     "WAITPKG" },
 };
 
 const struct cpu_cpuid_feature cpu_seff0_edxfeatures[] = {
index 392b4ff..22ee7ab 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: specialreg.h,v 1.80 2022/08/20 23:33:53 daniel Exp $  */
+/*     $OpenBSD: specialreg.h,v 1.81 2023/01/10 01:09:14 dv Exp $      */
 /*     $NetBSD: specialreg.h,v 1.7 1994/10/27 04:16:26 cgd Exp $       */
 
 /*-
 #define SEFF0ECX_AVX512VBMI    0x00000002 /* AVX-512 vector bit inst */
 #define SEFF0ECX_UMIP          0x00000004 /* UMIP support */
 #define SEFF0ECX_PKU           0x00000008 /* Page prot keys for user mode */
+#define SEFF0ECX_WAITPKG       0x00000010 /* UMONITOR/UMWAIT/TPAUSE insns */
 /* SEFF EDX bits */
 #define SEFF0EDX_AVX512_4FNNIW 0x00000004 /* AVX-512 neural network insns */
 #define SEFF0EDX_AVX512_4FMAPS 0x00000008 /* AVX-512 mult accum single prec */