x86/nested-svm: Update the paging mode on VMRUN and VMEXIT emulation.
authorTim Deegan <tim@xen.org>
Thu, 4 Oct 2012 13:20:50 +0000 (14:20 +0100)
committerTim Deegan <tim@xen.org>
Thu, 4 Oct 2012 13:20:50 +0000 (14:20 +0100)
This allows Xen to walk the l1 hypervisor's shadow pagetable
correctly.  Not needed for hap-on-hap guests because they are handled
at lookup time.  Problem found with 64bit Win7 and 32bit XPMode where Win7
switches forth and back between long mode and PAE legacy pagetables.

Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
[Adjusted to update in all cases where the l1 vmm uses shadows]
Signed-off-by: Tim Deegan <tim@xen.org>
Committed-by: Tim Deegan <tim@xen.org>
xen/arch/x86/hvm/svm/nestedsvm.c

index b56f92e3d3faa19839441ebba374787b7cf40582..9f69bcc70f9f89132730ab5c205c48f12d9a907b 100644 (file)
@@ -741,6 +741,10 @@ nsvm_vcpu_vmrun(struct vcpu *v, struct cpu_user_regs *regs)
         return 1;
     }
 
+    /* If l1 guest uses shadow paging, update the paging mode. */
+    if (!nestedhvm_paging_mode_hap(v))
+        paging_update_paging_modes(v);
+
     nv->nv_vmswitch_in_progress = 0;
     return 0;
 }
@@ -1408,6 +1412,10 @@ nestedsvm_vcpu_vmexit(struct vcpu *v, struct cpu_user_regs *regs,
      */
     rc = nhvm_vcpu_vmexit(v, regs, exitcode);
 
+    /* If l1 guest uses shadow paging, update the paging mode. */
+    if (!nestedhvm_paging_mode_hap(v))
+        paging_update_paging_modes(v);
+
     nv->nv_vmswitch_in_progress = 0;
 
     if (rc)