summaryrefslogtreecommitdiff
path: root/xen
diff options
context:
space:
mode:
authorJulien Grall <julien.grall@arm.com>2020-11-19 17:08:28 +0000
committerStefano Stabellini <sstabellini@kernel.org>2020-11-19 16:25:02 -0800
commit9a3c25b6562416dfb3708b0e61a4e4761db06e4f (patch)
tree8b41432f245a7ddaea10a438942545bcb10528c7 /xen
parent1965c171a4a791bbed1cf84c097177117bb02dac (diff)
xen/arm: gic: acpi: Use the correct length for the GICC structure
The length of the GICC structure in the MADT ACPI table differs between version 5.1 and 6.0, although there are no other relevant differences. Use the BAD_MADT_GICC_ENTRY macro, which was specifically designed to overcome this issue. Signed-off-by: Julien Grall <julien.grall@arm.com> Signed-off-by: Andre Przywara <andre.przywara@arm.com> Signed-off-by: Julien Grall <jgrall@amazon.com> Reviewed-by: Stefano Stabellini <sstabellini@kernel.org> Reviewed-by: Bertrand Marquis <bertrand.marquis@arm.com>
Diffstat (limited to 'xen')
-rw-r--r--xen/arch/arm/acpi/boot.c2
-rw-r--r--xen/arch/arm/gic-v2.c5
-rw-r--r--xen/arch/arm/gic-v3.c6
-rw-r--r--xen/arch/arm/gic.c2
4 files changed, 8 insertions, 7 deletions
diff --git a/xen/arch/arm/acpi/boot.c b/xen/arch/arm/acpi/boot.c
index 30e4bd1bc5..55c3e5cbc8 100644
--- a/xen/arch/arm/acpi/boot.c
+++ b/xen/arch/arm/acpi/boot.c
@@ -131,7 +131,7 @@ acpi_parse_gic_cpu_interface(struct acpi_subtable_header *header,
struct acpi_madt_generic_interrupt *processor =
container_of(header, struct acpi_madt_generic_interrupt, header);
- if ( BAD_MADT_ENTRY(processor, end) )
+ if ( BAD_MADT_GICC_ENTRY(processor, end) )
return -EINVAL;
acpi_table_print_madt_entry(header);
diff --git a/xen/arch/arm/gic-v2.c b/xen/arch/arm/gic-v2.c
index 581ea5ba6b..b2adc8ec9a 100644
--- a/xen/arch/arm/gic-v2.c
+++ b/xen/arch/arm/gic-v2.c
@@ -1136,7 +1136,8 @@ static int gicv2_make_hwdom_madt(const struct domain *d, u32 offset)
host_gicc = container_of(header, struct acpi_madt_generic_interrupt,
header);
- size = sizeof(struct acpi_madt_generic_interrupt);
+
+ size = ACPI_MADT_GICC_LENGTH;
/* Add Generic Interrupt */
for ( i = 0; i < d->max_vcpus; i++ )
{
@@ -1165,7 +1166,7 @@ gic_acpi_parse_madt_cpu(struct acpi_subtable_header *header,
struct acpi_madt_generic_interrupt *processor =
container_of(header, struct acpi_madt_generic_interrupt, header);
- if ( BAD_MADT_ENTRY(processor, end) )
+ if ( BAD_MADT_GICC_ENTRY(processor, end) )
return -EINVAL;
/* Read from APIC table and fill up the GIC variables */
diff --git a/xen/arch/arm/gic-v3.c b/xen/arch/arm/gic-v3.c
index 2a344393a0..ac28013c19 100644
--- a/xen/arch/arm/gic-v3.c
+++ b/xen/arch/arm/gic-v3.c
@@ -1499,7 +1499,7 @@ static int gicv3_make_hwdom_madt(const struct domain *d, u32 offset)
host_gicc = container_of(header, struct acpi_madt_generic_interrupt,
header);
- size = sizeof(struct acpi_madt_generic_interrupt);
+ size = ACPI_MADT_GICC_LENGTH;
for ( i = 0; i < d->max_vcpus; i++ )
{
gicc = (struct acpi_madt_generic_interrupt *)(base_ptr + table_len);
@@ -1558,7 +1558,7 @@ gic_acpi_parse_madt_cpu(struct acpi_subtable_header *header,
struct acpi_madt_generic_interrupt *processor =
container_of(header, struct acpi_madt_generic_interrupt, header);
- if ( BAD_MADT_ENTRY(processor, end) )
+ if ( BAD_MADT_GICC_ENTRY(processor, end) )
return -EINVAL;
/* Read from APIC table and fill up the GIC variables */
@@ -1628,7 +1628,7 @@ gic_acpi_get_madt_cpu_num(struct acpi_subtable_header *header,
struct acpi_madt_generic_interrupt *cpuif;
cpuif = (struct acpi_madt_generic_interrupt *)header;
- if ( BAD_MADT_ENTRY(cpuif, end) || !cpuif->gicr_base_address )
+ if ( BAD_MADT_GICC_ENTRY(cpuif, end) || !cpuif->gicr_base_address )
return -EINVAL;
return 0;
diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c
index fe60619e99..3b0331b538 100644
--- a/xen/arch/arm/gic.c
+++ b/xen/arch/arm/gic.c
@@ -454,7 +454,7 @@ unsigned long gic_get_hwdom_madt_size(const struct domain *d)
unsigned long madt_size;
madt_size = sizeof(struct acpi_table_madt)
- + sizeof(struct acpi_madt_generic_interrupt) * d->max_vcpus
+ + ACPI_MADT_GICC_LENGTH * d->max_vcpus
+ sizeof(struct acpi_madt_generic_distributor)
+ gic_hw_ops->get_hwdom_extra_madt_size(d);