summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/HALKit/AMD64
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-04-16 17:13:31 +0200
committerAmlal El Mahrouss <amlal@nekernel.org>2025-04-16 17:13:31 +0200
commit58b3d776ab5435de352217b2a3a525aeb9316e99 (patch)
treecf298a3b522fed5b829c4b250932ab13ef407838 /dev/kernel/HALKit/AMD64
parent0b0f61ae48bbd8827d6088feab6cf58e7837bf92 (diff)
dev, kernel, boot: fix dumb early-init which caused the kernel to jump
at IVT. Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'dev/kernel/HALKit/AMD64')
-rw-r--r--dev/kernel/HALKit/AMD64/HalDebugOutput.cc2
-rw-r--r--dev/kernel/HALKit/AMD64/HalKernelMain.cc55
2 files changed, 23 insertions, 34 deletions
diff --git a/dev/kernel/HALKit/AMD64/HalDebugOutput.cc b/dev/kernel/HALKit/AMD64/HalDebugOutput.cc
index 0ee7eef0..b69614fd 100644
--- a/dev/kernel/HALKit/AMD64/HalDebugOutput.cc
+++ b/dev/kernel/HALKit/AMD64/HalDebugOutput.cc
@@ -181,7 +181,7 @@ namespace Kernel
TerminalDevice TerminalDevice::The() noexcept
{
- static TerminalDevice out(Kernel::ke_io_write, Kernel::ke_io_read);
+ TerminalDevice out(Kernel::ke_io_write, Kernel::ke_io_read);
return out;
}
diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc
index 9ede8ebd..60df6a12 100644
--- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc
+++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc
@@ -4,6 +4,7 @@
------------------------------------------- */
+#include "modules/CoreGfx/CoreGfx.h"
#include <StorageKit/AHCI.h>
#include <ArchKit/ArchKit.h>
#include <KernelKit/ProcessScheduler.h>
@@ -15,6 +16,10 @@
#include <modules/CoreGfx/TextGfx.h>
#include <KernelKit/Timer.h>
+#include <FirmwareKit/EFI/API.h>
+#include <FirmwareKit/EFI/EFI.h>
+
+
EXTERN_C Kernel::VoidPtr kInterruptVectorTable[];
EXTERN_C Kernel::VoidPtr mp_user_switch_proc;
EXTERN_C Kernel::Char mp_user_switch_proc_stack_begin[];
@@ -28,32 +33,25 @@ STATIC Kernel::Void hal_init_scheduler_team()
}
}
-STATIC Kernel::UInt64 hal_rdtsc_fn()
+/// @brief Kernel init procedure.
+EXTERN_C Int32 hal_init_platform(
+ Kernel::HEL::BootInfoHeader* handover_hdr)
{
- Kernel::UInt32 lo = 0, hi = 0;
-
- asm volatile("rdtsc"
- : "=a"(lo), "=d"(hi));
+ if (handover_hdr->f_Magic != kHandoverMagic &&
+ handover_hdr->f_Version != kHandoverVersion)
+ {
+ return kEfiFail;
+ }
- return ((Kernel::UInt64)hi << 32) | lo;
-}
+ FB::fb_clear_video();
-STATIC Kernel::UInt64 kStartTim, kEndTim;
+ (Void)(Kernel::kout << "Welcome to NeKernel.\r");
-/// @brief Kernel init procedure.
-EXTERN_C void hal_init_platform(
- Kernel::HEL::BootInfoHeader* handover_hdr)
-{
- kStartTim = hal_rdtsc_fn();
+ fw_init_efi((EfiSystemTable*)handover_hdr->f_FirmwareCustomTables[1]);
+ Boot::ExitBootServices(handover_hdr->f_EFIImageKey, handover_hdr->f_EFIImage);
kHandoverHeader = handover_hdr;
- if (kHandoverHeader->f_Magic != kHandoverMagic &&
- kHandoverHeader->f_Version != kHandoverVersion)
- {
- return;
- }
-
hal_init_scheduler_team();
/************************************** */
@@ -85,33 +83,24 @@ EXTERN_C void hal_init_platform(
gdt_reg.Base = reinterpret_cast<Kernel::UIntPtr>(kGDTArray);
gdt_reg.Limit = (sizeof(Kernel::HAL::Detail::NE_GDT_ENTRY) * kGDTEntriesCount) - 1;
+ Kernel::NeFS::fs_init_nefs();
+
+ Kernel::HAL::mp_get_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr);
+
//! GDT will load hal_read_init after it successfully loads the segments.
Kernel::HAL::GDTLoader gdt_loader;
gdt_loader.Load(gdt_reg);
- Kernel::ke_panic(RUNTIME_CHECK_BOOTSTRAP);
+ return kEfiFail;
}
EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept
{
- kEndTim = hal_rdtsc_fn();
-
- (void)(Kernel::kout << "Boot Time: " << Kernel::number(kEndTim - kStartTim) << Kernel::kendl);
-
- Kernel::NeFS::fs_init_nefs();
-
- Kernel::HAL::mp_get_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr);
-
Kernel::HAL::Register64 idt_reg;
-
idt_reg.Base = (Kernel::UIntPtr)kInterruptVectorTable;
Kernel::HAL::IDTLoader idt_loader;
- kEndTim = hal_rdtsc_fn();
-
- (void)(Kernel::kout << "Init Time: " << Kernel::number(kEndTim - kStartTim) << Kernel::kendl);
-
idt_loader.Load(idt_reg);
dbg_break_point();