]> xenbits.xensource.com Git - people/vhanquez/xen.git/commitdiff
x86: tighten filter on ptwr_do_page_fault()
authorKeir Fraser <keir@xen.org>
Mon, 29 Nov 2010 14:46:43 +0000 (14:46 +0000)
committerKeir Fraser <keir@xen.org>
Mon, 29 Nov 2010 14:46:43 +0000 (14:46 +0000)
Even not-so-recent Linux may, due to post-2.6.18 changes to the
process creation code, cause quite a number (depending on environment
and argument size) of faulting accesses to user space originating from
kernel mode. Generally those happen for non-present pages and would
lead to a nested page fault from guest_get_eff_l1e(). They can be
avoided by checking for PFEC_page_present as long as the guest isn't
running on shadow page tables.

Signed-off-by: Jan Beulich <jbeulich@novell.com>
Signed-off-by: Keir Fraser <keir@xen.org>
xen-unstable changeset:   22449:3afb5ecbf69f
xen-unstable date:        Mon Nov 29 14:40:55 2010 +0000

xen/arch/x86/traps.c

index 4f15627890914c4b4884d59bae35bc04eb6a01cc..a4fd8c6b28ec7e58ebc095ffd06afd3494206d43 100644 (file)
@@ -1237,13 +1237,20 @@ static int fixup_page_fault(unsigned long addr, struct cpu_user_regs *regs)
     }
 
     if ( VM_ASSIST(d, VMASST_TYPE_writable_pagetables) &&
-         guest_kernel_mode(v, regs) &&
-         /* Do not check if access-protection fault since the page may 
-            legitimately be not present in shadow page tables */
-         ((regs->error_code & (PFEC_write_access|PFEC_reserved_bit)) ==
-          PFEC_write_access) &&
-         ptwr_do_page_fault(v, addr, regs) )
-        return EXCRET_fault_fixed;
+         guest_kernel_mode(v, regs) )
+    {
+        unsigned int mbs = PFEC_write_access;
+        unsigned int mbz = PFEC_reserved_bit | PFEC_insn_fetch;
+
+        /* Do not check if access-protection fault since the page may 
+           legitimately be not present in shadow page tables */
+        if ( !paging_mode_enabled(d) )
+            mbs |= PFEC_page_present;
+
+        if ( ((regs->error_code & (mbs | mbz)) == mbs) &&
+             ptwr_do_page_fault(v, addr, regs) )
+            return EXCRET_fault_fixed;
+    }
 
     /* For non-external shadowed guests, we fix up both their own 
      * pagefaults and Xen's, since they share the pagetables. */