untrusted comment: verify with openbsd-65-base.pub
RWSZaRmt1LEQTxCAUbFy7z1u1UAfBp4dYpAzG/TZk7NhKL8AuARZ862Pbjn0VrWX/JDT+QPYAQFneyBoI5mEq5O7k9YV2EVM4w0=

OpenBSD 6.5 errata 003, May 29, 2019:

Intel CPUs have a cross privilege side-channel attack (MDS).

Apply by doing:
   signify -Vep /etc/signify/openbsd-65-base.pub -x 003_mds.patch.sig \
       -m - | (cd /usr/src && patch -p0)

And then rebuild and install a new kernel:
   fw_update
   KK=`sysctl -n kern.osversion | cut -d# -f1`
   cd /usr/src/sys/arch/`machine`/compile/$KK
   make obj
   make config
   make
   make install

Index: sys/arch/amd64/amd64/cpu.c
===================================================================
RCS file: /cvs/src/sys/arch/amd64/amd64/cpu.c,v
retrieving revision 1.134
diff -u -p -r1.134 cpu.c
--- sys/arch/amd64/amd64/cpu.c  25 Mar 2019 20:29:25 -0000      1.134
+++ sys/arch/amd64/amd64/cpu.c  26 May 2019 02:29:54 -0000
@@ -146,6 +146,7 @@ struct cpu_softc {

void   replacesmap(void);
void   replacemeltdown(void);
+void   replacemds(void);

extern long _stac;
extern long _clac;
@@ -190,6 +191,129 @@ replacemeltdown(void)
       splx(s);
}

+void
+replacemds(void)
+{
+       static int replacedone = 0;
+       extern long mds_handler_bdw, mds_handler_ivb, mds_handler_skl;
+       extern long mds_handler_skl_sse, mds_handler_skl_avx;
+       extern long mds_handler_silvermont, mds_handler_knights;
+       struct cpu_info *ci = &cpu_info_primary;
+       CPU_INFO_ITERATOR cii;
+       void *handler = NULL, *vmm_handler = NULL;
+       const char *type;
+       int has_verw, s;
+
+       /* ci_mds_tmp must be 32byte aligned for AVX instructions */
+       CTASSERT((offsetof(struct cpu_info, ci_mds_tmp) -
+                 offsetof(struct cpu_info, ci_PAGEALIGN)) % 32 == 0);
+
+       if (replacedone)
+               return;
+       replacedone = 1;
+
+       if (strcmp(cpu_vendor, "GenuineIntel") != 0 ||
+           ((ci->ci_feature_sefflags_edx & SEFF0EDX_ARCH_CAP) &&
+            (rdmsr(MSR_ARCH_CAPABILITIES) & ARCH_CAPABILITIES_MDS_NO))) {
+               /* Unaffected, nop out the handling code */
+               has_verw = 0;
+       } else if (ci->ci_feature_sefflags_edx & SEFF0EDX_MD_CLEAR) {
+               /* new firmware, use VERW */
+               has_verw = 1;
+       } else {
+               int family = ci->ci_family;
+               int model = ci->ci_model;
+               int stepping = CPUID2STEPPING(ci->ci_signature);
+
+               has_verw = 0;
+               if (family == 0x6 &&
+                   (model == 0x2e || model == 0x1e || model == 0x1f ||
+                    model == 0x1a || model == 0x2f || model == 0x25 ||
+                    model == 0x2c || model == 0x2d || model == 0x2a ||
+                    model == 0x3e || model == 0x3a)) {
+                       /* Nehalem, SandyBridge, IvyBridge */
+                       handler = vmm_handler = &mds_handler_ivb;
+                       type = "IvyBridge";
+                       CPU_INFO_FOREACH(cii, ci) {
+                               ci->ci_mds_buf = malloc(672, M_DEVBUF,
+                                   M_WAITOK);
+                               memset(ci->ci_mds_buf, 0, 16);
+                       }
+               } else if (family == 0x6 &&
+                   (model == 0x3f || model == 0x3c || model == 0x45 ||
+                    model == 0x46 || model == 0x56 || model == 0x4f ||
+                    model == 0x47 || model == 0x3d)) {
+                       /* Haswell and Broadwell */
+                       handler = vmm_handler = &mds_handler_bdw;
+                       type = "Broadwell";
+                       CPU_INFO_FOREACH(cii, ci) {
+                               ci->ci_mds_buf = malloc(1536, M_DEVBUF,
+                                   M_WAITOK);
+                       }
+               } else if (family == 0x6 &&
+                   ((model == 0x55 && stepping <= 5) || model == 0x4e ||
+                   model == 0x5e || (model == 0x8e && stepping <= 0xb) ||
+                   (model == 0x9e && stepping <= 0xc))) {
+                       /*
+                        * Skylake, KabyLake, CoffeeLake, WhiskeyLake,
+                        * CascadeLake
+                        */
+                       /* XXX mds_handler_skl_avx512 */
+                       if (xgetbv(0) & XCR0_AVX) {
+                               handler = &mds_handler_skl_avx;
+                               type = "Skylake AVX";
+                       } else {
+                               handler = &mds_handler_skl_sse;
+                               type = "Skylake SSE";
+                       }
+                       vmm_handler = &mds_handler_skl;
+                       CPU_INFO_FOREACH(cii, ci) {
+                               vaddr_t b64;
+                               b64 = (vaddr_t)malloc(6 * 1024 + 64 + 63,
+                                   M_DEVBUF, M_WAITOK);
+                               ci->ci_mds_buf = (void *)((b64 + 63) & ~63);
+                               memset(ci->ci_mds_buf, 0, 64);
+                       }
+               } else if (family == 0x6 &&
+                   (model == 0x37 || model == 0x4a || model == 0x4c ||
+                    model == 0x4d || model == 0x5a || model == 0x5d ||
+                    model == 0x6e || model == 0x65 || model == 0x75)) {
+                       /* Silvermont, Airmont */
+                       handler = vmm_handler = &mds_handler_silvermont;
+                       type = "Silvermont";
+                       CPU_INFO_FOREACH(cii, ci) {
+                               ci->ci_mds_buf = malloc(256, M_DEVBUF,
+                                   M_WAITOK);
+                               memset(ci->ci_mds_buf, 0, 16);
+                       }
+               } else if (family == 0x6 && (model == 0x85 || model == 0x57)) {
+                       handler = vmm_handler = &mds_handler_knights;
+                       type = "KnightsLanding";
+                       CPU_INFO_FOREACH(cii, ci) {
+                               vaddr_t b64;
+                               b64 = (vaddr_t)malloc(1152 + 63, M_DEVBUF,
+                                   M_WAITOK);
+                               ci->ci_mds_buf = (void *)((b64 + 63) & ~63);
+                       }
+               }
+       }
+
+       if (handler != NULL) {
+               printf("cpu0: using %s MDS workaround\n", type);
+               s = splhigh();
+               codepatch_call(CPTAG_MDS, handler);
+               codepatch_call(CPTAG_MDS_VMM, vmm_handler);
+               splx(s);
+       } else if (has_verw)
+               printf("cpu0: using %s MDS workaround\n", "VERW");
+       else {
+               s = splhigh();
+               codepatch_nop(CPTAG_MDS);
+               codepatch_nop(CPTAG_MDS_VMM);
+               splx(s);
+       }
+}
+
#ifdef MULTIPROCESSOR
int mp_cpu_start(struct cpu_info *);
void mp_cpu_start_cleanup(struct cpu_info *);
@@ -910,6 +1034,9 @@ extern vector Xsyscall_meltdown, Xsyscal
void
cpu_init_msrs(struct cpu_info *ci)
{
+       uint64_t msr;
+       int family;
+
       wrmsr(MSR_STAR,
           ((uint64_t)GSEL(GCODE_SEL, SEL_KPL) << 32) |
           ((uint64_t)GSEL(GUCODE32_SEL, SEL_UPL) << 48));
@@ -921,6 +1048,16 @@ cpu_init_msrs(struct cpu_info *ci)
       wrmsr(MSR_FSBASE, 0);
       wrmsr(MSR_GSBASE, (u_int64_t)ci);
       wrmsr(MSR_KERNELGSBASE, 0);
+
+       family = ci->ci_family;
+       if (strcmp(cpu_vendor, "GenuineIntel") == 0 &&
+           (family > 6 || (family == 6 && ci->ci_model >= 0xd)) &&
+           rdmsr_safe(MSR_MISC_ENABLE, &msr) == 0 &&
+           (msr & MISC_ENABLE_FAST_STRINGS) == 0) {
+               msr |= MISC_ENABLE_FAST_STRINGS;
+               wrmsr(MSR_MISC_ENABLE, msr);
+               DPRINTF("%s: enabled fast strings\n", ci->ci_dev->dv_xname);
+       }

       patinit(ci);
}
Index: sys/arch/amd64/amd64/genassym.cf
===================================================================
RCS file: /cvs/src/sys/arch/amd64/amd64/genassym.cf,v
retrieving revision 1.39
diff -u -p -r1.39 genassym.cf
--- sys/arch/amd64/amd64/genassym.cf    4 Oct 2018 05:00:40 -0000       1.39
+++ sys/arch/amd64/amd64/genassym.cf    26 May 2019 02:28:45 -0000
@@ -129,6 +129,8 @@ member      CPU_INFO_KERN_CR3       ci_kern_cr3
member CPU_INFO_USER_CR3       ci_user_cr3
member CPU_INFO_KERN_RSP       ci_kern_rsp
member CPU_INFO_INTR_RSP       ci_intr_rsp
+member CPU_INFO_MDS_BUF        ci_mds_buf
+member CPU_INFO_MDS_TMP        ci_mds_tmp

export CPUF_USERSEGS
export CPUF_USERXSTATE
Index: sys/arch/amd64/amd64/identcpu.c
===================================================================
RCS file: /cvs/src/sys/arch/amd64/amd64/identcpu.c,v
retrieving revision 1.110
diff -u -p -r1.110 identcpu.c
--- sys/arch/amd64/amd64/identcpu.c     20 Oct 2018 20:40:54 -0000      1.110
+++ sys/arch/amd64/amd64/identcpu.c     26 May 2019 02:28:45 -0000
@@ -207,6 +207,8 @@ const struct {
}, cpu_seff0_edxfeatures[] = {
       { SEFF0EDX_AVX512_4FNNIW, "AVX512FNNIW" },
       { SEFF0EDX_AVX512_4FMAPS, "AVX512FMAPS" },
+       { SEFF0EDX_MD_CLEAR,    "MD_CLEAR" },
+       { SEFF0EDX_TSXFA,       "TSXFA" },
       { SEFF0EDX_IBRS,        "IBRS,IBPB" },
       { SEFF0EDX_STIBP,       "STIBP" },
       { SEFF0EDX_L1DF,        "L1DF" },
Index: sys/arch/amd64/amd64/locore.S
===================================================================
RCS file: /cvs/src/sys/arch/amd64/amd64/locore.S,v
retrieving revision 1.116
diff -u -p -r1.116 locore.S
--- sys/arch/amd64/amd64/locore.S       2 Apr 2019 03:35:08 -0000       1.116
+++ sys/arch/amd64/amd64/locore.S       26 May 2019 02:28:45 -0000
@@ -644,8 +644,6 @@ IDTVEC_NOALIGN(syscall)
.Lsyscall_restore_registers:
       RET_STACK_REFILL_WITH_RCX

-       movq    TF_RDI(%rsp),%rdi
-       movq    TF_RSI(%rsp),%rsi
       movq    TF_R8(%rsp),%r8
       movq    TF_R9(%rsp),%r9
       movq    TF_R10(%rsp),%r10
@@ -653,6 +651,14 @@ IDTVEC_NOALIGN(syscall)
       movq    TF_R13(%rsp),%r13
       movq    TF_R14(%rsp),%r14
       movq    TF_R15(%rsp),%r15
+
+       CODEPATCH_START
+       movw    %ds,TF_R8(%rsp)
+       verw    TF_R8(%rsp)
+       CODEPATCH_END(CPTAG_MDS)
+
+       movq    TF_RDI(%rsp),%rdi
+       movq    TF_RSI(%rsp),%rsi
       movq    TF_RBP(%rsp),%rbp
       movq    TF_RBX(%rsp),%rbx

@@ -811,8 +817,6 @@ intr_user_exit_post_ast:
.Lintr_restore_registers:
       RET_STACK_REFILL_WITH_RCX

-       movq    TF_RDI(%rsp),%rdi
-       movq    TF_RSI(%rsp),%rsi
       movq    TF_R8(%rsp),%r8
       movq    TF_R9(%rsp),%r9
       movq    TF_R10(%rsp),%r10
@@ -820,6 +824,14 @@ intr_user_exit_post_ast:
       movq    TF_R13(%rsp),%r13
       movq    TF_R14(%rsp),%r14
       movq    TF_R15(%rsp),%r15
+
+       CODEPATCH_START
+       movw    %ds,TF_R8(%rsp)
+       verw    TF_R8(%rsp)
+       CODEPATCH_END(CPTAG_MDS)
+
+       movq    TF_RDI(%rsp),%rdi
+       movq    TF_RSI(%rsp),%rsi
       movq    TF_RBP(%rsp),%rbp
       movq    TF_RBX(%rsp),%rbx

Index: sys/arch/amd64/amd64/mainbus.c
===================================================================
RCS file: /cvs/src/sys/arch/amd64/amd64/mainbus.c,v
retrieving revision 1.45
diff -u -p -r1.45 mainbus.c
--- sys/arch/amd64/amd64/mainbus.c      22 Sep 2018 17:41:52 -0000      1.45
+++ sys/arch/amd64/amd64/mainbus.c      26 May 2019 02:28:45 -0000
@@ -73,6 +73,8 @@
#include <machine/efifbvar.h>
#endif

+void   replacemds(void);
+
int    mainbus_match(struct device *, void *, void *);
void   mainbus_attach(struct device *, struct device *, void *);

@@ -204,6 +206,9 @@ mainbus_attach(struct device *parent, st

               config_found(self, &caa, mainbus_print);
       }
+
+       /* All CPUs are attached, handle MDS */
+       replacemds();

#if NACPI > 0
       if (!acpi_hasprocfvs)
Index: sys/arch/amd64/amd64/mds.S
===================================================================
RCS file: sys/arch/amd64/amd64/mds.S
diff -N sys/arch/amd64/amd64/mds.S
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ sys/arch/amd64/amd64/mds.S  26 May 2019 02:29:38 -0000
@@ -0,0 +1,192 @@
+/*     $OpenBSD$       */
+/*
+ * Copyright (c) 2019 Philip Guenther <[email protected]>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * ASM sequences for mitigating MDS on different Intel CPU models, taken from
+ *     https://software.intel.com/security-software-guidance/insights/deep-dive-intel-analysis-microarchitectural-data-sampling
+ * and adjusted to fit OpenBSD style and kernel usage.
+ * Some naming inspired by FreeBSD's usage of these sequences.
+ */
+
+#include "assym.h"
+
+#include <machine/asm.h>
+#include <machine/specialreg.h>
+
+ENTRY(mds_handler_ivb)
+       RETGUARD_SETUP(mds_handler_ivb, r11)
+       movq    CPUVAR(MDS_BUF),%rax
+       movdqa  %xmm0,CPUVAR(MDS_TMP)
+       pxor    %xmm0,%xmm0
+
+       lfence
+       orpd    (%rax),%xmm0
+       orpd    (%rax),%xmm0
+       mfence
+       movl    $40,%ecx
+       addq    $16,%rax
+1:     movntdq %xmm0,(%rax)
+       addq    $16,%rax
+       decl    %ecx
+       jnz     1b
+       mfence
+
+       movdqa  CPUVAR(MDS_TMP),%xmm0
+       RETGUARD_CHECK(mds_handler_ivb, r11)
+       retq
+END(mds_handler_ivb)
+
+ENTRY(mds_handler_bdw)
+       RETGUARD_SETUP(mds_handler_bdw, r11)
+       movq    CPUVAR(MDS_BUF),%rax
+       movdqa  %xmm0,CPUVAR(MDS_TMP)
+       pxor    %xmm0,%xmm0
+
+       movq    %rax,%rdi
+       movq    %rax,%rsi
+       movl    $40,%ecx
+1:     movntdq %xmm0,(%rax)
+       addq    $16,%rax
+       decl    %ecx
+       jnz     1b
+       mfence
+       movl    $1536,%ecx
+       rep movsb
+       lfence
+
+       movdqa  CPUVAR(MDS_TMP),%xmm0
+       RETGUARD_CHECK(mds_handler_bdw, r11)
+       retq
+END(mds_handler_bdw)
+
+ENTRY(mds_handler_skl)
+       xorl    %ecx,%ecx
+       xgetbv
+       testb   $XCR0_AVX,%al
+       jne     mds_handler_skl_avx
+       jmp     mds_handler_skl_sse
+END(mds_handler_skl)
+
+ENTRY(mds_handler_skl_sse)
+       RETGUARD_SETUP(mds_handler_skl_sse, r11)
+       movq    CPUVAR(MDS_BUF),%rax
+       leaq    64(%rax),%rdi
+       movdqa  %xmm0,CPUVAR(MDS_TMP)
+       pxor    %xmm0,%xmm0
+
+       lfence
+       orpd    (%rax),%xmm0
+       orpd    (%rax),%xmm0
+       xorl    %eax,%eax
+1:     clflushopt      5376(%rdi,%rax,8)
+       addl    $8,%eax
+       cmpl    $8*12,%eax
+       jb      1b
+       sfence
+       movl    $6144,%ecx
+       xorl    %eax,%eax
+       rep stosb
+       mfence
+
+       movdqa  CPUVAR(MDS_TMP),%xmm0
+       RETGUARD_CHECK(mds_handler_skl_sse, r11)
+       retq
+END(mds_handler_skl_sse)
+
+ENTRY(mds_handler_skl_avx)
+       RETGUARD_SETUP(mds_handler_skl_avx, r11)
+       movq    CPUVAR(MDS_BUF),%rax
+       leaq    64(%rax),%rdi
+       vmovdqa %ymm0,CPUVAR(MDS_TMP)
+       vpxor   %ymm0,%ymm0,%ymm0
+
+       lfence
+       vorpd   (%rax),%ymm0,%ymm0
+       vorpd   (%rax),%ymm0,%ymm0
+       xorl    %eax,%eax
+1:     clflushopt      5376(%rdi,%rax,8)
+       addl    $8,%eax
+       cmpl    $8*12,%eax
+       jb      1b
+       sfence
+       movl    $6144,%ecx
+       xorl    %eax,%eax
+       rep stosb
+       mfence
+
+       vmovdqa CPUVAR(MDS_TMP),%ymm0
+       RETGUARD_CHECK(mds_handler_skl_avx, r11)
+       retq
+END(mds_handler_skl_avx)
+
+/* we don't support AVX512 yet */
+#if 0
+ENTRY(mds_handler_skl_avx512)
+       RETGUARD_SETUP(mds_handler_skl_avx512, r11)
+       movq    CPUVAR(MDS_BUF),%rax
+       leaq    64(%rax),%rdi
+       vmovdqa64       %zmm0,CPUVAR(MDS_TMP)
+       vpxor   %zmm0,%zmm0,%zmm0
+
+       lfence
+       vorpd   (%rax),%zmm0,%zmm0
+       vorpd   (%rax),%zmm0,%zmm0
+       xorl    %eax,%eax
+1:     clflushopt      5376(%rdi,%rax,8)
+       addl    $8,%eax
+       cmpl    $8*12,%eax
+       jb      1b
+       sfence
+       movl    $6144,%ecx
+       xorl    %eax,%eax
+       rep stosb
+       mfence
+
+       vmovdqa64       CPUVAR(MDS_TMP),%zmm0
+       RETGUARD_CHECK(mds_handler_skl_avx512, r11)
+       retq
+END(mds_handler_skl_avx512)
+#endif
+
+ENTRY(mds_handler_silvermont)
+       RETGUARD_SETUP(mds_handler_silvermont, r11)
+       movq    CPUVAR(MDS_BUF),%rax
+       movdqa  %xmm0,CPUVAR(MDS_TMP)
+       pxor    %xmm0,%xmm0
+
+       movl    $16,%ecx
+1:     movntdq %xmm0,(%rax)
+       addq    $16,%rax
+       decl    %ecx
+       jnz     1b
+       mfence
+
+       movdqa  CPUVAR(MDS_TMP),%xmm0
+       RETGUARD_CHECK(mds_handler_silvermont, r11)
+       retq
+END(mds_handler_silvermont)
+
+ENTRY(mds_handler_knights)
+       RETGUARD_SETUP(mds_handler_knights, r11)
+       movq    CPUVAR(MDS_BUF),%rdi
+       xorl    %eax,%eax
+       movl    $16,%ecx
+       rep stosq
+       movl    $128,%ecx
+       rep stosq
+       mfence
+       RETGUARD_CHECK(mds_handler_knights, r11)
+END(mds_handler_knights)
Index: sys/arch/amd64/amd64/vmm.c
===================================================================
RCS file: /cvs/src/sys/arch/amd64/amd64/vmm.c,v
retrieving revision 1.237
diff -u -p -r1.237 vmm.c
--- sys/arch/amd64/amd64/vmm.c  2 Apr 2019 05:06:39 -0000       1.237
+++ sys/arch/amd64/amd64/vmm.c  26 May 2019 02:28:45 -0000
@@ -6140,7 +6140,7 @@ vmm_handle_cpuid(struct vcpu *vcpu)
                       *rax = 0;       /* Highest subleaf supported */
                       *rbx = curcpu()->ci_feature_sefflags_ebx & VMM_SEFF0EBX_MASK;
                       *rcx = curcpu()->ci_feature_sefflags_ecx & VMM_SEFF0ECX_MASK;
-                       *rdx = 0;
+                       *rdx = curcpu()->ci_feature_sefflags_edx & VMM_SEFF0EDX_MASK;
               } else {
                       /* Unsupported subleaf */
                       DPRINTF("%s: function 0x07 (SEFF) unsupported subleaf "
Index: sys/arch/amd64/amd64/vmm_support.S
===================================================================
RCS file: /cvs/src/sys/arch/amd64/amd64/vmm_support.S,v
retrieving revision 1.15
diff -u -p -r1.15 vmm_support.S
--- sys/arch/amd64/amd64/vmm_support.S  20 Feb 2019 06:59:16 -0000      1.15
+++ sys/arch/amd64/amd64/vmm_support.S  26 May 2019 02:28:45 -0000
@@ -18,6 +18,7 @@
#include "assym.h"
#include <machine/param.h>
#include <machine/asm.h>
+#include <machine/codepatch.h>
#include <machine/psl.h>
#include <machine/specialreg.h>

@@ -246,6 +247,19 @@ skip_init:
       pushq   %rbp
       pushq   %rbx
       pushq   %rsi            /* Guest Regs Pointer */
+
+       /*
+        * XXX this MDS mitigation and the L1TF mitigation are believed
+        * XXX to overlap in some cases, but Intel hasn't provided the
+        * XXX information yet to make the correct choices.
+        */
+       CODEPATCH_START
+       subq    $8, %rsp
+       movw    %ds, (%rsp)
+       verw    (%rsp)
+       addq    $8, %rsp
+       CODEPATCH_END(CPTAG_MDS_VMM)
+       movq    (%rsp),%rsi     /* reload now that it's mucked with */

       movq    $VMCS_HOST_IA32_RSP, %rdi
       movq    %rsp, %rax
Index: sys/arch/amd64/conf/Makefile.amd64
===================================================================
RCS file: /cvs/src/sys/arch/amd64/conf/Makefile.amd64,v
retrieving revision 1.111
diff -u -p -r1.111 Makefile.amd64
--- sys/arch/amd64/conf/Makefile.amd64  18 Mar 2019 17:30:08 -0000      1.111
+++ sys/arch/amd64/conf/Makefile.amd64  26 May 2019 02:28:45 -0000
@@ -170,7 +170,7 @@ cleandir: clean
depend obj:

locore0.o: ${_machdir}/${_mach}/locore0.S assym.h
-mutex.o vector.o copy.o spl.o: assym.h
+mutex.o vector.o copy.o spl.o mds.o: assym.h
mptramp.o acpi_wakecode.o vmm_support.o: assym.h

hardlink-obsd:
Index: sys/arch/amd64/conf/files.amd64
===================================================================
RCS file: /cvs/src/sys/arch/amd64/conf/files.amd64,v
retrieving revision 1.101
diff -u -p -r1.101 files.amd64
--- sys/arch/amd64/conf/files.amd64     26 Oct 2018 20:26:19 -0000      1.101
+++ sys/arch/amd64/conf/files.amd64     26 May 2019 02:28:45 -0000
@@ -32,6 +32,7 @@ file  arch/amd64/amd64/cacheinfo.c
file   arch/amd64/amd64/vector.S
file   arch/amd64/amd64/copy.S
file   arch/amd64/amd64/spl.S
+file   arch/amd64/amd64/mds.S

file   arch/amd64/amd64/intr.c
file   arch/amd64/amd64/bus_space.c
Index: sys/arch/amd64/include/codepatch.h
===================================================================
RCS file: /cvs/src/sys/arch/amd64/include/codepatch.h,v
retrieving revision 1.8
diff -u -p -r1.8 codepatch.h
--- sys/arch/amd64/include/codepatch.h  4 Oct 2018 05:00:40 -0000       1.8
+++ sys/arch/amd64/include/codepatch.h  26 May 2019 02:30:04 -0000
@@ -59,6 +59,8 @@ void codepatch_disable(void);
#define CPTAG_XSAVE            5
#define CPTAG_MELTDOWN_NOP     6
#define CPTAG_PCID_SET_REUSE   7
+#define CPTAG_MDS              8
+#define CPTAG_MDS_VMM          9

/*
 * As stac/clac SMAP instructions are 3 bytes, we want the fastest
Index: sys/arch/amd64/include/cpu.h
===================================================================
RCS file: /cvs/src/sys/arch/amd64/include/cpu.h,v
retrieving revision 1.129
diff -u -p -r1.129 cpu.h
--- sys/arch/amd64/include/cpu.h        19 Jan 2019 20:45:06 -0000      1.129
+++ sys/arch/amd64/include/cpu.h        26 May 2019 02:28:45 -0000
@@ -117,6 +117,10 @@ struct cpu_info {
       u_int64_t ci_intr_rsp;  /* U<-->K trampoline stack */
       u_int64_t ci_user_cr3;  /* U-K page table */

+       /* bits for mitigating Micro-architectural Data Sampling */
+       char            ci_mds_tmp[32];         /* 32byte aligned */
+       void            *ci_mds_buf;
+
       struct pcb *ci_curpcb;
       struct pcb *ci_idle_pcb;

Index: sys/arch/amd64/include/cpu_full.h
===================================================================
RCS file: /cvs/src/sys/arch/amd64/include/cpu_full.h,v
retrieving revision 1.4
diff -u -p -r1.4 cpu_full.h
--- sys/arch/amd64/include/cpu_full.h   12 Sep 2018 07:00:51 -0000      1.4
+++ sys/arch/amd64/include/cpu_full.h   26 May 2019 02:29:44 -0000
@@ -1,6 +1,6 @@
/*     $OpenBSD: cpu_full.h,v 1.4 2018/09/12 07:00:51 guenther Exp $   */
/*
- * Copyright (c) Philip Guenther <[email protected]>
+ * Copyright (c) 2018 Philip Guenther <[email protected]>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
Index: sys/arch/amd64/include/specialreg.h
===================================================================
RCS file: /cvs/src/sys/arch/amd64/include/specialreg.h,v
retrieving revision 1.82
diff -u -p -r1.82 specialreg.h
--- sys/arch/amd64/include/specialreg.h 21 Jan 2019 01:40:35 -0000      1.82
+++ sys/arch/amd64/include/specialreg.h 26 May 2019 02:28:45 -0000
@@ -220,6 +220,8 @@
/* SEFF EDX bits */
#define SEFF0EDX_AVX512_4FNNIW 0x00000004 /* AVX-512 neural network insns */
#define SEFF0EDX_AVX512_4FMAPS 0x00000008 /* AVX-512 mult accum single prec */
+#define SEFF0EDX_MD_CLEAR      0x00000400 /* Microarch Data Clear */
+#define SEFF0EDX_TSXFA         0x00002000 /* TSX Forced Abort */
#define SEFF0EDX_IBRS          0x04000000 /* IBRS / IBPB Speculation Control */
#define SEFF0EDX_STIBP         0x08000000 /* STIBP Speculation Control */
#define SEFF0EDX_L1DF          0x10000000 /* L1D_FLUSH */
@@ -374,6 +376,7 @@
#define ARCH_CAPABILITIES_RSBA         (1 << 2)        /* RSB Alternate */
#define ARCH_CAPABILITIES_SKIP_L1DFL_VMENTRY   (1 << 3)
#define ARCH_CAPABILITIES_SSB_NO       (1 << 4)        /* Spec St Byp safe */
+#define ARCH_CAPABILITIES_MDS_NO       (1 << 5) /* microarch data-sampling */
#define MSR_FLUSH_CMD          0x10b
#define FLUSH_CMD_L1D_FLUSH    (1ULL << 0)
#define        MSR_BBL_CR_ADDR         0x116   /* PII+ only */
Index: sys/arch/amd64/include/vmmvar.h
===================================================================
RCS file: /cvs/src/sys/arch/amd64/include/vmmvar.h,v
retrieving revision 1.63
diff -u -p -r1.63 vmmvar.h
--- sys/arch/amd64/include/vmmvar.h     1 Apr 2019 12:02:43 -0000       1.63
+++ sys/arch/amd64/include/vmmvar.h     26 May 2019 02:28:45 -0000
@@ -624,6 +624,9 @@ struct vm_rwregs_params {
    SEFF0EBX_AVX512BW | SEFF0EBX_AVX512VL)
#define VMM_SEFF0ECX_MASK ~(SEFF0ECX_AVX512VBMI)

+/* EDX mask contains the bits to include */
+#define VMM_SEFF0EDX_MASK (SEFF0EDX_MD_CLEAR)
+
/*
 * Extended function flags - copy from host minus:
 * 0x80000001  EDX:RDTSCP Support