From 58b3d776ab5435de352217b2a3a525aeb9316e99 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 16 Apr 2025 17:13:31 +0200 Subject: dev, kernel, boot: fix dumb early-init which caused the kernel to jump at IVT. Signed-off-by: Amlal El Mahrouss --- dev/boot/modules/BootNet/amd64.json | 2 +- dev/boot/modules/SysChk/amd64-ahci.json | 2 +- dev/boot/modules/SysChk/amd64-pio.json | 2 +- dev/boot/src/BootThread.cc | 26 ++------------- dev/boot/src/HEL/AMD64/BootAPI.S | 9 +++-- dev/boot/src/HEL/AMD64/BootEFI.cc | 32 +++++++----------- dev/kernel/FirmwareKit/Handover.h | 6 ++++ dev/kernel/HALKit/AMD64/HalDebugOutput.cc | 2 +- dev/kernel/HALKit/AMD64/HalKernelMain.cc | 55 +++++++++++++------------------ dev/kernel/amd64-ci.make | 2 +- dev/kernel/amd64-desktop.make | 4 +-- 11 files changed, 55 insertions(+), 87 deletions(-) (limited to 'dev') 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(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); } diff --git a/dev/kernel/FirmwareKit/Handover.h b/dev/kernel/FirmwareKit/Handover.h index 22d96ca9..ecdaca64 100644 --- a/dev/kernel/FirmwareKit/Handover.h +++ b/dev/kernel/FirmwareKit/Handover.h @@ -17,6 +17,7 @@ #pragma once +#include "FirmwareKit/EFI/EFI.h" #include #define kHandoverMagic 0xBADCC @@ -70,6 +71,11 @@ namespace Kernel::HEL WideChar f_FirmwareVendorName[32]; SizeT f_FirmwareVendorLen; +#ifdef __NE_AMD64__ + UInt32 f_EFIImageKey; + EfiHandlePtr f_EFIImage; +#endif + VoidPtr f_FirmwareCustomTables[2]; // On EFI 0: BS 1: ST struct 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 #include #include @@ -15,6 +16,10 @@ #include #include +#include +#include + + 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(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(); diff --git a/dev/kernel/amd64-ci.make b/dev/kernel/amd64-ci.make index 9e881123..e9a4d4b0 100644 --- a/dev/kernel/amd64-ci.make +++ b/dev/kernel/amd64-ci.make @@ -5,7 +5,7 @@ CXX = x86_64-w64-mingw32-g++ LD = x86_64-w64-mingw32-ld -CCFLAGS = -fshort-wchar -c -D__NE_AMD64__ -Werror -Wall -Wpedantic -Wextra -mno-red-zone -fno-rtti -fno-exceptions -std=c++20 -D__NE_SUPPORT_NX__ -O0 -I../Vendor -D__FSKIT_INCLUDES_NEFS__ -D__NEOSKRNL__ -D__HAVE_NE_APIS__ -D__FREESTANDING__ -D__NE_VIRTUAL_MEMORY_SUPPORT__ -D__NE_AUTO_FORMAT__ -D__NE__ -I./ -I../ -I../zba +CCFLAGS = -fshort-wchar -c -D__NE_AMD64__ -Werror -Wall -Wpedantic -Wextra -mno-red-zone -fno-rtti -fno-exceptions -std=c++20 -D__NE_SUPPORT_NX__ -O0 -I../vendor -D__FSKIT_INCLUDES_NEFS__ -D__NEOSKRNL__ -D__HAVE_NE_APIS__ -D__FREESTANDING__ -D__NE_VIRTUAL_MEMORY_SUPPORT__ -D__NE_AUTO_FORMAT__ -D__NE__ -I./ -I../ -I../boot ASM = nasm diff --git a/dev/kernel/amd64-desktop.make b/dev/kernel/amd64-desktop.make index 905a6c91..02b0a3b4 100644 --- a/dev/kernel/amd64-desktop.make +++ b/dev/kernel/amd64-desktop.make @@ -5,7 +5,7 @@ CXX = x86_64-w64-mingw32-g++ LD = x86_64-w64-mingw32-ld -CCFLAGS = -fshort-wchar -c -D__NE_AMD64__ -Wall -Wpedantic -Wextra -mno-red-zone -fno-rtti -fno-exceptions -std=c++20 -D__NE_SUPPORT_NX__ -O0 -I../Vendor -D__FSKIT_INCLUDES_NEFS__ -D__NEOSKRNL__ -D__HAVE_NE_APIS__ -D__FREESTANDING__ -D__NE_VIRTUAL_MEMORY_SUPPORT__ -D__NE_AUTO_FORMAT__ -D__NE__ -I./ -I../ -I../zba +CCFLAGS = -fshort-wchar -c -D__NE_AMD64__ -Wall -Wpedantic -Wextra -mno-red-zone -fno-rtti -fno-exceptions -std=c++20 -D__NE_SUPPORT_NX__ -O0 -I../vendor -D__FSKIT_INCLUDES_NEFS__ -D__NEOSKRNL__ -D__HAVE_NE_APIS__ -D__FREESTANDING__ -D__NE_VIRTUAL_MEMORY_SUPPORT__ -D__NE_AUTO_FORMAT__ -D__NE__ -I./ -I../ -I../boot ASM = nasm @@ -33,7 +33,7 @@ COPY = cp ASMFLAGS = -f win64 # Kernel subsystem is 17 and entrypoint is hal_init_platform -LDFLAGS = -e hal_init_platform --subsystem=17 --image-base 0x4000000 +LDFLAGS = -e hal_init_platform --subsystem=17 --image-base 0x10000000 LDOBJ = obj/*.obj # This file is the Kernel, responsible of task, memory, driver, sci, disk and device management. -- cgit v1.2.3