diff options
Diffstat (limited to 'dev/boot')
| -rw-r--r-- | dev/boot/amd64-ci.make | 2 | ||||
| -rw-r--r-- | dev/boot/amd64-desktop.make | 4 | ||||
| -rw-r--r-- | dev/boot/modules/BootNet/BootNet.cc | 25 | ||||
| -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/src/BootThread.cc | 2 | ||||
| -rw-r--r-- | dev/boot/src/HEL/AMD64/BootEFI.cc | 88 |
9 files changed, 53 insertions, 73 deletions
diff --git a/dev/boot/amd64-ci.make b/dev/boot/amd64-ci.make index 9ee61eed..62ab9af1 100644 --- a/dev/boot/amd64-ci.make +++ b/dev/boot/amd64-ci.make @@ -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 3ed2ba3f..21a99941 100644 --- a/dev/boot/amd64-desktop.make +++ b/dev/boot/amd64-desktop.make @@ -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/modules/BootNet/BootNet.cc b/dev/boot/modules/BootNet/BootNet.cc index 28d96cb2..050148c4 100644 --- a/dev/boot/modules/BootNet/BootNet.cc +++ b/dev/boot/modules/BootNet/BootNet.cc @@ -15,18 +15,19 @@ STATIC EfiGUID kEfiSimpleProtoGUID = EFI_SIMPLE_NETWORK_PROTOCOL_GUID; STATIC EFI_SIMPLE_NETWORK_PROTOCOL* kEfiProtocol = nullptr; -STATIC Void bootnet_read_ip_packet(BOOTNET_INTERNET_HEADER&); +STATIC Void bootnet_read_ip_packet(BOOTNET_INTERNET_HEADER); EXTERN_C Int32 BootNetModuleMain(Kernel::HEL::BootInfoHeader* handover) { - fw_init_efi((EfiSystemTable*)handover->f_FirmwareCustomTables[0]); + Boot::BootTextWriter writer; + writer.Write("BootNet: Init EFI...\r"); - Boot::BootTextWriter writer; + fw_init_efi((EfiSystemTable*)handover->f_FirmwareCustomTables[1]); if (BS->LocateProtocol(&kEfiSimpleProtoGUID, nullptr, (VoidPtr*)&kEfiProtocol) != kEfiOk) { - writer.Write("[BOOT] BootNet: Not supported by firmware.\r"); + writer.Write("BootNet: Not supported by firmware.\r"); return kEfiFail; } @@ -34,13 +35,13 @@ EXTERN_C Int32 BootNetModuleMain(Kernel::HEL::BootInfoHeader* handover) SetMem(&inet, 0, sizeof(BOOTNET_INTERNET_HEADER)); - writer.Write("[BOOT] BootNet: Downloading kernel...\r"); + writer.Write("BootNet: Downloading kernel...\r"); bootnet_read_ip_packet(inet); if (inet.Length < 1) { - writer.Write("[BOOT] BootNet: No executable attached to the packet, aborting.\r"); + writer.Write("BootNet: No executable attached to the packet, aborting.\r"); return kEfiFail; } @@ -50,7 +51,7 @@ EXTERN_C Int32 BootNetModuleMain(Kernel::HEL::BootInfoHeader* handover) if (thread.IsValid()) { - writer.Write("[BOOT] BootNet: Running kernel...\r"); + writer.Write("BootNet: Running kernel...\r"); return thread.Start(handover, YES); } @@ -62,11 +63,11 @@ EXTERN_C Int32 BootNetModuleMain(Kernel::HEL::BootInfoHeader* handover) if (inet.Length != kROMSize) { - writer.Write("[BOOT] BootNet: Not within 512K.\r"); + writer.Write("BootNet: Not within 512K.\r"); return kEfiFail; } - writer.Write("[BOOT] BootNet: Programming the flash is not available as of right now.\r"); + 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) @@ -77,11 +78,7 @@ EXTERN_C Int32 BootNetModuleMain(Kernel::HEL::BootInfoHeader* handover) return kEfiFail; } -STATIC Void bootnet_read_ip_packet(BOOTNET_INTERNET_HEADER& inet) +STATIC Void bootnet_read_ip_packet(BOOTNET_INTERNET_HEADER inet) { - kEfiProtocol->Start(kEfiProtocol); - NE_UNUSED(inet); - - kEfiProtocol->Stop(kEfiProtocol); }
\ No newline at end of file diff --git a/dev/boot/modules/BootNet/amd64.json b/dev/boot/modules/BootNet/amd64.json index 7b87b533..7e5fd018 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,0x4000000,-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 98e570f4..1377c23b 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,0x4000000,-e,SysChkModuleMain" diff --git a/dev/boot/modules/SysChk/amd64-pio.json b/dev/boot/modules/SysChk/amd64-pio.json index 2b159e38..879f651f 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,0x4000000,-e,SysChkModuleMain" diff --git a/dev/boot/src/BootThread.cc b/dev/boot/src/BootThread.cc index ce691f96..3f399d66 100644 --- a/dev/boot/src/BootThread.cc +++ b/dev/boot/src/BootThread.cc @@ -216,4 +216,4 @@ namespace Boot { return fStartAddress != nullptr; } -} // namespace Boot +} // namespace Boot
\ No newline at end of file diff --git a/dev/boot/src/HEL/AMD64/BootEFI.cc b/dev/boot/src/HEL/AMD64/BootEFI.cc index a818fcd6..795e43cf 100644 --- a/dev/boot/src/HEL/AMD64/BootEFI.cc +++ b/dev/boot/src/HEL/AMD64/BootEFI.cc @@ -82,18 +82,25 @@ 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(); - UInt32 map_key = 0; + 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 +130,6 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(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,14 +144,10 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle, kHandoverHeader = handover_hdr; - fb_init(); - FB::fb_clear_video(); 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; @@ -161,13 +163,13 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(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. */ 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) { --trials; @@ -212,22 +214,16 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(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(); } } - // ------------------------------------------ // - // null these fields, to avoid being reused later. - // ------------------------------------------ // + BS->GetMemoryMap(&size_struct_ptr, struct_ptr, &map_key, &sz_desc, &rev_desc); + + struct_ptr = new EfiMemoryDescriptor[sz_desc]; - 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); @@ -263,11 +259,13 @@ 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 Updated: ").Write(ver).Write("\r"); + writer.Write("BootZ: Kernel Version has been updated: ").Write(ver).Write("\r"); } writer.Write("BootZ: Kernel Version: ").Write(ver).Write("\r"); + // Fallback to bootnet, if not PXE. + Boot::BootFileReader reader_kernel(kernel_path, image_handle); reader_kernel.ReadAll(0); @@ -280,46 +278,32 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle, if (reader_kernel.Blob()) { + // ------------------------------------------ // + // null these fields, to avoid being reused later. + // ------------------------------------------ // + + handover_hdr->f_FirmwareCustomTables[0] = nullptr; + handover_hdr->f_FirmwareCustomTables[1] = nullptr; + kernel_thread = new Boot::BootThread(reader_kernel.Blob()); kernel_thread->SetName("BootZ: Kernel"); handover_hdr->f_KernelImage = reader_kernel.Blob(); handover_hdr->f_KernelSz = reader_kernel.Size(); - } - 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); - Boot::Stop(); - } + Boot::ExitBootServices(map_key, image_handle); - // Fallback to bootnet, if not PXE. + return kernel_thread->Start(handover_hdr, NO); + } Boot::BootFileReader reader_netboot(L"net.efi", image_handle); reader_netboot.ReadAll(0); - Boot::BootThread* netboot_thread = nullptr; - - // ---------------------------------------------------- // - // 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()) + return kEfiFail; - if (reader_netboot.Blob()) - { - netboot_thread = new Boot::BootThread(reader_netboot.Blob()); - netboot_thread->SetName("BootZ: BootNet"); - netboot_thread->Start(handover_hdr, YES); - } - } + Boot::BootThread* netboot_thread = new Boot::BootThread(reader_netboot.Blob()); + netboot_thread->SetName("BootZ: BootNet"); - CANT_REACH(); + return netboot_thread->Start(handover_hdr, NO); } |
