From: Liang Li Date: Mon, 29 Jun 2015 21:27:16 +0000 (+0800) Subject: nested EPT: fix the handling of nested EPT X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~2976 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=71bb7304e7a7a35ea6df4b0cedebc35028e4c159;p=xen.git nested EPT: fix the handling of nested EPT 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 Signed-off-by: Yang Zhang Reported-by: Tim Deegan Reviewed-by: Tim Deegan --- diff --git a/xen/arch/x86/mm/p2m-ept.c b/xen/arch/x86/mm/p2m-ept.c index 5133eb6d45..a28c6eb0b6 100644 --- a/xen/arch/x86/mm/p2m-ept.c +++ b/xen/arch/x86/mm/p2m-ept.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -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 diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c index 6b39733d2e..a9e4c26d8a 100644 --- a/xen/arch/x86/mm/p2m.c +++ b/xen/arch/x86/mm/p2m.c @@ -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;