[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 22/23] libxl/acpi: Build ACPI tables for HVMlite guests
On Thu, Aug 04, 2016 at 05:06:50PM -0400, Boris Ostrovsky wrote: [...] > > distclean: clean > $(RM) -f xenlight.pc.in xlutil.pc.in > diff --git a/tools/libxl/libxl_arch.h b/tools/libxl/libxl_arch.h > index 34a853c..7c6536b 100644 > --- a/tools/libxl/libxl_arch.h > +++ b/tools/libxl/libxl_arch.h > @@ -62,4 +62,7 @@ int libxl__arch_domain_construct_memmap(libxl__gc *gc, > uint32_t domid, > struct xc_dom_image *dom); > > +int libxl__dom_load_acpi(libxl__gc *gc, > + libxl_domain_build_info *info, > + struct xc_dom_image *dom); > #endif > diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c > index 3a1daae..7dbf614 100644 > --- a/tools/libxl/libxl_dom.c > +++ b/tools/libxl/libxl_dom.c > @@ -657,6 +657,7 @@ static int libxl__build_dom(libxl__gc *gc, uint32_t domid, > LOGE(ERROR, "xc_dom_build_image failed"); > goto out; > } > + Stray blank line. > if ( (ret = xc_dom_boot_image(dom)) != 0 ) { > LOGE(ERROR, "xc_dom_boot_image failed"); > goto out; > diff --git a/tools/libxl/libxl_x86.c b/tools/libxl/libxl_x86.c > index 7654e20..42f2139 100644 > --- a/tools/libxl/libxl_x86.c > +++ b/tools/libxl/libxl_x86.c > @@ -8,15 +8,18 @@ int libxl__arch_domain_prepare_config(libxl__gc *gc, > xc_domain_configuration_t *xc_config) > { > > - if (d_config->c_info.type == LIBXL_DOMAIN_TYPE_HVM && > - d_config->b_info.device_model_version != > - LIBXL_DEVICE_MODEL_VERSION_NONE) { > - /* HVM domains with a device model. */ > - xc_config->emulation_flags = XEN_X86_EMU_ALL; > - } else { > - /* PV or HVM domains without a device model. */ > + if (d_config->c_info.type == LIBXL_DOMAIN_TYPE_HVM) { > + if (d_config->b_info.device_model_version != > + LIBXL_DEVICE_MODEL_VERSION_NONE) > + xc_config->emulation_flags = XEN_X86_EMU_ALL; > + else if (libxl_defbool_val(d_config->b_info.u.hvm.apic)) > + /* > + * HVM guests without device model may want > + * to have LAPIC emulation. > + */ > + xc_config->emulation_flags = XEN_X86_EMU_LAPIC; > + } else Please retain {} for the else branch. We recently updated the CODING_STYLE a bit. > xc_config->emulation_flags = 0; > - } > > return 0; > } > @@ -366,7 +369,15 @@ int libxl__arch_domain_finalise_hw_description(libxl__gc > *gc, > libxl_domain_build_info *info, > struct xc_dom_image *dom) > { > - return 0; > + int ret = 0; > + > + if ((info->type == LIBXL_DOMAIN_TYPE_HVM) && > + (info->device_model_version == LIBXL_DEVICE_MODEL_VERSION_NONE)) { > + if ( (ret = libxl__dom_load_acpi(gc, info, dom)) != 0 ) > + LOGE(ERROR, "libxl_dom_load_acpi failed"); > + } > + > + return ret; > } > > /* Return 0 on success, ERROR_* on failure. */ > diff --git a/tools/libxl/libxl_x86_acpi.c b/tools/libxl/libxl_x86_acpi.c > new file mode 100644 > index 0000000..88e69e2 > --- /dev/null > +++ b/tools/libxl/libxl_x86_acpi.c I only skimmed this file. I think it's mostly code movement and believe the bug here should be easy to fix. > @@ -0,0 +1,199 @@ > +/* > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU Lesser General Public License as published > + * by the Free Software Foundation; version 2.1 only. with the special > + * exception on linking described in file LICENSE. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU Lesser General Public License for more details. > + * > + * Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. > + */ > + > +#include "libxl_internal.h" > +#include "libxl_arch.h" > +#include <xen/hvm/hvm_info_table.h> > +#include <xen/hvm/e820.h> > +#include "libacpi/libacpi.h" > + > +#include <xc_dom.h> > + > + /* Number of pages holding ACPI tables */ > +#define NUM_ACPI_PAGES 16 > +/* Store RSDP in the last 64 bytes of BIOS RO memory */ > +#define RSDP_ADDRESS (0x100000 - 64) > +#define ACPI_INFO_PHYSICAL_ADDRESS 0xfc000000 > + > +extern const unsigned char dsdt_pvh[]; > +extern const unsigned int dsdt_pvh_len; > + > +/* Assumes contiguous physical space */ > +static unsigned long virt_to_phys(struct acpi_ctxt *ctxt, void *v) > +{ > + return (((unsigned long)v - ctxt->alloc_base_vaddr) + > + ctxt->alloc_base_paddr); > +} > + > +static void *mem_alloc(struct acpi_ctxt *ctxt, uint32_t size, uint32_t align) > +{ > + unsigned long s, e; > + > + /* Align to at least 16 bytes. */ > + if (align < 16) > + align = 16; > + > + s = (ctxt->alloc_currp + align) & ~((unsigned long)align - 1); > + e = s + size - 1; > + > + /* TODO: Reallocate memory */ > + if ((e < s) || (e >= ctxt->alloc_end)) return NULL; > + Please put return NULL on a new line. > + while (ctxt->alloc_currp >> ctxt->page_shift != > + e >> ctxt->page_shift) > + ctxt->alloc_currp += ctxt->page_size; > + > + ctxt->alloc_currp = e; > + > + return (void *)s; > +} > + > +static int init_acpi_config(libxl__gc *gc, > + struct xc_dom_image *dom, > + libxl_domain_build_info *b_info, > + struct acpi_config *config) > +{ > + xc_interface *xch = dom->xch; > + uint32_t domid = dom->guest_domid; > + xc_dominfo_t info; > + int i, rc; > + > + config->dsdt_anycpu = config->dsdt_15cpu = dsdt_pvh; > + config->dsdt_anycpu_len = config->dsdt_15cpu_len = dsdt_pvh_len; > + > + rc = xc_domain_getinfo(xch, domid, 1, &info); > + if (rc < 0) { > + LOG(ERROR, "%s: getdomaininfo failed (rc=%d)", __FUNCTION__, rc); > + return rc; > + } > + > + config->hvminfo = libxl__zalloc(gc, sizeof(*config->hvminfo)); > + > + config->hvminfo->apic_mode = libxl_defbool_val(b_info->u.hvm.apic); > + > + if (dom->nr_vnodes) { > + struct acpi_numa *numa = &config->numa; > + > + rc = xc_domain_getvnuma(xch, domid, &numa->nr_vnodes, > + &numa->nr_vmemranges, > + &config->hvminfo->nr_vcpus, NULL, NULL, > NULL); > + if (rc) { > + LOG(ERROR, "%s: xc_domain_getvnuma failed (rc=%d)", > + __FUNCTION__, rc); > + return rc; > + } Indentation. > + > + numa->vmemrange = libxl__zalloc(gc, dom->nr_vmemranges * > + sizeof(*numa->vmemrange)); > + numa->vdistance = libxl__zalloc(gc, dom->nr_vnodes * > + sizeof(*numa->vdistance)); > + numa->vcpu_to_vnode = libxl__zalloc(gc, config->hvminfo->nr_vcpus * > + sizeof(*numa->vcpu_to_vnode)); > + rc = xc_domain_getvnuma(xch, domid, &numa->nr_vnodes, > + &numa->nr_vmemranges, > + &config->hvminfo->nr_vcpus, numa->vmemrange, > + numa->vdistance, numa->vcpu_to_vnode); > + if (rc) { > + LOG(ERROR, "%s: xc_domain_getvnuma failed (rc=%d)", > + __FUNCTION__, rc); > + return rc; > + } > + } > + else > + config->hvminfo->nr_vcpus = info.max_vcpu_id + 1; > + > + for (i=0; i<config->hvminfo->nr_vcpus; i++) > + config->hvminfo->vcpu_online[i / 8] |= 1 << (i & 7); > + > + return 0; > +} > + > +int libxl__dom_load_acpi(libxl__gc *gc, > + libxl_domain_build_info *info, > + struct xc_dom_image *dom) Indentation. And please constify stuff that don't get changed -- info. Wei. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |