[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[XEN PATCH] x86/ACPI: Ignore entries with invalid APIC IDs when parsing MADT



It seems some firmwares put dummy entries in the ACPI MADT table for non
existing processors. On my NUC11TNHi5 those have the invalid APIC ID
0xff. Linux already has code to handle those cases both in
acpi_parse_lapic [1] as well as in acpi_parse_x2apic [2]. So add the
same check to Xen.

Note that on some older (2nd gen Core i) laptop of mine I also saw dummy
entries with a valid APIC ID. Linux would still ignore those because
they have !ACPI_MADT_ENABLED && !ACPI_MADT_ONLINE_CAPABLE. But in Xen
this check is only active for madt_revision >= 5. But since this version
check seems to be intentionally I leave that alone.

Link: 
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f3bf1dbe64b62a2058dd1944c00990df203e8e7a
 # [1]
Link: 
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=10daf10ab154e31237a8c07242be3063fb6a9bf4
 # [2]
Signed-off-by: Simon Gaiser <simon@xxxxxxxxxxxxxxxxxxxxxx>
---
 xen/arch/x86/acpi/boot.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/xen/arch/x86/acpi/boot.c b/xen/arch/x86/acpi/boot.c
index 54b72d716b..4a62822fa9 100644
--- a/xen/arch/x86/acpi/boot.c
+++ b/xen/arch/x86/acpi/boot.c
@@ -87,14 +87,17 @@ acpi_parse_x2apic(struct acpi_subtable_header *header, 
const unsigned long end)
        if (BAD_MADT_ENTRY(processor, end))
                return -EINVAL;
 
+       /* Ignore entries with invalid apicid */
+       if (processor->local_apic_id == 0xffffffff)
+               return 0;
+
        /* Don't register processors that cannot be onlined. */
        if (madt_revision >= 5 &&
            !(processor->lapic_flags & ACPI_MADT_ENABLED) &&
            !(processor->lapic_flags & ACPI_MADT_ONLINE_CAPABLE))
                return 0;
 
-       if ((processor->lapic_flags & ACPI_MADT_ENABLED) ||
-           processor->local_apic_id != 0xffffffff || opt_cpu_info) {
+       if ((processor->lapic_flags & ACPI_MADT_ENABLED) || opt_cpu_info) {
                acpi_table_print_madt_entry(header);
                log = true;
        }
@@ -143,14 +146,17 @@ acpi_parse_lapic(struct acpi_subtable_header * header, 
const unsigned long end)
        if (BAD_MADT_ENTRY(processor, end))
                return -EINVAL;
 
+       /* Ignore entries with invalid apicid */
+       if (processor->id == 0xff)
+               return 0;
+
        /* Don't register processors that cannot be onlined. */
        if (madt_revision >= 5 &&
            !(processor->lapic_flags & ACPI_MADT_ENABLED) &&
            !(processor->lapic_flags & ACPI_MADT_ONLINE_CAPABLE))
                return 0;
 
-       if ((processor->lapic_flags & ACPI_MADT_ENABLED) ||
-           processor->id != 0xff || opt_cpu_info)
+       if ((processor->lapic_flags & ACPI_MADT_ENABLED) || opt_cpu_info)
                acpi_table_print_madt_entry(header);
 
        /* Record local apic id only when enabled */
-- 
2.40.1




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.