From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ian Jackson Subject: [PATCH 13/16] libxl: construct e820 map with RDM information for HVM guest Date: Wed, 22 Jul 2015 16:44:16 +0100 Message-ID: <1437579859-24485-14-git-send-email-ian.jackson@eu.citrix.com> References: <1437579859-24485-1-git-send-email-ian.jackson@eu.citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1437579859-24485-1-git-send-email-ian.jackson@eu.citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xensource.com Cc: Wei Liu , Ian Campbell , Stefano Stabellini , George Dunlap , Ian Jackson , Jan Beulich , Tiejun Chen List-Id: xen-devel@lists.xenproject.org From: Tiejun Chen Here we'll construct a basic guest e820 table via XENMEM_set_memory_map. This table includes lowmem, highmem and RDMs if they exist, and hvmloader would need this info later. Note this guest e820 table would be same as before if the platform has no any RDM or we disable RDM (by default). CC: Ian Jackson CC: Stefano Stabellini CC: Ian Campbell CC: Wei Liu Signed-off-by: Tiejun Chen Acked-by: Ian Jackson Checked-by: Ian Jackson --- tools/libxl/libxl_arch.h | 7 ++++ tools/libxl/libxl_arm.c | 8 +++++ tools/libxl/libxl_dom.c | 5 +++ tools/libxl/libxl_x86.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 103 insertions(+) diff --git a/tools/libxl/libxl_arch.h b/tools/libxl/libxl_arch.h index 9a80d43..bd030b6 100644 --- a/tools/libxl/libxl_arch.h +++ b/tools/libxl/libxl_arch.h @@ -55,4 +55,11 @@ int libxl__arch_vnuma_build_vmemrange(libxl__gc *gc, _hidden int libxl__arch_domain_map_irq(libxl__gc *gc, uint32_t domid, int irq); +/* arch specific to construct memory mapping function */ +_hidden +int libxl__arch_domain_construct_memmap(libxl__gc *gc, + libxl_domain_config *d_config, + uint32_t domid, + struct xc_hvm_build_args *args); + #endif diff --git a/tools/libxl/libxl_arm.c b/tools/libxl/libxl_arm.c index d306905..42ab6d8 100644 --- a/tools/libxl/libxl_arm.c +++ b/tools/libxl/libxl_arm.c @@ -969,6 +969,14 @@ int libxl__arch_domain_map_irq(libxl__gc *gc, uint32_t domid, int irq) return xc_domain_bind_pt_spi_irq(CTX->xch, domid, irq, irq); } +int libxl__arch_domain_construct_memmap(libxl__gc *gc, + libxl_domain_config *d_config, + uint32_t domid, + struct xc_hvm_build_args *args) +{ + return 0; +} + /* * Local variables: * mode: C diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index 0b7c39d..a76d4b3 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -1012,6 +1012,11 @@ int libxl__build_hvm(libxl__gc *gc, uint32_t domid, goto out; } + if (libxl__arch_domain_construct_memmap(gc, d_config, domid, &args)) { + LOG(ERROR, "setting domain memory map failed"); + goto out; + } + ret = hvm_build_set_params(ctx->xch, domid, info, state->store_port, &state->store_mfn, state->console_port, &state->console_mfn, state->store_domid, diff --git a/tools/libxl/libxl_x86.c b/tools/libxl/libxl_x86.c index 8cd15ca..b3cf3e2 100644 --- a/tools/libxl/libxl_x86.c +++ b/tools/libxl/libxl_x86.c @@ -445,6 +445,89 @@ int libxl__arch_domain_map_irq(libxl__gc *gc, uint32_t domid, int irq) } /* + * Here we're just trying to set these kinds of e820 mappings: + * + * #1. Low memory region + * + * Low RAM starts at least from 1M to make sure all standard regions + * of the PC memory map, like BIOS, VGA memory-mapped I/O and vgabios, + * have enough space. + * Note: Those stuffs below 1M are still constructed with multiple + * e820 entries by hvmloader. At this point we don't change anything. + * + * #2. RDM region if it exists + * + * #3. High memory region if it exists + * + * Note: these regions are not overlapping since we already check + * to adjust them. Please refer to libxl__domain_device_construct_rdm(). + */ +#define GUEST_LOW_MEM_START_DEFAULT 0x100000 +int libxl__arch_domain_construct_memmap(libxl__gc *gc, + libxl_domain_config *d_config, + uint32_t domid, + struct xc_hvm_build_args *args) +{ + int rc = 0; + unsigned int nr = 0, i; + /* We always own at least one lowmem entry. */ + unsigned int e820_entries = 1; + struct e820entry *e820 = NULL; + uint64_t highmem_size = + args->highmem_end ? args->highmem_end - (1ull << 32) : 0; + + /* Add all rdm entries. */ + for (i = 0; i < d_config->num_rdms; i++) + if (d_config->rdms[i].policy != LIBXL_RDM_RESERVE_POLICY_INVALID) + e820_entries++; + + + /* If we should have a highmem range. */ + if (highmem_size) + e820_entries++; + + if (e820_entries >= E820MAX) { + LOG(ERROR, "Ooops! Too many entries in the memory map!\n"); + rc = ERROR_INVAL; + goto out; + } + + e820 = libxl__malloc(gc, sizeof(struct e820entry) * e820_entries); + + /* Low memory */ + e820[nr].addr = GUEST_LOW_MEM_START_DEFAULT; + e820[nr].size = args->lowmem_end - GUEST_LOW_MEM_START_DEFAULT; + e820[nr].type = E820_RAM; + nr++; + + /* RDM mapping */ + for (i = 0; i < d_config->num_rdms; i++) { + if (d_config->rdms[i].policy == LIBXL_RDM_RESERVE_POLICY_INVALID) + continue; + + e820[nr].addr = d_config->rdms[i].start; + e820[nr].size = d_config->rdms[i].size; + e820[nr].type = E820_RESERVED; + nr++; + } + + /* High memory */ + if (highmem_size) { + e820[nr].addr = ((uint64_t)1 << 32); + e820[nr].size = highmem_size; + e820[nr].type = E820_RAM; + } + + if (xc_domain_set_memory_map(CTX->xch, domid, e820, e820_entries) != 0) { + rc = ERROR_FAIL; + goto out; + } + +out: + return rc; +} + +/* * Local variables: * mode: C * c-basic-offset: 4 -- 1.7.10.4