Anthony Liguori wrote: > Vincent Minet wrote: >> External ACPI tables are counted twice for the RSDT size and the load >> address for the first external table is in the MADT (interrupt override >> entries are overwritten). >> >> Signed-off-by: Vincent Minet >> > > Beth, > > I think you had a patch attempting to address the same issue. It was > a bit more involved though. > > Which is the proper fix and are they both to the same problem? They are for 2 different bases. My patch was for qemu's bochs bios and this is for qemu-kvm/kvm/bios/rombios32.c. They are pretty divergent in this area of setting up the ACPI tables. My patch is still needed for the qemu base. I hope we'll be getting to one base soon :-) Assuming the intent of the code was for MAX_RSDT_ENTRIES to include external_tables, this patch looks correct. I think one additional check would be needed (in my patch) to make sure that the code doesn't exceed MAX_RSDT_ENTRIES when the external tables are being loaded. My patch also puts all the code that calculates madt_size in the same place, at the beginning of the table layout. I believe this is neater and will avoid problems like this one in the future. As much as possible, I think it best to get all the tables layed out, then fill them in. If for some reason this is not acceptable, we need to add a big note that no tables should be layed out after the madt because the madt may grow further down in the code and overwrite the other table. > > > Regards, > > Anthony Liguori > >> --- >> kvm/bios/rombios32.c | 3 ++- >> 1 files changed, 2 insertions(+), 1 deletions(-) >> >> diff --git a/kvm/bios/rombios32.c b/kvm/bios/rombios32.c >> index cbd5f15..289361b 100755 >> --- a/kvm/bios/rombios32.c >> +++ b/kvm/bios/rombios32.c >> @@ -1626,7 +1626,7 @@ void acpi_bios_init(void) >> addr = base_addr = ram_size - ACPI_DATA_SIZE; >> rsdt_addr = addr; >> rsdt = (void *)(addr); >> - rsdt_size = sizeof(*rsdt) + external_tables * 4; >> + rsdt_size = sizeof(*rsdt); >> addr += rsdt_size; >> >> fadt_addr = addr; >> @@ -1787,6 +1787,7 @@ void acpi_bios_init(void) >> } >> int_override++; >> madt_size += sizeof(struct madt_int_override); >> + addr += sizeof(struct madt_int_override); >> } >> acpi_build_table_header((struct acpi_table_header *)madt, >> "APIC", madt_size, 1); >> > > -- > To unsubscribe from this list: send the line "unsubscribe kvm" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html