Message ID | 20181126162942.21258-3-sameo@linux.intel.com |
---|---|
State | New |
Headers | show |
Series | hw: acpi: RSDP fixes and refactoring | expand |
On Mon, 26 Nov 2018 17:29:35 +0100 Samuel Ortiz <sameo@linux.intel.com> wrote: > From: Igor Mammedov <imammedo@redhat.com> > > When RSDP table was introduced (d4bec5d87), we calculated only legacy > checksum, and that was incorrect as it > - specified rev=2 and forgot about extended checksum. > - legacy checksum calculated on full table instead of the 1st 20 bytes > > Fix it by adding extended checksum calculation and using correct > size for legacy checksum. > > While at it use explicit constants to specify sub/full tables > sizes instead of relying on AcpiRsdpDescriptor size and fields offsets. > The follow up commits will convert this table to build_append_int_noprefix() API, > will use constants anyway and remove unused AcpiRsdpDescriptor structure. > > Based on "[PATCH v5 05/24] hw: acpi: Implement XSDT support for RSDP" > by Samuel Ortiz, who did it right in his impl. > > Fixes: d4bec5d87 (hw/arm/virt-acpi-build: Generate RSDP table) > Signed-off-by: Igor Mammedov <imammedo@redhat.com> > CC: Ard Biesheuvel <ard.biesheuvel@linaro.org> > CC: Shannon Zhao <shannon.zhaosl@gmail.com> > Reviewed-by: Samuel Ortiz <sameo@linux.intel.com> For future reference, if one re-sends someone else patch, one is supposed to add his/her own SoB as the last one. > --- > hw/arm/virt-acpi-build.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c > index fcaa350892..0835900052 100644 > --- a/hw/arm/virt-acpi-build.c > +++ b/hw/arm/virt-acpi-build.c > @@ -390,8 +390,13 @@ build_rsdp(GArray *rsdp_table, BIOSLinker *linker, unsigned xsdt_tbl_offset) > > /* Checksum to be filled by Guest linker */ > bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE, > - (char *)rsdp - rsdp_table->data, sizeof *rsdp, > + (char *)rsdp - rsdp_table->data, 20 /* ACPI rev 1.0 RSDP size */, > (char *)&rsdp->checksum - rsdp_table->data); > + > + /* Extended checksum to be filled by Guest linker */ > + bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE, > + (char *)rsdp - rsdp_table->data, 36 /* ACPI rev 2.0 RSDP size */, > + (char *)&rsdp->extended_checksum - rsdp_table->data); > } > > static void
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c index fcaa350892..0835900052 100644 --- a/hw/arm/virt-acpi-build.c +++ b/hw/arm/virt-acpi-build.c @@ -390,8 +390,13 @@ build_rsdp(GArray *rsdp_table, BIOSLinker *linker, unsigned xsdt_tbl_offset) /* Checksum to be filled by Guest linker */ bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE, - (char *)rsdp - rsdp_table->data, sizeof *rsdp, + (char *)rsdp - rsdp_table->data, 20 /* ACPI rev 1.0 RSDP size */, (char *)&rsdp->checksum - rsdp_table->data); + + /* Extended checksum to be filled by Guest linker */ + bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE, + (char *)rsdp - rsdp_table->data, 36 /* ACPI rev 2.0 RSDP size */, + (char *)&rsdp->extended_checksum - rsdp_table->data); } static void