[PATCH 3/3] acpi: checksum: flag up errors that are critical, add more helpful advice
Colin King
colin.king at canonical.com
Tue Feb 28 11:07:42 UTC 2012
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
More information about the fwts-devel
mailing list