Hello Julien,
On 12/21/25 11:28 AM, Julien Grall wrote:
--- a/xen/arch/arm/gic.c
+++ b/xen/arch/arm/gic.c
@@ -418,8 +418,18 @@ unsigned long gic_get_hwdom_madt_size(const
struct domain *d)
{
unsigned long madt_size;
+ struct acpi_subtable_header *header;
+ struct acpi_madt_generic_interrupt *host_gicc;
For both variables, you don't seem to modify the content. So I think
they should be const.
Only|host_gicc| can be made|const|. If|header| is also declared as|const|, we
get a compilation error:
arch/arm/gic.c: In function ‘gic_get_hwdom_madt_size’:
./include/xen/kernel.h:20:46: error: initialization discards ‘const’
qualifier from pointer target type [-Werror=discarded-qualifiers]
20 | typeof_field(type, member) *__mptr = (ptr); \
| ^
arch/arm/gic.c:428:17: note: in expansion of macro ‘container_of’
428 | host_gicc = container_of(header, struct
acpi_madt_generic_interrupt,
It is probably better to leave|header| non-const here, rather than introducing
a cast such as:
host_gicc = container_of((struct acpi_subtable_header *)header, ...)
Thanks.
~ Oleksii
+
+ header =
acpi_table_get_entry_madt(ACPI_MADT_TYPE_GENERIC_INTERRUPT, 0);
+ if ( !header )
+ panic("Can't get GICC entry");
+
+ host_gicc = container_of(header, struct
acpi_madt_generic_interrupt,
+ header);
+
madt_size = sizeof(struct acpi_table_madt)
- + ACPI_MADT_GICC_LENGTH * d->max_vcpus
+ + host_gicc->header.length * d->max_vcpus
+ sizeof(struct acpi_madt_generic_distributor)
+ gic_hw_ops->get_hwdom_extra_madt_size(d);