diff --git a/kernel/include/kernel/Processor.h b/kernel/include/kernel/Processor.h index afa5f836..33bfe083 100644 --- a/kernel/include/kernel/Processor.h +++ b/kernel/include/kernel/Processor.h @@ -31,11 +31,12 @@ namespace Kernel asm volatile("movw %%gs, %0" : "=rm"(id)); return id; } - static Processor& get(ProcessorID); - static Processor& current() { return get(current_id()); } + static ProcessorID bsb_id() { return s_bsb_id; } + static bool current_is_bsb() { return current_id() == bsb_id(); } + static void set_interrupt_state(InterruptState state) { if (state == InterruptState::Enabled) @@ -73,6 +74,8 @@ namespace Kernel ~Processor(); private: + static ProcessorID s_bsb_id; + void* m_stack { nullptr }; static constexpr size_t m_stack_size { 4096 }; diff --git a/kernel/kernel/Processor.cpp b/kernel/kernel/Processor.cpp index 5016edc3..a8ff0b99 100644 --- a/kernel/kernel/Processor.cpp +++ b/kernel/kernel/Processor.cpp @@ -4,10 +4,16 @@ namespace Kernel { + ProcessorID Processor::s_bsb_id { PROCESSOR_NONE }; + static BAN::Vector s_processors; Processor& Processor::create(ProcessorID id) { + // bsb is the first processor + if (s_bsb_id == PROCESSOR_NONE) + s_bsb_id = id; + while (s_processors.size() <= id) MUST(s_processors.emplace_back()); auto& processor = s_processors[id];