From 2cae31dd472a9677949f55c15f108de9685b96b1 Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Mon, 16 Jul 2018 15:02:52 +0100 Subject: [PATCH] libxc: allow HVM guest to have modules MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Lift the loading code out of PVH specific branch. Take the chance to make the debug message more useful. Now the code needs to handle virt_base being UNSET_ADDR, which it is for HVM guest. In case virt_base is not set, it should be treated as zero. In case PVH and PV, virt_base is set by the respective loader by parsing the binary. IPXE will be loaded as a module of Rombios. Signed-off-by: Wei Liu Reviewed-by: Roger Pau Monné Acked-by: Ian Jackson --- tools/libxc/xc_dom_x86.c | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/tools/libxc/xc_dom_x86.c b/tools/libxc/xc_dom_x86.c index d28ff4d7e9..d77f2d6f62 100644 --- a/tools/libxc/xc_dom_x86.c +++ b/tools/libxc/xc_dom_x86.c @@ -1742,20 +1742,6 @@ static int bootlate_hvm(struct xc_dom_image *dom) ((uintptr_t)cmdline - (uintptr_t)start_info); } - for ( i = 0; i < dom->num_modules; i++ ) - { - struct xc_hvm_firmware_module mod; - - DOMPRINTF("Adding module %u", i); - mod.guest_addr_out = - dom->modules[i].seg.vstart - dom->parms.virt_base; - mod.length = - dom->modules[i].seg.vend - dom->modules[i].seg.vstart; - - add_module_to_list(dom, &mod, dom->modules[i].cmdline, - modlist, start_info); - } - /* ACPI module 0 is the RSDP */ start_info->rsdp_paddr = dom->acpi_modules[0].guest_addr_out ? : 0; } @@ -1765,6 +1751,24 @@ static int bootlate_hvm(struct xc_dom_image *dom) modlist, start_info); } + for ( i = 0; i < dom->num_modules; i++ ) + { + struct xc_hvm_firmware_module mod; + uint64_t base = dom->parms.virt_base != UNSET_ADDR ? + dom->parms.virt_base : 0; + + mod.guest_addr_out = + dom->modules[i].seg.vstart - base; + mod.length = + dom->modules[i].seg.vend - dom->modules[i].seg.vstart; + + DOMPRINTF("Adding module %u guest_addr %"PRIx64" len %u", + i, mod.guest_addr_out, mod.length); + + add_module_to_list(dom, &mod, dom->modules[i].cmdline, + modlist, start_info); + } + if ( start_info->nr_modules ) { start_info->modlist_paddr = (dom->start_info_seg.pfn << PAGE_SHIFT) + -- 2.30.2