[PATCH v2 2/2] acpi: hest: Add GHESv2 checking (LP: #1587624)
Jeff Hugo
jhugo at codeaurora.org
Wed Jun 1 20:24:43 UTC 2016
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",
--
1.8.5.2
More information about the fwts-devel
mailing list