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

Alex Hung alex.hung at canonical.com
Thu Mar 8 09:56:54 UTC 2012


On 02/28/2012 07:07 PM, Colin King 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;
>   }
Acked-by: Alex Hung <alex.hung at canonical.com>




More information about the fwts-devel mailing list