On 11/05/15 10:25, Jan Beulich wrote:
>>>> On 08.05.15 at 17:53, <dvra...@cantab.net> 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;
> +

You don't need this one because after building the new indirection
pages, we discard the guest supplied one.

>      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);

This is the one that was missing.  It matches the
machine_kexec_add_page() call for the destinations in kimage_load_segment().

>              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;

You don't need this one either, because this MFN is another
guest-supplied indirection page we're not going to use.

>              unmap_domain_page(page);
>              page = map_domain_page(mfn);
>              entry = page;

David

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

Reply via email to