aboutsummaryrefslogtreecommitdiff
path: root/kvm
diff options
context:
space:
mode:
authorBeth Kon <eak@us.ibm.com>2009-06-09 11:55:22 -0400
committerAvi Kivity <avi@redhat.com>2009-06-10 15:28:16 +0300
commitaf3feb32f22f14350f76ed0df0ac359b9fe71ca5 (patch)
treec59a9f90e208e4eff70799bade298f29e588eea1 /kvm
parentFix hot remove assigned device regression (diff)
downloadqemu-kvm-af3feb32f22f14350f76ed0df0ac359b9fe71ca5.tar.gz
qemu-kvm-af3feb32f22f14350f76ed0df0ac359b9fe71ca5.tar.bz2
qemu-kvm-af3feb32f22f14350f76ed0df0ac359b9fe71ca5.zip
bios: Fix MADT table creation
Correct MADT table size calculation. Based on patch from Vincent Minet. Signed-off-by: Beth Kon <eak@us.ibm.com> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'kvm')
-rwxr-xr-xkvm/bios/rombios32.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/kvm/bios/rombios32.c b/kvm/bios/rombios32.c
index 369cbef77..cdae363b3 100755
--- a/kvm/bios/rombios32.c
+++ b/kvm/bios/rombios32.c
@@ -86,6 +86,8 @@ typedef unsigned long long uint64_t;
#define MTRRphysBase_MSR(reg) (0x200 + 2 * (reg))
#define MTRRphysMask_MSR(reg) (0x200 + 2 * (reg) + 1)
+#define MAX_INT_OVERRIDES 16
+
static inline void outl(int addr, int val)
{
asm volatile ("outl %1, %w0" : : "d" (addr), "a" (val));
@@ -1600,7 +1602,7 @@ void acpi_bios_init(void)
uint32_t hpet_addr;
#endif
uint32_t base_addr, rsdt_addr, fadt_addr, addr, facs_addr, dsdt_addr, ssdt_addr;
- uint32_t acpi_tables_size, madt_addr, madt_size, rsdt_size;
+ uint32_t acpi_tables_size, madt_addr, madt_size, rsdt_size, madt_end;
uint32_t srat_addr,srat_size;
uint16_t i, external_tables;
int nb_numa_nodes;
@@ -1668,7 +1670,7 @@ void acpi_bios_init(void)
madt_size = sizeof(*madt) +
sizeof(struct madt_processor_apic) * MAX_CPUS +
#ifdef BX_QEMU
- sizeof(struct madt_io_apic) /* + sizeof(struct madt_int_override) */;
+ sizeof(struct madt_io_apic) + sizeof(struct madt_int_override) * MAX_INT_OVERRIDES;
#else
sizeof(struct madt_io_apic);
#endif
@@ -1786,8 +1788,9 @@ void acpi_bios_init(void)
continue;
}
int_override++;
- madt_size += sizeof(struct madt_int_override);
}
+ madt_end = (uint32_t)int_override;
+ madt_size = madt_end - madt_addr;
acpi_build_table_header((struct acpi_table_header *)madt,
"APIC", madt_size, 1);
}