From: Avi Kivity <a...@redhat.com> Instead of using hardcoded offsets into the rsdt table, keep a count of used entries.
Signed-off-by: Avi Kivity <a...@redhat.com> diff --git a/kvm/bios/rombios32.c b/kvm/bios/rombios32.c index f4c58b9..cbd5f15 100755 --- a/kvm/bios/rombios32.c +++ b/kvm/bios/rombios32.c @@ -1293,18 +1293,15 @@ struct rsdp_descriptor /* Root System Descriptor Pointer */ uint8_t reserved [3]; /* Reserved field must be 0 */ } __attribute__((__packed__)); +#define MAX_RSDT_ENTRIES 100 + /* * ACPI 1.0 Root System Description Table (RSDT) */ struct rsdt_descriptor_rev1 { ACPI_TABLE_HEADER_DEF /* ACPI common table header */ -#ifdef BX_QEMU - uint32_t table_offset_entry [3]; /* Array of pointers to other */ -// uint32_t table_offset_entry [5]; /* Array of pointers to other */ -#else - uint32_t table_offset_entry [3]; /* Array of pointers to other */ -#endif + uint32_t table_offset_entry [MAX_RSDT_ENTRIES]; /* Array of pointers to other */ /* ACPI tables */ } __attribute__((__packed__)); @@ -1607,6 +1604,7 @@ void acpi_bios_init(void) uint32_t srat_addr,srat_size; uint16_t i, external_tables; int nb_numa_nodes; + int nb_rsdt_entries = 0; /* reserve memory space for tables */ #ifdef BX_USE_EBDA_TABLES @@ -1876,7 +1874,7 @@ void acpi_bios_init(void) uint16_t len; if(acpi_load_table(i, addr, &len) < 0) BX_PANIC("Failed to load ACPI table from QEMU\n"); - rsdt->table_offset_entry[i+2] = cpu_to_le32(addr); + rsdt->table_offset_entry[nb_rsdt_entries++] = cpu_to_le32(addr); addr += len; if(addr >= ram_size) BX_PANIC("ACPI table overflow\n"); @@ -1884,18 +1882,20 @@ void acpi_bios_init(void) #endif /* RSDT */ - rsdt->table_offset_entry[0] = cpu_to_le32(fadt_addr); - rsdt->table_offset_entry[1] = cpu_to_le32(madt_addr); + rsdt->table_offset_entry[nb_rsdt_entries++] = cpu_to_le32(fadt_addr); + rsdt->table_offset_entry[nb_rsdt_entries++] = cpu_to_le32(madt_addr); /* kvm has no ssdt (processors are in dsdt) */ -// rsdt->table_offset_entry[2] = cpu_to_le32(ssdt_addr); +// rsdt->table_offset_entry[nb_rsdt_entries++] = cpu_to_le32(ssdt_addr); #ifdef BX_QEMU /* No HPET (yet) */ -// rsdt->table_offset_entry[3] = cpu_to_le32(hpet_addr); +// rsdt->table_offset_entry[nb_rsdt_entries++] = cpu_to_le32(hpet_addr); if (nb_numa_nodes > 0) - rsdt->table_offset_entry[3] = cpu_to_le32(srat_addr); + rsdt->table_offset_entry[nb_rsdt_entries++] = cpu_to_le32(srat_addr); #endif + rsdt_size -= MAX_RSDT_ENTRIES * 4; + rsdt_size += nb_rsdt_entries * 4; acpi_build_table_header((struct acpi_table_header *)rsdt, "RSDT", - rsdt_size - (nb_numa_nodes > 0? 0: sizeof(uint32_t)), 1); + rsdt_size, 1); acpi_tables_size = addr - base_addr; -- To unsubscribe from this list: send the line "unsubscribe kvm-commits" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html