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

[Xen-devel] RE: [PATCH] shadow-fixes.patch



Re #1, below: can you provide a call stack when snapshot_entry_match faults?
Seems like it's only ever called from __shadow_out_of_sync(), and that
function
tests for possible faulting conditions before invoking
snapshot_entry_match().
I'm not sure I see how you could be seeing this.

Re #2: I think the bug is that external mode should not set the
SHM_write_all
flag...  I'll commit that fix shortly.

Michael  

-----Original Message-----
From: Arun Sharma [mailto:arun.sharma@xxxxxxxxx] 
Sent: Saturday, May 28, 2005 3:34 PM
To: Ian Pratt; Keir Fraser
Cc: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [PATCH] shadow-fixes.patch

1. Indexing guest_pt[] can fault. Need to use __copy_from_user. This was
preventing FreeBSD 5.4 and RHEL3 install kernel from booting.

2. Read-only page tables should remain read only on a VMX domain. Linux 2.6
   depends on getting a write fault on a L2 page table page.

Signed-off-by: Arun Sharma <arun.sharma@xxxxxxxxx>

--- 1.114/xen/arch/x86/shadow.c 2005-05-25 03:36:57 -07:00
+++ edited/xen/arch/x86/shadow.c        2005-05-28 15:19:23 -07:00
@@ -1906,7 +1906,7 @@
     unsigned long gpfn, unsigned index)
 {
     unsigned long smfn = __shadow_status(d, gpfn, PGT_snapshot);
-    l1_pgentry_t *snapshot; // could be L1s or L2s or ...
+    l1_pgentry_t *snapshot, gpte; // could be L1s or L2s or ...
     int entries_match;
 
     perfc_incrc(snapshot_entry_matches_calls);
@@ -1916,10 +1916,14 @@
 
     snapshot = map_domain_mem(smfn << PAGE_SHIFT);
 
+    if (__copy_from_user(&gpte, &guest_pt[index],
+                         sizeof(gpte)))
+        return 0;
+
     // This could probably be smarter, but this is sufficent for
     // our current needs.
     //
-    entries_match = !l1e_has_changed(&guest_pt[index], &snapshot[index],
+    entries_match = !l1e_has_changed(&gpte, &snapshot[index],
                                      PAGE_FLAG_MASK);
 
     unmap_domain_mem(snapshot);
@@ -2600,7 +2604,8 @@
 
         if ( unlikely(!(l1e_get_flags(gpte) & _PAGE_RW)) )
         {
-            if ( shadow_mode_page_writable(d, l1e_get_pfn(gpte)) )
+            if ( shadow_mode_page_writable(d, l1e_get_pfn(gpte)) 
+                && !shadow_mode_external(d))
             {
                 allow_writes = 1;
                 l1e_add_flags(&gpte, _PAGE_RW);


_______________________________________________
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®.