ACK: [PATCH v2 2/2] acpi: hest: Add GHESv2 checking (LP: #1587624)
Colin Ian King
colin.king at canonical.com
Wed Jun 1 21:40:49 UTC 2016
On 01/06/16 21:24, Jeff Hugo wrote:
> ACPI 6.1 added section 18.3.2.8 which defines Generic Hardware Error Source
> version 2 (GHESv2). Add checking for this new type (0x0a).
>
> Signed-off-by: Jeffrey Hugo <jhugo at codeaurora.org>
> ---
> Changes from v1:
> - Update fwts_log_*_verbatum to fwts_log_*_verbatim per commit 8beb591e38c09e656b7fee03e37b0c11fb2063a9 as suggested by Alex Hung.
>
> src/acpi/hest/hest.c | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 121 insertions(+)
>
> diff --git a/src/acpi/hest/hest.c b/src/acpi/hest/hest.c
> index ecfd337..62f1370 100644
> --- a/src/acpi/hest/hest.c
> +++ b/src/acpi/hest/hest.c
> @@ -667,6 +667,124 @@ static void hest_check_generic_error_source(
> }
>
> /*
> + * ACPI Section 18.3.2.8 Generic Error Source version 2
> + */
> +static void hest_check_generic_error_source_v2(
> + fwts_framework *fw,
> + ssize_t *length,
> + uint8_t **data,
> + bool *passed)
> +{
> + fwts_acpi_table_hest_generic_hardware_error_source_v2 *source =
> + (fwts_acpi_table_hest_generic_hardware_error_source_v2 *)*data;
> +
> + /* Enough data for an empty machine check exceptions structure? */
> + if (*length < (ssize_t)sizeof(fwts_acpi_table_hest_generic_hardware_error_source_v2)) {
> + fwts_failed(fw, LOG_LEVEL_HIGH,
> + "HESTGenericHardwareErrorSourceTooShort",
> + "HEST Generic Hardware Error Source Too Short "
> + "too short, expecting %zu bytes, "
> + "instead got %zu bytes",
> + sizeof(fwts_acpi_table_hest_generic_hardware_error_source_v2), *length);
> + *passed = false;
> + *length = 0; /* Forces an early abort */
> + return;
> + }
> +
> + fwts_log_info_verbatim(fw, "HEST Generic Hardware Error Source version 2");
> + fwts_log_info_verbatim(fw, " Type: 0x%2.2" PRIx8, source->type);
> + fwts_log_info_verbatim(fw, " Source ID: 0x%4.4" PRIx16, source->source_id);
> + fwts_log_info_verbatim(fw, " Related Source ID: 0x%4.4" PRIx16, source->related_source_id);
> + fwts_log_info_verbatim(fw, " Flags: 0x%2.2" PRIx8, source->flags);
> + fwts_log_info_verbatim(fw, " Enabled: 0x%2.2" PRIx8, source->enabled);
> + fwts_log_info_verbatim(fw, " Num. Records. Prealloc.: 0x%8.8" PRIx32, source->number_of_records_to_preallocate);
> + fwts_log_info_verbatim(fw, " Max. Sections Per Rec.: 0x%8.8" PRIx32, source->max_sections_per_record);
> + fwts_log_info_verbatim(fw, " Max. Raw Data Length: 0x%8.8" PRIx32, source->max_raw_data_length);
> +
> + fwts_log_info_verbatim(fw, " Error Status Address:");
> + fwts_log_info_verbatim(fw, " Address Space ID: 0x%2.2" PRIx8,
> + source->error_status_address.address_space_id);
> + fwts_log_info_verbatim(fw, " Register Bit Width 0x%2.2" PRIx8,
> + source->error_status_address.register_bit_width);
> + fwts_log_info_verbatim(fw, " Register Bit Offset 0x%2.2" PRIx8,
> + source->error_status_address.register_bit_offset);
> + fwts_log_info_verbatim(fw, " Access Size 0x%2.2" PRIx8,
> + source->error_status_address.access_width);
> + fwts_log_info_verbatim(fw, " Address 0x%16.16" PRIx64,
> + source->error_status_address.address);
> + fwts_log_info_verbatim(fw, " Hardware Error Notification:");
> + fwts_log_info_verbatim(fw, " Type: 0x%2.2" PRIx8, source->notification.type);
> + fwts_log_info_verbatim(fw, " Length: 0x%2.2" PRIx8, source->notification.length);
> + fwts_log_info_verbatim(fw, " Config. Write. Enable: 0x%4.4" PRIx16,
> + source->notification.configuration_write_enable);
> + fwts_log_info_verbatim(fw, " Poll Interval: 0x%4.4" PRIx16,
> + source->notification.poll_interval);
> + fwts_log_info_verbatim(fw, " Interrupt Vector: 0x%4.4" PRIx16,
> + source->notification.vector);
> + fwts_log_info_verbatim(fw, " Sw. to Polling Value: 0x%4.4" PRIx16,
> + source->notification.switch_to_polling_threshold_value);
> + fwts_log_info_verbatim(fw, " Sw. to Polling Window: 0x%4.4" PRIx16,
> + source->notification.switch_to_polling_threshold_window);
> + fwts_log_info_verbatim(fw, " Error: Thresh. Value: 0x%4.4" PRIx16,
> + source->notification.error_threshold_value);
> + fwts_log_info_verbatim(fw, " Error: Thresh. Window: 0x%4.4" PRIx16,
> + source->notification.error_threshold_window);
> + fwts_log_info_verbatim(fw, " Error Status Blk. Length: 0x%8.8" PRIx32, source->error_status_block_length);
> + fwts_log_info_verbatim(fw, " Read Ack Register:");
> + fwts_log_info_verbatim(fw, " Address Space ID: 0x%2.2" PRIx8,
> + source->read_ack_register.address_space_id);
> + fwts_log_info_verbatim(fw, " Register Bit Width 0x%2.2" PRIx8,
> + source->read_ack_register.register_bit_width);
> + fwts_log_info_verbatim(fw, " Register Bit Offset 0x%2.2" PRIx8,
> + source->read_ack_register.register_bit_offset);
> + fwts_log_info_verbatim(fw, " Access Size 0x%2.2" PRIx8,
> + source->read_ack_register.access_width);
> + fwts_log_info_verbatim(fw, " Address 0x%16.16" PRIx64,
> + source->read_ack_register.address);
> + fwts_log_info_verbatim(fw, " Read Ack Preserve: 0x%16.16" PRIx64, source->read_ack_preserve);
> + fwts_log_info_verbatim(fw, " Read Ack Write: 0x%16.16" PRIx64, source->read_ack_write);
> + fwts_log_nl(fw);
> +
> + if (source->number_of_records_to_preallocate < 1) {
> + *passed = false;
> + fwts_failed(fw, LOG_LEVEL_HIGH,
> + "HESTInvalidRecordsToPreallocate",
> + "HEST Hardware Error Source Number of Records "
> + "to Preallocate is 0x%" PRIx16 " and must be "
> + "more than zero.",
> + source->number_of_records_to_preallocate);
> + }
> + if (source->max_sections_per_record < 1) {
> + *passed = false;
> + fwts_failed(fw, LOG_LEVEL_HIGH,
> + "HESTInvalidMaxSectionsPerRecord",
> + "HEST Hardware Error Source Max Sections Per "
> + "Record is 0x%" PRIx16 " and must be "
> + "more than zero.",
> + source->max_sections_per_record);
> + }
> + if (source->notification.type > 7) {
> + *passed = false;
> + fwts_failed(fw, LOG_LEVEL_HIGH,
> + "HESTInvalidHardwareErrorNotificationType",
> + "HEST Hardware Error Notification Type is "
> + "an invalid reserved value of 0x%2.2" PRIx8 ","
> + "expecting value 0x00 to 0x07",
> + source->notification.type);
> + }
> + if (source->notification.configuration_write_enable & ~0x3f) {
> + *passed = false;
> + fwts_failed(fw, LOG_LEVEL_LOW,
> + "HESTIA32ConfigWriteEnabledReservedNonZero",
> + "HEST Configuration Write Enabled Reserved bits [6:31] "
> + "are non-zero.");
> + }
> +
> + *length -= sizeof(fwts_acpi_table_hest_generic_hardware_error_source_v2);
> + *data += sizeof(fwts_acpi_table_hest_generic_hardware_error_source_v2);
> +}
> +
> +/*
> * ACPI Section 18.3.2.8
> */
>
> @@ -729,6 +847,9 @@ static int hest_test1(fwts_framework *fw)
> case 0x09:
> hest_check_generic_error_source(fw, &length, &data, &passed);
> break;
> + case 0x0a:
> + hest_check_generic_error_source_v2(fw, &length, &data, &passed);
> + break;
> default:
> fwts_failed(fw, LOG_LEVEL_HIGH,
> "HESTInvalidType",
>
Thanks Jeff.
Acked-by: Colin Ian King <colin.king at canonical.com>
More information about the fwts-devel
mailing list