summaryrefslogtreecommitdiffhomepage
path: root/dev/boot
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/boot
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/boot')
-rw-r--r--dev/boot/modules/BootNet/amd64.json2
-rw-r--r--dev/boot/modules/SysChk/amd64-ahci.json2
-rw-r--r--dev/boot/modules/SysChk/amd64-pio.json2
-rw-r--r--dev/boot/src/BootThread.cc26
-rw-r--r--dev/boot/src/HEL/AMD64/BootAPI.S9
-rw-r--r--dev/boot/src/HEL/AMD64/BootEFI.cc32
6 files changed, 23 insertions, 50 deletions
diff --git a/dev/boot/modules/BootNet/amd64.json b/dev/boot/modules/BootNet/amd64.json
index 7e5fd018..912eeb0b 100644
--- a/dev/boot/modules/BootNet/amd64.json
+++ b/dev/boot/modules/BootNet/amd64.json
@@ -9,7 +9,7 @@
"-std=c++20",
"-fno-rtti",
"-fno-exceptions",
- "-Wl,--subsystem=17,--image-base,0x4000000,-e,BootNetModuleMain"
+ "-Wl,--subsystem=17,--image-base,0x10000000,-e,BootNetModuleMain"
],
"cpp_macros": [
"__NEOSKRNL__",
diff --git a/dev/boot/modules/SysChk/amd64-ahci.json b/dev/boot/modules/SysChk/amd64-ahci.json
index 1377c23b..d13e6c4a 100644
--- a/dev/boot/modules/SysChk/amd64-ahci.json
+++ b/dev/boot/modules/SysChk/amd64-ahci.json
@@ -9,7 +9,7 @@
"-std=c++20",
"-fno-rtti",
"-fno-exceptions",
- "-Wl,--subsystem=17,--image-base,0x4000000,-e,SysChkModuleMain"
+ "-Wl,--subsystem=17,--image-base,0x10000000,-e,SysChkModuleMain"
],
"cpp_macros": [
"__NEOSKRNL__",
diff --git a/dev/boot/modules/SysChk/amd64-pio.json b/dev/boot/modules/SysChk/amd64-pio.json
index 879f651f..f15a8efd 100644
--- a/dev/boot/modules/SysChk/amd64-pio.json
+++ b/dev/boot/modules/SysChk/amd64-pio.json
@@ -9,7 +9,7 @@
"-std=c++20",
"-fno-rtti",
"-fno-exceptions",
- "-Wl,--subsystem=17,--image-base,0x4000000,-e,SysChkModuleMain"
+ "-Wl,--subsystem=17,--image-base,0x10000000,-e,SysChkModuleMain"
],
"cpp_macros": [
"__NEOSKRNL__",
diff --git a/dev/boot/src/BootThread.cc b/dev/boot/src/BootThread.cc
index 3f399d66..f1866a76 100644
--- a/dev/boot/src/BootThread.cc
+++ b/dev/boot/src/BootThread.cc
@@ -166,40 +166,18 @@ namespace Boot
/// @note handover header has to be valid!
Int32 BootThread::Start(HEL::BootInfoHeader* handover, Bool own_stack)
{
- HEL::HandoverProc err_fn = [](HEL::BootInfoHeader* rcx) -> Int32 {
- NE_UNUSED(rcx);
-
- fb_render_string("BootZ: Invalid Boot Image...", 50, 10, RGB(0xFF, 0xFF, 0xFF));
- ::Boot::Stop();
-
- return NO;
- };
-
- if (!fStartAddress)
- {
- err_fn(handover);
- }
-
fHandover = handover;
if (own_stack)
{
- UInt8* aligned_stack = &fStack[mib_cast(16) - 1];
- aligned_stack = (UInt8*)((UIntPtr)aligned_stack & ~0xF);
-
- rt_jump_to_address(fStartAddress, fHandover, aligned_stack);
+ return rt_jump_to_address(fStartAddress, fHandover, &fStack[mib_cast(16) - 1]);
}
else
{
- if (fStack)
- delete[] fStack;
-
- fStack = nullptr;
-
return reinterpret_cast<HEL::HandoverProc>(fStartAddress)(fHandover);
}
- return kEfiOk;
+ return kEfiFail;
}
const Char* BootThread::GetName()
diff --git a/dev/boot/src/HEL/AMD64/BootAPI.S b/dev/boot/src/HEL/AMD64/BootAPI.S
index c4a7ad39..963ef46a 100644
--- a/dev/boot/src/HEL/AMD64/BootAPI.S
+++ b/dev/boot/src/HEL/AMD64/BootAPI.S
@@ -11,11 +11,16 @@
rt_jump_to_address:
mov rbx, rcx
mov rcx, rdx
+ push rbx
+ push rdx
mov rsp, r8
-
- cli
+ push rax
jmp rbx
+ pop rdx
+ pop rbx
+ pop rax
+
ret
rt_reset_hardware:
diff --git a/dev/boot/src/HEL/AMD64/BootEFI.cc b/dev/boot/src/HEL/AMD64/BootEFI.cc
index 795e43cf..fa0cb74b 100644
--- a/dev/boot/src/HEL/AMD64/BootEFI.cc
+++ b/dev/boot/src/HEL/AMD64/BootEFI.cc
@@ -82,8 +82,6 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle,
{
fw_init_efi(sys_table); ///! Init the EFI library.
- fb_init();
-
HEL::BootInfoHeader* handover_hdr =
new HEL::BootInfoHeader();
@@ -146,7 +144,9 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle,
FB::fb_clear_video();
+ fb_init();
FBDrawBitMapInRegion(zka_disk, NE_DISK_WIDTH, NE_DISK_HEIGHT, (kHandoverHeader->f_GOP.f_Width - NE_DISK_WIDTH) / 2, (kHandoverHeader->f_GOP.f_Height - NE_DISK_HEIGHT) / 2);
+ fb_clear();
UInt32 cnt_enabled = 0;
UInt32 cnt_disabled = 0;
@@ -221,10 +221,6 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle,
BS->GetMemoryMap(&size_struct_ptr, struct_ptr, &map_key, &sz_desc, &rev_desc);
- struct_ptr = new EfiMemoryDescriptor[sz_desc];
-
- BS->GetMemoryMap(&size_struct_ptr, struct_ptr, &map_key, &sz_desc, &rev_desc);
-
handover_hdr->f_FirmwareVendorLen = Boot::BStrLen(sys_table->FirmwareVendor);
handover_hdr->f_Magic = kHandoverMagic;
@@ -259,19 +255,17 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle,
ver = KERNEL_VERSION_BCD;
ST->RuntimeServices->SetVariable(L"/props/kern_ver", kEfiGlobalNamespaceVarGUID, nullptr, &sz_ver, &ver);
- writer.Write("BootZ: Kernel Version has been updated: ").Write(ver).Write("\r");
+ writer.Write("BootZ: version has been updated: ").Write(ver).Write("\r");
}
- writer.Write("BootZ: Kernel Version: ").Write(ver).Write("\r");
+ writer.Write("BootZ: version: ").Write(ver).Write("\r");
- // Fallback to bootnet, if not PXE.
+ // boot to kernel, if not netboot this.
Boot::BootFileReader reader_kernel(kernel_path, image_handle);
reader_kernel.ReadAll(0);
- Boot::BootThread* kernel_thread = nullptr;
-
// ------------------------------------------ //
// If we succeed in reading the blob, then execute it.
// ------------------------------------------ //
@@ -282,18 +276,14 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle,
// null these fields, to avoid being reused later.
// ------------------------------------------ //
- handover_hdr->f_FirmwareCustomTables[0] = nullptr;
- handover_hdr->f_FirmwareCustomTables[1] = nullptr;
+ auto kernel_thread = Boot::BootThread(reader_kernel.Blob());
- kernel_thread = new Boot::BootThread(reader_kernel.Blob());
- kernel_thread->SetName("BootZ: Kernel");
+ kernel_thread.SetName("BootZ: Kernel");
handover_hdr->f_KernelImage = reader_kernel.Blob();
handover_hdr->f_KernelSz = reader_kernel.Size();
- Boot::ExitBootServices(map_key, image_handle);
-
- return kernel_thread->Start(handover_hdr, NO);
+ kernel_thread.Start(handover_hdr, YES);
}
Boot::BootFileReader reader_netboot(L"net.efi", image_handle);
@@ -302,8 +292,8 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle,
if (!reader_netboot.Blob())
return kEfiFail;
- Boot::BootThread* netboot_thread = new Boot::BootThread(reader_netboot.Blob());
- netboot_thread->SetName("BootZ: BootNet");
+ auto netboot_thread = Boot::BootThread(reader_netboot.Blob());
+ netboot_thread.SetName("BootZ: BootNet");
- return netboot_thread->Start(handover_hdr, NO);
+ return netboot_thread.Start(handover_hdr, NO);
}