[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] EPT: refine epte_present test


  • To: xen-devel@xxxxxxxxxxxxxxxxxxx
  • From: Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx>
  • Date: Thu, 12 Jan 2012 15:31:28 -0500
  • Cc: andres@xxxxxxxxxxxxxx, tim@xxxxxxx, adin@xxxxxxxxxxxxxx
  • Delivery-date: Thu, 12 Jan 2012 20:27:52 +0000
  • Domainkey-signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=content-type :mime-version:content-transfer-encoding:subject:message-id:date :from:to:cc; q=dns; s=lagarcavilla.org; b=NrBbWFicBp7OTuQxa3X3EL CATNCIRY8fZtqZedgiQAnk8DLrgJxP6y1baqrlkcg+7Wbq7j1ryX9iakSrW+n3LG A9g1bNjh4rFVgk2Kdi1dMtGeqXmompPRk9+BP7iU2hLnKB8KKELlUZ/z+wUHLNLa lKpWQuulL92HGH0OOyU6Y=
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>

 xen/arch/x86/mm/p2m-ept.c |  25 +++++++++++++++++++++++--
 1 files changed, 23 insertions(+), 2 deletions(-)


The current test for a present ept entry checks for a permission bit
to be set.

While this is valid in contexts in which we want to know whether an entry
will fault, it is not correct when it comes to testing whether an entry is
valid. Specifically, in the ept_change_entry_type_page function which is
used to set entries to the log dirty type.

In combination with a p2m access type like n or n2rwx, log dirty will not be
set for ept entries for which it should.

Signed-off-by: Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx>
Signed-off-by: Adin Scannell <adin@xxxxxxxxxxx>

diff -r e7028b298fe3 -r fa59531b6daa xen/arch/x86/mm/p2m-ept.c
--- a/xen/arch/x86/mm/p2m-ept.c
+++ b/xen/arch/x86/mm/p2m-ept.c
@@ -39,7 +39,8 @@
 #define atomic_write_ept_entry(__pepte, __epte)                     \
     write_atomic(&(__pepte)->epte, (__epte).epte)
 
-#define is_epte_present(ept_entry)      ((ept_entry)->epte & 0x7)
+#define epte_permissions(ept_entry)     ((ept_entry)->epte & 0x7)
+#define is_epte_present(ept_entry)      (!!(epte_permissions(ept_entry)))
 #define is_epte_superpage(ept_entry)    ((ept_entry)->sp)
 
 /* Non-ept "lock-and-check" wrapper */
@@ -139,6 +140,26 @@ static void ept_p2m_type_to_flags(ept_en
     
 }
 
+static inline bool_t is_epte_valid(ept_entry_t *e)
+{
+    ept_entry_t rights = { .epte = 0 };
+
+    /* Not valid if empty */
+    if (e->epte == 0) return 0;
+
+    /* Not valid if mfn not valid */
+    if ( !mfn_valid(e->mfn) ) return 0;
+
+    /* Not valid if rights different from those of 
+     * its p2m type and access combination */
+    ept_p2m_type_to_flags(&rights, e->sa_p2mt, e->access);
+    if ( epte_permissions(&rights) != epte_permissions(e) )
+        return 0;
+
+    return 1;
+}
+
+
 #define GUEST_TABLE_MAP_FAILED  0
 #define GUEST_TABLE_NORMAL_PAGE 1
 #define GUEST_TABLE_SUPER_PAGE  2
@@ -777,7 +798,7 @@ static void ept_change_entry_type_page(m
 
     for ( int i = 0; i < EPT_PAGETABLE_ENTRIES; i++ )
     {
-        if ( !is_epte_present(epte + i) )
+        if ( !is_epte_valid(epte + i) )
             continue;
 
         if ( (ept_page_level > 0) && !is_epte_superpage(epte + i) )

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.