xen_pfn_t pfn_alloc_end;
xen_vaddr_t virt_alloc_end;
xen_vaddr_t bsd_symtab_start;
+
+ /* initrd parameters as specified in start_info page */
+ unsigned long initrd_start;
+ unsigned long initrd_len;
+
unsigned int alloc_bootstack;
xen_vaddr_t virt_pgtab_end;
int xc_dom_build_image(struct xc_dom_image *dom)
{
unsigned int page_size;
+ bool unmapped_initrd;
DOMPRINTF_CALLED(dom->xch);
if ( dom->kernel_loader->loader(dom) != 0 )
goto err;
- /* load ramdisk */
- if ( dom->ramdisk_blob )
+ /* Don't load ramdisk now if no initial mapping required. */
+ unmapped_initrd = dom->parms.unmapped_initrd && !dom->ramdisk_seg.vstart;
+
+ if ( dom->ramdisk_blob && !unmapped_initrd )
{
if ( xc_dom_build_ramdisk(dom) != 0 )
goto err;
+ dom->initrd_start = dom->ramdisk_seg.vstart;
+ dom->initrd_len = dom->ramdisk_seg.vend - dom->ramdisk_seg.vstart;
}
/* load devicetree */
if ( dom->virt_pgtab_end && xc_dom_alloc_pad(dom, dom->virt_pgtab_end) )
return -1;
+ /* Load ramdisk if no initial mapping required. */
+ if ( dom->ramdisk_blob && unmapped_initrd )
+ {
+ if ( xc_dom_build_ramdisk(dom) != 0 )
+ goto err;
+ dom->flags |= SIF_MOD_START_PFN;
+ dom->initrd_start = dom->ramdisk_seg.pfn;
+ dom->initrd_len = page_size * dom->ramdisk_seg.pages;
+ }
+
return 0;
err:
if ( dom->ramdisk_blob )
{
- start_info->mod_start = dom->ramdisk_seg.vstart;
- start_info->mod_len = dom->ramdisk_seg.vend - dom->ramdisk_seg.vstart;
+ start_info->mod_start = dom->initrd_start;
+ start_info->mod_len = dom->initrd_len;
}
if ( dom->cmdline )
if ( dom->ramdisk_blob )
{
- start_info->mod_start = dom->ramdisk_seg.vstart;
- start_info->mod_len = dom->ramdisk_seg.vend - dom->ramdisk_seg.vstart;
+ start_info->mod_start = dom->initrd_start;
+ start_info->mod_len = dom->initrd_len;
}
if ( dom->cmdline )