diff options
| author | Amlal EL Mahrouss <amlalelmahrouss@icloud.com> | 2024-08-04 16:29:09 +0200 |
|---|---|---|
| committer | Amlal EL Mahrouss <amlalelmahrouss@icloud.com> | 2024-08-04 16:29:09 +0200 |
| commit | 1b92501a27f8781945bc6b19bb43e22588d4c933 (patch) | |
| tree | 8e73c4045188b0620bd8612dacdbab449ae97f94 | |
| parent | a38083f7d528111087949a0ba8e3970f091f2fc9 (diff) | |
[IMP] ProgramLoader class for PE32+.
Signed-off-by: Amlal EL Mahrouss <amlalelmahrouss@icloud.com>
| -rw-r--r-- | Boot/BootKit/BootKit.hxx | 2 | ||||
| -rw-r--r-- | Boot/Sources/HEL/AMD64/BootFileReader.cxx | 30 | ||||
| -rw-r--r-- | Boot/Sources/HEL/AMD64/BootMain.cxx | 10 | ||||
| -rw-r--r-- | Boot/Sources/HEL/AMD64/Support.cxx | 19 | ||||
| -rw-r--r-- | Boot/Sources/ProgramLoader.cxx | 46 | ||||
| -rw-r--r-- | Kernel/HALKit/AMD64/HalBoot.asm | 3 | ||||
| -rw-r--r-- | Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx | 4 | ||||
| -rw-r--r-- | Kernel/HALKit/AMD64/HalKernelMain.cxx | 73 | ||||
| -rw-r--r-- | Kernel/KernelKit/PE.hxx | 12 | ||||
| -rw-r--r-- | Kernel/amd64-efi.make | 4 |
10 files changed, 117 insertions, 86 deletions
diff --git a/Boot/BootKit/BootKit.hxx b/Boot/BootKit/BootKit.hxx index 9bc915b2..1f6b7d95 100644 --- a/Boot/BootKit/BootKit.hxx +++ b/Boot/BootKit/BootKit.hxx @@ -101,7 +101,7 @@ public: ~BFileReader(); public: - Void ReadAll(SizeT until, SizeT chunk = kib_cast(4)); + Void ReadAll(SizeT until, SizeT chunk = kib_cast(4), UIntPtr outAddress = 0UL); enum { diff --git a/Boot/Sources/HEL/AMD64/BootFileReader.cxx b/Boot/Sources/HEL/AMD64/BootFileReader.cxx index f784bf6f..7b07ee23 100644 --- a/Boot/Sources/HEL/AMD64/BootFileReader.cxx +++ b/Boot/Sources/HEL/AMD64/BootFileReader.cxx @@ -123,12 +123,12 @@ BFileReader::~BFileReader() @param **readUntil** size of file @param **chunkToRead** chunk to read each time. */ -Void BFileReader::ReadAll(SizeT readUntil, SizeT chunkToRead) +Void BFileReader::ReadAll(SizeT readUntil, SizeT chunkToRead, UIntPtr outAddress) { if (mBlob == nullptr) { EfiFileInfo newPtrInfo; - UInt32 szInfo = 0; + UInt32 szInfo = 0; EfiGUID cFileInfoGUID = EFI_FILE_INFO_GUID; @@ -142,11 +142,18 @@ Void BFileReader::ReadAll(SizeT readUntil, SizeT chunkToRead) mWriter.Write(L"newosldr: physical size: ").Write(readUntil).Write("\r"); } - if (auto err = BS->AllocatePool(EfiLoaderCode, readUntil, (VoidPtr*)&mBlob) != - kEfiOk) + if (!outAddress) { - mWriter.Write(L"*** error: ").Write(err).Write(L" ***\r"); - EFI::ThrowError(L"OutOfMemory", L"Out of memory."); + if (auto err = BS->AllocatePool(EfiLoaderCode, readUntil, (VoidPtr*)&mBlob) != + kEfiOk) + { + mWriter.Write(L"*** error: ").Write(err).Write(L" ***\r"); + EFI::ThrowError(L"OutOfMemory", L"Out of memory."); + } + } + else + { + mBlob = (VoidPtr)outAddress; } } @@ -163,16 +170,7 @@ Void BFileReader::ReadAll(SizeT readUntil, SizeT chunkToRead) if (res == kBufferTooSmall) { - mErrorCode = kTooSmall; - return; - } - else if (res == kEfiOk) - { - continue; - } - else - { - break; + bufSize = chunkToRead; } } diff --git a/Boot/Sources/HEL/AMD64/BootMain.cxx b/Boot/Sources/HEL/AMD64/BootMain.cxx index 0c0c9953..6aec67f5 100644 --- a/Boot/Sources/HEL/AMD64/BootMain.cxx +++ b/Boot/Sources/HEL/AMD64/BootMain.cxx @@ -157,12 +157,6 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, CGDrawInRegion(CGColor(0xFF, 0xFF, 0xFF), handoverHdrPtr->f_GOP.f_Height, handoverHdrPtr->f_GOP.f_Width, 0, 0); CGFini(); - // check if we are running in the PC platform. If so abort. -#if defined(__NEWOS_AMD64__) && !defined(__DEBUG__) - writer.Write(L"\rnewosldr: AMD64 support is not official.\r"); - EFI::ThrowError(L"Beta-Software", L"Beta Software."); -#endif - // ---------------------------------------------------- // // The following checks for an exisiting partition // inside the disk, if it doesn't have one, @@ -170,7 +164,7 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, // ---------------------------------------------------- // BFileReader readerKernel(L"newoskrnl.dll", ImageHandle); - + readerKernel.ReadAll(0); Boot::ProgramLoader* loader = nullptr; @@ -198,7 +192,7 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, // ---------------------------------------------------- // cg_write_text("NEWOSLDR (C) ZKA TECHNOLOGIES.", 10, 10, RGB(0x00, 0x00, 0x00)); - cg_write_text("SMP OS (MAX 8 CORES).", 20, 10, RGB(0x00, 0x00, 0x00)); + cg_write_text("LOADING NEWOSKRNL...", 20, 10, RGB(0x00, 0x00, 0x00)); loader->Start(handoverHdrPtr); diff --git a/Boot/Sources/HEL/AMD64/Support.cxx b/Boot/Sources/HEL/AMD64/Support.cxx index a2ac6394..8c82f78a 100644 --- a/Boot/Sources/HEL/AMD64/Support.cxx +++ b/Boot/Sources/HEL/AMD64/Support.cxx @@ -58,6 +58,25 @@ EXTERN_C size_t strlen(const char* whatToCheck) return len; } +/// @brief strcmp definition in C++. +EXTERN_C int strcmp(const char* whatToCheck, const char* whatToCheckRight) +{ + if (!whatToCheck || *whatToCheck == 0) + return 0; + + SizeT len = 0; + + while (whatToCheck[len] == whatToCheckRight[len]) + { + if (whatToCheck[len] == 0) + return 0; + + ++len; + } + + return whatToCheck[len] == whatToCheckRight[len] ? 0 : len; +} + /// @brief somthing specific to the Microsoft's ABI, When the stack grows too big. EXTERN_C void ___chkstk_ms(void) { diff --git a/Boot/Sources/ProgramLoader.cxx b/Boot/Sources/ProgramLoader.cxx index e4f61630..7461b87b 100644 --- a/Boot/Sources/ProgramLoader.cxx +++ b/Boot/Sources/ProgramLoader.cxx @@ -46,43 +46,47 @@ namespace Boot ExecHeaderPtr hdrPtr = ldr_find_exec_header(firstBytes); ExecOptionalHeaderPtr optHdr = ldr_find_opt_exec_header(firstBytes); - // ================================ // - // Allocate stack. - // ================================ // - fStackPtr = new Char[optHdr->mSizeOfStackReserve]; + auto numSecs = hdrPtr->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(optHdr->mMagic).Write("\r"); + writer.Write("newosldr: Magic: ").Write(hdrPtr->mSignature).Write("\r"); writer.Write("newosldr: ImageBase: ").Write(optHdr->mImageBase).Write("\r"); - EfiPhysicalAddress base_img_addr = optHdr->mImageBase; + constexpr auto cPageSize = 512; - constexpr auto cMaxSectionsOfKernel = 10; + EfiPhysicalAddress loadStartAddress = optHdr->mImageBase; + loadStartAddress += optHdr->mBaseOfData; - BS->AllocatePages(EfiAllocateType::AllocateAnyPages, EfiMemoryType::EfiLoaderCode, cMaxSectionsOfKernel, &base_img_addr); + auto numPages = optHdr->mSizeOfImage / cPageSize; + BS->AllocatePages(AllocateAddress, EfiLoaderData, numPages, &loadStartAddress); - ExecSectionHeaderPtr sectPtr = (ExecSectionHeaderPtr)((UIntPtr)firstBytes + ((DosHeaderPtr)firstBytes)->eLfanew + hdrPtr->mSizeOfOptionalHeader + sizeof(ExecHeader) + sizeof(UInt32)); + ExecSectionHeaderPtr sectPtr = (ExecSectionHeaderPtr)(((Char*)optHdr) + hdrPtr->mSizeOfOptionalHeader); - for (SizeT sectIndex = 0; sectIndex < cMaxSectionsOfKernel; ++sectIndex) + for (SizeT sectIndex = 0; sectIndex < numSecs; ++sectIndex) { ExecSectionHeaderPtr sect = §Ptr[sectIndex]; - EfiPhysicalAddress address_to_alloc = sect->mVirtualAddress; - - // if this is a code header, then we can look for the entrypoint. - if (sect->mCharacteristics & eUserSection) + if (strcmp(".text", sect->mName) == 0) { - if (!fStartAddress) - { - fStartAddress = (VoidPtr)((VoidPtr)((UIntPtr)sect->mPointerToRawData + (sect->mVirtualAddress - optHdr->mAddressOfEntryPoint))); - - writer.Write("newosldr: Start Address set: ").Write((UIntPtr)fStartAddress).Write("\r"); - } + fStartAddress = (VoidPtr)((UIntPtr)fBlob + sect->mVirtualAddress + optHdr->mAddressOfEntryPoint); } + + CopyMem((VoidPtr)(loadStartAddress + sect->mVirtualAddress), (VoidPtr)((UIntPtr)fBlob + sect->mPointerToRawData), sect->mSizeOfRawData); } + + EfiPhysicalAddress start = (EfiPhysicalAddress)fStartAddress; + + BS->AllocatePages(AllocateAddress, EfiLoaderData, 1, &start); + + writer.Write("newosldr: Start Address: ").Write((UIntPtr)fStartAddress).Write("\r"); + + // ================================ // + // Allocate stack. + // ================================ // + fStackPtr = new Char[optHdr->mSizeOfStackReserve]; } else if (firstBytes[0] == kPefMagic[0] && firstBytes[1] == kPefMagic[1] && @@ -117,7 +121,7 @@ namespace Boot BTextWriter writer; writer.Write("newosldr: Exec format error, Thread has been aborted.\r"); - EFI::ThrowError(L"Exec-Format-Error", L"Format doesn't match (Thread aborted.)"); + EFI::ThrowError(L"Exec-Format-Error", L"Format doesn't match (Thread aborted)."); }; if (!fStartAddress) diff --git a/Kernel/HALKit/AMD64/HalBoot.asm b/Kernel/HALKit/AMD64/HalBoot.asm index f03982e6..6cd119ac 100644 --- a/Kernel/HALKit/AMD64/HalBoot.asm +++ b/Kernel/HALKit/AMD64/HalBoot.asm @@ -29,4 +29,7 @@ section .text [global ke_startup_platform] ke_startup_platform: + push rax + jmp hal_init_platform + pop rax ret
\ No newline at end of file diff --git a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx index c9552851..dd912d2b 100644 --- a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx +++ b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx @@ -12,6 +12,10 @@ #include <KernelKit/ProcessScheduler.hxx> #include <KernelKit/Timer.hxx> +// Needed for SMP. // + +#include <KernelKit/MP.hxx> + #define kAPIC_ICR_Low 0x300 #define kAPIC_ICR_High 0x310 #define kAPIC_SIPI_Vector 0x00500 diff --git a/Kernel/HALKit/AMD64/HalKernelMain.cxx b/Kernel/HALKit/AMD64/HalKernelMain.cxx index 2eae6053..0ed63569 100644 --- a/Kernel/HALKit/AMD64/HalKernelMain.cxx +++ b/Kernel/HALKit/AMD64/HalKernelMain.cxx @@ -19,6 +19,7 @@ #include <Modules/ACPI/ACPIFactoryInterface.hxx> #include <NetworkKit/IPC.hxx> #include <CFKit/Property.hxx> +#include <Modules/CoreCG/TextRenderer.hxx> #define mInitKernel(X) \ X; \ @@ -52,6 +53,8 @@ struct PROCESS_EXIT_INFO final Kernel::Char fReason[cReasonLen]; }; +STATIC Kernel::UInt32 kTextOffsetY = 30; + namespace Kernel::HAL { /// @brief Gets the system cores using the MADT. @@ -82,6 +85,11 @@ EXTERN_C void hal_init_platform( return; } + cg_write_text("NEWOSKRNL (C) ZKA TECHNOLOGIES.", kTextOffsetY, 10, RGB(0x00, 0x00, 0x00)); + kTextOffsetY += 10; + + cg_write_text("SMP OS (MAX 8 CORES).", kTextOffsetY, 10, RGB(0x00, 0x00, 0x00)); + kKernelVirtualSize = HandoverHeader->f_VirtualSize; kKernelVirtualStart = reinterpret_cast<Kernel::VoidPtr>( reinterpret_cast<Kernel::UIntPtr>(HandoverHeader->f_VirtualStart) + cHeapStartOffset); @@ -109,29 +117,30 @@ EXTERN_C void hal_init_platform( // Register the basic SCI functions. - constexpr auto cSerialAlertInterrupt = 0x10; - constexpr auto cTlsInterrupt = 0x11; - constexpr auto cTlsInstallInterrupt = 0x12; - constexpr auto cNewInterrupt = 0x13; - constexpr auto cDeleteInterrupt = 0x14; - constexpr auto cExitInterrupt = 0x15; - constexpr auto cLastExitInterrupt = 0x16; - constexpr auto cCatalogOpen = 0x17; - constexpr auto cForkRead = 0x18; - constexpr auto cForkWrite = 0x19; - constexpr auto cCatalogClose = 0x20; - constexpr auto cCatalogRemove = 0x21; - constexpr auto cCatalogCreate = 0x22; - constexpr auto cRebootInterrupt = 0x23; - constexpr auto cShutdownInterrupt = 0x24; - constexpr auto cLPCSendMsg = 0x25; - constexpr auto cLPCOpenMsg = 0x26; - constexpr auto cLPCCloseMsg = 0x27; - constexpr auto cLPCSanitizeMsg = 0x28; - - kSyscalls[cSerialAlertInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { + constexpr auto cVGAWrite = 0x10; + constexpr auto cTlsInterrupt = 0x11; + constexpr auto cTlsInstallInterrupt = 0x12; + constexpr auto cNewInterrupt = 0x13; + constexpr auto cDeleteInterrupt = 0x14; + constexpr auto cExitInterrupt = 0x15; + constexpr auto cLastExitInterrupt = 0x16; + constexpr auto cCatalogOpen = 0x17; + constexpr auto cForkRead = 0x18; + constexpr auto cForkWrite = 0x19; + constexpr auto cCatalogClose = 0x20; + constexpr auto cCatalogRemove = 0x21; + constexpr auto cCatalogCreate = 0x22; + constexpr auto cRebootInterrupt = 0x23; + constexpr auto cShutdownInterrupt = 0x24; + constexpr auto cLPCSendMsg = 0x25; + constexpr auto cLPCOpenMsg = 0x26; + constexpr auto cLPCCloseMsg = 0x27; + constexpr auto cLPCSanitizeMsg = 0x28; + + kSyscalls[cVGAWrite].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { const char* msg = (const char*)rdx; - Kernel::kcout << "Kernel: " << msg << "\r"; + cg_write_text(msg, kTextOffsetY, 10, RGB(0x00, 0x00, 0x00)); + kTextOffsetY += 10; }; kSyscalls[cTlsInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { @@ -206,16 +215,16 @@ EXTERN_C void hal_init_platform( pow.Shutdown(); }; - kSyscalls[cSerialAlertInterrupt].Leak().Leak()->fHooked = true; - kSyscalls[cTlsInterrupt].Leak().Leak()->fHooked = true; - kSyscalls[cTlsInstallInterrupt].Leak().Leak()->fHooked = true; - kSyscalls[cDeleteInterrupt].Leak().Leak()->fHooked = true; - kSyscalls[cNewInterrupt].Leak().Leak()->fHooked = true; - kSyscalls[cExitInterrupt].Leak().Leak()->fHooked = true; - kSyscalls[cLastExitInterrupt].Leak().Leak()->fHooked = true; - kSyscalls[cShutdownInterrupt].Leak().Leak()->fHooked = true; - kSyscalls[cRebootInterrupt].Leak().Leak()->fHooked = true; - kSyscalls[cLPCSanitizeMsg].Leak().Leak()->fHooked = true; + kSyscalls[cVGAWrite].Leak().Leak()->fHooked = true; + kSyscalls[cTlsInterrupt].Leak().Leak()->fHooked = true; + kSyscalls[cTlsInstallInterrupt].Leak().Leak()->fHooked = true; + kSyscalls[cDeleteInterrupt].Leak().Leak()->fHooked = true; + kSyscalls[cNewInterrupt].Leak().Leak()->fHooked = true; + kSyscalls[cExitInterrupt].Leak().Leak()->fHooked = true; + kSyscalls[cLastExitInterrupt].Leak().Leak()->fHooked = true; + kSyscalls[cShutdownInterrupt].Leak().Leak()->fHooked = true; + kSyscalls[cRebootInterrupt].Leak().Leak()->fHooked = true; + kSyscalls[cLPCSanitizeMsg].Leak().Leak()->fHooked = true; // newoskrnl version 1.00. Kernel::StringView strVer(cMaxPropLen); diff --git a/Kernel/KernelKit/PE.hxx b/Kernel/KernelKit/PE.hxx index bcf325c6..2931410f 100644 --- a/Kernel/KernelKit/PE.hxx +++ b/Kernel/KernelKit/PE.hxx @@ -26,6 +26,7 @@ typedef struct ExecHeader final { + Kernel::UInt32 mSignature; Kernel::UInt16 mMachine; Kernel::UInt16 mNumberOfSections; Kernel::UInt32 mTimeDateStamp; @@ -33,7 +34,7 @@ typedef struct ExecHeader final Kernel::UInt32 mNumberOfSymbols; Kernel::UInt16 mSizeOfOptionalHeader; Kernel::UInt16 mCharacteristics; -} PACKED ExecHeader, *ExecHeaderPtr; +} ExecHeader, *ExecHeaderPtr; typedef struct ExecOptionalHeader final { @@ -67,7 +68,7 @@ typedef struct ExecOptionalHeader final Kernel::UInt32 mSizeOfHeapCommit; Kernel::UInt32 mLoaderFlags; Kernel::UInt32 mNumberOfRvaAndSizes; -} PACKED ExecOptionalHeader, *ExecOptionalHeaderPtr; +} ExecOptionalHeader, *ExecOptionalHeaderPtr; typedef struct ExecSectionHeader final { @@ -81,7 +82,7 @@ typedef struct ExecSectionHeader final Kernel::UInt16 mNumberOfRelocations; Kernel::UInt16 mNumberOfLinenumbers; Kernel::UInt32 mCharacteristics; -} ExecSectionHeader, *ExecSectionHeaderPtr; +} ExecSectionHeader, *ExecSectionHeaderPtr; enum kExecDataDirParams { @@ -104,7 +105,7 @@ typedef struct ExecExportDirectory Kernel::UInt32 mAddressOfFunctions; // export table rva Kernel::UInt32 mAddressOfNames; Kernel::UInt32 mAddressOfNameOrdinal; // ordinal table rva -} PACKED ExecExportDirectory, *ExecExportDirectoryPtr; +} ExecExportDirectory, *ExecExportDirectoryPtr; typedef struct ExecImportDirectory { @@ -116,7 +117,7 @@ typedef struct ExecImportDirectory Kernel::UInt32 mForwarderChain; Kernel::UInt32 mNameRva; Kernel::UInt32 mThunkTableRva; -} PACKED ExecImportDirectory, *ExecImportDirectoryPtr; +} ExecImportDirectory, *ExecImportDirectoryPtr; typedef struct ExecDataDirectory { Kernel::UInt32 VirtualAddress; @@ -124,7 +125,6 @@ typedef struct ExecDataDirectory { } ExecDataDirectory, *ExecDataDirectoryPtr; typedef struct ExecImageHeader { - Kernel::UInt32 mSignature; ExecHeader mHeader; ExecOptionalHeader mOptHdr; } ExecImageHeader, *ExecImageHeaderPtr; diff --git a/Kernel/amd64-efi.make b/Kernel/amd64-efi.make index fd2ecc55..bf41827b 100644 --- a/Kernel/amd64-efi.make +++ b/Kernel/amd64-efi.make @@ -5,7 +5,7 @@ CC = x86_64-w64-mingw32-g++ LD = x86_64-w64-mingw32-ld -CCFLAGS = -fshort-wchar -c -ffreestanding -fPIC -D__NEWOS_AMD64__ -mno-red-zone -fno-rtti -fno-exceptions \ +CCFLAGS = -fshort-wchar -c -ffreestanding -fPIC -shared -D__NEWOS_AMD64__ -mno-red-zone -fno-rtti -fno-exceptions \ -std=c++20 -D__NEWOS_SUPPORT_NX__ -I../Vendor -D__FSKIT_USE_NEWFS__ \ -D__NEWOSKRNL__ -D__HAVE_MAHROUSS_APIS__ -D__MAHROUSS__ -I./ -I../ @@ -35,7 +35,7 @@ COPY = cp ASMFLAGS = -f win64 # Kernel subsystem is 17 and entrypoint is __ImageStart -LDFLAGS = -e ke_startup_platform --subsystem=17 +LDFLAGS = -e ke_startup_platform --subsystem=17 --image-base 0x10000000 LDOBJ = Objects/*.obj # This file is the kernel, responsible of task management and memory. |
