From 05f085c9055fa5bd13bdba40fc40fb3f00d69fab Mon Sep 17 00:00:00 2001 From: Amlal Date: Sat, 26 Oct 2024 07:59:10 +0200 Subject: IMP: Fixes and improvements. Signed-off-by: Amlal --- dev/zba/src/BootFileReader.cc | 2 +- dev/zba/src/BootString.cc | 2 +- dev/zba/src/BootTextWriter.cc | 2 +- dev/zba/src/BootThread.cc | 195 ++++++++++++++++++++++++++++++++++++++ dev/zba/src/HEL/AMD64/BootAHCI.cc | 4 +- dev/zba/src/HEL/AMD64/BootATA.cc | 2 +- dev/zba/src/HEL/AMD64/BootMain.cc | 45 +++++---- dev/zba/src/Thread.cc | 195 -------------------------------------- 8 files changed, 223 insertions(+), 224 deletions(-) create mode 100644 dev/zba/src/BootThread.cc delete mode 100644 dev/zba/src/Thread.cc (limited to 'dev/zba') diff --git a/dev/zba/src/BootFileReader.cc b/dev/zba/src/BootFileReader.cc index 835fcb05..ab5d53ee 100644 --- a/dev/zba/src/BootFileReader.cc +++ b/dev/zba/src/BootFileReader.cc @@ -2,7 +2,7 @@ Copyright ZKA Web Services Co. - File: FileReader.cxx + File: FileReader.cc Purpose: New Boot FileReader, Read complete file and store it in a buffer. diff --git a/dev/zba/src/BootString.cc b/dev/zba/src/BootString.cc index faa7f168..6bc5cf9d 100644 --- a/dev/zba/src/BootString.cc +++ b/dev/zba/src/BootString.cc @@ -2,7 +2,7 @@ Copyright ZKA Web Services Co. - File: String.cxx + File: String.cc Purpose: ZBA string library Revision History: diff --git a/dev/zba/src/BootTextWriter.cc b/dev/zba/src/BootTextWriter.cc index 650484b3..e394d193 100644 --- a/dev/zba/src/BootTextWriter.cc +++ b/dev/zba/src/BootTextWriter.cc @@ -2,7 +2,7 @@ Copyright ZKA Web Services Co. - File: String.cxx + File: String.cc Purpose: ZBA string library Revision History: diff --git a/dev/zba/src/BootThread.cc b/dev/zba/src/BootThread.cc new file mode 100644 index 00000000..c185b367 --- /dev/null +++ b/dev/zba/src/BootThread.cc @@ -0,0 +1,195 @@ +/* ------------------------------------------- + + Copyright ZKA Web Services Co. + +------------------------------------------- */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +// External boot services symbol. +EXTERN EfiBootServices* BS; + +/// @note BThread doesn't parse the symbols so doesn't nullify them, .bss is though. + +namespace Boot +{ + BThread::BThread(VoidPtr blob) + : fBlob(blob), fStartAddress(nullptr) + { + // detect the format. + const Char* blob_bytes = reinterpret_cast(fBlob); + + BTextWriter writer; + + if (!blob_bytes) + { + // failed to provide a valid pointer. + return; + } + + if (blob_bytes[0] == kMagMz0 && + blob_bytes[1] == kMagMz1) + { + LDR_EXEC_HEADER_PTR header_ptr = CFKit::ldr_find_exec_header(blob_bytes); + LDR_OPTIONAL_HEADER_PTR opt_header_ptr = CFKit::ldr_find_opt_exec_header(blob_bytes); + + if (!header_ptr || !opt_header_ptr) + return; + +#ifdef __ZKA_AMD64__ + if (header_ptr->mMachine != kPeMachineAMD64 || + header_ptr->mSignature != kPeSignature) + { + writer.Write("ZBA: Not a PE32+ executable.\r"); + return; + } +#elif defined(__ZKA_ARM64__) + if (header_ptr->mMachine != kPeMachineAMD64 || + header_ptr->mSignature != kPeSignature) + { + writer.Write("ZBA: Not a PE32+ executable.\r"); + return; + } +#endif // __ZKA_AMD64__ || __ZKA_ARM64__ + + if (opt_header_ptr->mSubsystem != kZKASubsystem) + { + writer.Write("ZBA: Not a ZKA Subsystem executable.\r"); + return; + } + + writer.Write("ZBA: PE32+ executable detected (ZKA Subsystem).\r"); + + auto numSecs = header_ptr->mNumberOfSections; + + writer.Write("ZBA: Major Linker Ver: ").Write(opt_header_ptr->mMajorLinkerVersion).Write("\r"); + writer.Write("ZBA: Minor Linker Ver: ").Write(opt_header_ptr->mMinorLinkerVersion).Write("\r"); + writer.Write("ZBA: Major Subsystem Ver: ").Write(opt_header_ptr->mMajorSubsystemVersion).Write("\r"); + writer.Write("ZBA: Minor Subsystem Ver: ").Write(opt_header_ptr->mMinorSubsystemVersion).Write("\r"); + writer.Write("ZBA: Magic: ").Write(header_ptr->mSignature).Write("\r"); + + constexpr auto cPageSize = 512; + + EfiPhysicalAddress loadStartAddress = opt_header_ptr->mImageBase; + loadStartAddress += opt_header_ptr->mBaseOfData; + + writer.Write("ZBA: ImageBase: ").Write(loadStartAddress).Write("\r"); + + auto numPages = opt_header_ptr->mSizeOfImage / cPageSize; + BS->AllocatePages(AllocateAddress, EfiLoaderData, numPages, &loadStartAddress); + + LDR_SECTION_HEADER_PTR sectPtr = (LDR_SECTION_HEADER_PTR)(((Char*)opt_header_ptr) + header_ptr->mSizeOfOptionalHeader); + + constexpr auto sectionForCode = ".text"; + constexpr auto sectionForNewLdr = ".ldr"; + constexpr auto sectionForBSS = ".bss"; + + for (SizeT sectIndex = 0; sectIndex < numSecs; ++sectIndex) + { + LDR_SECTION_HEADER_PTR sect = §Ptr[sectIndex]; + + SetMem((VoidPtr)(loadStartAddress + sect->mVirtualAddress), 0, sect->mSizeOfRawData); + + if (StrCmp(sectionForCode, sect->mName) == 0) + { + fStartAddress = (VoidPtr)((UIntPtr)loadStartAddress + opt_header_ptr->mAddressOfEntryPoint); + writer.Write("ZBA: Executable entry address: ").Write((UIntPtr)fStartAddress).Write("\r"); + } + else if (StrCmp(sectionForNewLdr, sect->mName) == 0) + { + struct HANDOVER_INFORMATION_STUB + { + UInt64 HandoverMagic; + UInt32 HandoverType; + UInt32 HandoverPad; + UInt32 HandoverArch; + }* handover_struc = (struct HANDOVER_INFORMATION_STUB*)((UIntPtr)fBlob + sect->mPointerToRawData); + + if (handover_struc->HandoverMagic != kHandoverMagic && + handover_struc->HandoverType != HEL::kTypeKernel) + { +#ifdef __ZKA_AMD64__ + if (handover_struc->HandoverArch != HEL::kArchAMD64) + { + CGDrawString("ZBA: NOT AN HANDOVER IMAGE, BAD ARCHITECTURE...", 40, 10, RGB(0xFF, 0xFF, 0xFF)); + ::EFI::Stop(); + } +#endif + +#ifdef __ZKA_ARM64__ + if (handover_struc->HandoverArch != HEL::kArchARM64) + { + CGDrawString("ZBA: NOT AN HANDOVER IMAGE, BAD ARCHITECTURE...", 40, 10, RGB(0xFF, 0xFF, 0xFF)); + ::EFI::Stop(); + } +#endif + CGDrawString("ZBA: NOT AN HANDOVER IMAGE...", 40, 10, RGB(0xFF, 0xFF, 0xFF)); + + ::EFI::Stop(); + } + } + + writer.Write("ZBA: Raw offset: ").Write(sect->mPointerToRawData).Write(" of ").Write(sect->mName).Write("\r"); + + CopyMem((VoidPtr)(loadStartAddress + sect->mVirtualAddress), (VoidPtr)((UIntPtr)fBlob + sect->mPointerToRawData), sect->mSizeOfRawData); + } + } + 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. + // ========================================= // + + fStartAddress = nullptr; + writer.Write("ZBA: PEF executable detected, won't load it.\r"); + writer.Write("ZBA: note: PEF executables aren't loadable by default.\r"); + } + else + { + writer.Write("ZBA: Invalid executable.\r"); + } + } + + /// @note handover header has to be valid! + Void BThread::Start(HEL::HANDOVER_INFO_HEADER* handover) + { + HEL::HandoverProc err_fn = [](HEL::HANDOVER_INFO_HEADER* rcx) -> void { + CGDrawString("ZBA: INVALID IMAGE! ABORTING...", 50, 10, RGB(0xFF, 0xFF, 0xFF)); + ::EFI::Stop(); + }; + + if (!fStartAddress) + { + err_fn(handover); + } + + reinterpret_cast(fStartAddress)(handover); + } + + const Char* BThread::GetName() + { + return fBlobName; + } + + Void BThread::SetName(const Char* name) + { + CopyMem(fBlobName, name, StrLen(name)); + } + + bool BThread::IsValid() + { + return fStartAddress != nullptr; + } +} // namespace Boot diff --git a/dev/zba/src/HEL/AMD64/BootAHCI.cc b/dev/zba/src/HEL/AMD64/BootAHCI.cc index 5899f177..60520ac9 100644 --- a/dev/zba/src/HEL/AMD64/BootAHCI.cc +++ b/dev/zba/src/HEL/AMD64/BootAHCI.cc @@ -5,9 +5,9 @@ ------------------------------------------- */ /** - * @file AHCI.cxx + * @file BootAHCI.cc * @author Amlal El Mahrouss (amlalelmahrouss@icloud.com) - * @brief AHCI driver. + * @brief AHCI support for ZBA. * @version 0.1 * @date 2024-02-02 * diff --git a/dev/zba/src/HEL/AMD64/BootATA.cc b/dev/zba/src/HEL/AMD64/BootATA.cc index 0faba789..34f1df29 100644 --- a/dev/zba/src/HEL/AMD64/BootATA.cc +++ b/dev/zba/src/HEL/AMD64/BootATA.cc @@ -5,7 +5,7 @@ ------------------------------------------- */ /** - * @file ATA.cxx + * @file BootATA.cc * @author Amlal El Mahrouss (amlalelmahrouss@icloud.com) * @brief ATA driver. * @version 0.1 diff --git a/dev/zba/src/HEL/AMD64/BootMain.cc b/dev/zba/src/HEL/AMD64/BootMain.cc index 392fce0d..e939ac18 100644 --- a/dev/zba/src/HEL/AMD64/BootMain.cc +++ b/dev/zba/src/HEL/AMD64/BootMain.cc @@ -17,17 +17,17 @@ #include #include -// make the compiler shut up. +// Makes the compiler shut up. #ifndef kMachineModel #define kMachineModel "ZKA SSD" #endif // !kMachineModel -#ifndef cExpectedWidth -#define cExpectedWidth 1280 +#ifndef kExpectedWidth +#define kExpectedWidth 1280 #endif -#ifndef cExpectedHeight -#define cExpectedHeight 720 +#ifndef kExpectedHeight +#define kExpectedHeight 720 #endif /** Graphics related. */ @@ -38,18 +38,18 @@ STATIC EfiGUID kGopGuid; EXTERN_C Void rt_reset_hardware(); -/** - @brief Finds and stores the GOP. -*/ - EXTERN EfiBootServices* BS; -STATIC Void boot_init_fb() noexcept +/** + @brief Finds and stores the GOP object. +*/ +STATIC Bool boot_init_fb() noexcept { kGopGuid = EfiGUID(EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID); kGop = nullptr; - BS->LocateProtocol(&kGopGuid, nullptr, (VoidPtr*)&kGop); + if (BS->LocateProtocol(&kGopGuid, nullptr, (VoidPtr*)&kGop) /= kEfiOk) + return No; kGopStride = 4; @@ -60,8 +60,8 @@ STATIC Void boot_init_fb() noexcept kGop->QueryMode(kGop, i, &sz, &infoPtr); - if (infoPtr->HorizontalResolution == cExpectedWidth && - infoPtr->VerticalResolution == cExpectedHeight) + if (infoPtr->HorizontalResolution == kExpectedWidth && + infoPtr->VerticalResolution == kExpectedHeight) { kGop->SetMode(kGop, i); break; @@ -93,15 +93,16 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr ImageHandle, UInt32 rev_desc = 0; #ifdef __ZKA_USE_FB__ - boot_init_fb(); ///! Init the GOP. + if (!boot_init_fb()) + return -1; ///! Init the GOP. - for (SizeT indexVT = 0; indexVT < SystemTable->NumberOfTableEntries; - ++indexVT) + for (SizeT index_vt = 0; index_vt < SystemTable->NumberOfTableEntries; + ++index_vt) { Char* vendor_table = reinterpret_cast( - SystemTable->ConfigurationTable[indexVT].VendorTable); + SystemTable->ConfigurationTable[index_vt].VendorTable); - /// ACPI's 'RSD PTR', which contains hardware tables (MADT, FACP...) + // ACPI's 'RSD PTR', which contains the ACPI SDT (MADT, FACP...) if (vendor_table[0] == 'R' && vendor_table[1] == 'S' && vendor_table[2] == 'D' && vendor_table[3] == ' ' && vendor_table[4] == 'P' && vendor_table[5] == 'T' && @@ -164,7 +165,6 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr ImageHandle, // format the disk. // ---------------------------------------------------- // -#ifdef __AHCI__ if (!partition_factory.IsPartitionValid()) { Boot::BDiskFormatFactory::BFileDescriptor root; @@ -177,7 +177,6 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr ImageHandle, rt_reset_hardware(); } -#endif BS->GetMemoryMap(&size_struct_ptr, struct_ptr, &map_key, &sz_desc, &rev_desc); @@ -231,7 +230,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."); + syschk_thread->SetName("System Check (Integrity check)"); } syschk_thread->Start(handover_hdr); @@ -268,7 +267,7 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr ImageHandle, if (reader_kernel.Blob()) { kernel_thread = new Boot::BThread(reader_kernel.Blob()); - kernel_thread->SetName("Minimal Kernel."); + kernel_thread->SetName("OS Kernel (Microkernel)."); handover_hdr->f_KernelImage = reader_kernel.Blob(); } @@ -315,7 +314,7 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr ImageHandle, #endif // __ZKA_USE_FB__ // ---------------------------------------------------- // - // Finally load Kernel, and the cr3 to it. + // Finally load the operating system kernel. // ---------------------------------------------------- // kernel_thread->Start(handover_hdr); diff --git a/dev/zba/src/Thread.cc b/dev/zba/src/Thread.cc deleted file mode 100644 index d009a633..00000000 --- a/dev/zba/src/Thread.cc +++ /dev/null @@ -1,195 +0,0 @@ -/* ------------------------------------------- - - Copyright ZKA Web Services Co. - -------------------------------------------- */ - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -// External boot services symbol. -EXTERN EfiBootServices* BS; - -/// @note BThread doesn't parse the symbols so doesn't nullify them, .bss is though. - -namespace Boot -{ - BThread::BThread(VoidPtr blob) - : fBlob(blob), fStartAddress(nullptr) - { - // detect the format. - const Char* blob_bytes = reinterpret_cast(fBlob); - - BTextWriter writer; - - if (!blob_bytes) - { - // failed to provide a valid pointer. - return; - } - - if (blob_bytes[0] == kMagMz0 && - blob_bytes[1] == kMagMz1) - { - LDR_EXEC_HEADER_PTR header_ptr = CFKit::ldr_find_exec_header(blob_bytes); - LDR_OPTIONAL_HEADER_PTR opt_header_ptr = CFKit::ldr_find_opt_exec_header(blob_bytes); - - if (!header_ptr || !opt_header_ptr) - return; - -#ifdef __ZKA_AMD64__ - if (header_ptr->mMachine != kPeMachineAMD64 || - header_ptr->mSignature != kPeSignature) - { - writer.Write("ZBA: Not a PE32+ executable.\r"); - return; - } -#elif defined(__ZKA_ARM64__) - if (header_ptr->mMachine != kPeMachineAMD64 || - header_ptr->mSignature != kPeSignature) - { - writer.Write("ZBA: Not a PE32+ executable.\r"); - return; - } -#endif // __ZKA_AMD64__ || __ZKA_ARM64__ - - if (opt_header_ptr->mSubsystem != kZKASubsystem) - { - writer.Write("ZBA: Not a ZKA Subsystem executable.\r"); - return; - } - - writer.Write("ZBA: PE32+ executable detected (ZKA Subsystem).\r"); - - auto numSecs = header_ptr->mNumberOfSections; - - writer.Write("ZBA: Major Linker Ver: ").Write(opt_header_ptr->mMajorLinkerVersion).Write("\r"); - writer.Write("ZBA: Minor Linker Ver: ").Write(opt_header_ptr->mMinorLinkerVersion).Write("\r"); - writer.Write("ZBA: Major Subsystem Ver: ").Write(opt_header_ptr->mMajorSubsystemVersion).Write("\r"); - writer.Write("ZBA: Minor Subsystem Ver: ").Write(opt_header_ptr->mMinorSubsystemVersion).Write("\r"); - writer.Write("ZBA: Magic: ").Write(header_ptr->mSignature).Write("\r"); - - constexpr auto cPageSize = 512; - - EfiPhysicalAddress loadStartAddress = opt_header_ptr->mImageBase; - loadStartAddress += opt_header_ptr->mBaseOfData; - - writer.Write("ZBA: ImageBase: ").Write(loadStartAddress).Write("\r"); - - auto numPages = opt_header_ptr->mSizeOfImage / cPageSize; - BS->AllocatePages(AllocateAddress, EfiLoaderData, numPages, &loadStartAddress); - - LDR_SECTION_HEADER_PTR sectPtr = (LDR_SECTION_HEADER_PTR)(((Char*)opt_header_ptr) + header_ptr->mSizeOfOptionalHeader); - - constexpr auto sectionForCode = ".text"; - constexpr auto sectionForNewLdr = ".ldr"; - constexpr auto sectionForBSS = ".bss"; - - for (SizeT sectIndex = 0; sectIndex < numSecs; ++sectIndex) - { - LDR_SECTION_HEADER_PTR sect = §Ptr[sectIndex]; - - SetMem((VoidPtr)(loadStartAddress + sect->mVirtualAddress), 0, sect->mSizeOfRawData); - - if (StrCmp(sectionForCode, sect->mName) == 0) - { - fStartAddress = (VoidPtr)((UIntPtr)loadStartAddress + opt_header_ptr->mAddressOfEntryPoint); - writer.Write("ZBA: Executable entry address: ").Write((UIntPtr)fStartAddress).Write("\r"); - } - else if (StrCmp(sectionForNewLdr, sect->mName) == 0) - { - struct HANDOVER_INFORMATION_STUB - { - UInt64 HandoverMagic; - UInt32 HandoverType; - UInt32 HandoverPad; - UInt32 HandoverArch; - }* handover_struc = (struct HANDOVER_INFORMATION_STUB*)((UIntPtr)fBlob + sect->mPointerToRawData); - - if (handover_struc->HandoverMagic != kHandoverMagic && - handover_struc->HandoverType != HEL::kTypeKernel) - { -#ifdef __ZKA_AMD64__ - if (handover_struc->HandoverArch != HEL::kArchAMD64) - { - CGDrawString("ZBA: NOT AN HANDOVER IMAGE, BAD ARCHITECTURE...", 40, 10, RGB(0xFF, 0xFF, 0xFF)); - ::EFI::Stop(); - } -#endif - -#ifdef __ZKA_ARM64__ - if (handover_struc->HandoverArch != HEL::kArchARM64) - { - CGDrawString("ZBA: NOT AN HANDOVER IMAGE, BAD ARCHITECTURE...", 40, 10, RGB(0xFF, 0xFF, 0xFF)); - ::EFI::Stop(); - } -#endif - CGDrawString("ZBA: NOT AN HANDOVER IMAGE...", 40, 10, RGB(0xFF, 0xFF, 0xFF)); - - ::EFI::Stop(); - } - } - - writer.Write("ZBA: Raw offset: ").Write(sect->mPointerToRawData).Write(" of ").Write(sect->mName).Write("\r"); - - CopyMem((VoidPtr)(loadStartAddress + sect->mVirtualAddress), (VoidPtr)((UIntPtr)fBlob + sect->mPointerToRawData), sect->mSizeOfRawData); - } - } - 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. - // ========================================= // - - fStartAddress = nullptr; - writer.Write("ZBA: PEF executable detected, won't load it.\r"); - writer.Write("ZBA: note: PEF executables aren't loadable by default.\r"); - } - else - { - writer.Write("ZBA: Invalid executable.\r"); - } - } - - /// @note handover header has to be valid! - Void BThread::Start(HEL::HANDOVER_INFO_HEADER* handover) - { - HEL::HandoverProc err_fn = [](HEL::HANDOVER_INFO_HEADER* rcx) -> void { - CGDrawString("ZBA: INVALID IMAGE! ABORTING...", 50, 10, RGB(0xFF, 0xFF, 0xFF)); - ::EFI::Stop(); - }; - - if (!fStartAddress) - { - err_fn(handover); - } - - reinterpret_cast(fStartAddress)(handover); - } - - const Char* BThread::GetName() - { - return fBlobName; - } - - Void BThread::SetName(const Char* name) - { - CopyMem(fBlobName, name, StrLen(name)); - } - - bool BThread::IsValid() - { - return fStartAddress != nullptr; - } -} // namespace Boot -- cgit v1.2.3