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:
parent
137e1dc7bd
commit
57b61b2dde
3 changed files with 25 additions and 7 deletions
|
@ -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(¤t() == this); // sanity check
|
||||||
|
}
|
||||||
|
|
||||||
|
void Processor::initialize(u32 cpu)
|
||||||
|
{
|
||||||
|
ASSERT(m_self == this);
|
||||||
|
ASSERT(¤t() == 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(¤t() == 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");
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue