From 58ec3282634ccf75006043017ceacffed9a4533c Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Fri, 23 Aug 2024 15:26:33 +0200 Subject: [IMP] BootScr module, manage boot driver (TODO need a UI toolkit for it) [IMP] Made NetBoot compilable as well. [IMP] Fix Thread loader to be able to load other executables. [REFACTOR] __NEWOS_ to __ZKA_ refactor. [WIP] Fixing catalog which can't be fetched again after being written. Signed-off-by: Amlal El Mahrouss --- dev/ZBA/Modules/BootScr/Boot.S | 28 ++++++++++++++++++++++++++++ dev/ZBA/Modules/BootScr/Module.cxx | 6 +----- dev/ZBA/Modules/BootScr/build.json | 25 +++++++++++++++++++++++++ dev/ZBA/Modules/BootScr/compile_flags.txt | 2 +- dev/ZBA/Modules/NetBoot/Boot.S | 28 ++++++++++++++++++++++++++++ dev/ZBA/Modules/NetBoot/Module.cxx | 13 ++----------- dev/ZBA/Modules/NetBoot/build.json | 25 +++++++++++++++++++++++++ dev/ZBA/Modules/NetBoot/compile_flags.txt | 2 +- dev/ZBA/Sources/HEL/AMD64/BootFileReader.cxx | 2 +- dev/ZBA/Sources/HEL/AMD64/BootJump.S | 2 +- dev/ZBA/Sources/HEL/AMD64/BootMain.cxx | 20 +++++++++++++++++++- dev/ZBA/Sources/HEL/AMD64/compile_flags.txt | 2 +- dev/ZBA/Sources/Thread.cxx | 26 +++++++++++--------------- dev/ZBA/Sources/compile_flags.txt | 2 +- dev/ZBA/amd64-efi.make | 4 +++- 15 files changed, 148 insertions(+), 39 deletions(-) create mode 100644 dev/ZBA/Modules/BootScr/Boot.S create mode 100644 dev/ZBA/Modules/BootScr/build.json create mode 100644 dev/ZBA/Modules/NetBoot/Boot.S create mode 100644 dev/ZBA/Modules/NetBoot/build.json (limited to 'dev/ZBA') diff --git a/dev/ZBA/Modules/BootScr/Boot.S b/dev/ZBA/Modules/BootScr/Boot.S new file mode 100644 index 00000000..ce9f36b1 --- /dev/null +++ b/dev/ZBA/Modules/BootScr/Boot.S @@ -0,0 +1,28 @@ +;; /* +;; * ======================================================== +;; * +;; * ZKA +;; * Copyright ZKA Technologies., all rights reserved. +;; * +;; * ======================================================== +;; */ + +.code64 +.intel_syntax noprefix + +#define kTypeDriver 101 +#define kArchAmd64 122 +#define kHandoverMagic 0xBADCC + +.section .ldr + +.quad kHandoverMagic +.word kTypeDriver + +.text + +.extern main +.global __main + +__main: + ret diff --git a/dev/ZBA/Modules/BootScr/Module.cxx b/dev/ZBA/Modules/BootScr/Module.cxx index 11bbb6c0..15758599 100644 --- a/dev/ZBA/Modules/BootScr/Module.cxx +++ b/dev/ZBA/Modules/BootScr/Module.cxx @@ -9,11 +9,7 @@ #include -EXTERN EfiSystemTable* ST; - -EXTERN_C Int32 ModuleMain(Void) +EXTERN_C Int32 main(Kernel::HEL::HandoverInformationHeader* Handover) { - ST->ConOut->ClearScreen(ST->ConOut); - return kEfiOk; } diff --git a/dev/ZBA/Modules/BootScr/build.json b/dev/ZBA/Modules/BootScr/build.json new file mode 100644 index 00000000..c53c6faa --- /dev/null +++ b/dev/ZBA/Modules/BootScr/build.json @@ -0,0 +1,25 @@ +{ + "compiler_path": "x86_64-w64-mingw32-g++", + "compiler_std": "c++20", + "headers_path": ["../", "../../", "../../../ZKA", "../../../", "./"], + "sources_path": ["*.cxx", "*.S"], + "output_name": "bootscr.sys", + "compiler_flags": [ + "-ffreestanding", + "-nostdlib", + "-std=c++20", + "-fPIC", + "-fno-rtti", + "-fno-exceptions", + "-Wl,--subsystem=17,--image-base 0x10000000" + ], + "cpp_macros": [ + "__NEWOSKRNL__", + "__NEWOSLDR__", + "__ZKA_AMD64__", + "__BOOTSCR__", + "cSCRVersionHighest=0x0100", + "cSCRVersionLowest=0x0100", + "cSCRVersion=0x0100" + ] +} diff --git a/dev/ZBA/Modules/BootScr/compile_flags.txt b/dev/ZBA/Modules/BootScr/compile_flags.txt index f9ca281f..18bc8512 100644 --- a/dev/ZBA/Modules/BootScr/compile_flags.txt +++ b/dev/ZBA/Modules/BootScr/compile_flags.txt @@ -2,7 +2,7 @@ -I../ -I../../ -I../../Kernel --D__NEWOS_AMD64__ +-D__ZKA_AMD64__ -std=c++20 -D__x86_64__ -D__NEWOS_OTA__ diff --git a/dev/ZBA/Modules/NetBoot/Boot.S b/dev/ZBA/Modules/NetBoot/Boot.S new file mode 100644 index 00000000..ce9f36b1 --- /dev/null +++ b/dev/ZBA/Modules/NetBoot/Boot.S @@ -0,0 +1,28 @@ +;; /* +;; * ======================================================== +;; * +;; * ZKA +;; * Copyright ZKA Technologies., all rights reserved. +;; * +;; * ======================================================== +;; */ + +.code64 +.intel_syntax noprefix + +#define kTypeDriver 101 +#define kArchAmd64 122 +#define kHandoverMagic 0xBADCC + +.section .ldr + +.quad kHandoverMagic +.word kTypeDriver + +.text + +.extern main +.global __main + +__main: + ret diff --git a/dev/ZBA/Modules/NetBoot/Module.cxx b/dev/ZBA/Modules/NetBoot/Module.cxx index 9bc65eda..ea30569b 100644 --- a/dev/ZBA/Modules/NetBoot/Module.cxx +++ b/dev/ZBA/Modules/NetBoot/Module.cxx @@ -7,19 +7,10 @@ * ======================================================== */ +#include #include -#include -EXTERN EfiSystemTable* ST; - -EXTERN_C Int32 ModuleMain(Void) +EXTERN_C Int32 main(Kernel::HEL::HandoverInformationHeader* Handover) { - ST->ConOut->ClearScreen(ST->ConOut); - - /// @todo - /// - Find a network drive called "\.\newoskrnl.dll" with fork 'For-NewOSLdr' in the network path. (NewFS formatted disk as well!) - /// - Download our image - /// - Boot from it. - return kEfiOk; } diff --git a/dev/ZBA/Modules/NetBoot/build.json b/dev/ZBA/Modules/NetBoot/build.json new file mode 100644 index 00000000..78336241 --- /dev/null +++ b/dev/ZBA/Modules/NetBoot/build.json @@ -0,0 +1,25 @@ +{ + "compiler_path": "x86_64-w64-mingw32-g++", + "compiler_std": "c++20", + "headers_path": ["../", "../../", "../../../ZKA", "../../../", "./"], + "sources_path": ["*.cxx", "*.S"], + "output_name": "netboot.sys", + "compiler_flags": [ + "-ffreestanding", + "-nostdlib", + "-std=c++20", + "-fPIC", + "-fno-rtti", + "-fno-exceptions", + "-Wl,--subsystem=17,--image-base 0x10000000" + ], + "cpp_macros": [ + "__NEWOSKRNL__", + "__NEWOSLDR__", + "__ZKA_AMD64__", + "__BOOTSCR__", + "cSCRVersionHighest=0x0100", + "cSCRVersionLowest=0x0100", + "cSCRVersion=0x0100" + ] +} diff --git a/dev/ZBA/Modules/NetBoot/compile_flags.txt b/dev/ZBA/Modules/NetBoot/compile_flags.txt index f9ca281f..18bc8512 100644 --- a/dev/ZBA/Modules/NetBoot/compile_flags.txt +++ b/dev/ZBA/Modules/NetBoot/compile_flags.txt @@ -2,7 +2,7 @@ -I../ -I../../ -I../../Kernel --D__NEWOS_AMD64__ +-D__ZKA_AMD64__ -std=c++20 -D__x86_64__ -D__NEWOS_OTA__ diff --git a/dev/ZBA/Sources/HEL/AMD64/BootFileReader.cxx b/dev/ZBA/Sources/HEL/AMD64/BootFileReader.cxx index e94c690a..5686318b 100644 --- a/dev/ZBA/Sources/HEL/AMD64/BootFileReader.cxx +++ b/dev/ZBA/Sources/HEL/AMD64/BootFileReader.cxx @@ -139,7 +139,7 @@ Void BFileReader::ReadAll(SizeT readUntil, SizeT chunkToRead, UIntPtr outAddress else if (readUntil < 1) readUntil = newPtrInfo.FileSize; - mWriter.Write(L"newosldr: physical size: ").Write(readUntil).Write("\r"); + mWriter.Write(L"newosldr: Physical size: ").Write(readUntil).Write("\r"); } if (!outAddress) diff --git a/dev/ZBA/Sources/HEL/AMD64/BootJump.S b/dev/ZBA/Sources/HEL/AMD64/BootJump.S index 2eb745d0..de474c96 100644 --- a/dev/ZBA/Sources/HEL/AMD64/BootJump.S +++ b/dev/ZBA/Sources/HEL/AMD64/BootJump.S @@ -1,8 +1,8 @@ .global rt_jump_to_address .global rt_reset_hardware -.text .text + .intel_syntax noprefix /** diff --git a/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx b/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx index 1011ce10..c5ee3fb3 100644 --- a/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx +++ b/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx @@ -185,7 +185,8 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, handoverHdrPtr->f_HeapStart = nullptr; - while (BS->AllocatePool(EfiLoaderCode, kHandoverHeapSz, &handoverHdrPtr->f_HeapStart) != kEfiOk); + while (BS->AllocatePool(EfiLoaderCode, kHandoverHeapSz, &handoverHdrPtr->f_HeapStart) != kEfiOk) + ; handoverHdrPtr->f_VirtualSize = Descriptor[cDefaultMemoryMap].NumberOfPages; /* # of pages */ @@ -225,6 +226,23 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, // format the disk. // ---------------------------------------------------- // + BFileReader readerBootScr(L"bootscr.sys", ImageHandle); + readerBootScr.ReadAll(0); + + Boot::BThread* loaderBootScr = nullptr; + + // ------------------------------------------ // + // If we succeed in reading the blob, then execute it. + // ------------------------------------------ // + + if (readerBootScr.Blob()) + { + loaderBootScr = new Boot::BThread(readerBootScr.Blob()); + loaderBootScr->SetName("64-bit Boot Screen DLL."); + } + + loaderBootScr->Start(handoverHdrPtr); + BFileReader readerKernel(L"newoskrnl.dll", ImageHandle); readerKernel.ReadAll(0); diff --git a/dev/ZBA/Sources/HEL/AMD64/compile_flags.txt b/dev/ZBA/Sources/HEL/AMD64/compile_flags.txt index c24c4b09..cc79d229 100644 --- a/dev/ZBA/Sources/HEL/AMD64/compile_flags.txt +++ b/dev/ZBA/Sources/HEL/AMD64/compile_flags.txt @@ -1,7 +1,7 @@ -std=c++20 -I../../../ -I../../../../Kernel --D__NEWOS_AMD64__ +-D__ZKA_AMD64__ -std=c++20 -D__x86_64__ -D__NEWOS_OTA__ diff --git a/dev/ZBA/Sources/Thread.cxx b/dev/ZBA/Sources/Thread.cxx index c13d25b9..7362e484 100644 --- a/dev/ZBA/Sources/Thread.cxx +++ b/dev/ZBA/Sources/Thread.cxx @@ -15,13 +15,10 @@ #include #include -EXTERN_C -{ +EXTERN_C{ #include } -#define kHOTypeKernel 100 - EXTERN EfiBootServices* BS; namespace Boot @@ -53,13 +50,13 @@ namespace Boot return; } - if (optHdr->mSubsystem != kNewOSSubsystem) + if (optHdr->mSubsystem != kZKASubsystem) { - writer.Write("newosldr: Not a New OS executable.\r"); + writer.Write("newosldr: Not a ZKA Subsystem executable.\r"); return; } - writer.Write("newosldr: PE32+ executable detected (New OS Subsystem).\r"); + writer.Write("newosldr: PE32+ executable detected (ZKA Subsystem).\r"); auto numSecs = hdrPtr->mNumberOfSections; @@ -83,7 +80,7 @@ namespace Boot constexpr auto sectionForCode = ".text"; constexpr auto sectionForNewLdr = ".ldr"; - constexpr auto sectionForBSS = ".bss"; + constexpr auto sectionForBSS = ".bss"; for (SizeT sectIndex = 0; sectIndex < numSecs; ++sectIndex) { @@ -92,7 +89,7 @@ namespace Boot if (StrCmp(sectionForCode, sect->mName) == 0) { fStartAddress = (VoidPtr)((UIntPtr)loadStartAddress + optHdr->mAddressOfEntryPoint); - writer.Write("newosldr: Start Address: ").Write((UIntPtr)fStartAddress).Write("\r"); + writer.Write("newosldr: Entrypoint of DLL: ").Write((UIntPtr)fStartAddress).Write("\r"); } else if (StrCmp(sectionForBSS, sect->mName) == 0) { @@ -106,11 +103,11 @@ namespace Boot UInt32 HandoverType; }* structHandover = (struct HANDOVER_INFORMATION_STUB*)((UIntPtr)fBlob + sect->mPointerToRawData); - if (structHandover->HandoverMagic != kHandoverMagic || - structHandover->HandoverType != kHOTypeKernel) + if (structHandover->HandoverMagic != kHandoverMagic && + structHandover->HandoverType != HEL::kTypeKernel) { - cg_write_text("NEWOSLDR: INVALID HANDOVER IMAGE! ABORTING...", 40, 10, RGB(0x00, 0x00, 0x00)); - EFI::Stop(); + writer.Write("newosldr: Entrypoint of SYS: ").Write((UIntPtr)fStartAddress).Write("\r"); + cg_write_text("NEWOSLDR: NOT AN HANDOVER IMAGE...", 40, 10, RGB(0xFF, 0xFF, 0xFF)); } } @@ -149,7 +146,7 @@ namespace Boot } HEL::HandoverProc err_fn = [](HEL::HandoverInformationHeader* rcx) -> void { - cg_write_text("NEWOSLDR: INVALID IMAGE! ABORTING...", 40, 10, RGB(0x00, 0x00, 0x00)); + cg_write_text("NEWOSLDR: INVALID IMAGE! ABORTING...", 50, 10, RGB(0xFF, 0xFF, 0xFF)); EFI::Stop(); }; @@ -159,7 +156,6 @@ namespace Boot } reinterpret_cast(fStartAddress)(handover); - err_fn(handover); } const Char* BThread::GetName() diff --git a/dev/ZBA/Sources/compile_flags.txt b/dev/ZBA/Sources/compile_flags.txt index f9ca281f..18bc8512 100644 --- a/dev/ZBA/Sources/compile_flags.txt +++ b/dev/ZBA/Sources/compile_flags.txt @@ -2,7 +2,7 @@ -I../ -I../../ -I../../Kernel --D__NEWOS_AMD64__ +-D__ZKA_AMD64__ -std=c++20 -D__x86_64__ -D__NEWOS_OTA__ diff --git a/dev/ZBA/amd64-efi.make b/dev/ZBA/amd64-efi.make index 9e1fcd98..70071439 100644 --- a/dev/ZBA/amd64-efi.make +++ b/dev/ZBA/amd64-efi.make @@ -46,13 +46,14 @@ REM_FLAG=-f FLAG_ASM=-f win64 FLAG_GNU=-fshort-wchar -D__EFI_x86_64__ -mno-red-zone -D__NEWOSKRNL__ -D__NEWOSLDR__ \ -DEFI_FUNCTION_WRAPPER -I./ -I../Vendor -I../ZKA -I../ -c -nostdlib -fno-rtti -fno-exceptions \ - -std=c++20 -D__HAVE_MAHROUSS_APIS__ -D__NEWOS_AMD64__ -D__MAHROUSS__ + -std=c++20 -D__HAVE_MAHROUSS_APIS__ -D__ZKA_AMD64__ -D__MAHROUSS__ BOOT_LOADER=newosldr.exe KERNEL=newoskrnl.dll DDK=ddk.dll SCI=sci.dll CRT=ndkcrt.dll +BOOT_SCR=bootscr.sys .PHONY: invalid-recipe invalid-recipe: @@ -67,6 +68,7 @@ all: compile-amd64 $(COPY) ../ZKA/$(KERNEL) Sources/Root/$(KERNEL) $(COPY) ../SCI/$(SCI) Sources/Root/$(SCI) $(COPY) ../DDK/$(DDK) Sources/Root/$(DDK) + $(COPY) ./Modules/BootScr/$(BOOT_SCR) Sources/Root/$(BOOT_SCR) $(COPY) ../CRT/$(CRT) Sources/Root/$(CRT) $(COPY) Sources/$(BOOT_LOADER) Sources/Root/$(BOOT_LOADER) -- cgit v1.2.3