From c0f7f3f300d603d355fc7ec5be317afe1f0ee1b6 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Thu, 26 Dec 2024 18:15:54 +0100 Subject: IMPL: Improvements and fixes. Signed-off-by: Amlal El Mahrouss --- dev/BootLoader/BootKit/BootKit.h | 1 - dev/BootLoader/BootKit/Thread.h | 2 +- dev/BootLoader/Modules/NetBoot/Module.cc | 2 +- dev/BootLoader/Modules/NetBoot/build.json | 2 +- dev/BootLoader/Modules/SysChk/Module.cc | 33 ++++++++++++++-- dev/BootLoader/src/BootThread.cc | 22 +++++++---- dev/BootLoader/src/HEL/AMD64/BootMain.cc | 65 ++++++++++++++----------------- 7 files changed, 75 insertions(+), 52 deletions(-) (limited to 'dev/BootLoader') diff --git a/dev/BootLoader/BootKit/BootKit.h b/dev/BootLoader/BootKit/BootKit.h index 90d6fae9..2e0099f2 100644 --- a/dev/BootLoader/BootKit/BootKit.h +++ b/dev/BootLoader/BootKit/BootKit.h @@ -15,7 +15,6 @@ #include #include #include -#include #include #include #include diff --git a/dev/BootLoader/BootKit/Thread.h b/dev/BootLoader/BootKit/Thread.h index 06fd84a0..42991d17 100644 --- a/dev/BootLoader/BootKit/Thread.h +++ b/dev/BootLoader/BootKit/Thread.h @@ -29,7 +29,7 @@ namespace Boot BThread& operator=(const BThread&) = default; BThread(const BThread&) = default; - void Start(HEL::BootInfoHeader* handover, BOOL is_own_stack); + Int32 Start(HEL::BootInfoHeader* handover, BOOL is_own_stack); void SetName(const char* name); const char* GetName(); bool IsValid(); diff --git a/dev/BootLoader/Modules/NetBoot/Module.cc b/dev/BootLoader/Modules/NetBoot/Module.cc index 1b4a4bb4..6277da70 100644 --- a/dev/BootLoader/Modules/NetBoot/Module.cc +++ b/dev/BootLoader/Modules/NetBoot/Module.cc @@ -10,7 +10,7 @@ #include #include -EXTERN_C Int32 main(Kernel::HEL::BootInfoHeader* Handover) +EXTERN_C Int32 ModuleMain(Kernel::HEL::BootInfoHeader* Handover) { return kEfiOk; } diff --git a/dev/BootLoader/Modules/NetBoot/build.json b/dev/BootLoader/Modules/NetBoot/build.json index 3844f9cb..9df27b3c 100644 --- a/dev/BootLoader/Modules/NetBoot/build.json +++ b/dev/BootLoader/Modules/NetBoot/build.json @@ -11,7 +11,7 @@ "-fPIC", "-fno-rtti", "-fno-exceptions", - "-Wl,--subsystem=17,--image-base,0x1000000" + "-Wl,--subsystem=17,--image-base,0x10000000,-e,ModuleMain" ], "cpp_macros": [ "__MINOSKRNL__", diff --git a/dev/BootLoader/Modules/SysChk/Module.cc b/dev/BootLoader/Modules/SysChk/Module.cc index b0808fde..28b89859 100644 --- a/dev/BootLoader/Modules/SysChk/Module.cc +++ b/dev/BootLoader/Modules/SysChk/Module.cc @@ -8,15 +8,40 @@ */ #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include EXTERN_C Int32 ModuleMain(Kernel::HEL::BootInfoHeader* Handover) { EfiSystemTable* system_table = (EfiSystemTable*)Handover->f_FirmwareCustomTables[1]; - system_table->ConOut->ClearScreen(system_table->ConOut); + EfiInputKey key{}; - system_table->ConOut->OutputString(system_table->ConOut, L"SYSCHK: CHECKING FOR VALID NEFS OR HPFS PARTITIONS...\r\n"); - system_table->ConOut->OutputString(system_table->ConOut, L"SYSCHK: GOOD TO GO!\r\n"); + system_table->ConIn->ReadKeyStroke(system_table->ConIn, &key); - return kEfiOk; + if (key.UnicodeChar == 'F' || + key.UnicodeChar == 'f') + { + UI::ui_draw_background(); + + fb_init(); + + FBDrawBitMapInRegion(zka_no_disk, ZKA_NO_DISK_HEIGHT, ZKA_NO_DISK_WIDTH, (kHandoverHeader->f_GOP.f_Width - ZKA_NO_DISK_WIDTH) / 2, (kHandoverHeader->f_GOP.f_Height - ZKA_NO_DISK_HEIGHT) / 2); + + fb_fini(); + + return kEfiOk; + } + + return kEfiFail; } diff --git a/dev/BootLoader/src/BootThread.cc b/dev/BootLoader/src/BootThread.cc index 6d78d0d1..ae494a15 100644 --- a/dev/BootLoader/src/BootThread.cc +++ b/dev/BootLoader/src/BootThread.cc @@ -122,7 +122,7 @@ namespace Boot #ifdef __ZKA_AMD64__ if (handover_struc->HandoverArch != HEL::kArchAMD64) { - fb_render_string("BootZ: NOT AN HANDOVER IMAGE, BAD ARCHITECTURE...", 40, 10, RGB(0xFF, 0xFF, 0xFF)); + fb_render_string("BootZ: Not an handover header, bad CPU...", 40, 10, RGB(0xFF, 0xFF, 0xFF)); ::EFI::Stop(); } #endif @@ -130,11 +130,11 @@ namespace Boot #ifdef __ZKA_ARM64__ if (handover_struc->HandoverArch != HEL::kArchARM64) { - fb_render_string("BootZ: NOT AN HANDOVER IMAGE, BAD ARCHITECTURE...", 40, 10, RGB(0xFF, 0xFF, 0xFF)); + fb_render_string("BootZ: Not an handover header, bad CPU...", 40, 10, RGB(0xFF, 0xFF, 0xFF)); ::EFI::Stop(); } #endif - fb_render_string("BootZ: NOT AN HANDOVER IMAGE...", 40, 10, RGB(0xFF, 0xFF, 0xFF)); + fb_render_string("BootZ: Not an handover header...", 40, 10, RGB(0xFF, 0xFF, 0xFF)); ::EFI::Stop(); } @@ -160,18 +160,20 @@ namespace Boot } else { - writer.Write("BootZ: INVALID EXECUTABLE.\r"); + writer.Write("BootZ: Invalid Executable.\r"); } fStack = new UInt8[mib_cast(8)]; } /// @note handover header has to be valid! - Void BThread::Start(HEL::BootInfoHeader* handover, Bool own_stack) + Int32 BThread::Start(HEL::BootInfoHeader* handover, Bool own_stack) { - HEL::HandoverProc err_fn = [](HEL::BootInfoHeader* rcx) -> void { - fb_render_string("BootZ: INVALID IMAGE! ABORTING...", 50, 10, RGB(0xFF, 0xFF, 0xFF)); + HEL::HandoverProc err_fn = [](HEL::BootInfoHeader* rcx) -> Int32 { + fb_render_string("BootZ: Invalid Boot Image...", 50, 10, RGB(0xFF, 0xFF, 0xFF)); ::EFI::Stop(); + + return NO; }; if (!fStartAddress) @@ -182,12 +184,16 @@ namespace Boot fHandover = handover; if (own_stack) + { rt_jump_to_address(fStartAddress, fHandover, &fStack[mib_cast(8) - 1]); + } else { delete[] fStack; - reinterpret_cast(fStartAddress)(fHandover); + return reinterpret_cast(fStartAddress)(fHandover); } + + return NO; } const Char* BThread::GetName() diff --git a/dev/BootLoader/src/HEL/AMD64/BootMain.cc b/dev/BootLoader/src/HEL/AMD64/BootMain.cc index dd7528d8..023976ae 100644 --- a/dev/BootLoader/src/HEL/AMD64/BootMain.cc +++ b/dev/BootLoader/src/HEL/AMD64/BootMain.cc @@ -157,40 +157,12 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr ImageHandle, handover_hdr->f_HardwareTables.f_MultiProcessingEnabled = cnt_enabled > 1; // Fill handover header now. - Boot::BDiskFormatFactory partition_factory; - // ---------------------------------------------------- // // The following checks for an exisiting partition // inside the disk, if it doesn't have one, // format the disk. // ---------------------------------------------------- // -#ifdef ZKA_AUTO_FORMAT - if (!partition_factory.IsPartitionValid()) - { - UI::ui_draw_background(); - - FBDrawBitMapInRegion(zka_no_disk, ZKA_NO_DISK_HEIGHT, ZKA_NO_DISK_WIDTH, (kHandoverHeader->f_GOP.f_Width - ZKA_NO_DISK_WIDTH) / 2, (kHandoverHeader->f_GOP.f_Height - ZKA_NO_DISK_HEIGHT) / 2); - - fb_fini(); - - Boot::BDiskFormatFactory::BFileDescriptor root{}; - - root.fFileName[0] = kNeFSRoot[0]; - root.fFileName[1] = 0; - - root.fKind = kNeFSCatalogKindDir; - - partition_factory.Format("FileSystem (A:)\0", &root, 1); - - UI::ui_draw_background(); - - FBDrawBitMapInRegion(zka_has_disk, ZKA_HAS_DISK_HEIGHT, ZKA_HAS_DISK_WIDTH, (kHandoverHeader->f_GOP.f_Width - ZKA_HAS_DISK_WIDTH) / 2, (kHandoverHeader->f_GOP.f_Height - ZKA_HAS_DISK_HEIGHT) / 2); - - fb_fini(); - } -#endif // ZKA_AUTO_FORMAT - BS->GetMemoryMap(&size_struct_ptr, struct_ptr, &map_key, &sz_desc, &rev_desc); struct_ptr = new EfiMemoryDescriptor[sz_desc]; @@ -243,10 +215,31 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr ImageHandle, if (reader_syschk.Blob()) { syschk_thread = new Boot::BThread(reader_syschk.Blob()); - syschk_thread->SetName("BootZ: System Check"); + syschk_thread->SetName("BootZ: System Recovery Check"); } - syschk_thread->Start(handover_hdr, NO); + Boot::BDiskFormatFactory partition_factory; + + if (partition_factory.IsPartitionValid() == false && + syschk_thread->Start(handover_hdr, NO) == kEfiOk) + { + fb_init(); + + Boot::BDiskFormatFactory::BFileDescriptor root{}; + + root.fFileName[0] = kNeFSRoot[0]; + root.fFileName[1] = 0; + + root.fKind = kNeFSCatalogKindDir; + + partition_factory.Format("FileSystem (A:) ", &root, 1); + + UI::ui_draw_background(); + + FBDrawBitMapInRegion(zka_has_disk, ZKA_HAS_DISK_HEIGHT, ZKA_HAS_DISK_WIDTH, (kHandoverHeader->f_GOP.f_Width - ZKA_HAS_DISK_WIDTH) / 2, (kHandoverHeader->f_GOP.f_Height - ZKA_HAS_DISK_HEIGHT) / 2); + + fb_fini(); + } // ------------------------------------------ // // null these fields, to avoid being reused later. @@ -289,7 +282,7 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr ImageHandle, else { fb_init(); - FBDrawBitMapInRegion(zka_no_disk, ZKA_NO_DISK_HEIGHT, ZKA_NO_DISK_WIDTH, (kHandoverHeader->f_GOP.f_Width - ZKA_NO_DISK_WIDTH) / 2, (kHandoverHeader->f_GOP.f_Height - ZKA_NO_DISK_HEIGHT) / 2); + FBDrawBitMapInRegion(zka_no_disk, ZKA_NO_DISK_HEIGHT, ZKA_NO_DISK_WIDTH, (kHandoverHeader->f_GOP.f_Width - ZKA_NO_DISK_WIDTH) / 2, (kHandoverHeader->f_GOP.f_Height - ZKA_NO_DISK_HEIGHT) / 2); EFI::Stop(); } @@ -300,16 +293,16 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr ImageHandle, if (ttf_font.Blob()) { - handover_hdr->f_KernelImage = reader_kernel.Blob(); - handover_hdr->f_KernelSz = reader_kernel.Size(); - handover_hdr->f_FontImage = ttf_font.Blob(); - handover_hdr->f_FontSz = ttf_font.Size(); + handover_hdr->f_KernelImage = reader_kernel.Blob(); + handover_hdr->f_KernelSz = reader_kernel.Size(); + handover_hdr->f_FontImage = ttf_font.Blob(); + handover_hdr->f_FontSz = ttf_font.Size(); } else { fb_init(); FBDrawBitMapInRegion(zka_no_disk, ZKA_NO_DISK_HEIGHT, ZKA_NO_DISK_WIDTH, (kHandoverHeader->f_GOP.f_Width - ZKA_NO_DISK_WIDTH) / 2, (kHandoverHeader->f_GOP.f_Height - ZKA_NO_DISK_HEIGHT) / 2); - + EFI::Stop(); } -- cgit v1.2.3