1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-20 18:15:07 +00:00

Kernel: Split initialization of Processor structure

We need to very early on initialize the Processor structure so
that we can use RecursiveSpinLock early on.
This commit is contained in:
Tom 2020-07-02 08:34:00 -06:00 committed by Andreas Kling
parent 137e1dc7bd
commit 57b61b2dde
3 changed files with 25 additions and 7 deletions

View file

@ -822,7 +822,7 @@ Processor& Processor::by_id(u32 cpu)
return *procs[cpu]; return *procs[cpu];
} }
void Processor::initialize(u32 cpu) void Processor::early_initialize(u32 cpu)
{ {
m_self = this; m_self = this;
@ -832,15 +832,29 @@ void Processor::initialize(u32 cpu)
m_idle_thread = nullptr; m_idle_thread = nullptr;
m_current_thread = nullptr; m_current_thread = nullptr;
m_mm_data = nullptr; m_mm_data = nullptr;
m_info = nullptr;
gdt_init(); gdt_init();
ASSERT(&current() == this); // sanity check
}
void Processor::initialize(u32 cpu)
{
ASSERT(m_self == this);
ASSERT(&current() == this); // sanity check
m_cpu = cpu;
m_in_irq = 0;
m_idle_thread = nullptr;
m_current_thread = nullptr;
m_mm_data = nullptr;
if (cpu == 0) if (cpu == 0)
idt_init(); idt_init();
else else
flush_idt(); flush_idt();
ASSERT(&current() == this); // sanity check
if (cpu == 0) { if (cpu == 0) {
ASSERT((FlatPtr(&s_clean_fpu_state) & 0xF) == 0); ASSERT((FlatPtr(&s_clean_fpu_state) & 0xF) == 0);
asm volatile("fninit"); asm volatile("fninit");

View file

@ -639,6 +639,7 @@ class Processor {
static Vector<Processor*>& processors(); static Vector<Processor*>& processors();
public: public:
void early_initialize(u32 cpu);
void initialize(u32 cpu); void initialize(u32 cpu);
Descriptor& get_gdt_entry(u16 selector); Descriptor& get_gdt_entry(u16 selector);

View file

@ -89,6 +89,8 @@ static void setup_serial_debug();
VirtualConsole* tty0; VirtualConsole* tty0;
static Processor s_bsp_processor; // global but let's keep it "private"
// SerenityOS Kernel C++ entry point :^) // SerenityOS Kernel C++ entry point :^)
// //
// This is where C++ execution begins, after boot.S transfers control here. // This is where C++ execution begins, after boot.S transfers control here.
@ -103,15 +105,13 @@ extern "C" [[noreturn]] void init()
{ {
setup_serial_debug(); setup_serial_debug();
s_bsp_processor.early_initialize(0);
cpu_setup(0); cpu_setup(0);
kmalloc_init(); kmalloc_init();
slab_alloc_init(); slab_alloc_init();
{ s_bsp_processor.initialize(0);
static Processor s_bsp_processor_info; // global but let's keep it "private"
s_bsp_processor_info.initialize(0);
}
CommandLine::initialize(reinterpret_cast<const char*>(low_physical_to_virtual(multiboot_info_ptr->cmdline))); CommandLine::initialize(reinterpret_cast<const char*>(low_physical_to_virtual(multiboot_info_ptr->cmdline)));
MemoryManager::initialize(0); MemoryManager::initialize(0);
@ -165,7 +165,10 @@ extern "C" [[noreturn]] void init()
// //
extern "C" [[noreturn]] void init_ap(u32 cpu, Processor* processor_info) extern "C" [[noreturn]] void init_ap(u32 cpu, Processor* processor_info)
{ {
processor_info->early_initialize(cpu);
klog() << "CPU #" << cpu << " processor_info at " << VirtualAddress(FlatPtr(processor_info)); klog() << "CPU #" << cpu << " processor_info at " << VirtualAddress(FlatPtr(processor_info));
cpu_setup(cpu); cpu_setup(cpu);
processor_info->initialize(cpu); processor_info->initialize(cpu);
MemoryManager::initialize(cpu); MemoryManager::initialize(cpu);