Przeglądaj źródła

Kernel: Split initialization of Processor structure

We need to very early on initialize the Processor structure so
that we can use RecursiveSpinLock early on.
Tom 5 lat temu
rodzic
commit
57b61b2dde
3 zmienionych plików z 25 dodań i 7 usunięć
  1. 17 3
      Kernel/Arch/i386/CPU.cpp
  2. 1 0
      Kernel/Arch/i386/CPU.h
  3. 7 4
      Kernel/init.cpp

+ 17 - 3
Kernel/Arch/i386/CPU.cpp

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

+ 1 - 0
Kernel/Arch/i386/CPU.h

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

+ 7 - 4
Kernel/init.cpp

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