On Tue, Jul 05, 2016 at 11:12:36AM +0800, Shannon Zhao wrote:
> From: Shannon Zhao <shannon.z...@linaro.org>
> 
> Estimate the size of ACPI tables and reserve a memory map space for ACPI
> tables.
> 
> Signed-off-by: Shannon Zhao <shannon.z...@linaro.org>

I will leave this patch to Stefano and Julien.

> ---
>  tools/libxl/libxl_arm_acpi.c  | 85 
> +++++++++++++++++++++++++++++++++++++++++++
>  xen/include/public/arch-arm.h |  4 ++
>  2 files changed, 89 insertions(+)
> 
> diff --git a/tools/libxl/libxl_arm_acpi.c b/tools/libxl/libxl_arm_acpi.c
> index d1c066d..7a59126 100644
> --- a/tools/libxl/libxl_arm_acpi.c
> +++ b/tools/libxl/libxl_arm_acpi.c
> @@ -33,11 +33,92 @@ extern const unsigned char dsdt_anycpu_arm[];
>  _hidden
>  extern const int dsdt_anycpu_arm_len;
>  
> +enum {
> +    RSDP,
> +    XSDT,
> +    GTDT,
> +    MADT,
> +    FADT,
> +    DSDT,
> +    NUMS,
> +};
> +
> +struct acpitable {
> +    uint64_t addr;
> +    size_t size;
> +};
> +
> +static int libxl__estimate_acpi_size(libxl__gc *gc,
> +                                     libxl_domain_build_info *info,
> +                                     struct xc_dom_image *dom,
> +                                     xc_domain_configuration_t *xc_config,
> +                                     struct acpitable acpitables[])
> +{
> +    uint64_t size;
> +
> +    acpitables[RSDP].addr = GUEST_ACPI_BASE;
> +    acpitables[RSDP].size = sizeof(struct acpi_table_rsdp);
> +    dom->acpitable_size += ROUNDUP(acpitables[RSDP].size, 3);
> +
> +    acpitables[XSDT].addr = GUEST_ACPI_BASE + dom->acpitable_size;
> +    /*
> +     * Currently only 3 tables(GTDT, FADT, MADT) are pointed by XSDT. Alloc
> +     * entries for them.
> +     */
> +    acpitables[XSDT].size = sizeof(struct acpi_table_xsdt) +
> +                            sizeof(uint64_t) * 2;
> +    dom->acpitable_size += ROUNDUP(acpitables[XSDT].size, 3);
> +
> +    acpitables[GTDT].addr = GUEST_ACPI_BASE + dom->acpitable_size;
> +    acpitables[GTDT].size = sizeof(struct acpi_table_gtdt);
> +    dom->acpitable_size += ROUNDUP(acpitables[GTDT].size, 3);
> +
> +    acpitables[MADT].addr = GUEST_ACPI_BASE + dom->acpitable_size;
> +
> +    switch (xc_config->gic_version) {
> +    case XEN_DOMCTL_CONFIG_GIC_V2:
> +        size = sizeof(struct acpi_table_madt) +
> +               sizeof(struct acpi_madt_generic_interrupt) * info->max_vcpus +
> +               sizeof(struct acpi_madt_generic_distributor);
> +        break;
> +    case XEN_DOMCTL_CONFIG_GIC_V3:
> +        size = sizeof(struct acpi_table_madt) +
> +               sizeof(struct acpi_madt_generic_interrupt) * info->max_vcpus +
> +               sizeof(struct acpi_madt_generic_distributor) +
> +               sizeof(struct acpi_madt_generic_redistributor);
> +        break;
> +    default:
> +        LOG(ERROR, "Unknown GIC version");
> +        return ERROR_FAIL;
> +    }
> +
> +    acpitables[MADT].size = size;
> +    dom->acpitable_size += ROUNDUP(acpitables[MADT].size, 3);
> +
> +    acpitables[FADT].addr = GUEST_ACPI_BASE + dom->acpitable_size;
> +    acpitables[FADT].size = sizeof(struct acpi_table_fadt);
> +    dom->acpitable_size += ROUNDUP(acpitables[FADT].size, 3);
> +
> +    acpitables[DSDT].addr = GUEST_ACPI_BASE + dom->acpitable_size;
> +    acpitables[DSDT].size = dsdt_anycpu_arm_len;
> +    dom->acpitable_size += ROUNDUP(acpitables[DSDT].size, 3);
> +
> +    assert(dom->acpitable_size <= GUEST_ACPI_SIZE);
> +    dom->acpitable_blob = libxl__zalloc(gc, dom->acpitable_size);
> +

Goto style error handling.

> +    return 0;
> +}
> +
>  int libxl__prepare_acpi(libxl__gc *gc, libxl_domain_build_info *info,
>                          libxl__domain_build_state *state,
>                          struct xc_dom_image *dom)
>  {
>      const libxl_version_info *vers;
> +    int rc;
> +    struct acpitable acpitables[NUMS];
> +
> +    /* convenience aliases */
> +    xc_domain_configuration_t *xc_config = &state->config;
>  

Julien seemed to have suggested this structure shouldn't be used. Did I
misremember?

>      vers = libxl_get_version_info(CTX);
>      if (vers == NULL)
> @@ -49,6 +130,10 @@ int libxl__prepare_acpi(libxl__gc *gc, 
> libxl_domain_build_info *info,
>      dom->acpitable_blob = NULL;
>      dom->acpitable_size = 0;
>  
> +    rc = libxl__estimate_acpi_size(gc, info, dom, xc_config, acpitables);
> +    if (rc)
> +        return rc;
> +
>      return 0;
>  }

Goto style error handling please.

>  
> diff --git a/xen/include/public/arch-arm.h b/xen/include/public/arch-arm.h
> index 4a49254..008a2a0 100644
> --- a/xen/include/public/arch-arm.h
> +++ b/xen/include/public/arch-arm.h
> @@ -406,6 +406,10 @@ typedef uint64_t xen_callback_t;
>  #define GUEST_GICV3_GICR0_BASE     0x03020000ULL    /* vCPU0 - vCPU127 */
>  #define GUEST_GICV3_GICR0_SIZE     0x01000000ULL
>  
> +/* ACPI tables physical address */
> +#define GUEST_ACPI_BASE 0x20000000ULL
> +#define GUEST_ACPI_SIZE 0x00200000ULL
> +
>  /*
>   * 16MB == 4096 pages reserved for guest to use as a region to map its
>   * grant table in.
> -- 
> 2.0.4
> 
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

Reply via email to