From 1ca3d11bac1e1aa742f47176ced2a681ab139ba8 Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Sat, 7 Feb 2026 14:51:16 +0100 Subject: [PATCH] Differentiate between logical CPU IDs and ACPI MADT IDs --- kernel/amd64/apic.c | 2 +- kernel/amd64/smp.c | 17 ++++++++++++----- kernel/amd64/smp.h | 3 ++- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/kernel/amd64/apic.c b/kernel/amd64/apic.c index ab1c4ed..0c45ae0 100644 --- a/kernel/amd64/apic.c +++ b/kernel/amd64/apic.c @@ -267,5 +267,5 @@ void amd64_lapic_ipi (uint32_t lapic_id, uint32_t vec) { } amd64_lapic_write (LAPIC_ICR + 0x10, (lapic_id << 24)); - amd64_lapic_write (LAPIC_ICR, vec | (1 << 14)); + amd64_lapic_write (LAPIC_ICR, vec); } diff --git a/kernel/amd64/smp.c b/kernel/amd64/smp.c index 143d32e..a825915 100644 --- a/kernel/amd64/smp.c +++ b/kernel/amd64/smp.c @@ -20,14 +20,17 @@ static struct cpu cpus[CPUS_MAX]; static atomic_int last_cpu_index = 0; static atomic_int cpu_counter; +static atomic_int cpu_id_counter = 0; /// Allocate a CPU structure -struct cpu* cpu_make (uint64_t lapic_id, uint64_t cpu_id) { - struct cpu* cpu = &cpus[cpu_id]; +struct cpu* cpu_make (uint64_t lapic_id, uint64_t acpi_id) { + int id = atomic_fetch_add (&cpu_id_counter, 1); + struct cpu* cpu = &cpus[id]; memset (cpu, 0, sizeof (*cpu)); cpu->lock = SPIN_LOCK_INIT; - cpu->id = cpu_id; + cpu->id = id; + cpu->acpi_id = acpi_id; cpu->lapic_id = lapic_id; amd64_wrmsr (MSR_GS_BASE, (uint64_t)cpu); @@ -102,11 +105,15 @@ void smp_init (void) { cpu_counter = mp->cpu_count - 1; for (size_t i = 0; i < mp->cpu_count; i++) { - if (mp->cpus[i]->lapic_id != thiscpu->lapic_id) { + if (mp->cpus[i]->processor_id != thiscpu->acpi_id) { mp->cpus[i]->goto_address = &amd64_smp_bootstrap; } } + DEBUG ("Waiting for other CPUs:\n"); + while (atomic_load (&cpu_counter) > 0) - ; + debugprintf (".\n"); + + DEBUG ("All CPUs are up!\n"); } diff --git a/kernel/amd64/smp.h b/kernel/amd64/smp.h index 500e0a6..f51e9be 100644 --- a/kernel/amd64/smp.h +++ b/kernel/amd64/smp.h @@ -26,6 +26,7 @@ struct cpu { uint64_t lapic_ticks; uint64_t lapic_id; uint32_t id; + uint32_t acpi_id; spin_lock_t lock; @@ -34,7 +35,7 @@ struct cpu { atomic_int proc_run_q_count; }; -struct cpu* cpu_make (uint64_t lapic_id, uint64_t cpu_id); +struct cpu* cpu_make (uint64_t lapic_id, uint64_t acpi_id); struct cpu* cpu_get (void); void cpu_request_sched (struct cpu* cpu); struct cpu* cpu_find_lightest (void);