[PATCH 3/3] acpi: checksum: flag up errors that are critical, add more helpful advice

Keng-Yü Lin kengyu at canonical.com
Fri Mar 2 11:37:01 UTC 2012


On Tue, Feb 28, 2012 at 7:07 PM, Colin King <colin.king at canonical.com> wrote:
> From: Colin Ian King <colin.king at canonical.com>
>
> Signed-off-by: Colin Ian King <colin.king at canonical.com>
> ---
>  src/acpi/checksum/checksum.c |   66 +++++++++++++++++++++++++++++++++++------
>  1 files changed, 56 insertions(+), 10 deletions(-)
>
> diff --git a/src/acpi/checksum/checksum.c b/src/acpi/checksum/checksum.c
> index 77449cc..264e7d0 100644
> --- a/src/acpi/checksum/checksum.c
> +++ b/src/acpi/checksum/checksum.c
> @@ -42,12 +42,16 @@ static void checksum_rsdp(fwts_framework *fw, fwts_acpi_table_info *table)
>
>        /* Version 1.0 RSDP checksum, always applies */
>        checksum = fwts_checksum(table->data, 20);
> -       if (checksum != 0)
> -               fwts_failed(fw, LOG_LEVEL_HIGH, "ACPITableChecksumRSDP",
> +       if (checksum != 0) {
> +               fwts_failed(fw, LOG_LEVEL_CRITICAL, "ACPITableChecksumRSDP",
>                        "RSDP has incorrect checksum, expected 0x%2.2x, "
>                        "got 0x%2.2x.",
>                        (uint8_t)(rsdp->checksum)-checksum, rsdp->checksum);
> -       else
> +               fwts_advice(fw,
> +                       "The kernel will not load the RSDP with an "
> +                       "invalid checksum and hence all other ACPI "
> +                       "tables will also fail to load.");
> +       } else
>                fwts_passed(fw, "Table RSDP has correct checksum 0x%x.",
>                        rsdp->checksum);
>
> @@ -57,7 +61,7 @@ static void checksum_rsdp(fwts_framework *fw, fwts_acpi_table_info *table)
>         */
>        if (rsdp->revision > 0) {
>                if (table->length < sizeof(fwts_acpi_table_rsdp)) {
> -                       fwts_failed(fw, LOG_LEVEL_HIGH,
> +                       fwts_failed(fw, LOG_LEVEL_CRITICAL,
>                                "ACPITableCheckSumShortRSDP",
>                                "RSDP was expected to be %d bytes long, "
>                                "got a shortened size of %d bytes.",
> @@ -67,20 +71,34 @@ static void checksum_rsdp(fwts_framework *fw, fwts_acpi_table_info *table)
>                        return;
>                }
>                checksum = fwts_checksum(table->data, sizeof(fwts_acpi_table_rsdp));
> -               if (checksum != 0)
> -                       fwts_failed(fw, LOG_LEVEL_HIGH,
> +               if (checksum != 0) {
> +                       fwts_failed(fw, LOG_LEVEL_CRITICAL,
>                                "ACPITableChecksumRSDP",
>                                "RSDP has incorrect extended checksum, "
>                                "expected 0x%2.2x, got 0x%2.2x.",
>                                (uint8_t)(rsdp->extended_checksum-checksum),
>                                rsdp->extended_checksum);
> -               else
> +                       fwts_advice(fw,
> +                               "The kernel will not load the RSDP with an "
> +                               "invalid extended checksum and hence all "
> +                               "other ACPI tables will also fail to load.");
> +               } else
>                        fwts_passed(fw, "Table RSDP has correct extended "
>                                "checksum 0x%x.", rsdp->extended_checksum);
>        }
>
>  }
>
> +/*
> + *  The following tables the kernel requires the checksum to be valid otherwise
> + *  it will not load them, so checksum failures here are considered critical errors.
> + */
> +static char *critical_checksum[] = {
> +       "RSDT",
> +       "XSDT",
> +       NULL
> +};
> +
>  static int checksum_scan_tables(fwts_framework *fw)
>  {
>        int i;
> @@ -104,6 +122,7 @@ static int checksum_scan_tables(fwts_framework *fw)
>                        continue;
>                }
>
> +               /* FACS doesn't have a checksum, so ignore */
>                if (strcmp("FACS", table->name) == 0)
>                        continue;
>
> @@ -112,11 +131,38 @@ static int checksum_scan_tables(fwts_framework *fw)
>                        fwts_passed(fw, "Table %s has correct checksum 0x%x.",
>                                table->name, hdr->checksum);
>                else {
> -                       fwts_failed(fw, LOG_LEVEL_LOW, "ACPITableChecksum",
> +                       int i;
> +                       int log_level = LOG_LEVEL_LOW;
> +
> +                       for (i = 0; critical_checksum[i]; i++) {
> +                               if (!strcmp(table->name, critical_checksum[i])) {
> +                                       log_level = LOG_LEVEL_CRITICAL;
> +                                       break;
> +                               }
> +                       }
> +
> +                       fwts_failed(fw, log_level, "ACPITableChecksum",
>                                "Table %s has incorrect checksum, "
>                                "expected 0x%2.2x, got 0x%2.2x.",
> -                               table->name, (uint8_t)(hdr->checksum-checksum), hdr->checksum);
> -               }       fwts_tag_failed(fw, FWTS_TAG_ACPI_TABLE_CHECKSUM);
> +                               table->name, (uint8_t)(hdr->checksum-checksum),
> +                               hdr->checksum);
> +
> +                       /* Give some contextual explanation of the error */
> +                       if (log_level == LOG_LEVEL_CRITICAL)
> +                               fwts_advice(fw,
> +                                       "The kernel requires this table to have a "
> +                                       "valid checksum and will not load it. This "
> +                                       "will lead to ACPI not working correctly.");
> +                       else
> +                               fwts_advice(fw,
> +                                       "The kernel will warn that this table has "
> +                                       "an invalid checksum but will ignore the "
> +                                       "error and still load it. This is not a "
> +                                       "critical issue, but should be fixed if "
> +                                       "possible to avoid the warning messages.");
> +
> +                       fwts_tag_failed(fw, FWTS_TAG_ACPI_TABLE_CHECKSUM);
> +               }
>        }
>        return FWTS_OK;
>  }
> --
> 1.7.9
>
>
Acked-by: Keng-Yu Lin <kengyu at canonical.com>


More information about the fwts-devel mailing list