Differentiate between logical CPU IDs and ACPI MADT IDs
All checks were successful
Build documentation / build-and-deploy (push) Successful in 34s

This commit is contained in:
2026-02-07 14:51:16 +01:00
parent 5fe9d0a158
commit 1ca3d11bac
3 changed files with 15 additions and 7 deletions

View File

@@ -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 + 0x10, (lapic_id << 24));
amd64_lapic_write (LAPIC_ICR, vec | (1 << 14)); amd64_lapic_write (LAPIC_ICR, vec);
} }

View File

@@ -20,14 +20,17 @@ static struct cpu cpus[CPUS_MAX];
static atomic_int last_cpu_index = 0; static atomic_int last_cpu_index = 0;
static atomic_int cpu_counter; static atomic_int cpu_counter;
static atomic_int cpu_id_counter = 0;
/// Allocate a CPU structure /// Allocate a CPU structure
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 = &cpus[cpu_id]; int id = atomic_fetch_add (&cpu_id_counter, 1);
struct cpu* cpu = &cpus[id];
memset (cpu, 0, sizeof (*cpu)); memset (cpu, 0, sizeof (*cpu));
cpu->lock = SPIN_LOCK_INIT; cpu->lock = SPIN_LOCK_INIT;
cpu->id = cpu_id; cpu->id = id;
cpu->acpi_id = acpi_id;
cpu->lapic_id = lapic_id; cpu->lapic_id = lapic_id;
amd64_wrmsr (MSR_GS_BASE, (uint64_t)cpu); amd64_wrmsr (MSR_GS_BASE, (uint64_t)cpu);
@@ -102,11 +105,15 @@ void smp_init (void) {
cpu_counter = mp->cpu_count - 1; cpu_counter = mp->cpu_count - 1;
for (size_t i = 0; i < mp->cpu_count; i++) { 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; mp->cpus[i]->goto_address = &amd64_smp_bootstrap;
} }
} }
DEBUG ("Waiting for other CPUs:\n");
while (atomic_load (&cpu_counter) > 0) while (atomic_load (&cpu_counter) > 0)
; debugprintf (".\n");
DEBUG ("All CPUs are up!\n");
} }

View File

@@ -26,6 +26,7 @@ struct cpu {
uint64_t lapic_ticks; uint64_t lapic_ticks;
uint64_t lapic_id; uint64_t lapic_id;
uint32_t id; uint32_t id;
uint32_t acpi_id;
spin_lock_t lock; spin_lock_t lock;
@@ -34,7 +35,7 @@ struct cpu {
atomic_int proc_run_q_count; 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); struct cpu* cpu_get (void);
void cpu_request_sched (struct cpu* cpu); void cpu_request_sched (struct cpu* cpu);
struct cpu* cpu_find_lightest (void); struct cpu* cpu_find_lightest (void);