Signed-off-by: Boris Ostrovsky
---
tools/firmware/hvmloader/acpi/build.c | 68 +--
tools/firmware/hvmloader/acpi/libacpi.h |1 +
tools/firmware/hvmloader/util.c |2 +-
3 files changed, 39 insertions(+), 32 deletions(-)
diff --git a/tools/firmware/hvmloader/acpi/build.c
b/tools/firmware/hvmloader/acpi/build.c
index 94b46c1..8780984 100644
--- a/tools/firmware/hvmloader/acpi/build.c
+++ b/tools/firmware/hvmloader/acpi/build.c
@@ -81,43 +81,49 @@ static struct acpi_20_madt *construct_madt(struct
acpi_config *config)
madt->lapic_addr = LAPIC_BASE_ADDRESS;
madt->flags = ACPI_PCAT_COMPAT;
-intsrcovr = (struct acpi_20_madt_intsrcovr *)(madt + 1);
-for ( i = 0; i < 16; i++ )
+if ( config->table_flags & ACPI_BUILD_IOAPIC )
{
-memset(intsrcovr, 0, sizeof(*intsrcovr));
-intsrcovr->type = ACPI_INTERRUPT_SOURCE_OVERRIDE;
-intsrcovr->length = sizeof(*intsrcovr);
-intsrcovr->source = i;
-
-if ( i == 0 )
-{
-/* ISA IRQ0 routed to IOAPIC GSI 2. */
-intsrcovr->gsi= 2;
-intsrcovr->flags = 0x0;
-}
-else if ( PCI_ISA_IRQ_MASK & (1U << i) )
+intsrcovr = (struct acpi_20_madt_intsrcovr *)(madt + 1);
+for ( i = 0; i < 16; i++ )
{
-/* PCI: active-low level-triggered. */
-intsrcovr->gsi= i;
-intsrcovr->flags = 0xf;
-}
-else
-{
-/* No need for a INT source override structure. */
-continue;
+memset(intsrcovr, 0, sizeof(*intsrcovr));
+intsrcovr->type = ACPI_INTERRUPT_SOURCE_OVERRIDE;
+intsrcovr->length = sizeof(*intsrcovr);
+intsrcovr->source = i;
+
+if ( i == 0 )
+{
+/* ISA IRQ0 routed to IOAPIC GSI 2. */
+intsrcovr->gsi= 2;
+intsrcovr->flags = 0x0;
+}
+else if ( PCI_ISA_IRQ_MASK & (1U << i) )
+{
+/* PCI: active-low level-triggered. */
+intsrcovr->gsi= i;
+intsrcovr->flags = 0xf;
+}
+else
+{
+/* No need for a INT source override structure. */
+continue;
+}
+
+intsrcovr++;
}
-intsrcovr++;
-}
+io_apic = (struct acpi_20_madt_ioapic *)intsrcovr;
+memset(io_apic, 0, sizeof(*io_apic));
+io_apic->type= ACPI_IO_APIC;
+io_apic->length = sizeof(*io_apic);
+io_apic->ioapic_id = IOAPIC_ID;
+io_apic->ioapic_addr = IOAPIC_BASE_ADDRESS;
-io_apic = (struct acpi_20_madt_ioapic *)intsrcovr;
-memset(io_apic, 0, sizeof(*io_apic));
-io_apic->type= ACPI_IO_APIC;
-io_apic->length = sizeof(*io_apic);
-io_apic->ioapic_id = IOAPIC_ID;
-io_apic->ioapic_addr = IOAPIC_BASE_ADDRESS;
+lapic = (struct acpi_20_madt_lapic *)(io_apic + 1);
+}
+else
+lapic = (struct acpi_20_madt_lapic *)(madt + 1);
-lapic = (struct acpi_20_madt_lapic *)(io_apic + 1);
config->ainfo.nr_cpus =config-> hvminfo->nr_vcpus;
config->ainfo.madt_lapic0_addr = (uint32_t)lapic;
for ( i = 0; i < config->hvminfo->nr_vcpus; i++ )
diff --git a/tools/firmware/hvmloader/acpi/libacpi.h
b/tools/firmware/hvmloader/acpi/libacpi.h
index 75874ec..86f19b9 100644
--- a/tools/firmware/hvmloader/acpi/libacpi.h
+++ b/tools/firmware/hvmloader/acpi/libacpi.h
@@ -35,6 +35,7 @@
#define ACPI_BUILD_SSDT_S3(1<<1)
#define ACPI_BUILD_SSDT_S4(1<<2)
#define ACPI_BUILD_TCPA (1<<3)
+#define ACPI_BUILD_IOAPIC (1<<4)
#pragma pack ()
diff --git a/tools/firmware/hvmloader/util.c b/tools/firmware/hvmloader/util.c
index 9f9c93b..5aecf7b 100644
--- a/tools/firmware/hvmloader/util.c
+++ b/tools/firmware/hvmloader/util.c
@@ -914,7 +914,7 @@ void hvmloader_acpi_build_tables(struct acpi_config *config,
if ( !strncmp(xenstore_read("platform/acpi_s4", "1"), "1", 1) )
config->table_flags |= ACPI_BUILD_SSDT_S4;
-config->table_flags |= ACPI_BUILD_TCPA;
+config->table_flags |= (ACPI_BUILD_TCPA | ACPI_BUILD_IOAPIC);
config->tis_hdr = (uint16_t *)ACPI_TIS_HDR_ADDRESS;
--
1.7.1
___
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel