[PATCH] acpi: acpidump: fix ACPI FPDT dump

Colin King colin.king at canonical.com
Tue Jan 1 00:53:14 UTC 2013


From: Colin Ian King <colin.king at canonical.com>

Fix the output of the ACPI FPDT dump.  This now prints the
performance record types correctly as well as binary dumps the
reserved fields that are not described in the ACPI specification.

Signed-off-by: Colin Ian King <colin.king at canonical.com>
---
 src/acpi/acpidump/acpidump.c | 54 ++++++++++++++++++++++++++++++++------------
 1 file changed, 39 insertions(+), 15 deletions(-)

diff --git a/src/acpi/acpidump/acpidump.c b/src/acpi/acpidump/acpidump.c
index 88dbc10..5f3e25e 100644
--- a/src/acpi/acpidump/acpidump.c
+++ b/src/acpi/acpidump/acpidump.c
@@ -1550,6 +1550,7 @@ static void acpidump_fpdt(fwts_framework *fw, fwts_acpi_table_info *table)
 	uint8_t *data = (uint8_t *)table->data;
 	uint8_t *ptr  = data;
 	size_t length = table->length;
+	const size_t fpdt_hdr_len = sizeof(fwts_acpi_table_fpdt_header);
 
 	static fwts_acpidump_field fpdt_header_fields[] = {
 		FIELD_UINT("Type", 		fwts_acpi_table_fpdt_header, type),
@@ -1558,17 +1559,19 @@ static void acpidump_fpdt(fwts_framework *fw, fwts_acpi_table_info *table)
 		FIELD_END
 	};
 
+	static fwts_acpidump_field fpdt_basic_boot_perf_ptr_fields[] = {
+		FIELD_UINT("Reserved", 		fwts_acpi_table_fpdt_basic_boot_perf_ptr, reserved),
+		FIELD_UINT("FBPT Pointer", 	fwts_acpi_table_fpdt_basic_boot_perf_ptr, fbpt_addr),
+		FIELD_END
+	};
+
 	static fwts_acpidump_field fpdt_s3_perf_ptr_fields[] = {
 		FIELD_UINT("Reserved", 		fwts_acpi_table_fpdt_s3_perf_ptr, reserved),
 		FIELD_UINT("S3PT Pointer", 	fwts_acpi_table_fpdt_s3_perf_ptr, s3pt_addr),
 		FIELD_END
 	};
 
-	static fwts_acpidump_field fpdt_basic_boot_perf_ptr_fields[] = {
-		FIELD_UINT("Reserved", 		fwts_acpi_table_fpdt_basic_boot_perf_ptr, reserved),
-		FIELD_UINT("FBPT Pointer", 	fwts_acpi_table_fpdt_basic_boot_perf_ptr, fbpt_addr),
-		FIELD_END
-	};
+	ptr += sizeof(fwts_acpi_table_header);
 
 	/*
 	 *  Currently we just dump out the various pointer records.  A more complete
@@ -1578,24 +1581,45 @@ static void acpidump_fpdt(fwts_framework *fw, fwts_acpi_table_info *table)
 	while (ptr < data + length) {
 		fwts_acpi_table_fpdt_header *fpdt = (fwts_acpi_table_fpdt_header*)ptr;
 
-		__acpi_dump_table_fields(fw, ptr, fpdt_header_fields, ptr - data);
+		fwts_log_nl(fw);
+
 		switch (fpdt->type) {
-		case 0:
-			fwts_log_info_verbatum(fw, "S3 resume performance record pointer:");
-			__acpi_dump_table_fields(fw, ptr, fpdt_s3_perf_ptr_fields, ptr - data);
+		case 0x0000:
+			fwts_log_info_verbatum(fw, "Basic Boot Performance Data Record pointer:");
+			__acpi_dump_table_fields(fw, ptr, fpdt_header_fields, ptr - data);
+			__acpi_dump_table_fields(fw, ptr, fpdt_basic_boot_perf_ptr_fields, ptr - data);
 			break;
-		case 1:
-			fwts_log_info_verbatum(fw, "S3 suspend performance record pointer:");
+		case 0x0001:
+			fwts_log_info_verbatum(fw, "S3 Performance Table pointer:");
+			__acpi_dump_table_fields(fw, ptr, fpdt_header_fields, ptr - data);
 			__acpi_dump_table_fields(fw, ptr, fpdt_s3_perf_ptr_fields, ptr - data);
 			break;
-		case 2:
-			fwts_log_info_verbatum(fw, "Boot performance record pointer:");
-			__acpi_dump_table_fields(fw, ptr, fpdt_basic_boot_perf_ptr_fields, ptr - data);
+		case 0x0002 ... 0x0fff:
+			fwts_log_info_verbatum(fw, "Reserved for ACPI specification useage:");
+			__acpi_dump_table_fields(fw, ptr, fpdt_header_fields, ptr - data);
+			acpi_dump_raw_data(fw, ptr + fpdt_hdr_len, fpdt->length - fpdt_hdr_len, ptr + fpdt_hdr_len - data);
+			break;
+		case 0x1000 ... 0x1fff:
+			fwts_log_info_verbatum(fw, "Reserved for Platform Vendor useage:");
+			__acpi_dump_table_fields(fw, ptr, fpdt_header_fields, ptr - data);
+			acpi_dump_raw_data(fw, ptr + fpdt_hdr_len, fpdt->length - fpdt_hdr_len, ptr + fpdt_hdr_len - data);
+			break;
+		case 0x2000 ... 0x2fff:
+			fwts_log_info_verbatum(fw, "Reserved for Hardware Vendor useage:");
+			__acpi_dump_table_fields(fw, ptr, fpdt_header_fields, ptr - data);
+			acpi_dump_raw_data(fw, ptr + fpdt_hdr_len, fpdt->length - fpdt_hdr_len, ptr + fpdt_hdr_len - data);
+			break;
+		case 0x3000 ... 0x3fff:
+			fwts_log_info_verbatum(fw, "Reserved for BIOS Vendor useage:");
+			__acpi_dump_table_fields(fw, ptr, fpdt_header_fields, ptr - data);
+			acpi_dump_raw_data(fw, ptr + fpdt_hdr_len, fpdt->length - fpdt_hdr_len, ptr + fpdt_hdr_len - data);
 			break;
 		default:
+			fwts_log_info_verbatum(fw, "Reserved for future useage:");
+			__acpi_dump_table_fields(fw, ptr, fpdt_header_fields, ptr - data);
+			acpi_dump_raw_data(fw, ptr + fpdt_hdr_len, fpdt->length - fpdt_hdr_len, ptr + fpdt_hdr_len - data);
 			break;
 		}
-
 		ptr += fpdt->length;
 	}
 }
-- 
1.8.0




More information about the fwts-devel mailing list