Hi Shannon,
On 25/03/16 13:48, Shannon Zhao wrote:
[...]
+static int estimate_acpi_efi_size(struct domain *d, struct kernel_info *kinfo)
+{
+ size_t efi_size, acpi_size, madt_size;
+ u64 addr;
+ struct acpi_table_rsdp *rsdp_tbl;
+ struct acpi_table_header *table;
+
+ efi_size = estimate_efi_size(kinfo->mem.nr_banks);
+
+ acpi_size = ROUNDUP(sizeof(struct acpi_table_fadt), 8);
+ acpi_size += ROUNDUP(sizeof(struct acpi_table_stao), 8);
+
+ madt_size = sizeof(struct acpi_table_madt)
+ + sizeof(struct acpi_madt_generic_interrupt) * d->max_vcpus
+ + sizeof(struct acpi_madt_generic_distributor);
+ if ( d->arch.vgic.version == GIC_V3 )
+ madt_size += sizeof(struct acpi_madt_generic_redistributor)
+ * d->arch.vgic.nr_regions;
+ acpi_size += ROUNDUP(madt_size, 8);
+
+ addr = acpi_os_get_root_pointer();
+ if ( !addr )
+ {
+ printk("Unable to get acpi root pointer\n");
+ return -EINVAL;
+ }
+
+ rsdp_tbl = acpi_os_map_memory(addr, sizeof(struct acpi_table_rsdp));
+ if ( !rsdp_tbl )
+ {
+ printk("Unable to map RSDP table\n");
+ return -EINVAL;
+ }
+
+ table = acpi_os_map_memory(rsdp_tbl->xsdt_physical_address,
+ sizeof(struct acpi_table_header));
+ if ( !table )
rsdp_tbl will be left mapped if Xen fails to map the XSDT.
As you don't use rsdp_tbl later, I would move
acpi_os_unmap_memory(rsdp_tlb,...) here.
With this change:
Acked-by: Julien Grall <julien.gr...@arm.com>
+ {
+ printk("Unable to map XSDT table\n");
+ return -EINVAL;
+ }
+
+ /* Add place for STAO table in XSDT table */
+ acpi_size += ROUNDUP(table->length + sizeof(u64), 8);
+ acpi_os_unmap_memory(table, sizeof(struct acpi_table_header));
+ acpi_os_unmap_memory(rsdp_tbl, sizeof(struct acpi_table_rsdp));
+
+ acpi_size += ROUNDUP(sizeof(struct acpi_table_rsdp), 8);
+ d->arch.efi_acpi_len = PAGE_ALIGN(ROUNDUP(efi_size, 8)
+ + ROUNDUP(acpi_size, 8));
+
+ return 0;
+}
Regards,
--
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel