Differentiate between logical CPU IDs and ACPI MADT IDs
All checks were successful
Build documentation / build-and-deploy (push) Successful in 34s
All checks were successful
Build documentation / build-and-deploy (push) Successful in 34s
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user