diff options
| author | Amlal El Mahrouss <zka-holder@mahrouss-logic.com> | 2024-10-14 05:58:38 +0000 |
|---|---|---|
| committer | Amlal El Mahrouss <zka-holder@mahrouss-logic.com> | 2024-10-14 05:58:38 +0000 |
| commit | d9d82713326069478e6dd212763d1fac15e65370 (patch) | |
| tree | 37775f4299281598b0f5121df4c188392daebd04 /dev/zba | |
| parent | 7477a0f942c374b652da4f80cdb36d4661aac3c8 (diff) | |
IMP: Basic ARM64 port.
Diffstat (limited to 'dev/zba')
| -rw-r--r-- | dev/zba/amd64-efi.make | 2 | ||||
| -rw-r--r-- | dev/zba/arm64-efi.make | 10 | ||||
| -rw-r--r-- | dev/zba/src/BootFileReader.cxx | 2 | ||||
| -rw-r--r-- | dev/zba/src/HEL/AMD64/BootMain.cxx | 6 | ||||
| -rw-r--r-- | dev/zba/src/HEL/ARM64/BootMain.cxx | 62 | ||||
| -rw-r--r-- | dev/zba/src/Thread.cxx | 72 |
6 files changed, 101 insertions, 53 deletions
diff --git a/dev/zba/amd64-efi.make b/dev/zba/amd64-efi.make index f2121f85..ae019d74 100644 --- a/dev/zba/amd64-efi.make +++ b/dev/zba/amd64-efi.make @@ -29,7 +29,7 @@ IMG=epm-master-1.img IMG_2=epm-slave.img IMG_3=epm-master-2.img -EMU_FLAGS=-net none -m 8G -M q35 \ +EMU_FLAGS=-net none -smp 4 -m 8G -M q35 \ -bios $(BIOS) -device piix3-ide,id=ide \ -drive id=disk,file=$(IMG),format=raw,if=none \ -device ide-hd,drive=disk,bus=ide.0 -drive \ diff --git a/dev/zba/arm64-efi.make b/dev/zba/arm64-efi.make index 9ea31d83..f131374d 100644 --- a/dev/zba/arm64-efi.make +++ b/dev/zba/arm64-efi.make @@ -27,12 +27,13 @@ IMG=epm-master-1.img IMG_2=epm-slave.img IMG_3=epm-master-2.img -EMU_FLAGS=-net none -m 8G -cpu max -M virt-9.1 -vga std \ +EMU_FLAGS=-net none -smp 4 -m 8G -cpu max -M virt-9.1 \ -bios $(BIOS) \ -drive id=disk,file=$(IMG),format=raw,if=none \ -drive \ file=fat:rw:src/Root/,index=1,format=raw \ - -d int -no-shutdown -no-reboot + -device virtio-tablet-pci \ + -d int -no-shutdown -no-reboot -device virtio-gpu-pci,xres=844,yres=390 LD_FLAGS=-subsystem:efi_application -entry:Main /nodefaultlib @@ -66,11 +67,6 @@ all: compile-amd64 $(COPY) src/$(BOOT_LOADER) src/Root/EFI/BOOT/BOOTAA64.EFI $(COPY) src/$(BOOT_LOADER) src/Root/EFI/BOOT/NEWOSLDR.EFI $(COPY) ../zka/$(KERNEL) src/Root/$(KERNEL) - $(COPY) ../sci/$(SCI) src/Root/$(SCI) - $(COPY) ../ddk/$(DDK) src/Root/$(DDK) - $(COPY) ./Modules/SysChk/$(SYS_CHK) src/Root/$(SYS_CHK) - $(COPY) ./Modules/SysChk/$(SYS_CHK) src/Root/zka/$(STARTUP) - $(COPY) ../crt/$(CRT) src/Root/$(CRT) $(COPY) src/$(BOOT_LOADER) src/Root/$(BOOT_LOADER) ifneq ($(DEBUG_SUPPORT), ) diff --git a/dev/zba/src/BootFileReader.cxx b/dev/zba/src/BootFileReader.cxx index e81ba3fb..72b10b9f 100644 --- a/dev/zba/src/BootFileReader.cxx +++ b/dev/zba/src/BootFileReader.cxx @@ -142,7 +142,7 @@ Void Boot::BFileReader::ReadAll(SizeT readUntil, SizeT chunkToRead, UIntPtr outA else if (readUntil < 1) readUntil = newPtrInfo.FileSize; - mWriter.Write(L"NEWOSLDR: Physical size: ").Write(readUntil).Write("\r"); + mWriter.Write(L"NEWOSLDR: SIZE: ").Write(readUntil).Write("\r"); } if (!outAddress) diff --git a/dev/zba/src/HEL/AMD64/BootMain.cxx b/dev/zba/src/HEL/AMD64/BootMain.cxx index 5aa26b03..4f4525ec 100644 --- a/dev/zba/src/HEL/AMD64/BootMain.cxx +++ b/dev/zba/src/HEL/AMD64/BootMain.cxx @@ -42,13 +42,13 @@ EXTERN_C Void rt_reset_hardware(); @brief Finds and stores the GOP. */ +EXTERN EfiBootServices* BS; + STATIC Void boot_init_fb() noexcept { kGopGuid = EfiGUID(EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID); kGop = nullptr; - extern EfiBootServices* BS; - BS->LocateProtocol(&kGopGuid, nullptr, (VoidPtr*)&kGop); kGopStride = 4; @@ -228,7 +228,7 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr ImageHandle, if (reader_syschk.Blob()) { syschk_thread = new Boot::BThread(reader_syschk.Blob()); - syschk_thread->SetName("System Check SYS."); + syschk_thread->SetName("System Check."); } syschk_thread->Start(handover_hdr); diff --git a/dev/zba/src/HEL/ARM64/BootMain.cxx b/dev/zba/src/HEL/ARM64/BootMain.cxx index 2033b74b..a7d22b47 100644 --- a/dev/zba/src/HEL/ARM64/BootMain.cxx +++ b/dev/zba/src/HEL/ARM64/BootMain.cxx @@ -4,21 +4,73 @@ ------------------------------------------- */ +#include <FirmwareKit/EFI/API.hxx> #include <FirmwareKit/EFI.hxx> #include <BootKit/Thread.hxx> #include <BootKit/BootKit.hxx> +#ifndef cExpectedWidth +#define cExpectedWidth 844 +#endif + +#ifndef cExpectedHeight +#define cExpectedHeight 390 +#endif + EXTERN EfiBootServices* BS; +STATIC EfiGraphicsOutputProtocol* kGop = nullptr; +STATIC UInt16 kGopStride = 0U; +STATIC EfiGUID kGopGuid; + /// @brief Main EFI entrypoint. /// @param ImageHandle Handle of this image. /// @param SystemTable The system table of it. /// @return nothing, never returns. -EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr ImageHandle, - EfiSystemTable* SystemTable) +EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr ImageHandle, + EfiSystemTable* SystemTable) { - SystemTable->ConOut->OutputString(SystemTable->ConOut, L"NEWSOLDR, (C) ZKA TECHNOLOGIES, ALL RIGHTS RESERVED.\r\n"); - SystemTable->ConOut->OutputString(SystemTable->ConOut, L"NEWSOLDR: BOOTING KERNEL...\r\n"); + InitEFI(SystemTable); + + kGopGuid = EfiGUID(EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID); + kGop = nullptr; + + BS->LocateProtocol(&kGopGuid, nullptr, (VoidPtr*)&kGop); + + kGopStride = 4; + + Boot::BTextWriter writer; + + for (SizeT i = 0; i < kGop->Mode->MaxMode; ++i) + { + EfiGraphicsOutputProtocolModeInformation* infoPtr = nullptr; + UInt32 sz = 0U; + + kGop->QueryMode(kGop, i, &sz, &infoPtr); + + writer.Write(infoPtr->HorizontalResolution); + writer.Write(infoPtr->VerticalResolution); + writer.Write("\r"); + + if (infoPtr->HorizontalResolution == cExpectedWidth && + infoPtr->VerticalResolution == cExpectedHeight) + { + kGop->SetMode(kGop, i); + break; + } + } + + Boot::BFileReader reader_kernel(L"minoskrnl.exe", ImageHandle); + + reader_kernel.ReadAll(0); + + if (reader_kernel.Blob()) + { + auto kernel_thread = Boot::BThread(reader_kernel.Blob()); + + if (kernel_thread.IsValid()) + kernel_thread.Start(nullptr); + } - CANT_REACH(); + CANT_REACH(); } diff --git a/dev/zba/src/Thread.cxx b/dev/zba/src/Thread.cxx index 2c1ee173..b7c44868 100644 --- a/dev/zba/src/Thread.cxx +++ b/dev/zba/src/Thread.cxx @@ -26,30 +26,42 @@ namespace Boot : fBlob(blob), fStartAddress(nullptr) { // detect the format. - const Char* firstBytes = reinterpret_cast<char*>(fBlob); + const Char* blob_bytes = reinterpret_cast<char*>(fBlob); BTextWriter writer; - if (!firstBytes) + if (!blob_bytes) { // failed to provide a valid pointer. return; } - if (firstBytes[0] == kMagMz0 && - firstBytes[1] == kMagMz1) + if (blob_bytes[0] == kMagMz0 && + blob_bytes[1] == kMagMz1) { - LDR_EXEC_HEADER_PTR hdrPtr = ldr_find_exec_header(firstBytes); - LDR_OPTIONAL_HEADER_PTR optHdr = ldr_find_opt_exec_header(firstBytes); + LDR_EXEC_HEADER_PTR header_ptr = ldr_find_exec_header(blob_bytes); + LDR_OPTIONAL_HEADER_PTR opt_header_ptr = ldr_find_opt_exec_header(blob_bytes); - if (hdrPtr->mMachine != kPeMachineAMD64 || - hdrPtr->mSignature != kPeMagic) + if (!header_ptr || !opt_header_ptr) + return; + +#ifdef __ZKA_AMD64__ + if (header_ptr->mMachine != kPeMachineAMD64 || + header_ptr->mSignature != kPeMagic) { writer.Write("NEWOSLDR: Not a PE32+ executable.\r"); return; } +#elif defined(__ZKA_ARM64__) + if (header_ptr->mMachine != kPeMachineAMD64 || + header_ptr->mSignature != kPeMagic) + { + writer.Write("NEWOSLDR: Not a PE32+ executable.\r"); + return; + } +#endif // __ZKA_AMD64__ || __ZKA_ARM64__ - if (optHdr->mSubsystem != kZKASubsystem) + if (opt_header_ptr->mSubsystem != kZKASubsystem) { writer.Write("NEWOSLDR: Not a ZKA Subsystem executable.\r"); return; @@ -57,25 +69,25 @@ namespace Boot writer.Write("NEWOSLDR: PE32+ executable detected (ZKA Subsystem).\r"); - auto numSecs = hdrPtr->mNumberOfSections; + auto numSecs = header_ptr->mNumberOfSections; - writer.Write("NEWOSLDR: Major Linker Ver: ").Write(optHdr->mMajorLinkerVersion).Write("\r"); - writer.Write("NEWOSLDR: Minor Linker Ver: ").Write(optHdr->mMinorLinkerVersion).Write("\r"); - writer.Write("NEWOSLDR: Major Subsystem Ver: ").Write(optHdr->mMajorSubsystemVersion).Write("\r"); - writer.Write("NEWOSLDR: Minor Subsystem Ver: ").Write(optHdr->mMinorSubsystemVersion).Write("\r"); - writer.Write("NEWOSLDR: Magic: ").Write(hdrPtr->mSignature).Write("\r"); + writer.Write("NEWOSLDR: Major Linker Ver: ").Write(opt_header_ptr->mMajorLinkerVersion).Write("\r"); + writer.Write("NEWOSLDR: Minor Linker Ver: ").Write(opt_header_ptr->mMinorLinkerVersion).Write("\r"); + writer.Write("NEWOSLDR: Major Subsystem Ver: ").Write(opt_header_ptr->mMajorSubsystemVersion).Write("\r"); + writer.Write("NEWOSLDR: Minor Subsystem Ver: ").Write(opt_header_ptr->mMinorSubsystemVersion).Write("\r"); + writer.Write("NEWOSLDR: Magic: ").Write(header_ptr->mSignature).Write("\r"); constexpr auto cPageSize = 512; - EfiPhysicalAddress loadStartAddress = optHdr->mImageBase; - loadStartAddress += optHdr->mBaseOfData; + EfiPhysicalAddress loadStartAddress = opt_header_ptr->mImageBase; + loadStartAddress += opt_header_ptr->mBaseOfData; writer.Write("NEWOSLDR: ImageBase: ").Write(loadStartAddress).Write("\r"); - auto numPages = optHdr->mSizeOfImage / cPageSize; + auto numPages = opt_header_ptr->mSizeOfImage / cPageSize; BS->AllocatePages(AllocateAddress, EfiLoaderData, numPages, &loadStartAddress); - LDR_SECTION_HEADER_PTR sectPtr = (LDR_SECTION_HEADER_PTR)(((Char*)optHdr) + hdrPtr->mSizeOfOptionalHeader); + LDR_SECTION_HEADER_PTR sectPtr = (LDR_SECTION_HEADER_PTR)(((Char*)opt_header_ptr) + header_ptr->mSizeOfOptionalHeader); constexpr auto sectionForCode = ".text"; constexpr auto sectionForNewLdr = ".ldr"; @@ -89,7 +101,7 @@ namespace Boot if (StrCmp(sectionForCode, sect->mName) == 0) { - fStartAddress = (VoidPtr)((UIntPtr)loadStartAddress + optHdr->mAddressOfEntryPoint); + fStartAddress = (VoidPtr)((UIntPtr)loadStartAddress + opt_header_ptr->mAddressOfEntryPoint); writer.Write("NEWOSLDR: ENTRY OF EXE: ").Write((UIntPtr)fStartAddress).Write("\r"); } else if (StrCmp(sectionForNewLdr, sect->mName) == 0) @@ -111,8 +123,6 @@ namespace Boot writer.Write("NEWOSLDR: ARCH OF EXE: ").Write(handover_struc->HandoverArch).Write("\r"); writer.Write("NEWOSLDR: ENTRY OF EXE: ").Write((UIntPtr)fStartAddress).Write("\r"); CGDrawString("NEWOSLDR: NOT AN HANDOVER IMAGE, BAD ARCHITECTURE...", 40, 10, RGB(0xFF, 0xFF, 0xFF)); - - ::EFI::Stop(); } #endif @@ -122,8 +132,6 @@ namespace Boot writer.Write("NEWOSLDR: ARCH OF EXE: ").Write(handover_struc->HandoverArch).Write("\r"); writer.Write("NEWOSLDR: ENTRY OF EXE: ").Write((UIntPtr)fStartAddress).Write("\r"); CGDrawString("NEWOSLDR: NOT AN HANDOVER IMAGE, BAD ARCHITECTURE...", 40, 10, RGB(0xFF, 0xFF, 0xFF)); - - ::EFI::Stop(); } #endif writer.Write("NEWOSLDR: ENTRY OF EXE: ").Write((UIntPtr)fStartAddress).Write("\r"); @@ -138,10 +146,10 @@ namespace Boot CopyMem((VoidPtr)(loadStartAddress + sect->mVirtualAddress), (VoidPtr)((UIntPtr)fBlob + sect->mPointerToRawData), sect->mSizeOfRawData); } } - else if (firstBytes[0] == kPefMagic[0] && - firstBytes[1] == kPefMagic[1] && - firstBytes[2] == kPefMagic[2] && - firstBytes[3] == kPefMagic[3]) + else if (blob_bytes[0] == kPefMagic[0] && + blob_bytes[1] == kPefMagic[1] && + blob_bytes[2] == kPefMagic[2] && + blob_bytes[3] == kPefMagic[3]) { // ========================================= // // PEF executable detected. @@ -160,14 +168,6 @@ namespace Boot /// @note handover header has to be valid! Void BThread::Start(HEL::HANDOVER_INFO_HEADER* handover) { - BTextWriter writer; - - if (!handover) - { - writer.Write("NEWOSLDR: EXEC FORMAT ERROR.\r"); - return; - } - HEL::HandoverProc err_fn = [](HEL::HANDOVER_INFO_HEADER* rcx) -> void { CGDrawString("NEWOSLDR: INVALID IMAGE! ABORTING...", 50, 10, RGB(0xFF, 0xFF, 0xFF)); ::EFI::Stop(); |
