[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 = &regs[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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.