x86: Fix get_page_from_l1e() and avoid host crash on 'xm save'.
authorKeir Fraser <keir@xensource.com>
Fri, 19 Oct 2007 13:30:10 +0000 (14:30 +0100)
committerKeir Fraser <keir@xensource.com>
Fri, 19 Oct 2007 13:30:10 +0000 (14:30 +0100)
Signed-off-by: Keir Fraser <keir@xensource.com>
xen/arch/x86/mm.c
xen/common/rangeset.c

index d25fba76741bcc3260ec1261df3e655b409e60e2..76036da60712b3b0259ad4fae24e4677c7662dd4 100644 (file)
@@ -152,7 +152,8 @@ unsigned long total_pages;
 #define PAGE_CACHE_ATTRS (_PAGE_PAT|_PAGE_PCD|_PAGE_PWT)
 
 #define l1_disallow_mask(d)                                     \
-    ((rangeset_is_empty((d)->iomem_caps) &&                     \
+    ((d != dom_io) &&                                           \
+     (rangeset_is_empty((d)->iomem_caps) &&                     \
       rangeset_is_empty((d)->arch.ioport_caps)) ?               \
      L1_DISALLOW_MASK : (L1_DISALLOW_MASK & ~PAGE_CACHE_ATTRS))
 
@@ -619,17 +620,15 @@ get_page_from_l1e(
 {
     unsigned long mfn = l1e_get_pfn(l1e);
     struct page_info *page = mfn_to_page(mfn);
-    unsigned int disallow_mask;
     int okay;
 
     if ( !(l1e_get_flags(l1e) & _PAGE_PRESENT) )
         return 1;
 
-    disallow_mask = l1_disallow_mask((d == dom_io) ? current->domain : d);
-    if ( unlikely(l1e_get_flags(l1e) & disallow_mask) )
+    if ( unlikely(l1e_get_flags(l1e) & l1_disallow_mask(d)) )
     {
         MEM_LOG("Bad L1 flags %x",
-                l1e_get_flags(l1e) & disallow_mask);
+                l1e_get_flags(l1e) & l1_disallow_mask(d));
         return 0;
     }
 
index 79a09f894e57e06e431aed95ec2b5cf98b827226..5c1b73cefeb9fe38bbd36a41b7993e3f96a67f60 100644 (file)
@@ -263,7 +263,7 @@ int rangeset_contains_singleton(
 int rangeset_is_empty(
     struct rangeset *r)
 {
-    return list_empty(&r->range_list);
+    return ((r == NULL) || list_empty(&r->range_list));
 }
 
 struct rangeset *rangeset_new(