diff --git a/kernel/src/arch/CPU.h b/kernel/src/arch/CPU.h index 3e56d105..ecb0bc17 100644 --- a/kernel/src/arch/CPU.h +++ b/kernel/src/arch/CPU.h @@ -26,6 +26,8 @@ namespace CPU void get_stack_trace_at(Registers* regs, void (*callback)(u64, void*), void* arg); void print_stack_trace_at(Registers* regs); + u16 get_processor_id(); + [[noreturn]] void bootstrap_switch_stack(u64 stack, void* function); void pause(); diff --git a/kernel/src/arch/x86_64/CPU.cpp b/kernel/src/arch/x86_64/CPU.cpp index 54dd934c..f9feb7e6 100644 --- a/kernel/src/arch/x86_64/CPU.cpp +++ b/kernel/src/arch/x86_64/CPU.cpp @@ -335,6 +335,14 @@ namespace CPU { asm volatile("pause"); } + + u16 get_processor_id() + { + unsigned int unused; + unsigned int ebx = 0; + __get_cpuid(1, &unused, &ebx, &unused, &unused); + return (u16)(ebx >> 24); + } } // called by kernel_yield diff --git a/kernel/src/boot/Init.cpp b/kernel/src/boot/Init.cpp index f997f2a7..139cddaa 100644 --- a/kernel/src/boot/Init.cpp +++ b/kernel/src/boot/Init.cpp @@ -17,6 +17,9 @@ void Init::check_magic() kerrorln("ERROR: Invalid magic value from bootloader"); CPU::efficient_halt(); } + + // Stop all secondary processors for now + if (CPU::get_processor_id() != bootboot.bspid) { CPU::efficient_halt(); } } void Init::early_init()