[PATCH] acpi: madt: only inspect Local APIC/x2APIC/SAPIC tables if enabled

Ricardo Neri ricardo.neri-calderon at linux.intel.com
Tue Nov 28 00:55:54 UTC 2017


The Advanced Configuration and Power Interface (ACPI) specification
version 6.2 Errata A in sections 5.2.12.2, 5.2.12.10 and 5.2.12.12 states
that "when a processor is not present, the Processor Local APIC/x2APIC/
SAPIC information is either not reported or flagged as disabled."

This implies that it is possible for firmware implementations to include
Local APIC/SAPIC/x2APIC tables for non-existent processors provided that
they are disabled.

Thus, only test these tables if they have the Enable flag set. Otherwise,
skip the test. Also, print a message to record the fact that these tables
exist but are not tested.

Signed-off-by: Ricardo Neri <ricardo.neri-calderon at linux.intel.com>
Reported-by: Bin Song <binx.song at intel.com>
---
 src/acpi/madt/madt.c | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/src/acpi/madt/madt.c b/src/acpi/madt/madt.c
index 3bbaf2f..f997a5f 100644
--- a/src/acpi/madt/madt.c
+++ b/src/acpi/madt/madt.c
@@ -546,6 +546,13 @@ static int madt_local_apic(fwts_framework *fw,
 	fwts_acpi_madt_processor_local_apic *lapic =
 		(fwts_acpi_madt_processor_local_apic *)data;
 
+	/* only test table if enabled */
+	if (!(lapic->flags & 0x1)) {
+		fwts_skipped(fw, "MADT %s is disabled. Skipping test.",
+			      madt_sub_names[hdr->type]);
+		goto out;
+	}
+
 	madt_find_processor_uid(fw, lapic->acpi_processor_id, "LAPIC");
 
 	if (lapic->flags & 0xfffffffe)
@@ -561,6 +568,7 @@ static int madt_local_apic(fwts_framework *fw,
 			    "reserved and properly set to zero.",
 			    madt_sub_names[hdr->type]);
 
+out:
 	return (hdr->length - sizeof(fwts_acpi_madt_sub_table_header));
 }
 
@@ -780,6 +788,7 @@ static int madt_local_sapic(fwts_framework *fw,
 	 * initial boot state.
 	 */
 
+
 	if (hdr->length != (strlen(lsapic->uid_string) + 16))
 		fwts_failed(fw, LOG_LEVEL_MEDIUM,
 			    "MADTLSAPICLength",
@@ -792,6 +801,13 @@ static int madt_local_sapic(fwts_framework *fw,
 			    "MADT %s table length (%d) is correct.",
 			    madt_sub_names[hdr->type], hdr->length);
 
+	/* only continue testing table if enabled */
+	if (!(lsapic->flags & 0x1)) {
+		fwts_skipped(fw, "MADT %s is disabled. Skipping test.",
+			      madt_sub_names[hdr->type]);
+		goto out;
+	}
+
 	/*
 	 * There are three values that need to be checked for a valid
 	 * processor UID: the ACPI processor ID, the UID value, and the UID
@@ -878,6 +894,7 @@ static int madt_local_sapic(fwts_framework *fw,
 			    "MADT %s UID string is an ASCII string.",
 			    madt_sub_names[hdr->type]);
 
+out:
 	return (hdr->length - sizeof(fwts_acpi_madt_sub_table_header));
 }
 
@@ -952,6 +969,13 @@ static int madt_local_x2apic(fwts_framework *fw,
 	fwts_acpi_madt_local_x2apic *lx2apic =
 					(fwts_acpi_madt_local_x2apic *)data;
 
+	/* only test table if enabled */
+	if (!(lx2apic->flags & 0x1)) {
+		fwts_skipped(fw, "MADT %s is disabled. Skipping test.",
+			      madt_sub_names[hdr->type]);
+		goto out;
+	}
+
 	if (lx2apic->reserved)
 		fwts_failed(fw, LOG_LEVEL_MEDIUM,
 			    "MADTLX2APICReservedNonZero",
@@ -980,6 +1004,7 @@ static int madt_local_x2apic(fwts_framework *fw,
 
 	madt_find_processor_uid(fw, lx2apic->processor_uid, "X2APIC");
 
+out:
 	return (hdr->length - sizeof(fwts_acpi_madt_sub_table_header));
 }
 
-- 
2.7.4




More information about the fwts-devel mailing list