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

Re: [Xen-devel] kexec's v1 compatibility code



>>> On 08.05.15 at 17:53, <dvrabel@xxxxxxxxxx> wrote:
> On 08/05/15 14:34, Jan Beulich wrote:
>> now that we're putting Xen 4.4.x underneath an older distro (SLE11)
>> we've got to see that kexec doesn't work there. Initial investigation
>> of our kexec person revealed that the destinations attempted to be
>> written to by kexec_reloc()'s code following the is_source and
>> is_zero labels have no mappings in the kexec page tables. Comparing
>> kexec_do_load_v1() with kexec_load() I wonder whether the former
>> isn't simply lacking a call to kimage_load_segments().
> 
> I think I only tested the V1 path with 32-bit images which did not need
> page tables.
> 
> The caller of the V1 kexec_load has already loaded the segments into
> their (potentially intermediate) destination so the apparently missing
> kimage_load_segments() is deliberate.
> 
> I think kimage_build_ind() needs to call machine_kexec_add_page()
> appropriately.

Okay, iiuc IND_SOURCE and IND_DONE don't need any adjustment.
Would the below therefore look okay, or did I simply not find where
the indirection pages get handled?

Thanks, Jan

--- a/xen/common/kimage.c
+++ b/xen/common/kimage.c
@@ -863,9 +863,14 @@ int kimage_build_ind(struct kexec_image 
 {
     void *page;
     kimage_entry_t *entry;
-    int ret = 0;
+    int ret;
     paddr_t dest = KIMAGE_NO_DEST;
 
+    ret = machine_kexec_add_page(image, pfn_to_paddr(ind_mfn),
+                                 pfn_to_paddr(ind_mfn));
+    if ( ret < 0 )
+        return ret;
+
     page = map_domain_page(ind_mfn);
     if ( !page )
         return -ENOMEM;
@@ -887,10 +892,16 @@ int kimage_build_ind(struct kexec_image 
         case IND_DESTINATION:
             dest = (paddr_t)mfn << PAGE_SHIFT;
             ret = kimage_set_destination(image, dest);
+            if ( !ret )
+                ret = machine_kexec_add_page(image, dest, dest);
             if ( ret < 0 )
                 goto done;
             break;
         case IND_INDIRECTION:
+            ret = machine_kexec_add_page(image, pfn_to_paddr(mfn),
+                                         pfn_to_paddr(mfn));
+            if ( ret < 0 )
+                goto done;
             unmap_domain_page(page);
             page = map_domain_page(mfn);
             entry = page;



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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