diff --git a/src/kernel/cpu.cpp b/src/kernel/cpu.cpp index c398586..e5350b5 100644 --- a/src/kernel/cpu.cpp +++ b/src/kernel/cpu.cpp @@ -57,9 +57,6 @@ cpu_init(cpu_data *cpu, bool bsp) cpu_early_init(cpu); } - lapic &apic = device_manager::get().get_lapic(); - cpu->id = apic.get_id(); - // Set up the syscall MSRs syscall_enable(); diff --git a/src/kernel/cpu.h b/src/kernel/cpu.h index a5afa35..e7ef485 100644 --- a/src/kernel/cpu.h +++ b/src/kernel/cpu.h @@ -23,7 +23,9 @@ struct cpu_state struct cpu_data { cpu_data *self; - uint64_t id; + uint16_t id; + uint16_t index; + uint32_t reserved; uintptr_t rsp0; uintptr_t rsp3; TCB *tcb; diff --git a/src/kernel/main.cpp b/src/kernel/main.cpp index 50aaa53..be5fe98 100644 --- a/src/kernel/main.cpp +++ b/src/kernel/main.cpp @@ -159,7 +159,10 @@ kernel_main(args::header *header) device_manager &devices = device_manager::get(); devices.parse_acpi(header->acpi_table); - // cpu_init relies on the APIC being set up + // Need the local APIC to get the BSP's id + lapic &apic = device_manager::get().get_lapic(); + cpu->id = apic.get_id(); + cpu_init(cpu, true); devices.init_drivers(); @@ -228,6 +231,8 @@ start_aps(void *kpml4) cpu_data &bsp = current_cpu(); bsp.process = &g_kernel_process; + uint16_t index = bsp.index; + // Copy the startup code somwhere the real mode trampoline can run uintptr_t addr = 0x8000; // TODO: find a valid address, rewrite addresses uint8_t vector = addr >> 12; @@ -258,6 +263,8 @@ start_aps(void *kpml4) cpu_data *cpu = new cpu_data; kutil::memset(cpu, 0, sizeof(cpu_data)); cpu->self = cpu; + cpu->id = id; + cpu->index = ++index; cpu->gdt = gdt; cpu->tss = tss; @@ -279,7 +286,7 @@ start_aps(void *kpml4) // Kick it off! size_t current_count = ap_startup_count; - log::debug(logs::boot, "Starting AP %d: stack %llx", id, stack_end); + log::debug(logs::boot, "Starting AP %d: stack %llx", cpu->index, stack_end); apic.send_ipi(lapic::ipi_mode::init, 0, id); clk.spinwait(1000); diff --git a/src/kernel/tasking.inc b/src/kernel/tasking.inc index 4c7ffdb..936001f 100644 --- a/src/kernel/tasking.inc +++ b/src/kernel/tasking.inc @@ -7,7 +7,9 @@ endstruc struc CPU_DATA .self: resq 1 -.id: resq 1 +.id: resw 1 +.index: resw 1 +.reserved resd 1 .rsp0: resq 1 .rsp3: resq 1 .tcb: resq 1