|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RESEND 13/14] libxl/arm: initialize memory information of ACPI blob
On Tue, 31 May 2016, Shannon Zhao wrote:
> From: Shannon Zhao <shannon.zhao@xxxxxxxxxx>
>
> Assign the guest memory space for ACPI tables and replace the reg in DT
> with real values.
>
> Signed-off-by: Shannon Zhao <shannon.zhao@xxxxxxxxxx>
> ---
> tools/libxc/xc_dom_arm.c | 16 +++++++++++++++-
> tools/libxl/libxl_arm.c | 40 ++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 55 insertions(+), 1 deletion(-)
>
> diff --git a/tools/libxc/xc_dom_arm.c b/tools/libxc/xc_dom_arm.c
> index 64a8b67..e21e3e9 100644
> --- a/tools/libxc/xc_dom_arm.c
> +++ b/tools/libxc/xc_dom_arm.c
> @@ -383,9 +383,11 @@ static int meminit(struct xc_dom_image *dom)
> const uint64_t kernsize = kernend - kernbase;
> const uint64_t dtb_size = dom->devicetree_blob ?
> ROUNDUP(dom->devicetree_size, XC_PAGE_SHIFT) : 0;
> + const uint64_t acpi_size = dom->acpitable_blob ?
> + ROUNDUP(dom->acpitable_size, XC_PAGE_SHIFT) : 0;
> const uint64_t ramdisk_size = dom->ramdisk_blob ?
> ROUNDUP(dom->ramdisk_size, XC_PAGE_SHIFT) : 0;
> - const uint64_t modsize = dtb_size + ramdisk_size;
> + const uint64_t modsize = dtb_size + acpi_size + ramdisk_size;
> const uint64_t ram128mb = bankbase[0] + (128<<20);
>
> xen_pfn_t p2m_size;
> @@ -500,6 +502,18 @@ static int meminit(struct xc_dom_image *dom)
> modbase += dtb_size;
> }
>
> + if ( acpi_size )
> + {
> + dom->acpi_seg.vstart = modbase;
> + dom->acpi_seg.vend = modbase + acpi_size;
> +
> + DOMPRINTF("%s: acpi: 0x%" PRIx64 " -> 0x%" PRIx64 "",
> + __FUNCTION__,
> + dom->acpi_seg.vstart, dom->acpi_seg.vend);
> +
> + modbase += dtb_size;
shouldn't this be
modbase += acpi_size
?
> + }
> +
> return 0;
> }
>
> diff --git a/tools/libxl/libxl_arm.c b/tools/libxl/libxl_arm.c
> index e7cb578..bf1eeea 100644
> --- a/tools/libxl/libxl_arm.c
> +++ b/tools/libxl/libxl_arm.c
> @@ -230,6 +230,27 @@ static int fdt_property_regs(libxl__gc *gc, void *fdt,
> return fdt_property(fdt, "reg", regs, sizeof(regs));
> }
>
> +static int fdt_property_inplace_regs(void *fdt, int nodeoffset,
> + unsigned addr_cells, unsigned
> size_cells,
> + unsigned num_regs, ...)
> +{
> + uint32_t regs[num_regs*(addr_cells+size_cells)];
> + be32 *cells = ®s[0];
> + int i;
> + va_list ap;
> + uint64_t base, size;
> +
> + va_start(ap, num_regs);
> + for (i = 0 ; i < num_regs; i++) {
> + base = addr_cells ? va_arg(ap, uint64_t) : 0;
> + size = size_cells ? va_arg(ap, uint64_t) : 0;
> + set_range(&cells, addr_cells, size_cells, base, size);
> + }
> + va_end(ap);
> +
> + return fdt_setprop_inplace(fdt, nodeoffset, "reg", regs, sizeof(regs));
> +}
The va_arg stuff is a bit overkill. Also, can't you call
finalise_one_memory_node instead?
> static int make_root_properties(libxl__gc *gc,
> const libxl_version_info *vers,
> void *fdt)
> @@ -1209,6 +1230,8 @@ int
> libxl__arch_domain_finalise_hw_description(libxl__gc *gc,
>
> const struct xc_dom_seg *ramdisk = dom->ramdisk_blob ?
> &dom->ramdisk_seg : NULL;
> + const struct xc_dom_seg *acpi = dom->acpitable_blob ?
> + &dom->acpi_seg : NULL;
>
> if (ramdisk) {
> int chosen, res;
> @@ -1238,6 +1261,23 @@ int
> libxl__arch_domain_finalise_hw_description(libxl__gc *gc,
>
> }
>
> + if (acpi)
> + {
> + int module, res;
> +
> + module = fdt_path_offset(fdt, "/chosen/modules/module@0");
> + assert(module > 0);
> +
> + LOG(DEBUG, "/chosen/modules/module@0 updating acpi properties to
> cover "
> + "%"PRIx64"-%"PRIx64,
> + acpi->vstart, acpi->vend);
> +
> + res = fdt_property_inplace_regs(fdt, module, ROOT_ADDRESS_CELLS,
> + ROOT_SIZE_CELLS, 1, acpi->vstart,
> + acpi->vend - acpi->vstart + 1);
> + assert(!res);
> + }
> +
> for (i = 0; i < GUEST_RAM_BANKS; i++) {
> const uint64_t size = (uint64_t)dom->rambank_size[i] <<
> XC_PAGE_SHIFT;
>
> --
> 2.0.4
>
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |