nested EPT: fix the handling of nested EPT
authorLiang Li <liang.z.li@intel.com>
Mon, 29 Jun 2015 21:27:16 +0000 (05:27 +0800)
committerIan Campbell <ian.campbell@citrix.com>
Tue, 30 Jun 2015 14:00:54 +0000 (15:00 +0100)
If the host EPT entry is changed, the nested EPT should be updated.
the current code does not do this, and it's wrong.
I have tested this patch, the L2 guest can boot and run as normal.

Signed-off-by: Liang Li <liang.z.li@intel.com>
Signed-off-by: Yang Zhang <yang.z.zhang@intel.com>
Reported-by: Tim Deegan <tim@xen.org>
Reviewed-by: Tim Deegan <tim@xen.org>
xen/arch/x86/mm/p2m-ept.c
xen/arch/x86/mm/p2m.c

index 5133eb6d456f622f801a0337a959f653f284d7c3..a28c6eb0b61ef15bd15349a7d672ed0a80304e96 100644 (file)
@@ -26,6 +26,7 @@
 #include <asm/p2m.h>
 #include <asm/hvm/vmx/vmx.h>
 #include <asm/hvm/vmx/vmcs.h>
+#include <asm/hvm/nestedhvm.h>
 #include <xen/iommu.h>
 #include <asm/mtrr.h>
 #include <asm/hvm/cacheattr.h>
@@ -1076,6 +1077,9 @@ void ept_sync_domain(struct p2m_domain *p2m)
 
     ASSERT(local_irq_is_enabled());
 
+    if ( nestedhvm_enabled(d) && !p2m_is_nestedp2m(p2m) )
+        p2m_flush_nestedp2m(d);
+
     /*
      * Flush active cpus synchronously. Flush others the next time this domain
      * is scheduled onto them. We accept the race of other CPUs adding to
index 6b39733d2e96fcdbbbb26ab36396faef07f3a244..a9e4c26d8aeffbeac95bc4d919057711ea5692c5 100644 (file)
@@ -1742,6 +1742,12 @@ p2m_flush_table(struct p2m_domain *p2m)
     ASSERT(page_list_empty(&p2m->pod.super));
     ASSERT(page_list_empty(&p2m->pod.single));
 
+    if ( p2m->np2m_base == P2M_BASE_EADDR )
+    {
+        p2m_unlock(p2m);
+        return;
+    }
+
     /* This is no longer a valid nested p2m for any address space */
     p2m->np2m_base = P2M_BASE_EADDR;