diff --git a/headers/private/kernel/arch/x86/smp_acpi.h b/headers/private/kernel/arch/x86/smp_acpi.h index d675d35ddb..4c5338feb8 100644 --- a/headers/private/kernel/arch/x86/smp_acpi.h +++ b/headers/private/kernel/arch/x86/smp_acpi.h @@ -9,6 +9,8 @@ #define ACPI_RSDT_SIGNATURE "RSDT" #define ACPI_MADT_SIGNATURE "APIC" +#define ACPI_LOCAL_APIC_ENABLED 0x01 + struct acpi_rsdp { char signature[8]; /* "RSD PTR " including blank */ uint8 checksum; /* checksum of bytes 0-19 (per ACPI 1.0) */ diff --git a/src/system/boot/platform/bios_ia32/smp.cpp b/src/system/boot/platform/bios_ia32/smp.cpp index 6f09feb38f..48c16bbbaf 100644 --- a/src/system/boot/platform/bios_ia32/smp.cpp +++ b/src/system/boot/platform/bios_ia32/smp.cpp @@ -280,6 +280,11 @@ smp_do_acpi_config(acpi_rsdp *rsdp) acpi_local_apic *localApic = (acpi_local_apic *)apic; TRACE(("smp: found local APIC with id %u\n", localApic->apic_id)); + if ((localApic->flags & ACPI_LOCAL_APIC_ENABLED) == 0) { + TRACE(("smp: APIC is disabled and will not be used\n")); + break; + } + gKernelArgs.arch_args.cpu_apic_id[gKernelArgs.num_cpus] = localApic->apic_id; gKernelArgs.arch_args.cpu_os_id[localApic->apic_id] = gKernelArgs.num_cpus; // ToDo: how to find out? putting 0x10 in to indicate a local apic