[PATCH 2/2] acpi: hest: Add GHESv2 checking (LP: #1587624)
Jeffrey Hugo
jhugo at codeaurora.org
Wed Jun 1 18:32:15 UTC 2016
On 5/31/2016 7:07 PM, Alex Hung wrote:
> On 2016-06-01 03:50 AM, 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>
>> ---
>> 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_verbatum(fw, "HEST Generic Hardware Error Source
>> version 2");
>> + fwts_log_info_verbatum(fw, " Type: 0x%2.2"
>> PRIx8, source->type);
>> + fwts_log_info_verbatum(fw, " Source ID: 0x%4.4"
>> PRIx16, source->source_id);
>> + fwts_log_info_verbatum(fw, " Related Source ID: 0x%4.4"
>> PRIx16, source->related_source_id);
>> + fwts_log_info_verbatum(fw, " Flags: 0x%2.2"
>> PRIx8, source->flags);
>> + fwts_log_info_verbatum(fw, " Enabled: 0x%2.2"
>> PRIx8, source->enabled);
>> + fwts_log_info_verbatum(fw, " Num. Records. Prealloc.: 0x%8.8"
>> PRIx32, source->number_of_records_to_preallocate);
>> + fwts_log_info_verbatum(fw, " Max. Sections Per Rec.: 0x%8.8"
>> PRIx32, source->max_sections_per_record);
>> + fwts_log_info_verbatum(fw, " Max. Raw Data Length: 0x%8.8"
>> PRIx32, source->max_raw_data_length);
>> +
>> + fwts_log_info_verbatum(fw, " Error Status Address:");
>> + fwts_log_info_verbatum(fw, " Address Space ID:
>> 0x%2.2" PRIx8,
>> + source->error_status_address.address_space_id);
>> + fwts_log_info_verbatum(fw, " Register Bit Width
>> 0x%2.2" PRIx8,
>> + source->error_status_address.register_bit_width);
>> + fwts_log_info_verbatum(fw, " Register Bit Offset
>> 0x%2.2" PRIx8,
>> + source->error_status_address.register_bit_offset);
>> + fwts_log_info_verbatum(fw, " Access Size
>> 0x%2.2" PRIx8,
>> + source->error_status_address.access_width);
>> + fwts_log_info_verbatum(fw, " Address
>> 0x%16.16" PRIx64,
>> + source->error_status_address.address);
>> + fwts_log_info_verbatum(fw, " Hardware Error Notification:");
>> + fwts_log_info_verbatum(fw, " Type:
>> 0x%2.2" PRIx8, source->notification.type);
>> + fwts_log_info_verbatum(fw, " Length:
>> 0x%2.2" PRIx8, source->notification.length);
>> + fwts_log_info_verbatum(fw, " Config. Write. Enable:
>> 0x%4.4" PRIx16,
>> + source->notification.configuration_write_enable);
>> + fwts_log_info_verbatum(fw, " Poll Interval:
>> 0x%4.4" PRIx16,
>> + source->notification.poll_interval);
>> + fwts_log_info_verbatum(fw, " Interrupt Vector:
>> 0x%4.4" PRIx16,
>> + source->notification.vector);
>> + fwts_log_info_verbatum(fw, " Sw. to Polling Value:
>> 0x%4.4" PRIx16,
>> + source->notification.switch_to_polling_threshold_value);
>> + fwts_log_info_verbatum(fw, " Sw. to Polling Window:
>> 0x%4.4" PRIx16,
>> + source->notification.switch_to_polling_threshold_window);
>> + fwts_log_info_verbatum(fw, " Error: Thresh. Value:
>> 0x%4.4" PRIx16,
>> + source->notification.error_threshold_value);
>> + fwts_log_info_verbatum(fw, " Error: Thresh. Window:
>> 0x%4.4" PRIx16,
>> + source->notification.error_threshold_window);
>> + fwts_log_info_verbatum(fw, " Error Status Blk. Length: 0x%8.8"
>> PRIx32, source->error_status_block_length);
>> + fwts_log_info_verbatum(fw, " Read Ack Register:");
>> + fwts_log_info_verbatum(fw, " Address Space ID:
>> 0x%2.2" PRIx8,
>> + source->read_ack_register.address_space_id);
>> + fwts_log_info_verbatum(fw, " Register Bit Width
>> 0x%2.2" PRIx8,
>> + source->read_ack_register.register_bit_width);
>> + fwts_log_info_verbatum(fw, " Register Bit Offset
>> 0x%2.2" PRIx8,
>> + source->read_ack_register.register_bit_offset);
>> + fwts_log_info_verbatum(fw, " Access Size
>> 0x%2.2" PRIx8,
>> + source->read_ack_register.access_width);
>> + fwts_log_info_verbatum(fw, " Address
>> 0x%16.16" PRIx64,
>> + source->read_ack_register.address);
>> + fwts_log_info_verbatum(fw, " Read Ack Preserve: 0x%16.16"
>> PRIx64, source->read_ack_preserve);
>> + fwts_log_info_verbatum(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",
>>
>
> Commit 8beb591e38c09e656b7fee03e37b0c11fb2063a9 "Rename
> fwts_log_*_verbatum to fwts_log_*_verbatim" fixed a typo, and therefore
> this needs to be fixed. Everything else looks good to me.
>
>
Ah, yes, I appear to have missed that. Thanks for pointing it out. I
will correct the oversight in V2.
--
Jeffrey Hugo
Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a
Linux Foundation Collaborative Project
More information about the fwts-devel
mailing list