cleanup: move some logic out of kernel Main.cpp into separate files/functions

This commit is contained in:
2026-03-03 20:30:59 +01:00
parent 144ae2a843
commit b0e6dd040d
6 changed files with 110 additions and 53 deletions
+38
View File
@@ -0,0 +1,38 @@
/*
* Init.cpp
* Driver initialization orchestration
* Copyright (c) 2025 Daniel Hammer
*/
#include "Init.hpp"
#include <Drivers/Graphics/IntelGPU.hpp>
#include <Drivers/Net/E1000.hpp>
#include <Drivers/Net/E1000E.hpp>
#include <Graphics/Cursor.hpp>
#include <Net/Net.hpp>
#include <Terminal/Terminal.hpp>
namespace Drivers {
void InitializeGraphics() {
Graphics::IntelGPU::Initialize();
if (Graphics::IntelGPU::IsInitialized()) {
::Graphics::Cursor::SetFramebuffer(
Graphics::IntelGPU::GetFramebufferBase(),
Graphics::IntelGPU::GetWidth(),
Graphics::IntelGPU::GetHeight(),
Graphics::IntelGPU::GetPitch()
);
}
}
void InitializeNetwork() {
Net::E1000::Initialize();
if (!Net::E1000::IsInitialized()) {
Kt::KernelLogStream(Kt::INFO, "Init") << "E1000 not found, trying E1000E...";
Net::E1000E::Initialize();
}
::Net::Initialize();
}
}
+17
View File
@@ -0,0 +1,17 @@
/*
* Init.hpp
* Driver initialization orchestration
* Copyright (c) 2025 Daniel Hammer
*/
#pragma once
namespace Drivers {
// Initialize Intel GPU driver and update the cursor framebuffer if found.
void InitializeGraphics();
// Initialize network driver (E1000, falling back to E1000E) and the net stack.
void InitializeNetwork();
}
+18
View File
@@ -7,6 +7,8 @@
#include "Cursor.hpp" #include "Cursor.hpp"
#include <Terminal/Terminal.hpp> #include <Terminal/Terminal.hpp>
#include <Memory/HHDM.hpp> #include <Memory/HHDM.hpp>
#include <Memory/Paging.hpp>
#include <CppLib/Stream.hpp>
namespace Graphics::Cursor { namespace Graphics::Cursor {
@@ -44,4 +46,20 @@ namespace Graphics::Cursor {
return Memory::SubHHDM((uint64_t)g_FbBase); return Memory::SubHHDM((uint64_t)g_FbBase);
} }
void MapWriteCombining() {
uint64_t fbPhys = GetFramebufferPhysBase();
uint64_t fbSize = g_FbHeight * g_FbPitch;
uint64_t numPages = (fbSize + 0xFFF) / 0x1000;
for (uint64_t i = 0; i < numPages; i++) {
uint64_t phys = fbPhys + i * 0x1000;
Memory::VMM::g_paging->MapWC(phys, Memory::HHDM(phys));
}
Memory::VMM::FlushTLB();
Kt::KernelLogStream(Kt::OK, "Graphics") << "Framebuffer mapped as Write-Combining ("
<< kcp::dec << numPages << " pages)";
}
}; };
+2
View File
@@ -20,4 +20,6 @@ namespace Graphics::Cursor {
void SetFramebuffer(uint32_t* base, uint64_t width, uint64_t height, uint64_t pitch); void SetFramebuffer(uint32_t* base, uint64_t width, uint64_t height, uint64_t pitch);
uint64_t GetFramebufferPhysBase(); uint64_t GetFramebufferPhysBase();
void MapWriteCombining();
}; };
+29
View File
@@ -0,0 +1,29 @@
/*
* Cpu.hpp
* CPU feature enablement helpers
* Copyright (c) 2025 Daniel Hammer
*/
#pragma once
#include <cstdint>
namespace Hal {
// Enable SSE/SSE2 — required for userspace programs compiled with SSE.
// CR0: clear EM (bit 2), set MP (bit 1)
// CR4: set OSFXSR (bit 9) and OSXMMEXCPT (bit 10)
inline void EnableSSE() {
uint64_t cr0;
asm volatile("mov %%cr0, %0" : "=r"(cr0));
cr0 &= ~(1ULL << 2); // Clear EM
cr0 |= (1ULL << 1); // Set MP
asm volatile("mov %0, %%cr0" :: "r"(cr0));
uint64_t cr4;
asm volatile("mov %%cr4, %0" : "=r"(cr4));
cr4 |= (1ULL << 9); // OSFXSR
cr4 |= (1ULL << 10); // OSXMMEXCPT
asm volatile("mov %0, %%cr4" :: "r"(cr4));
}
}
+6 -53
View File
@@ -34,13 +34,11 @@
#include <Drivers/PS2/Keyboard.hpp> #include <Drivers/PS2/Keyboard.hpp>
#include <Drivers/PS2/Mouse.hpp> #include <Drivers/PS2/Mouse.hpp>
#include <Drivers/USB/Xhci.hpp> #include <Drivers/USB/Xhci.hpp>
#include <Drivers/Net/E1000.hpp> #include <Drivers/Init.hpp>
#include <Drivers/Net/E1000E.hpp>
#include <Drivers/Graphics/IntelGPU.hpp>
#include <Net/Net.hpp>
#include <CppLib/BoxUI.hpp> #include <CppLib/BoxUI.hpp>
#include <Graphics/Cursor.hpp> #include <Graphics/Cursor.hpp>
#include <Hal/MSR.hpp> #include <Hal/MSR.hpp>
#include <Hal/Cpu.hpp>
#include <Fs/Ramdisk.hpp> #include <Fs/Ramdisk.hpp>
#include <Fs/Vfs.hpp> #include <Fs/Vfs.hpp>
#include <Sched/Scheduler.hpp> #include <Sched/Scheduler.hpp>
@@ -98,22 +96,7 @@ extern "C" void kmain() {
Hal::PrepareGDT(); Hal::PrepareGDT();
Hal::BridgeLoadGDT(); Hal::BridgeLoadGDT();
// Enable SSE/SSE2 — required for userspace programs compiled with SSE Hal::EnableSSE();
// CR0: clear EM (bit 2), set MP (bit 1)
{
uint64_t cr0;
asm volatile("mov %%cr0, %0" : "=r"(cr0));
cr0 &= ~(1ULL << 2); // Clear EM
cr0 |= (1ULL << 1); // Set MP
asm volatile("mov %0, %%cr0" :: "r"(cr0));
// CR4: set OSFXSR (bit 9) and OSXMMEXCPT (bit 10)
uint64_t cr4;
asm volatile("mov %%cr4, %0" : "=r"(cr4));
cr4 |= (1ULL << 9); // OSFXSR
cr4 |= (1ULL << 10); // OSXMMEXCPT
asm volatile("mov %0, %%cr4" :: "r"(cr4));
}
#endif #endif
uint64_t hhdm_offset = hhdm_request.response->offset; uint64_t hhdm_offset = hhdm_request.response->offset;
@@ -155,22 +138,7 @@ extern "C" void kmain() {
#if defined (__x86_64__) #if defined (__x86_64__)
// Map framebuffer as Write-Combining immediately for faster screen writes. // Map framebuffer as Write-Combining immediately for faster screen writes.
// All subsequent log output benefits from WC burst transfers. // All subsequent log output benefits from WC burst transfers.
{ Graphics::Cursor::MapWriteCombining();
uint64_t fbPhys = Graphics::Cursor::GetFramebufferPhysBase();
uint64_t fbSize = Graphics::Cursor::GetFramebufferHeight()
* Graphics::Cursor::GetFramebufferPitch();
uint64_t numPages = (fbSize + 0xFFF) / 0x1000;
for (uint64_t i = 0; i < numPages; i++) {
uint64_t phys = fbPhys + i * 0x1000;
g_paging.MapWC(phys, Memory::HHDM(phys));
}
Memory::VMM::FlushTLB();
Kt::KernelLogStream(OK, "Graphics") << "Framebuffer mapped as Write-Combining ("
<< kcp::dec << numPages << " pages)";
}
#endif #endif
Hal::ACPI g_acpi((Hal::ACPI::XSDP*)Memory::HHDM(rsdp_request.response->address)); Hal::ACPI g_acpi((Hal::ACPI::XSDP*)Memory::HHDM(rsdp_request.response->address));
@@ -181,17 +149,7 @@ extern "C" void kmain() {
Pci::Initialize(g_acpi.GetXSDT()); Pci::Initialize(g_acpi.GetXSDT());
// Intel GPU driver — initialize right after PCI so the native Drivers::InitializeGraphics();
// driver takes over early and all subsequent logs use it.
Drivers::Graphics::IntelGPU::Initialize();
if (Drivers::Graphics::IntelGPU::IsInitialized()) {
Graphics::Cursor::SetFramebuffer(
Drivers::Graphics::IntelGPU::GetFramebufferBase(),
Drivers::Graphics::IntelGPU::GetWidth(),
Drivers::Graphics::IntelGPU::GetHeight(),
Drivers::Graphics::IntelGPU::GetPitch()
);
}
Timekeeping::ApicTimerInitialize(); Timekeeping::ApicTimerInitialize();
@@ -201,12 +159,7 @@ extern "C" void kmain() {
Drivers::USB::Xhci::Initialize(); Drivers::USB::Xhci::Initialize();
Drivers::Net::E1000::Initialize(); Drivers::InitializeNetwork();
if (!Drivers::Net::E1000::IsInitialized()) {
KernelLogStream(INFO, "Init") << "E1000 not found, trying E1000E...";
Drivers::Net::E1000E::Initialize();
}
Net::Initialize();
} }
#endif #endif