Different arch would handle the main madt table differently. Add a helper function to achieve this goal.
Signed-off-by: Wei Yang <richardw.y...@linux.intel.com> --- hw/acpi/piix4.c | 1 + hw/i386/acpi-build.c | 13 +++++++++++-- hw/isa/lpc_ich9.c | 1 + include/hw/acpi/acpi_dev_interface.h | 1 + include/hw/i386/pc.h | 1 + 5 files changed, 15 insertions(+), 2 deletions(-) diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c index f4336b9238..d7d097daee 100644 --- a/hw/acpi/piix4.c +++ b/hw/acpi/piix4.c @@ -723,6 +723,7 @@ static void piix4_pm_class_init(ObjectClass *klass, void *data) adevc->ospm_status = piix4_ospm_status; adevc->send_event = piix4_send_gpe; adevc->madt_sub = i386_madt_sub; + adevc->madt_main = i386_madt_main; } static const TypeInfo piix4_pm_info = { diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index 74a34e297e..e73e9fddee 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -454,6 +454,14 @@ madt_operations i386_madt_sub = { [ACPI_APIC_LOCAL_NMI] = pc_madt_nmi_entry, }; +void i386_madt_main(GArray *entry, void *opaque) +{ + AcpiMultipleApicTable *madt = opaque; + + madt->local_apic_address = cpu_to_le32(APIC_DEFAULT_ADDRESS); + madt->flags = cpu_to_le32(1); +} + static void build_madt(GArray *table_data, BIOSLinker *linker, PCMachineState *pcms, struct madt_input *input) @@ -466,8 +474,9 @@ build_madt(GArray *table_data, BIOSLinker *linker, PCMachineState *pcms, void *opaque; madt = acpi_data_push(table_data, sizeof *madt); - madt->local_apic_address = cpu_to_le32(APIC_DEFAULT_ADDRESS); - madt->flags = cpu_to_le32(1); + if (adevc->madt_main) { + adevc->madt_main(table_data, madt); + } for (i = 0; ; i++) { sub_id = input[i].sub_id; diff --git a/hw/isa/lpc_ich9.c b/hw/isa/lpc_ich9.c index efb0fd8e94..21afd1a12d 100644 --- a/hw/isa/lpc_ich9.c +++ b/hw/isa/lpc_ich9.c @@ -812,6 +812,7 @@ static void ich9_lpc_class_init(ObjectClass *klass, void *data) adevc->ospm_status = ich9_pm_ospm_status; adevc->send_event = ich9_send_gpe; adevc->madt_sub = i386_madt_sub; + adevc->madt_main = i386_madt_main; } static const TypeInfo ich9_lpc_info = { diff --git a/include/hw/acpi/acpi_dev_interface.h b/include/hw/acpi/acpi_dev_interface.h index 3a3a12d543..d3b216544d 100644 --- a/include/hw/acpi/acpi_dev_interface.h +++ b/include/hw/acpi/acpi_dev_interface.h @@ -52,6 +52,7 @@ typedef struct AcpiDeviceIfClass { /* <public> */ void (*ospm_status)(AcpiDeviceIf *adev, ACPIOSTInfoList ***list); void (*send_event)(AcpiDeviceIf *adev, AcpiEventStatusBits ev); + madt_operation madt_main; madt_operation *madt_sub; } AcpiDeviceIfClass; #endif diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h index db4ec693d3..6b7dd060ac 100644 --- a/include/hw/i386/pc.h +++ b/include/hw/i386/pc.h @@ -282,6 +282,7 @@ void pc_system_firmware_init(PCMachineState *pcms, MemoryRegion *rom_memory); void pc_madt_cpu_entry(AcpiDeviceIf *adev, int uid, const CPUArchIdList *apic_ids, GArray *entry); extern madt_operations i386_madt_sub; +void i386_madt_main(GArray *entry, void *opaque); /* e820 types */ #define E820_RAM 1 -- 2.19.1