diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2025-03-31 19:06:39 +0200 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal@nekernel.org> | 2025-03-31 19:06:39 +0200 |
| commit | e3e25ba6822ec8545d8fad5d1d30115af874525b (patch) | |
| tree | df2ad86ec3fa915f0d52f5d3b66c8c14dca805af /dev/boot | |
| parent | 4edacbb20e2dd8c0e71cfbfc6712654c36f9c4e5 (diff) | |
boot/efi: a set of important patches regarding efi bootz.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'dev/boot')
| -rw-r--r-- | dev/boot/BootKit/BootKit.h | 4 | ||||
| -rw-r--r-- | dev/boot/amd64-ci.make | 2 | ||||
| -rw-r--r-- | dev/boot/amd64-desktop.make | 16 | ||||
| -rw-r--r-- | dev/boot/arm64-desktop.make | 14 | ||||
| -rw-r--r-- | dev/boot/src/BootTextWriter.cc | 4 | ||||
| -rw-r--r-- | dev/boot/src/HEL/AMD64/BootEFI.cc | 43 |
6 files changed, 50 insertions, 33 deletions
diff --git a/dev/boot/BootKit/BootKit.h b/dev/boot/BootKit/BootKit.h index e845e6ce..b5062eab 100644 --- a/dev/boot/BootKit/BootKit.h +++ b/dev/boot/BootKit/BootKit.h @@ -61,10 +61,10 @@ namespace Boot */ class BootTextWriter final { - BootTextWriter& _Write(const Long& num); + BootTextWriter& _Write(const UInt64& num); public: - BootTextWriter& Write(const Long& num); + BootTextWriter& Write(const UInt64& num); BootTextWriter& Write(const Char* str); BootTextWriter& Write(const CharacterTypeUTF16* str); BootTextWriter& WriteCharacter(CharacterTypeUTF16 c); diff --git a/dev/boot/amd64-ci.make b/dev/boot/amd64-ci.make index a77806c4..21c797f6 100644 --- a/dev/boot/amd64-ci.make +++ b/dev/boot/amd64-ci.make @@ -85,7 +85,7 @@ invalid-recipe: # CI doesn't do anything than build. .PHONY: all all: compile-amd64 - mkdir -p src/Root/EFI/BOOT + mkdir -p src/root/EFI/BOOT $(LD_GNU) $(OBJ) $(LD_FLAGS) -o src/$(BOOTLOADER) .PHONY: disk diff --git a/dev/boot/amd64-desktop.make b/dev/boot/amd64-desktop.make index 649e0925..95ccac2e 100644 --- a/dev/boot/amd64-desktop.make +++ b/dev/boot/amd64-desktop.make @@ -84,15 +84,15 @@ invalid-recipe: .PHONY: all all: compile-amd64 - mkdir -p src/Root/EFI/BOOT + mkdir -p src/root/EFI/BOOT $(LD_GNU) $(OBJ) $(LD_FLAGS) -o src/$(BOOTLOADER) - $(COPY) src/$(BOOTLOADER) src/Root/EFI/BOOT/BOOTX64.EFI - $(COPY) src/$(BOOTLOADER) src/Root/EFI/BOOT/BOOTZ.EFI - $(COPY) ../kernel/$(KERNEL) src/Root/$(KERNEL) - $(COPY) ./modules/SysChk/$(SYSCHK) src/Root/$(SYSCHK) - $(COPY) ./modules/BootNet/$(BOOTNET) src/Root/$(BOOTNET) - $(COPY) ../user/$(SCIKIT) src/Root/$(SCIKIT) - $(COPY) src/$(BOOTLOADER) src/Root/$(BOOTLOADER) + $(COPY) src/$(BOOTLOADER) src/root/EFI/BOOT/BOOTX64.EFI + $(COPY) src/$(BOOTLOADER) src/root/EFI/BOOT/BOOTZ.EFI + $(COPY) ../kernel/$(KERNEL) src/root/$(KERNEL) + $(COPY) ./modules/SysChk/$(SYSCHK) src/root/$(SYSCHK) + $(COPY) ./modules/BootNet/$(BOOTNET) src/root/$(BOOTNET) + $(COPY) ../user/$(SCIKIT) src/root/$(SCIKIT) + $(COPY) src/$(BOOTLOADER) src/root/$(BOOTLOADER) .PHONY: disk disk: diff --git a/dev/boot/arm64-desktop.make b/dev/boot/arm64-desktop.make index d17c2ae2..a862b5b8 100644 --- a/dev/boot/arm64-desktop.make +++ b/dev/boot/arm64-desktop.make @@ -31,7 +31,7 @@ EMU_FLAGS=-net none -smp 4 -m 8G -cpu max -M virt \ -bios $(BIOS) \ -drive id=disk,file=$(IMG),format=raw,if=none \ -drive \ - file=fat:rw:src/Root/,index=2,format=raw \ + 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:Main /nodefaultlib @@ -58,13 +58,13 @@ invalid-recipe: .PHONY: all all: compile - mkdir -p src/Root/EFI/BOOT + mkdir -p src/root/EFI/BOOT $(LD_GNU) $(OBJ) $(LD_FLAGS) /out:src/$(BOOT_LOADER) - $(COPY) src/$(BOOT_LOADER) src/Root/EFI/BOOT/BOOTAA64.EFI - $(COPY) src/$(BOOT_LOADER) src/Root/EFI/BOOT/BootZ.EFI - $(COPY) ../kernel/$(KERNEL) src/Root/$(KERNEL) - $(COPY) ./modules/SysChk/$(SYSCHK) src/Root/$(SYSCHK) - $(COPY) src/$(BOOT_LOADER) src/Root/$(BOOT_LOADER) + $(COPY) src/$(BOOT_LOADER) src/root/EFI/BOOT/BOOTAA64.EFI + $(COPY) src/$(BOOT_LOADER) src/root/EFI/BOOT/BootZ.EFI + $(COPY) ../kernel/$(KERNEL) src/root/$(KERNEL) + $(COPY) ./modules/SysChk/$(SYSCHK) src/root/$(SYSCHK) + $(COPY) src/$(BOOT_LOADER) src/root/$(BOOT_LOADER) ifneq ($(DEBUG_SUPPORT), ) DEBUG = -D__DEBUG__ diff --git a/dev/boot/src/BootTextWriter.cc b/dev/boot/src/BootTextWriter.cc index bc93b133..0b132f83 100644 --- a/dev/boot/src/BootTextWriter.cc +++ b/dev/boot/src/BootTextWriter.cc @@ -131,7 +131,7 @@ Boot::BootTextWriter& Boot::BootTextWriter::WriteCharacter(CharacterTypeUTF16 c) return *this; } -Boot::BootTextWriter& Boot::BootTextWriter::Write(const Long& x) +Boot::BootTextWriter& Boot::BootTextWriter::Write(const UInt64& x) { #ifdef __DEBUG__ this->_Write(x); @@ -141,7 +141,7 @@ Boot::BootTextWriter& Boot::BootTextWriter::Write(const Long& x) return *this; } -Boot::BootTextWriter& Boot::BootTextWriter::_Write(const Long& x) +Boot::BootTextWriter& Boot::BootTextWriter::_Write(const UInt64& x) { #ifdef __DEBUG__ UInt64 y = (x > 0 ? x : -x) / 16; diff --git a/dev/boot/src/HEL/AMD64/BootEFI.cc b/dev/boot/src/HEL/AMD64/BootEFI.cc index 7b912025..5f89aae6 100644 --- a/dev/boot/src/HEL/AMD64/BootEFI.cc +++ b/dev/boot/src/HEL/AMD64/BootEFI.cc @@ -91,9 +91,9 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr image_handle, new HEL::BootInfoHeader(); UInt32 map_key = 0; - UInt32 size_struct_ptr = sizeof(EfiMemoryDescriptor); + UInt32 size_struct_ptr = 0; EfiMemoryDescriptor* struct_ptr = nullptr; - UInt32 sz_desc = sizeof(EfiMemoryDescriptor); + UInt32 sz_desc = 0; UInt32 rev_desc = 0; #ifdef ZBA_USE_FB @@ -176,33 +176,52 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr image_handle, // format the disk. // ---------------------------------------------------- // - BS->GetMemoryMap(&size_struct_ptr, struct_ptr, &map_key, &sz_desc, &rev_desc); + Boot::BootTextWriter writer; + + auto ret = BS->GetMemoryMap(&size_struct_ptr, struct_ptr, &map_key, &sz_desc, &rev_desc); - struct_ptr = new EfiMemoryDescriptor[sz_desc]; + if (ret == kEfiFail) + { + writer.Write("BootZ: GetMemoryMap failed (x1)\r"); + Boot::Stop(); + } - BS->GetMemoryMap(&size_struct_ptr, struct_ptr, &map_key, &sz_desc, &rev_desc); + size_struct_ptr += sz_desc * 2; + BS->AllocatePool(EfiMemoryType::EfiBootServicesData, size_struct_ptr, reinterpret_cast<VoidPtr*>(&struct_ptr)); - auto kDefaultMemoryMap = 0; // Grab any usable entries. + ret = BS->GetMemoryMap(&size_struct_ptr, struct_ptr, &map_key, &sz_desc, &rev_desc); + + if (ret == kEfiFail) + { + writer.Write("BootZ: GetMemoryMap failed (x2)\r"); + Boot::Stop(); + } //-----------------------------------------------------------// // A simple loop which finds a usable memory region for us. //-----------------------------------------------------------// SizeT lookup_index = 0UL; + SizeT entry_count = size_struct_ptr / sz_desc; - for (; struct_ptr[lookup_index].Kind != EfiMemoryType::EfiConventionalMemory; ++lookup_index) + for (; lookup_index < entry_count; ++lookup_index) { - NE_UNUSED(0); + if (struct_ptr[lookup_index].Kind == EfiMemoryType::EfiConventionalMemory) + break; } - kDefaultMemoryMap = lookup_index; + if (lookup_index > entry_count) + { + writer.Write("BootZ: No usable entries.\r"); + Boot::Stop(); + } //-------------------------------------------------------------// // Update handover file specific table and phyiscal start field. //-------------------------------------------------------------// - handover_hdr->f_BitMapStart = (VoidPtr)struct_ptr[kDefaultMemoryMap].VirtualStart; /* Start of bitmap. */ - handover_hdr->f_BitMapSize = struct_ptr[kDefaultMemoryMap].NumberOfPages * sizeof(UIntPtr); /* Size of bitmap. */ + handover_hdr->f_BitMapStart = (VoidPtr)struct_ptr[lookup_index].VirtualStart; /* Start of bitmap. */ + handover_hdr->f_BitMapSize = struct_ptr[lookup_index].NumberOfPages * kib_cast(4); /* Size of bitmap in bytes. */ handover_hdr->f_FirmwareCustomTables[0] = (VoidPtr)BS; handover_hdr->f_FirmwareCustomTables[1] = (VoidPtr)ST; @@ -287,8 +306,6 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr image_handle, ST->RuntimeServices->GetVariable(L"/props/kern_ver", kEfiGlobalNamespaceVarGUID, nullptr, &sz_ver, &ver); - Boot::BootTextWriter writer; - if (ver != KERNEL_VERSION_BCD) { ver = KERNEL_VERSION_BCD; |
