Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12-SP2:Update
xen.12882
0001-libxc-Rework-extra-module-initialisation.p...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0001-libxc-Rework-extra-module-initialisation.patch of Package xen.12882
From 270b8e85b5379fe93192f36966384ff07400fe7b Mon Sep 17 00:00:00 2001 From: Anthony PERARD <anthony.perard@citrix.com> Date: Mon, 14 Mar 2016 17:55:36 +0000 Subject: [PATCH 01/15] libxc: Rework extra module initialisation This patch use xc_dom_alloc_segment() to allocate the memory space for the ACPI modules and the SMBIOS modules. This is to replace the arbitrary placement of 1MB after the hvmloader image. In later patches, while trying to load a firmware such as OVMF, the later could easily be loaded past the address 4MB (OVMF is a 2MB binary), but hvmloader use a range of memory from 4MB to 8MB to perform tests and in the process, clear the memory, before loading the modules. Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> --- tools/libxc/xc_dom_hvmloader.c | 131 ++++++++++++----------------------------- 1 file changed, 38 insertions(+), 93 deletions(-) Index: xen-4.7.0-testing/tools/libxc/xc_dom_hvmloader.c =================================================================== --- xen-4.7.0-testing.orig/tools/libxc/xc_dom_hvmloader.c +++ xen-4.7.0-testing/tools/libxc/xc_dom_hvmloader.c @@ -129,98 +129,52 @@ static elf_errorstatus xc_dom_parse_hvm_ return rc; } -static int modules_init(struct xc_dom_image *dom, - uint64_t vend, struct elf_binary *elf, - uint64_t *mstart_out, uint64_t *mend_out) +static int module_init_one(struct xc_dom_image *dom, + struct xc_hvm_firmware_module *module, + char *name) { -#define MODULE_ALIGN 1UL << 7 -#define MB_ALIGN 1UL << 20 -#define MKALIGN(x, a) (((uint64_t)(x) + (a) - 1) & ~(uint64_t)((a) - 1)) - uint64_t total_len = 0, offset1 = 0; - - if ( dom->acpi_module.length == 0 && dom->smbios_module.length == 0 ) - return 0; - - /* Find the total length for the firmware modules with a reasonable large - * alignment size to align each the modules. - */ - total_len = MKALIGN(dom->acpi_module.length, MODULE_ALIGN); - offset1 = total_len; - total_len += MKALIGN(dom->smbios_module.length, MODULE_ALIGN); - - /* Want to place the modules 1Mb+change behind the loader image. */ - *mstart_out = MKALIGN(elf->pend, MB_ALIGN) + (MB_ALIGN); - *mend_out = *mstart_out + total_len; - - if ( *mend_out > vend ) - return -1; - - if ( dom->acpi_module.length != 0 ) - dom->acpi_module.guest_addr_out = *mstart_out; - if ( dom->smbios_module.length != 0 ) - dom->smbios_module.guest_addr_out = *mstart_out + offset1; + struct xc_dom_seg seg; + void *dest; + + if ( module->length ) + { + if ( xc_dom_alloc_segment(dom, &seg, name, 0, module->length) ) + goto err; + dest = xc_dom_seg_to_ptr(dom, &seg); + if ( dest == NULL ) + { + DOMPRINTF("%s: xc_dom_seg_to_ptr(dom, &seg) => NULL", + __FUNCTION__); + goto err; + } + memcpy(dest, module->data, module->length); + module->guest_addr_out = seg.vstart; + if ( module->guest_addr_out > UINT32_MAX || + module->guest_addr_out + module->length > UINT32_MAX ) + { + DOMPRINTF("%s: Module %s would be loaded abrove 4GB", + __FUNCTION__, name); + goto err; + } + } return 0; +err: + return -1; } -static int loadmodules(struct xc_dom_image *dom, - uint64_t mstart, uint64_t mend, - uint32_t domid) +static int modules_init(struct xc_dom_image *dom) { - privcmd_mmap_entry_t *entries = NULL; - unsigned long pfn_start; - unsigned long pfn_end; - size_t pages; - uint32_t i; - uint8_t *dest; - int rc = -1; - xc_interface *xch = dom->xch; - - if ( mstart == 0 || mend == 0 ) - return 0; - - pfn_start = (unsigned long)(mstart >> PAGE_SHIFT); - pfn_end = (unsigned long)((mend + PAGE_SIZE - 1) >> PAGE_SHIFT); - pages = pfn_end - pfn_start; + int rc; - /* Map address space for module list. */ - entries = calloc(pages, sizeof(privcmd_mmap_entry_t)); - if ( entries == NULL ) - goto error_out; + rc = module_init_one(dom, &dom->acpi_module, "acpi module"); + if ( rc ) goto err; + rc = module_init_one(dom, &dom->smbios_module, "smbios module"); + if ( rc ) goto err; - for ( i = 0; i < pages; i++ ) - entries[i].mfn = (mstart >> PAGE_SHIFT) + i; - - dest = xc_map_foreign_ranges( - xch, domid, pages << PAGE_SHIFT, PROT_READ | PROT_WRITE, 1 << PAGE_SHIFT, - entries, pages); - if ( dest == NULL ) - goto error_out; - - /* Zero the range so padding is clear between modules */ - memset(dest, 0, pages << PAGE_SHIFT); - - /* Load modules into range */ - if ( dom->acpi_module.length != 0 ) - { - memcpy(dest, - dom->acpi_module.data, - dom->acpi_module.length); - } - if ( dom->smbios_module.length != 0 ) - { - memcpy(dest + (dom->smbios_module.guest_addr_out - mstart), - dom->smbios_module.data, - dom->smbios_module.length); - } - - munmap(dest, pages << PAGE_SHIFT); - rc = 0; - - error_out: - free(entries); - - return rc; + return 0; +err: + return -1; } static elf_errorstatus xc_dom_load_hvm_kernel(struct xc_dom_image *dom) @@ -229,7 +183,6 @@ static elf_errorstatus xc_dom_load_hvm_k privcmd_mmap_entry_t *entries = NULL; size_t pages = (elf->pend - elf->pstart + PAGE_SIZE - 1) >> PAGE_SHIFT; elf_errorstatus rc; - uint64_t m_start = 0, m_end = 0; int i; /* Map address space for initial elf image. */ @@ -262,15 +215,7 @@ static elf_errorstatus xc_dom_load_hvm_k munmap(elf->dest_base, elf->dest_size); - rc = modules_init(dom, dom->total_pages << PAGE_SHIFT, elf, &m_start, - &m_end); - if ( rc != 0 ) - { - DOMPRINTF("%s: insufficient space to load modules.", __func__); - goto error; - } - - rc = loadmodules(dom, m_start, m_end, dom->guest_domid); + rc = modules_init(dom); if ( rc != 0 ) { DOMPRINTF("%s: unable to load modules.", __func__);
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor