Author: markj
Date: Mon Nov  2 14:00:25 2020
New Revision: 367270
URL: https://svnweb.freebsd.org/changeset/base/367270

Log:
  MFC r366834:
  vmx: Implement pmap (de)activation in C

Modified:
  stable/12/sys/amd64/vmm/intel/vmx.c
  stable/12/sys/amd64/vmm/intel/vmx.h
  stable/12/sys/amd64/vmm/intel/vmx_genassym.c
  stable/12/sys/amd64/vmm/intel/vmx_support.S
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/amd64/vmm/intel/vmx.c
==============================================================================
--- stable/12/sys/amd64/vmm/intel/vmx.c Mon Nov  2 10:44:29 2020        
(r367269)
+++ stable/12/sys/amd64/vmm/intel/vmx.c Mon Nov  2 14:00:25 2020        
(r367270)
@@ -2822,7 +2822,6 @@ vmx_exit_inst_error(struct vmxctx *vmxctx, int rc, str
        switch (rc) {
        case VMX_VMRESUME_ERROR:
        case VMX_VMLAUNCH_ERROR:
-       case VMX_INVEPT_ERROR:
                vmexit->u.vmx.inst_type = rc;
                break;
        default:
@@ -2927,6 +2926,29 @@ vmx_dr_leave_guest(struct vmxctx *vmxctx)
        write_rflags(read_rflags() | vmxctx->host_tf);
 }
 
+static __inline void
+vmx_pmap_activate(struct vmx *vmx, pmap_t pmap)
+{
+       long eptgen;
+       int cpu;
+
+       cpu = curcpu;
+
+       CPU_SET_ATOMIC(cpu, &pmap->pm_active);
+       eptgen = atomic_load_long(&pmap->pm_eptgen);
+       if (eptgen != vmx->eptgen[cpu]) {
+               vmx->eptgen[cpu] = eptgen;
+               invept(INVEPT_TYPE_SINGLE_CONTEXT,
+                   (struct invept_desc){ .eptp = vmx->eptp, ._res = 0 });
+       }
+}
+
+static __inline void
+vmx_pmap_deactivate(struct vmx *vmx, pmap_t pmap)
+{
+       CPU_CLR_ATOMIC(curcpu, &pmap->pm_active);
+}
+
 static int
 vmx_run(void *arg, int vcpu, register_t rip, pmap_t pmap,
     struct vm_eventinfo *evinfo)
@@ -3075,11 +3097,19 @@ vmx_run(void *arg, int vcpu, register_t rip, pmap_t pm
                 */
                vmx_msr_guest_enter_tsc_aux(vmx, vcpu);
 
-               vmx_run_trace(vmx, vcpu);
                vmx_dr_enter_guest(vmxctx);
+
+               /*
+                * Mark the EPT as active on this host CPU and invalidate
+                * EPTP-tagged TLB entries if required.
+                */
+               vmx_pmap_activate(vmx, pmap);
+
+               vmx_run_trace(vmx, vcpu);
                rc = vmx_enter_guest(vmxctx, vmx, launched);
-               vmx_dr_leave_guest(vmxctx);
 
+               vmx_pmap_deactivate(vmx, pmap);
+               vmx_dr_leave_guest(vmxctx);
                vmx_msr_guest_exit_tsc_aux(vmx, vcpu);
 
                bare_lgdt(&gdtr);

Modified: stable/12/sys/amd64/vmm/intel/vmx.h
==============================================================================
--- stable/12/sys/amd64/vmm/intel/vmx.h Mon Nov  2 10:44:29 2020        
(r367269)
+++ stable/12/sys/amd64/vmm/intel/vmx.h Mon Nov  2 14:00:25 2020        
(r367270)
@@ -142,7 +142,6 @@ CTASSERT((offsetof(struct vmx, pir_desc[0]) & 63) == 0
 #define        VMX_GUEST_VMEXIT        0
 #define        VMX_VMRESUME_ERROR      1
 #define        VMX_VMLAUNCH_ERROR      2
-#define        VMX_INVEPT_ERROR        3
 int    vmx_enter_guest(struct vmxctx *ctx, struct vmx *vmx, int launched);
 void   vmx_call_isr(uintptr_t entry);
 

Modified: stable/12/sys/amd64/vmm/intel/vmx_genassym.c
==============================================================================
--- stable/12/sys/amd64/vmm/intel/vmx_genassym.c        Mon Nov  2 10:44:29 
2020        (r367269)
+++ stable/12/sys/amd64/vmm/intel/vmx_genassym.c        Mon Nov  2 14:00:25 
2020        (r367270)
@@ -70,17 +70,12 @@ ASSYM(VMXCTX_HOST_RSP, offsetof(struct vmxctx, host_rs
 ASSYM(VMXCTX_HOST_RBX, offsetof(struct vmxctx, host_rbx));
 
 ASSYM(VMXCTX_INST_FAIL_STATUS, offsetof(struct vmxctx, inst_fail_status));
-ASSYM(VMXCTX_PMAP, offsetof(struct vmxctx, pmap));
 
-ASSYM(VMX_EPTGEN, offsetof(struct vmx, eptgen));
-ASSYM(VMX_EPTP, offsetof(struct vmx, eptp));
-
 ASSYM(VM_FAIL_INVALID, VM_FAIL_INVALID);
 ASSYM(VM_FAIL_VALID,   VM_FAIL_VALID);
 ASSYM(VMX_GUEST_VMEXIT, VMX_GUEST_VMEXIT);
 ASSYM(VMX_VMRESUME_ERROR, VMX_VMRESUME_ERROR);
 ASSYM(VMX_VMLAUNCH_ERROR, VMX_VMLAUNCH_ERROR);
-ASSYM(VMX_INVEPT_ERROR, VMX_INVEPT_ERROR);
 
 ASSYM(PC_CPUID, offsetof(struct pcpu, pc_cpuid));
 

Modified: stable/12/sys/amd64/vmm/intel/vmx_support.S
==============================================================================
--- stable/12/sys/amd64/vmm/intel/vmx_support.S Mon Nov  2 10:44:29 2020        
(r367269)
+++ stable/12/sys/amd64/vmm/intel/vmx_support.S Mon Nov  2 14:00:25 2020        
(r367270)
@@ -148,33 +148,6 @@ ENTRY(vmx_enter_guest)
         */
        VMX_HOST_SAVE
 
-       /*
-        * Activate guest pmap on this cpu.
-        */
-       movq    VMXCTX_PMAP(%rdi), %r11
-       movl    PCPU(CPUID), %eax
-       LK btsl %eax, PM_ACTIVE(%r11)
-
-       /*
-        * If 'vmx->eptgen[curcpu]' is not identical to 'pmap->pm_eptgen'
-        * then we must invalidate all mappings associated with this EPTP.
-        */
-       movq    PM_EPTGEN(%r11), %r10
-       cmpq    %r10, VMX_EPTGEN(%rsi, %rax, 8)
-       je      guest_restore
-
-       /* Refresh 'vmx->eptgen[curcpu]' */
-       movq    %r10, VMX_EPTGEN(%rsi, %rax, 8)
-
-       /* Setup the invept descriptor on the host stack */
-       mov     %rsp, %r11
-       movq    VMX_EPTP(%rsi), %rax
-       movq    %rax, -16(%r11)
-       movq    $0x0, -8(%r11)
-       mov     $0x1, %eax              /* Single context invalidate */
-       invept  -16(%r11), %rax
-       jbe     invept_error            /* Check invept instruction error */
-
 guest_restore:
        movl    %edx, %r8d
        cmpb    $0, guest_l1d_flush_sw(%rip)
@@ -208,10 +181,6 @@ do_launch:
        movl    $VMX_VMLAUNCH_ERROR, %eax
        jmp     decode_inst_error
 
-invept_error:
-       movl    $VMX_INVEPT_ERROR, %eax
-       jmp     decode_inst_error
-
 decode_inst_error:
        movl    $VM_FAIL_VALID, %r11d
        jz      inst_error
@@ -224,13 +193,6 @@ inst_error:
         * it as a scratch register beyond this point.
         */
 
-       /*
-        * Deactivate guest pmap from this cpu.
-        */
-       movq    VMXCTX_PMAP(%rdi), %r11
-       movl    PCPU(CPUID), %r10d
-       LK btrl %r10d, PM_ACTIVE(%r11)
-
        VMX_HOST_RESTORE
        VLEAVE
        ret
@@ -248,13 +210,6 @@ vmx_exit_guest_flush_rsb:
         */
        VMX_GUEST_SAVE
 
-       /*
-        * Deactivate guest pmap from this cpu.
-        */
-       movq    VMXCTX_PMAP(%rdi), %r11
-       movl    PCPU(CPUID), %r10d
-       LK btrl %r10d, PM_ACTIVE(%r11)
-
        VMX_HOST_RESTORE
 
        VMX_GUEST_CLOBBER
@@ -290,13 +245,6 @@ vmx_exit_guest:
         * Save guest state that is not automatically saved in the vmcs.
         */
        VMX_GUEST_SAVE
-
-       /*
-        * Deactivate guest pmap from this cpu.
-        */
-       movq    VMXCTX_PMAP(%rdi), %r11
-       movl    PCPU(CPUID), %r10d
-       LK btrl %r10d, PM_ACTIVE(%r11)
 
        VMX_HOST_RESTORE
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to