build_madt(GArray *table_data, GArray *linker, VirtGuestInfo *guest_info,

           VirtAcpiCpuInfo *cpuinfo)

{

    int madt_start = table_data->len;

    const MemMapEntry *memmap = guest_info->memmap;

    const int *irqmap = guest_info->irqmap;

    AcpiMultipleApicTable *madt;

    AcpiMadtGenericDistributor *gicd;

    AcpiMadtGenericMsiFrame *gic_msi;

    int i;



    madt = acpi_data_push(table_data, sizeof *madt);



    for (i = 0; i < guest_info->smp_cpus; i++) {

        AcpiMadtGenericInterrupt *gicc = acpi_data_push(table_data,

                                                     sizeof *gicc);

        gicc->type = ACPI_APIC_GENERIC_INTERRUPT;

        gicc->length = sizeof(*gicc);

        gicc->base_address = memmap[VIRT_GIC_CPU].base;

        gicc->cpu_interface_number = i;

        gicc->arm_mpidr = i;

        gicc->uid = i;

        if (test_bit(i, cpuinfo->found_cpus)) {

            gicc->flags = cpu_to_le32(ACPI_GICC_ENABLED);

        }

    }



    gicd = acpi_data_push(table_data, sizeof *gicd);

    gicd->type = ACPI_APIC_GENERIC_DISTRIBUTOR;

    gicd->length = sizeof(*gicd);

    gicd->base_address = memmap[VIRT_GIC_DIST].base;



    gic_msi = acpi_data_push(table_data, sizeof *gic_msi);

    gic_msi->type = ACPI_APIC_GENERIC_MSI_FRAME;

    gic_msi->length = sizeof(*gic_msi);

    gic_msi->gic_msi_frame_id = 0;

    gic_msi->base_address = cpu_to_le64(memmap[VIRT_GIC_V2M].base);

    gic_msi->flags = cpu_to_le32(1);

    gic_msi->spi_count = cpu_to_le16(NUM_GICV2M_SPIS);

    gic_msi->spi_base = cpu_to_le16(irqmap[VIRT_GIC_V2M] + ARM_SPI_BASE);



    build_header(linker, table_data,

                 (void *)(table_data->data + madt_start), "APIC",

                 table_data->len - madt_start, 3);

}

build_madt(GArray *table_data, GArray *linker, VirtGuestInfo *guest_info,

           VirtAcpiCpuInfo *cpuinfo)

{

    int madt_start = table_data->len;

    const MemMapEntry *memmap = guest_info->memmap;

    const int *irqmap = guest_info->irqmap;

    AcpiMultipleApicTable *madt;

    AcpiMadtGenericDistributor *gicd;

    AcpiMadtGenericMsiFrame *gic_msi;

    int i;



    madt = acpi_data_push(table_data, sizeof *madt);



    for (i = 0; i < guest_info->smp_cpus; i++) {

        AcpiMadtGenericInterrupt *gicc = acpi_data_push(table_data,

                                                     sizeof *gicc);

        gicc->type = ACPI_APIC_GENERIC_INTERRUPT;

        gicc->length = sizeof(*gicc);

        gicc->base_address = memmap[VIRT_GIC_CPU].base;

        gicc->cpu_interface_number = i;

        gicc->arm_mpidr = i;

        gicc->uid = i;

        if (test_bit(i, cpuinfo->found_cpus)) {

            gicc->flags = cpu_to_le32(ACPI_GICC_ENABLED);

        }

    }



    gicd = acpi_data_push(table_data, sizeof *gicd);

    gicd->type = ACPI_APIC_GENERIC_DISTRIBUTOR;

    gicd->length = sizeof(*gicd);

    gicd->base_address = memmap[VIRT_GIC_DIST].base;



    gic_msi = acpi_data_push(table_data, sizeof *gic_msi);

    gic_msi->type = ACPI_APIC_GENERIC_MSI_FRAME;

    gic_msi->length = sizeof(*gic_msi);

    gic_msi->gic_msi_frame_id = 0;

    gic_msi->base_address = cpu_to_le64(memmap[VIRT_GIC_V2M].base);

    gic_msi->flags = cpu_to_le32(1);

    gic_msi->spi_count = cpu_to_le16(NUM_GICV2M_SPIS);

    gic_msi->spi_base = cpu_to_le16(irqmap[VIRT_GIC_V2M] + ARM_SPI_BASE);



    build_header(linker, table_data,

                 (void *)(table_data->data + madt_start), "APIC",

                 table_data->len - madt_start, 3);

}

FUNC_0(GArray *VAR_0, GArray *VAR_1, VirtGuestInfo *VAR_2,

           VirtAcpiCpuInfo *VAR_3)

{

    int VAR_4 = VAR_0->len;

    const MemMapEntry *VAR_5 = VAR_2->VAR_5;

    const int *VAR_6 = VAR_2->VAR_6;

    AcpiMultipleApicTable *madt;

    AcpiMadtGenericDistributor *gicd;

    AcpiMadtGenericMsiFrame *gic_msi;

    int VAR_7;



    madt = acpi_data_push(VAR_0, sizeof *madt);



    for (VAR_7 = 0; VAR_7 < VAR_2->smp_cpus; VAR_7++) {

        AcpiMadtGenericInterrupt *gicc = acpi_data_push(VAR_0,

                                                     sizeof *gicc);

        gicc->type = ACPI_APIC_GENERIC_INTERRUPT;

        gicc->length = sizeof(*gicc);

        gicc->base_address = VAR_5[VIRT_GIC_CPU].base;

        gicc->cpu_interface_number = VAR_7;

        gicc->arm_mpidr = VAR_7;

        gicc->uid = VAR_7;

        if (test_bit(VAR_7, VAR_3->found_cpus)) {

            gicc->flags = cpu_to_le32(ACPI_GICC_ENABLED);

        }

    }



    gicd = acpi_data_push(VAR_0, sizeof *gicd);

    gicd->type = ACPI_APIC_GENERIC_DISTRIBUTOR;

    gicd->length = sizeof(*gicd);

    gicd->base_address = VAR_5[VIRT_GIC_DIST].base;



    gic_msi = acpi_data_push(VAR_0, sizeof *gic_msi);

    gic_msi->type = ACPI_APIC_GENERIC_MSI_FRAME;

    gic_msi->length = sizeof(*gic_msi);

    gic_msi->gic_msi_frame_id = 0;

    gic_msi->base_address = cpu_to_le64(VAR_5[VIRT_GIC_V2M].base);

    gic_msi->flags = cpu_to_le32(1);

    gic_msi->spi_count = cpu_to_le16(NUM_GICV2M_SPIS);

    gic_msi->spi_base = cpu_to_le16(VAR_6[VIRT_GIC_V2M] + ARM_SPI_BASE);



    build_header(VAR_1, VAR_0,

                 (void *)(VAR_0->data + VAR_4), "APIC",

                 VAR_0->len - VAR_4, 3);

}

FUNC_0(GArray *VAR_0, GArray *VAR_1, VirtGuestInfo *VAR_2,
VirtAcpiCpuInfo *VAR_3)
{ int VAR_4 = VAR_0->len; const MemMapEntry *VAR_5 = VAR_2->VAR_5; const int *VAR_6 = VAR_2->VAR_6; AcpiMultipleApicTable *madt; AcpiMadtGenericDistributor *gicd; AcpiMadtGenericMsiFrame *gic_msi; int VAR_7; madt = acpi_data_push(VAR_0, sizeof *madt); for (VAR_7 = 0; VAR_7 < VAR_2->smp_cpus; VAR_7++) { AcpiMadtGenericInterrupt *gicc = acpi_data_push(VAR_0,
sizeof *gicc); gicc->type = ACPI_APIC_GENERIC_INTERRUPT; gicc->length = sizeof(*gicc); gicc->base_address = VAR_5[VIRT_GIC_CPU].base; gicc->cpu_interface_number = VAR_7; gicc->arm_mpidr = VAR_7; gicc->uid = VAR_7; if (test_bit(VAR_7, VAR_3->found_cpus)) { gicc->flags = cpu_to_le32(ACPI_GICC_ENABLED); } } gicd = acpi_data_push(VAR_0, sizeof *gicd); gicd->type = ACPI_APIC_GENERIC_DISTRIBUTOR; gicd->length = sizeof(*gicd); gicd->base_address = VAR_5[VIRT_GIC_DIST].base; gic_msi = acpi_data_push(VAR_0, sizeof *gic_msi); gic_msi->type = ACPI_APIC_GENERIC_MSI_FRAME; gic_msi->length = sizeof(*gic_msi); gic_msi->gic_msi_frame_id = 0; gic_msi->base_address = cpu_to_le64(VAR_5[VIRT_GIC_V2M].base); gic_msi->flags = cpu_to_le32(1); gic_msi->spi_count = cpu_to_le16(NUM_GICV2M_SPIS); gic_msi->spi_base = cpu_to_le16(VAR_6[VIRT_GIC_V2M] + ARM_SPI_BASE); build_header(VAR_1, VAR_0,
(void *)(VAR_0->data + VAR_4), "APIC",
VAR_0->len - VAR_4, 3); }