diff options
Diffstat (limited to 'dev/BootLoader')
| -rw-r--r-- | dev/BootLoader/BootKit/BootKit.h | 1 | ||||
| -rw-r--r-- | dev/BootLoader/BootKit/Thread.h | 2 | ||||
| -rw-r--r-- | dev/BootLoader/Modules/NetBoot/Module.cc | 2 | ||||
| -rw-r--r-- | dev/BootLoader/Modules/NetBoot/build.json | 2 | ||||
| -rw-r--r-- | dev/BootLoader/Modules/SysChk/Module.cc | 33 | ||||
| -rw-r--r-- | dev/BootLoader/src/BootThread.cc | 22 | ||||
| -rw-r--r-- | dev/BootLoader/src/HEL/AMD64/BootMain.cc | 65 |
7 files changed, 75 insertions, 52 deletions
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 <FirmwareKit/EPM.h> #include <CompilerKit/Version.h> #include <Modules/GfxMgr/FBMgr.h> -#include <Modules/GfxMgr/AppearanceMgr.h> #include <BootKit/Rsrc/zka_disk.rsrc> #include <BootKit/Rsrc/zka_no_disk.rsrc> #include <BootKit/Rsrc/zka_has_disk.rsrc> 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 <NetBoot.h> #include <BootKit/BootKit.h> -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 <BootKit/BootKit.h> +#include <Modules/GfxMgr/FBMgr.h> +#include <Modules/GfxMgr/TextMgr.h> +#include <FirmwareKit/EFI.h> +#include <FirmwareKit/EFI/API.h> +#include <FirmwareKit/Handover.h> +#include <KernelKit/MSDOS.h> +#include <KernelKit/PE.h> +#include <KernelKit/PEF.h> +#include <NewKit/Macros.h> +#include <NewKit/Ref.h> +#include <BootKit/Thread.h> +#include <Modules/GfxMgr/FBMgr.h> 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<HEL::HandoverProc>(fStartAddress)(fHandover); + return reinterpret_cast<HEL::HandoverProc>(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<BootDeviceATA> 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<BootDeviceATA>::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<BootDeviceATA> partition_factory; + + if (partition_factory.IsPartitionValid() == false && + syschk_thread->Start(handover_hdr, NO) == kEfiOk) + { + fb_init(); + + Boot::BDiskFormatFactory<BootDeviceATA>::BFileDescriptor root{}; + + root.fFileName[0] = kNeFSRoot[0]; + root.fFileName[1] = 0; + + root.fKind = kNeFSCatalogKindDir; + + partition_factory.Format("FileSystem (A:) <System_Build\"" __DATE__ "\">", &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(); } |
