diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2025-03-28 04:57:17 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal@nekernel.org> | 2025-03-28 04:57:17 +0100 |
| commit | 4966ca284132e4e52a9bee6f582527aa7f784ef6 (patch) | |
| tree | 023fc0c5a3e6b1daae91ce22ec01852a8074f2ff | |
| parent | a3da0eaaf7569948f83c65ff7997c4d1fc868603 (diff) | |
bootz: consolidate EFI namespace into Boot, finalize NetBoot fallback
Collapse the EFI namespace into Boot to unify BootZ's interface for firmware
handling. This simplifies calls to functions like Stop(), ThrowError(),
and ExitBootServices(), and improves consistency across boot modules.
Also rename SysChk/Module.cc to SysChk/SysChk.cc for naming consistency
with other modules.
Improve NetBoot fallback path in BootEFI:
- Ensure netboot.sys is read before ExitBootServices() to avoid allocation
issues after exiting firmware services.
- Reuse reader and thread objects if kernel boot fails.
- Update both AMD64 and ARM64 paths to follow the same logic.
Update all call sites to use Boot:: instead of EFI::.
Fixes: broken error handling and memory reads after ExitBootServices()
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
| -rw-r--r-- | dev/boot/BootKit/BootKit.h | 9 | ||||
| -rw-r--r-- | dev/boot/modules/SysChk/SysChk.cc (renamed from dev/boot/modules/SysChk/Module.cc) | 0 | ||||
| -rw-r--r-- | dev/boot/src/BootFileReader.cc | 2 | ||||
| -rw-r--r-- | dev/boot/src/BootThread.cc | 8 | ||||
| -rw-r--r-- | dev/boot/src/HEL/AMD64/BootEFI.cc | 18 | ||||
| -rw-r--r-- | dev/boot/src/HEL/ARM64/BootEFI.cc | 2 | ||||
| -rw-r--r-- | dev/kernel/FirmwareKit/EFI/API.h | 6 |
7 files changed, 21 insertions, 24 deletions
diff --git a/dev/boot/BootKit/BootKit.h b/dev/boot/BootKit/BootKit.h index 425c6ed4..6cde6a51 100644 --- a/dev/boot/BootKit/BootKit.h +++ b/dev/boot/BootKit/BootKit.h @@ -37,14 +37,11 @@ /// Framebuffer helpers. /***********************************************************************************/ -namespace EFI +namespace Boot { EXTERN void ThrowError(const WideChar* errorCode, const WideChar* reason) noexcept; -} // namespace EFI - -namespace Boot -{ + class BootTextWriter; class BootFileReader; class BootThread; @@ -338,7 +335,7 @@ namespace Boot fb_init(); FBDrawBitMapInRegion(zka_no_disk, NE_NO_DISK_WIDTH, NE_NO_DISK_HEIGHT, (kHandoverHeader->f_GOP.f_Width - NE_NO_DISK_WIDTH) / 2, (kHandoverHeader->f_GOP.f_Height - NE_NO_DISK_HEIGHT) / 2); - EFI::ThrowError(L"Drive-Too-Tiny", L"Can't format a NeFS partition here."); + Boot::ThrowError(L"Drive-Too-Tiny", L"Can't format a NeFS partition here."); return false; } diff --git a/dev/boot/modules/SysChk/Module.cc b/dev/boot/modules/SysChk/SysChk.cc index c22e183b..c22e183b 100644 --- a/dev/boot/modules/SysChk/Module.cc +++ b/dev/boot/modules/SysChk/SysChk.cc diff --git a/dev/boot/src/BootFileReader.cc b/dev/boot/src/BootFileReader.cc index a2afbce5..604ddaba 100644 --- a/dev/boot/src/BootFileReader.cc +++ b/dev/boot/src/BootFileReader.cc @@ -154,7 +154,7 @@ Void Boot::BootFileReader::ReadAll(SizeT readUntil, SizeT chunkToRead, UIntPtr o kEfiOk) { mWriter.Write(L"*** error: ").Write(err).Write(L" ***\r"); - EFI::ThrowError(L"OutOfMemory", L"Out of memory."); + Boot::ThrowError(L"OutOfMemory", L"Out of memory."); } } else diff --git a/dev/boot/src/BootThread.cc b/dev/boot/src/BootThread.cc index e087d386..eef2104b 100644 --- a/dev/boot/src/BootThread.cc +++ b/dev/boot/src/BootThread.cc @@ -117,7 +117,7 @@ namespace Boot if (handover_struc->HandoverArch != HEL::kArchAMD64) { fb_render_string("BootZ: Not an handover header, bad CPU...", 40, 10, RGB(0xFF, 0xFF, 0xFF)); - ::EFI::Stop(); + ::Boot::Stop(); } #endif @@ -125,12 +125,12 @@ namespace Boot if (handover_struc->HandoverArch != HEL::kArchARM64) { fb_render_string("BootZ: Not an handover header, bad CPU...", 40, 10, RGB(0xFF, 0xFF, 0xFF)); - ::EFI::Stop(); + ::Boot::Stop(); } #endif fb_render_string("BootZ: Not an handover header...", 40, 10, RGB(0xFF, 0xFF, 0xFF)); - ::EFI::Stop(); + ::Boot::Stop(); } } @@ -165,7 +165,7 @@ namespace Boot { HEL::HandoverProc err_fn = [](HEL::BootInfoHeader* rcx) -> Int32 { fb_render_string("BootZ: Invalid Boot Image...", 50, 10, RGB(0xFF, 0xFF, 0xFF)); - ::EFI::Stop(); + ::Boot::Stop(); return NO; }; diff --git a/dev/boot/src/HEL/AMD64/BootEFI.cc b/dev/boot/src/HEL/AMD64/BootEFI.cc index 4744892f..a6af4235 100644 --- a/dev/boot/src/HEL/AMD64/BootEFI.cc +++ b/dev/boot/src/HEL/AMD64/BootEFI.cc @@ -307,10 +307,15 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr image_handle, fb_init(); FBDrawBitMapInRegion(zka_no_disk, NE_NO_DISK_WIDTH, NE_NO_DISK_HEIGHT, (kHandoverHeader->f_GOP.f_Width - NE_NO_DISK_WIDTH) / 2, (kHandoverHeader->f_GOP.f_Height - NE_NO_DISK_HEIGHT) / 2); - EFI::Stop(); + Boot::Stop(); } - EFI::ExitBootServices(map_key, image_handle); + Boot::BootFileReader reader_netboot(L"netboot.sys", image_handle); + reader_netboot.ReadAll(0); + + Boot::BootThread* netboot_thread = nullptr; + + Boot::ExitBootServices(map_key, image_handle); // ---------------------------------------------------- // // Finally load the OS kernel. @@ -318,13 +323,8 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr image_handle, if (kernel_thread->Start(handover_hdr, YES) != kEfiOk) { - Boot::BootFileReader reader_netboot(L"netboot.sys", image_handle); - reader_netboot.ReadAll(0); - - Boot::BootThread* netboot_thread = nullptr; - // ------------------------------------------ // - // If we succeed in reading the blob, then execute it. (That is NetBoot) + // If we fail into booting the kernel, then run NetBoot. // ------------------------------------------ // if (reader_netboot.Blob()) @@ -334,6 +334,6 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr image_handle, netboot_thread->Start(handover_hdr, YES); } } - + CANT_REACH(); } diff --git a/dev/boot/src/HEL/ARM64/BootEFI.cc b/dev/boot/src/HEL/ARM64/BootEFI.cc index d60f305b..09dcd4b0 100644 --- a/dev/boot/src/HEL/ARM64/BootEFI.cc +++ b/dev/boot/src/HEL/ARM64/BootEFI.cc @@ -211,7 +211,7 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr image_handle, handover_hdr->f_KernelImage = reader_kernel.Blob(); - EFI::ExitBootServices(map_key, image_handle); + Boot::ExitBootServices(map_key, image_handle); kernel_thread.Start(handover_hdr, YES); } diff --git a/dev/kernel/FirmwareKit/EFI/API.h b/dev/kernel/FirmwareKit/EFI/API.h index b05fcc71..916a6b1a 100644 --- a/dev/kernel/FirmwareKit/EFI/API.h +++ b/dev/kernel/FirmwareKit/EFI/API.h @@ -31,7 +31,7 @@ inline EfiBootServices* BS = nullptr; EXTERN_C void rt_cli(); EXTERN_C void rt_hlt(); -namespace EFI +namespace Boot { /// @brief Halt and clear interrupts. /// @return @@ -79,9 +79,9 @@ Bascially frees everything we have in the EFI side. ST->ConOut->OutputString(ST->ConOut, L" ***\r"); - EFI::Stop(); + Boot::Stop(); } -} // namespace EFI +} // namespace Boot inline void InitEFI(EfiSystemTable* SystemTable) noexcept { |
