[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