diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2025-04-16 18:15:13 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-16 18:15:13 +0200 |
| commit | 0033ef41f33ce3d39b4e7ed7e1353cec916bdd5d (patch) | |
| tree | cf298a3b522fed5b829c4b250932ab13ef407838 /dev/boot | |
| parent | d3cf45311cf3f6de0bc25bb0ddb5c14a29a72cd6 (diff) | |
| parent | 58b3d776ab5435de352217b2a3a525aeb9316e99 (diff) | |
Merge pull request #19 from amlel-el-mahrouss/dev
urgent patches.
Diffstat (limited to 'dev/boot')
| -rw-r--r-- | dev/boot/BootKit/Device.h | 2 | ||||
| -rw-r--r-- | dev/boot/amd64-ci.make | 4 | ||||
| -rw-r--r-- | dev/boot/amd64-desktop.make | 6 | ||||
| -rw-r--r-- | dev/boot/arm64-desktop.make | 2 | ||||
| -rw-r--r-- | dev/boot/gdbinit | 2 | ||||
| -rw-r--r-- | dev/boot/modules/BootNet/BootNet.cc | 48 | ||||
| -rw-r--r-- | dev/boot/modules/BootNet/BootNet.h | 2 | ||||
| -rw-r--r-- | dev/boot/modules/BootNet/amd64.json | 1 | ||||
| -rw-r--r-- | dev/boot/modules/SysChk/SysChk.cc | 2 | ||||
| -rw-r--r-- | dev/boot/modules/SysChk/amd64-ahci.json | 1 | ||||
| -rw-r--r-- | dev/boot/modules/SysChk/amd64-pio.json | 1 | ||||
| -rw-r--r-- | dev/boot/modules/SysChk/arm64.json | 2 | ||||
| -rw-r--r-- | dev/boot/src/BootThread.cc | 28 | ||||
| -rw-r--r-- | dev/boot/src/HEL/AMD64/BootAPI.S | 9 | ||||
| -rw-r--r-- | dev/boot/src/HEL/AMD64/BootEFI.cc | 103 | ||||
| -rw-r--r-- | dev/boot/src/HEL/ARM64/BootEFI.cc | 79 |
16 files changed, 151 insertions, 141 deletions
diff --git a/dev/boot/BootKit/Device.h b/dev/boot/BootKit/Device.h index 77c6cd32..88574bd6 100644 --- a/dev/boot/BootKit/Device.h +++ b/dev/boot/BootKit/Device.h @@ -28,7 +28,7 @@ public: virtual Trait& Leak() = 0; - virtual Device& Read(Char* Buf, SizeT SecCount) = 0; + virtual Device& Read(Char* Buf, SizeT SecCount) = 0; virtual Device& Write(Char* Buf, SizeT SecCount) = 0; }; diff --git a/dev/boot/amd64-ci.make b/dev/boot/amd64-ci.make index ae451e26..62ab9af1 100644 --- a/dev/boot/amd64-ci.make +++ b/dev/boot/amd64-ci.make @@ -56,7 +56,7 @@ EMU_FLAGS= -smp 4 -m 8G \ -bios $(BIOS) -M q35 -cdrom $(BOOT) -boot d -accel kvm endif -LD_FLAGS=-e ModuleMain --subsystem=10 +LD_FLAGS=-e BootloaderMain --subsystem=10 STANDALONE_MACRO=-D__BOOTZ_STANDALONE__ OBJ=obj/*.o @@ -88,7 +88,7 @@ all: compile-amd64 .PHONY: disk disk: - dd if=/dev/zero of=$(BOOT) bs=30M count=100 + dd if=/dev/zero of=$(BOOT) bs=7M count=100 mformat -i $(BOOT) -F -v "NeKernel" diff --git a/dev/boot/amd64-desktop.make b/dev/boot/amd64-desktop.make index 3adbfb33..21a99941 100644 --- a/dev/boot/amd64-desktop.make +++ b/dev/boot/amd64-desktop.make @@ -58,7 +58,7 @@ EMU_FLAGS= -smp 4 -m 8G \ -bios $(BIOS) -M q35 -cdrom $(BOOT) -boot d -accel kvm endif -LD_FLAGS=-e ModuleMain --subsystem=10 +LD_FLAGS=-e BootloaderMain --subsystem=10 STANDALONE_MACRO=-D__BOOTZ_STANDALONE__ OBJ=obj/*.o @@ -96,7 +96,7 @@ all: compile-amd64 .PHONY: disk disk: - dd if=/dev/zero of=$(BOOT) bs=30M count=100 + dd if=/dev/zero of=$(BOOT) bs=7M count=100 mformat -i $(BOOT) -F -v "NEKERNEL-ESP" @@ -128,7 +128,7 @@ run-efi-amd64-ata-dma: .PHONY: run-efi-amd64-ata run-efi-amd64-ata: run-efi-amd64-ata-dma -# img_2 is the rescue disk. img is the bootable disk, as provided by the Zeta specs. +# img_2 is the rescue disk. img is the bootable disk, as provided by the NeKernel specs. .PHONY: epm-img epm-img: qemu-img create -f raw $(IMG) 4G diff --git a/dev/boot/arm64-desktop.make b/dev/boot/arm64-desktop.make index a553e908..06ec84d0 100644 --- a/dev/boot/arm64-desktop.make +++ b/dev/boot/arm64-desktop.make @@ -34,7 +34,7 @@ EMU_FLAGS= -smp 4 -m 8G -cpu max -M virt \ file=fat:rw:src/root/,index=2,format=raw \ -no-shutdown -no-reboot -cpu cortex-a72 -device virtio-gpu-pci -LD_FLAGS=-subsystem:efi_application -entry:ModuleMain /nodefaultlib +LD_FLAGS=-subsystem:efi_application -entry:BootloaderMain /nodefaultlib STANDALONE_MACRO=-D__BOOTZ_STANDALONE__ OBJ=*.o diff --git a/dev/boot/gdbinit b/dev/boot/gdbinit index e5b29f38..b55fa645 100644 --- a/dev/boot/gdbinit +++ b/dev/boot/gdbinit @@ -1,3 +1,3 @@ set disassemble-next-line on -b ModuleMain +b BootloaderMain target remote localhost:1234 diff --git a/dev/boot/modules/BootNet/BootNet.cc b/dev/boot/modules/BootNet/BootNet.cc index 8ee08929..050148c4 100644 --- a/dev/boot/modules/BootNet/BootNet.cc +++ b/dev/boot/modules/BootNet/BootNet.cc @@ -7,29 +7,41 @@ * ======================================================== */ +#include <FirmwareKit/EFI/API.h> #include <modules/BootNet/BootNet.h> #include <BootKit/BootKit.h> #include <BootKit/BootThread.h> -STATIC EfiGUID kEfiIP4ProtoGUID = {}; +STATIC EfiGUID kEfiSimpleProtoGUID = EFI_SIMPLE_NETWORK_PROTOCOL_GUID; +STATIC EFI_SIMPLE_NETWORK_PROTOCOL* kEfiProtocol = nullptr; -STATIC Void bootnet_read_udp_packet(BOOTNET_INTERNET_HEADER&); +STATIC Void bootnet_read_ip_packet(BOOTNET_INTERNET_HEADER); EXTERN_C Int32 BootNetModuleMain(Kernel::HEL::BootInfoHeader* handover) { + Boot::BootTextWriter writer; + + writer.Write("BootNet: Init EFI...\r"); + + fw_init_efi((EfiSystemTable*)handover->f_FirmwareCustomTables[1]); + + if (BS->LocateProtocol(&kEfiSimpleProtoGUID, nullptr, (VoidPtr*)&kEfiProtocol) != kEfiOk) + { + writer.Write("BootNet: Not supported by firmware.\r"); + return kEfiFail; + } + BOOTNET_INTERNET_HEADER inet{}; - memset(&inet, 0, sizeof(BOOTNET_INTERNET_HEADER)); - - bootnet_read_udp_packet(inet); + SetMem(&inet, 0, sizeof(BOOTNET_INTERNET_HEADER)); + + writer.Write("BootNet: Downloading kernel...\r"); - /// TODO: Read address from JSON file 'bootnet.json' + bootnet_read_ip_packet(inet); if (inet.Length < 1) { - Boot::BootTextWriter writer; writer.Write("BootNet: No executable attached to the packet, aborting.\r"); - return kEfiFail; } @@ -38,23 +50,35 @@ EXTERN_C Int32 BootNetModuleMain(Kernel::HEL::BootInfoHeader* handover) Boot::BootThread thread(inet.Data); if (thread.IsValid()) + { + writer.Write("BootNet: Running kernel...\r"); return thread.Start(handover, YES); + } return kEfiFail; } else { - Boot::BootTextWriter writer; - writer.Write("BootNetLauncher: EEPROM flash is not available as of right now.\r"); + constexpr auto kROMSize = 0x200; + + if (inet.Length != kROMSize) + { + writer.Write("BootNet: Not within 512K.\r"); + return kEfiFail; + } + + writer.Write("BootNet: Programming the flash is not available as of right now.\r"); /// TODO: Program new firmware to EEPROM (if crc and size matches) - return kEfiFail; // TODO: Add support for EEPROM firmware update. + const UIntPtr kEEPROMAddress = 0; + const UInt16 kEEPROMSize = inet.Length; } return kEfiFail; } -STATIC Void bootnet_read_udp_packet(BOOTNET_INTERNET_HEADER&) +STATIC Void bootnet_read_ip_packet(BOOTNET_INTERNET_HEADER inet) { + NE_UNUSED(inet); }
\ No newline at end of file diff --git a/dev/boot/modules/BootNet/BootNet.h b/dev/boot/modules/BootNet/BootNet.h index aba7924f..b38ed0e9 100644 --- a/dev/boot/modules/BootNet/BootNet.h +++ b/dev/boot/modules/BootNet/BootNet.h @@ -29,5 +29,5 @@ typedef struct BOOTNET_INTERNET_HEADER Kernel::Char Target[kBootNetNameLen]; /// the target file. Kernel::Boolean ImpliesProgram : 1; /// does it imply an EEPROM reprogram? Kernel::Boolean Preflight : 1; /// is it a preflight packet. - Kernel::Char Data[]; /// non preflight packet has a patch blob for a **PatchTarget** + Kernel::Char Data[1]; /// non preflight packet has a patch blob for a **PatchTarget** } ATTRIBUTE(packed) BOOTNET_INTERNET_HEADER; diff --git a/dev/boot/modules/BootNet/amd64.json b/dev/boot/modules/BootNet/amd64.json index da4a15f0..912eeb0b 100644 --- a/dev/boot/modules/BootNet/amd64.json +++ b/dev/boot/modules/BootNet/amd64.json @@ -7,7 +7,6 @@ "compiler_flags": [ "-nostdlib", "-std=c++20", - "-fPIC", "-fno-rtti", "-fno-exceptions", "-Wl,--subsystem=17,--image-base,0x10000000,-e,BootNetModuleMain" diff --git a/dev/boot/modules/SysChk/SysChk.cc b/dev/boot/modules/SysChk/SysChk.cc index 3086cdc6..dec4e11a 100644 --- a/dev/boot/modules/SysChk/SysChk.cc +++ b/dev/boot/modules/SysChk/SysChk.cc @@ -28,6 +28,8 @@ EXTERN_C Int32 SysChkModuleMain(Kernel::HEL::BootInfoHeader* handover) { + NE_UNUSED(handover); + #ifdef __ATA_PIO__ Boot::BDiskFormatFactory<BootDeviceATA> partition_factory; diff --git a/dev/boot/modules/SysChk/amd64-ahci.json b/dev/boot/modules/SysChk/amd64-ahci.json index 527e79f9..d13e6c4a 100644 --- a/dev/boot/modules/SysChk/amd64-ahci.json +++ b/dev/boot/modules/SysChk/amd64-ahci.json @@ -7,7 +7,6 @@ "compiler_flags": [ "-nostdlib", "-std=c++20", - "-fPIC", "-fno-rtti", "-fno-exceptions", "-Wl,--subsystem=17,--image-base,0x10000000,-e,SysChkModuleMain" diff --git a/dev/boot/modules/SysChk/amd64-pio.json b/dev/boot/modules/SysChk/amd64-pio.json index de3195ce..f15a8efd 100644 --- a/dev/boot/modules/SysChk/amd64-pio.json +++ b/dev/boot/modules/SysChk/amd64-pio.json @@ -7,7 +7,6 @@ "compiler_flags": [ "-nostdlib", "-std=c++20", - "-fPIC", "-fno-rtti", "-fno-exceptions", "-Wl,--subsystem=17,--image-base,0x10000000,-e,SysChkModuleMain" diff --git a/dev/boot/modules/SysChk/arm64.json b/dev/boot/modules/SysChk/arm64.json index 1f91326e..ad5fde6e 100644 --- a/dev/boot/modules/SysChk/arm64.json +++ b/dev/boot/modules/SysChk/arm64.json @@ -11,7 +11,7 @@ "-fno-rtti", "-fno-exceptions", "-fuse-ld=lld", - "-Wl,-subsystem:efi_application,-entry:ModuleMain", + "-Wl,-subsystem:efi_application,-entry:BootloaderMain", "-target aarch64-unknown-windows" ], "cpp_macros": [ diff --git a/dev/boot/src/BootThread.cc b/dev/boot/src/BootThread.cc index ce691f96..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() @@ -216,4 +194,4 @@ namespace Boot { return fStartAddress != nullptr; } -} // namespace Boot +} // namespace Boot
\ No newline at end of file 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 4220c6cb..fa0cb74b 100644 --- a/dev/boot/src/HEL/AMD64/BootEFI.cc +++ b/dev/boot/src/HEL/AMD64/BootEFI.cc @@ -73,27 +73,32 @@ STATIC Bool boot_init_fb() noexcept EfiGUID kEfiGlobalNamespaceVarGUID = { 0x8BE4DF61, 0x93CA, 0x11D2, {0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C}}; -/// @brief ModuleMain EFI entrypoint. +/// @brief BootloaderMain EFI entrypoint. /// @param image_handle Handle of this image. /// @param sys_table The system table of it. /// @return nothing, never returns. -EFI_EXTERN_C EFI_API Int32 ModuleMain(EfiHandlePtr image_handle, - EfiSystemTable* sys_table) +EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle, + EfiSystemTable* sys_table) { - InitEFI(sys_table); ///! Init the EFI library. + fw_init_efi(sys_table); ///! Init the EFI library. HEL::BootInfoHeader* handover_hdr = new HEL::BootInfoHeader(); UInt32 map_key = 0; + UInt32 size_struct_ptr = sizeof(EfiMemoryDescriptor); + EfiMemoryDescriptor* struct_ptr = nullptr; + UInt32 sz_desc = sizeof(EfiMemoryDescriptor); + UInt32 rev_desc = 0; + + Boot::BootTextWriter writer; + + writer.Write("BootZ: NeKernel Loader.\r"); -#ifdef ZBA_USE_FB if (!boot_init_fb()) { - Boot::BootTextWriter writer; writer.Write("BootZ: Invalid Framebuffer, can't boot NeKernel.\r"); - - CANT_REACH(); + Boot::Stop(); } for (SizeT index_vt = 0; index_vt < sys_table->NumberOfTableEntries; @@ -123,7 +128,6 @@ EFI_EXTERN_C EFI_API Int32 ModuleMain(EfiHandlePtr image_handle, handover_hdr->f_GOP.f_PixelPerLine = kGop->Mode->Info->PixelsPerScanLine; handover_hdr->f_GOP.f_PixelFormat = kGop->Mode->Info->PixelFormat; handover_hdr->f_GOP.f_Size = kGop->Mode->FrameBufferSize; -#endif // ZBA_USE_FB // ------------------------------------------- // // Grab MP services, extended to runtime. // @@ -138,12 +142,10 @@ EFI_EXTERN_C EFI_API Int32 ModuleMain(EfiHandlePtr image_handle, kHandoverHeader = handover_hdr; - fb_init(); - 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; @@ -161,14 +163,12 @@ EFI_EXTERN_C EFI_API Int32 ModuleMain(EfiHandlePtr image_handle, // Fill handover header now. - Boot::BootTextWriter writer; + handover_hdr->f_BitMapStart = nullptr; /* Start of bitmap. */ + handover_hdr->f_BitMapSize = kHandoverBitMapSz; /* Size of bitmap in bytes. */ - //-------------------------------------------------------------// - // Update handover file specific table and phyiscal start field. - //-------------------------------------------------------------// + Int32 trials = 5 * 10000000; - handover_hdr->f_BitMapSize = gib_cast(4); /* Size of bitmap in bytes. */ - Int32 trials = 5 * 10000000; + writer.Write("BootZ: Allocating sufficent memory, trying with 4GB...\r"); while (BS->AllocatePool(EfiLoaderData, handover_hdr->f_BitMapSize, &handover_hdr->f_BitMapStart) != kEfiOk) { @@ -180,7 +180,7 @@ EFI_EXTERN_C EFI_API Int32 ModuleMain(EfiHandlePtr image_handle, trials = 3 * 10000000; - handover_hdr->f_BitMapSize = gib_cast(2); /* Size of bitmap in bytes. */ + handover_hdr->f_BitMapSize = kHandoverBitMapSz / 2; /* Size of bitmap in bytes. */ while (BS->AllocatePool(EfiLoaderData, handover_hdr->f_BitMapSize, &handover_hdr->f_BitMapStart) != kEfiOk) { @@ -214,24 +214,12 @@ EFI_EXTERN_C EFI_API Int32 ModuleMain(EfiHandlePtr image_handle, if (syschk_thread->Start(handover_hdr, NO) != kEfiOk) { - fb_init(); - FB::fb_clear_video(); - 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); - - fb_clear(); - - Boot::Stop(); } } - // ------------------------------------------ // - // null these fields, to avoid being reused later. - // ------------------------------------------ // - - handover_hdr->f_FirmwareCustomTables[0] = nullptr; - handover_hdr->f_FirmwareCustomTables[1] = nullptr; + BS->GetMemoryMap(&size_struct_ptr, struct_ptr, &map_key, &sz_desc, &rev_desc); handover_hdr->f_FirmwareVendorLen = Boot::BStrLen(sys_table->FirmwareVendor); @@ -267,60 +255,45 @@ EFI_EXTERN_C EFI_API Int32 ModuleMain(EfiHandlePtr image_handle, ver = KERNEL_VERSION_BCD; ST->RuntimeServices->SetVariable(L"/props/kern_ver", kEfiGlobalNamespaceVarGUID, nullptr, &sz_ver, &ver); - writer.Write("BootZ: Kernel Version 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"); + + // 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. // ------------------------------------------ // if (reader_kernel.Blob()) { - kernel_thread = new Boot::BootThread(reader_kernel.Blob()); - kernel_thread->SetName("BootZ: Kernel"); + // ------------------------------------------ // + // null these fields, to avoid being reused later. + // ------------------------------------------ // + + auto kernel_thread = Boot::BootThread(reader_kernel.Blob()); + + kernel_thread.SetName("BootZ: Kernel"); handover_hdr->f_KernelImage = reader_kernel.Blob(); - } - else - { - 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); + handover_hdr->f_KernelSz = reader_kernel.Size(); - Boot::Stop(); + kernel_thread.Start(handover_hdr, YES); } Boot::BootFileReader reader_netboot(L"net.efi", image_handle); reader_netboot.ReadAll(0); - Boot::BootThread* netboot_thread = nullptr; + if (!reader_netboot.Blob()) + return kEfiFail; - // ---------------------------------------------------- // - // Finally load the OS kernel. - // ---------------------------------------------------- // - - Boot::ExitBootServices(map_key, image_handle); - - if (kernel_thread->Start(handover_hdr, YES) != kEfiOk) - { - // ------------------------------------------ // - // If we fail into booting the kernel, then run BootNet. - // ------------------------------------------ // - - if (reader_netboot.Blob()) - { - netboot_thread = new Boot::BootThread(reader_netboot.Blob()); - netboot_thread->SetName("BootZ: BootNet"); - netboot_thread->Start(handover_hdr, YES); - } - } + auto netboot_thread = Boot::BootThread(reader_netboot.Blob()); + netboot_thread.SetName("BootZ: BootNet"); - CANT_REACH(); + return netboot_thread.Start(handover_hdr, NO); } diff --git a/dev/boot/src/HEL/ARM64/BootEFI.cc b/dev/boot/src/HEL/ARM64/BootEFI.cc index b6f28351..8008d846 100644 --- a/dev/boot/src/HEL/ARM64/BootEFI.cc +++ b/dev/boot/src/HEL/ARM64/BootEFI.cc @@ -18,17 +18,12 @@ #include <BootKit/BootThread.h> #include <modules/CoreGfx/CoreGfx.h> -// Makes the compiler shut up. -#ifndef kMachineModel -#define kMachineModel "NeKernel" -#endif // !kMachineModel - #ifndef kExpectedWidth -#define kExpectedWidth (1920) +#define kExpectedWidth (800) #endif #ifndef kExpectedHeight -#define kExpectedHeight (1080) +#define kExpectedHeight (600) #endif /** Graphics related. */ @@ -74,23 +69,19 @@ STATIC Bool boot_init_fb() noexcept EXTERN EfiBootServices* BS; -/// @brief ModuleMain EFI entrypoint. +/// @brief BootloaderMain EFI entrypoint. /// @param image_handle Handle of this image. /// @param sys_table The system table of it. /// @return nothing, never returns. -EFI_EXTERN_C EFI_API Int32 ModuleMain(EfiHandlePtr image_handle, - EfiSystemTable* sys_table) +EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle, + EfiSystemTable* sys_table) { - InitEFI(sys_table); ///! Init the EFI library. + fw_init_efi(sys_table); ///! Init the EFI library. HEL::BootInfoHeader* handover_hdr = new HEL::BootInfoHeader(); UInt32 map_key = 0; - UInt32 size_struct_ptr = sizeof(EfiMemoryDescriptor); - EfiMemoryDescriptor* struct_ptr = nullptr; - UInt32 sz_desc = sizeof(EfiMemoryDescriptor); - UInt32 rev_desc = 0; #ifdef ZBA_USE_FB if (!boot_init_fb()) @@ -133,9 +124,9 @@ EFI_EXTERN_C EFI_API Int32 ModuleMain(EfiHandlePtr image_handle, EfiMpServicesProtocol* mp = nullptr; BS->LocateProtocol(&guid_mp, nullptr, reinterpret_cast<VoidPtr*>(&mp)); - handover_hdr->f_HardwareTables.f_MpPtr = reinterpret_cast<VoidPtr>(mp); + // Assign to global 'kHandoverHeader'. kHandoverHeader = handover_hdr; fb_init(); @@ -160,18 +151,59 @@ EFI_EXTERN_C EFI_API Int32 ModuleMain(EfiHandlePtr image_handle, } //-------------------------------------------------------------// - // Update handover file specific table and phyiscal start field. + // Allocate heap. //-------------------------------------------------------------// + Boot::BootTextWriter writer; + handover_hdr->f_BitMapStart = nullptr; /* Start of bitmap. */ - handover_hdr->f_BitMapSize = kHandoverBitMapSz; /* Size of bitmap. */ + handover_hdr->f_BitMapSize = kHandoverBitMapSz; /* Size of bitmap in bytes. */ + Int32 trials = 5 * 10000000; while (BS->AllocatePool(EfiLoaderData, handover_hdr->f_BitMapSize, &handover_hdr->f_BitMapStart) != kEfiOk) { - if (handover_hdr->f_BitMapStart) + --trials; + + if (!trials) + { + writer.Write("BootZ: Unable to allocate sufficent memory, trying again with 2GB...\r"); + + trials = 3 * 10000000; + + handover_hdr->f_BitMapSize = kHandoverBitMapSz / 2; /* Size of bitmap in bytes. */ + + while (BS->AllocatePool(EfiLoaderData, handover_hdr->f_BitMapSize, &handover_hdr->f_BitMapStart) != kEfiOk) + { + --trials; + + if (!trials) + { + writer.Write("BootZ: Unable to allocate sufficent memory, aborting...\r"); + Boot::Stop(); + } + } + } + } + + Boot::BootFileReader reader_syschk(L"chk.efi", image_handle); + reader_syschk.ReadAll(0); + + Boot::BootThread* syschk_thread = nullptr; + + if (reader_syschk.Blob()) + { + syschk_thread = new Boot::BootThread(reader_syschk.Blob()); + syschk_thread->SetName("BootZ: System Check"); + + if (syschk_thread->Start(handover_hdr, NO) != kEfiOk) { - BS->FreePool(handover_hdr->f_BitMapStart); - handover_hdr->f_BitMapStart = nullptr; + fb_init(); + + FB::fb_clear_video(); + + 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); + + fb_clear(); } } @@ -194,8 +226,6 @@ EFI_EXTERN_C EFI_API Int32 ModuleMain(EfiHandlePtr image_handle, handover_hdr->f_FirmwareVendorLen = Boot::BStrLen(sys_table->FirmwareVendor); - // Assign to global 'kHandoverHeader'. - Boot::BootFileReader reader_kernel(L"vmkrnl.efi", image_handle); reader_kernel.ReadAll(0); @@ -207,9 +237,10 @@ EFI_EXTERN_C EFI_API Int32 ModuleMain(EfiHandlePtr image_handle, if (reader_kernel.Blob()) { auto kernel_thread = Boot::BootThread(reader_kernel.Blob()); - kernel_thread.SetName("BootZ: MicroKernel."); + 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); |
