ACK: [PATCH] lib: fwts_acpi_table: multi-FADT table support fimware make sure the table from XSDT be checked first. (LP: #1258378)
Colin Ian King
colin.king at canonical.com
Fri Dec 6 08:51:16 UTC 2013
On 06/12/13 04:26, Ivan Hu wrote:
> Some fimwares that contain two FADT tables, one comes from the RSDT and
> the other comes from the XSDT. The FWTS will add the FADT tables followed
> the order RSDT and XSDT. And the fadt test will load the fadt table first
> added to the table what was from RSDT.
>
> Unfortunately, some firmware provide the multi-fadt tables, one(from
> XSDT) is correct and the other is uncompleted/wrong (from RSDT). See the
> bug(LP: #1253871)
>
> From the ACPI spec: it said "An ACPI-compatible OS must use the XSDT if
> present.". So change table adding order to XSDT, RSDT to make sure fwts
> check the fadt from XSDT first.
>
> Signed-off-by: Ivan Hu <ivan.hu at canonical.com>
> ---
> src/lib/src/fwts_acpi_tables.c | 36 ++++++++++++++++++------------------
> 1 file changed, 18 insertions(+), 18 deletions(-)
>
> diff --git a/src/lib/src/fwts_acpi_tables.c b/src/lib/src/fwts_acpi_tables.c
> index b23efa7..6f1e964 100644
> --- a/src/lib/src/fwts_acpi_tables.c
> +++ b/src/lib/src/fwts_acpi_tables.c
> @@ -260,19 +260,19 @@ static int fwts_acpi_load_tables_from_firmware(void)
> return FWTS_ERROR;
> fwts_acpi_add_table("RSDP", rsdp, (uint64_t)(off_t)rsdp_addr, rsdp_len, FWTS_ACPI_TABLE_FROM_FIRMWARE);
>
> - /* Load any tables from RSDT if it's valid */
> - if (rsdp->rsdt_address) {
> - if ((rsdt = fwts_acpi_load_table((off_t)rsdp->rsdt_address)) != NULL) {
> - fwts_acpi_add_table("RSDT", rsdt, (uint64_t)rsdp->rsdt_address,
> - rsdt->header.length, FWTS_ACPI_TABLE_FROM_FIRMWARE);
> - num_entries = (rsdt->header.length - sizeof(fwts_acpi_table_header)) / 4;
> + /* Load any tables from XSDT if it's valid */
> + if (rsdp->xsdt_address) {
> + if ((xsdt = fwts_acpi_load_table((off_t)rsdp->xsdt_address)) != NULL) {
> + fwts_acpi_add_table("XSDT", xsdt, (uint64_t)rsdp->xsdt_address,
> + xsdt->header.length, FWTS_ACPI_TABLE_FROM_FIRMWARE);
> + num_entries = (xsdt->header.length - sizeof(fwts_acpi_table_header)) / 8;
> for (i=0; i<num_entries; i++) {
> - if (rsdt->entries[i]) {
> - if ((header = fwts_acpi_load_table((off_t)rsdt->entries[i])) != NULL) {
> + if (xsdt->entries[i]) {
> + if ((header = fwts_acpi_load_table((off_t)xsdt->entries[i])) != NULL) {
> if (strncmp("FACP", header->signature, 4) == 0)
> fwts_acpi_handle_fadt((fwts_acpi_table_fadt*)header,
> FWTS_ACPI_TABLE_FROM_FIRMWARE);
> - fwts_acpi_add_table(header->signature, header, (uint64_t)rsdt->entries[i],
> + fwts_acpi_add_table(header->signature, header, xsdt->entries[i],
> header->length, FWTS_ACPI_TABLE_FROM_FIRMWARE);
> }
> }
> @@ -280,19 +280,19 @@ static int fwts_acpi_load_tables_from_firmware(void)
> }
> }
>
> - /* Load any tables from XSDT if it's valid */
> - if (rsdp->xsdt_address) {
> - if ((xsdt = fwts_acpi_load_table((off_t)rsdp->xsdt_address)) != NULL) {
> - fwts_acpi_add_table("XSDT", xsdt, (uint64_t)rsdp->xsdt_address,
> - xsdt->header.length, FWTS_ACPI_TABLE_FROM_FIRMWARE);
> - num_entries = (xsdt->header.length - sizeof(fwts_acpi_table_header)) / 8;
> + /* Load any tables from RSDT if it's valid */
> + if (rsdp->rsdt_address) {
> + if ((rsdt = fwts_acpi_load_table((off_t)rsdp->rsdt_address)) != NULL) {
> + fwts_acpi_add_table("RSDT", rsdt, (uint64_t)rsdp->rsdt_address,
> + rsdt->header.length, FWTS_ACPI_TABLE_FROM_FIRMWARE);
> + num_entries = (rsdt->header.length - sizeof(fwts_acpi_table_header)) / 4;
> for (i=0; i<num_entries; i++) {
> - if (xsdt->entries[i]) {
> - if ((header = fwts_acpi_load_table((off_t)xsdt->entries[i])) != NULL) {
> + if (rsdt->entries[i]) {
> + if ((header = fwts_acpi_load_table((off_t)rsdt->entries[i])) != NULL) {
> if (strncmp("FACP", header->signature, 4) == 0)
> fwts_acpi_handle_fadt((fwts_acpi_table_fadt*)header,
> FWTS_ACPI_TABLE_FROM_FIRMWARE);
> - fwts_acpi_add_table(header->signature, header, xsdt->entries[i],
> + fwts_acpi_add_table(header->signature, header, (uint64_t)rsdt->entries[i],
> header->length, FWTS_ACPI_TABLE_FROM_FIRMWARE);
> }
> }
>
Thanks for spotting this, good catch.
Acked-by: Colin Ian King <colin.king at canonical.com>
More information about the fwts-devel
mailing list