[PATCH] fwts/madt: Add address of subtable to messages

Prarit Bhargava prarit at redhat.com
Tue Jul 12 13:49:05 UTC 2016


Currently the messages in the madt test display, for example,

PASSED: Test 5, Subtable 196 of type 127 (Reserved. OSPM skips
structures of the reserved type.) is the correct length: 12
FAILED [MEDIUM] SPECMADTSubReservedID: Test 5, MADT subtable 196
is using the reserved value 0x7f for a type. Subtable type values 0x10..0x7f are
reserved; 0x80..0xff can be used by OEMs.

The commonly available utilities (acpidump + acpixtract+ iasl) result in
table files that use the address offset of the table rather than a number.

ex)

[650h 1616   1]                Subtable Type : 7F [Unknown Subtable Type]
[651h 1617   1]                       Length : 0C

While the table number may be useful in some cases, the offset is also a
valuable piece of information.  This patch adds the table's address offset
to the output so that it now looks like:

PASSED: Test 5, Subtable 196 (offset 0x650) of type 127 (Reserved. OSPM skips
structures of the reserved type.) is the correct length: 12
FAILED [MEDIUM] SPECMADTSubReservedID: Test 5, MADT subtable 196 (offset 0x650)
is using the reserved value 0x7f for a type. Subtable type values 0x10..0x7f are
reserved; 0x80..0xff can be used by OEMs.

Signed-off-by: Prarit Bhargava <prarit at redhat.com>
---
 src/acpi/madt/madt.c |   37 +++++++++++++++++++++----------------
 1 file changed, 21 insertions(+), 16 deletions(-)

diff --git a/src/acpi/madt/madt.c b/src/acpi/madt/madt.c
index 8ee231ee16be..e260222a8b75 100644
--- a/src/acpi/madt/madt.c
+++ b/src/acpi/madt/madt.c
@@ -1212,11 +1212,13 @@ static int madt_subtables(fwts_framework *fw)
 		int len = 0;
 		bool passed = true;
 		int type;
+		int offset = 0;
 
 		hdr = (fwts_acpi_madt_sub_table_header *)data;
 		ii++;
 
 		data += sizeof(fwts_acpi_madt_sub_table_header);
+		offset = (int)(mtable->length - length);
 		length -= sizeof(fwts_acpi_madt_sub_table_header);
 
 		/* set initial type value, will be overriden for OEM and
@@ -1264,17 +1266,18 @@ static int madt_subtables(fwts_framework *fw)
 		}
 		if (passed) {
 			fwts_passed(fw,
-				    "Subtable %d of type %d (%s) is the "
-				    " correct length: %d",
-				    ii, hdr->type,
+				    "Subtable %d (offset 0x%x) of "
+				    "type %d (%s) is the correct length: %d",
+				    ii, offset, hdr->type,
 				    madt_sub_names[type],
 				    hdr->length);
 		} else {
 			fwts_failed(fw, LOG_LEVEL_MEDIUM,
 				    "SPECMADTSubLen",
-				    "Subtable %d of type %d (%s) is %d bytes "
-				    " long but should be %d bytes",
-				    ii, hdr->type,
+				    "Subtable %d (offset 0x%x) of "
+				    "type %d (%s) is %d bytes "
+				    "long but should be %d bytes",
+				    ii, offset, hdr->type,
 				    madt_sub_names[type],
 				    hdr->length, len);
 		}
@@ -1348,12 +1351,12 @@ static int madt_subtables(fwts_framework *fw)
 		case FWTS_ACPI_MADT_RESERVED:
 			fwts_failed(fw, LOG_LEVEL_MEDIUM,
 				    "SPECMADTSubReservedID",
-				    "MADT subtable %d is using the "
-				    "reserved value 0x%x for a type. "
-				    "Subtable type values 0x10..0x7f "
+				    "MADT subtable %d (offset 0x%x) is "
+				    "using the reserved value 0x%x for a "
+				    "type.  Subtable type values 0x10..0x7f "
 				    "are reserved; 0x80..0xff can be "
 				    "used by OEMs.",
-				    ii, hdr->type);
+				    ii, offset, hdr->type);
 			skip = (hdr->length -
 				sizeof(fwts_acpi_madt_sub_table_header));
 			break;
@@ -1365,10 +1368,11 @@ static int madt_subtables(fwts_framework *fw)
 		default:
 			fwts_failed(fw, LOG_LEVEL_MEDIUM,
 				    "SPECMADTSubReservedID",
-				    "MADT subtable %d is using value 0x%x "
-				    "for a type.  This value is out of the "
-				    "expected range of 0x00 .. 0xff.",
-				    ii, hdr->type);
+				    "MADT subtable %d (offset 0x%x) is "
+				    "using value 0x%x for a type.  This "
+				    "value is out of the expected range "
+				    "of 0x00 .. 0xff.",
+				    ii, offset, hdr->type);
 			skip = (hdr->length -
 				sizeof(fwts_acpi_madt_sub_table_header));
 			break;
@@ -1377,8 +1381,9 @@ static int madt_subtables(fwts_framework *fw)
 		if (hdr->length == 0) {
 			fwts_log_error(fw, "INTERNAL ERROR: "
 				       "zero length subtable means something "
-				       "is seriously broken. Subtable %d has "
-				       "the problem.", ii);
+				       "is seriously broken. Subtable %d "
+				       "(offset 0x%0x) has the problem.",
+				       ii, offset);
 			break;
 		}
 		data   += skip;
-- 
1.7.9.3




More information about the fwts-devel mailing list