diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2025-04-16 17:13:31 +0200 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal@nekernel.org> | 2025-04-16 17:13:31 +0200 |
| commit | 58b3d776ab5435de352217b2a3a525aeb9316e99 (patch) | |
| tree | cf298a3b522fed5b829c4b250932ab13ef407838 /dev/boot/src | |
| parent | 0b0f61ae48bbd8827d6088feab6cf58e7837bf92 (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/src')
| -rw-r--r-- | dev/boot/src/BootThread.cc | 26 | ||||
| -rw-r--r-- | dev/boot/src/HEL/AMD64/BootAPI.S | 9 | ||||
| -rw-r--r-- | dev/boot/src/HEL/AMD64/BootEFI.cc | 32 |
3 files changed, 20 insertions, 47 deletions
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); } |
