GNU Mach hangs during SMP startup when the firmware exposes more CPUs than
NCPUS. The broadcast INIT/STARTUP IPI starts every exposed AP, including the
ones the parser rejected, and the zero-initialised cpu_id_lut made those APs
alias kernel ID 0 and corrupt the BSP's per-CPU and GDT state.
The series bounds cpu_lapic_list at insertion, keeps the BSP and skips
unusable MADT entries, parks rejected APs, panics with a reason on APIC
failure, and clarifies --enable-ncpus.
Changes since v1:
- former patch 2 split into four patches;
- former patch 3 now also covers x86_64;
- patch 1 drops the APIC ID range test.
The series applies to gnumach c5701c1c ("Raise NET_MAX_FILTER").
David Bidner (8):
apic: Bound cpu_lapic_list by NCPUS
acpi_parse_apic: Name ACPI error codes
acpi_parse_apic: Ignore x2APIC and NMI MADT entries
acpi_parse_apic: Stop on malformed MADT entries
acpi_parse_apic: Reserve the BSP and bound CPU admission
cpuboot: Park processors not accepted into the CPU list
model_dep: Panic on APIC initialization failure
configfrag-first: Clarify --enable-ncpus help
configfrag-first.ac | 3 +-
i386/i386/apic.c | 25 ++++++++++--
i386/i386/apic.h | 3 +-
i386/i386/cpuboot.S | 12 ++++++
i386/i386at/acpi_parse_apic.c | 75 +++++++++++++++++++++++++----------
i386/i386at/acpi_parse_apic.h | 4 +-
i386/i386at/model_dep.c | 4 +-
x86_64/cpuboot.S | 17 ++++++++
8 files changed, 114 insertions(+), 29 deletions(-)