diff options
| author | Amlal EL Mahrouss <amlalelmahrouss@icloud.com> | 2024-08-13 13:00:12 +0200 |
|---|---|---|
| committer | Amlal EL Mahrouss <amlalelmahrouss@icloud.com> | 2024-08-13 15:25:57 +0200 |
| commit | 7efcf975fe61b2d20d2379f6151b6cdd99391dff (patch) | |
| tree | ed592c2c2b1c626874d4c64e9a2dea23c20f52d5 /Boot | |
| parent | 1913550ab89eb39e53ab61a164766a75d7897202 (diff) | |
[IMP] Add WIP Thread scheduler inside kernel DLL.
[META] PE loader: Fix uneven macros inside PE.hxx.
[FIX] Add more checks to Thread loader inside bootloader for PE32+
[IMP] Refactor KernelLoader to Thread inside loader EXE.
Signed-off-by: Amlal EL Mahrouss <amlalelmahrouss@icloud.com>
Diffstat (limited to 'Boot')
| -rw-r--r-- | Boot/BootKit/Thread.hxx (renamed from Boot/BootKit/KernelLoader.hxx) | 17 | ||||
| -rw-r--r-- | Boot/Sources/HEL/AMD64/BootMain.cxx | 6 | ||||
| -rw-r--r-- | Boot/Sources/Thread.cxx (renamed from Boot/Sources/KernelLoader.cxx) | 28 | ||||
| -rw-r--r-- | Boot/amd64-efi.make | 4 |
4 files changed, 30 insertions, 25 deletions
diff --git a/Boot/BootKit/KernelLoader.hxx b/Boot/BootKit/Thread.hxx index 3c98a238..6303eb35 100644 --- a/Boot/BootKit/KernelLoader.hxx +++ b/Boot/BootKit/Thread.hxx @@ -14,20 +14,20 @@ namespace Boot { using namespace Kernel; - class KernelLoader; + class Thread; /// @brief Program loader class /// @package nl.zeta.boot.api - class KernelLoader final + class Thread final { public: - explicit KernelLoader() = delete; - ~KernelLoader() = default; + explicit Thread() = delete; + ~Thread() = default; - explicit KernelLoader(Kernel::VoidPtr blob); + explicit Thread(Kernel::VoidPtr blob); - KernelLoader& operator=(const KernelLoader&) = default; - KernelLoader(const KernelLoader&) = default; + Thread& operator=(const Thread&) = default; + Thread(const Thread&) = default; void Start(HEL::HandoverInformationHeader* handover); const char* GetName(); @@ -35,8 +35,7 @@ namespace Boot bool IsValid(); private: - Char fBlobName[255]; - Char* fHeapForProgram{nullptr}; + Char fBlobName[255] = { "Boot Thread" }; VoidPtr fStartAddress{nullptr}; VoidPtr fBlob{nullptr}; }; diff --git a/Boot/Sources/HEL/AMD64/BootMain.cxx b/Boot/Sources/HEL/AMD64/BootMain.cxx index f35c13ff..ffbab88a 100644 --- a/Boot/Sources/HEL/AMD64/BootMain.cxx +++ b/Boot/Sources/HEL/AMD64/BootMain.cxx @@ -16,7 +16,7 @@ #include <KernelKit/PEF.hxx> #include <NewKit/Macros.hxx> #include <NewKit/Ref.hxx> -#include <BootKit/KernelLoader.hxx> +#include <BootKit/Thread.hxx> #include <cstring> // make the compiler shut up. @@ -223,7 +223,7 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, readerKernel.ReadAll(0); - Boot::KernelLoader* loader = nullptr; + Boot::Thread* loader = nullptr; // ------------------------------------------ // // If we succeed in reading the blob, then execute it. @@ -231,7 +231,7 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, if (readerKernel.Blob()) { - loader = new Boot::KernelLoader(readerKernel.Blob()); + loader = new Boot::Thread(readerKernel.Blob()); loader->SetName("\"newoskrnl.dll\" (64-bit SMP DLL)"); } diff --git a/Boot/Sources/KernelLoader.cxx b/Boot/Sources/Thread.cxx index aaabddc3..51d10fda 100644 --- a/Boot/Sources/KernelLoader.cxx +++ b/Boot/Sources/Thread.cxx @@ -4,7 +4,7 @@ ------------------------------------------- */ -#include <BootKit/KernelLoader.hxx> +#include <BootKit/Thread.hxx> #include <BootKit/Support.hxx> #include <BootKit/BootKit.hxx> #include <FirmwareKit/EFI/API.hxx> @@ -26,7 +26,7 @@ EXTERN EfiBootServices* BS; namespace Boot { - KernelLoader::KernelLoader(VoidPtr blob) + Thread::Thread(VoidPtr blob) : fBlob(blob), fStartAddress(nullptr) { // detect the format. @@ -43,17 +43,24 @@ namespace Boot if (firstBytes[0] == kMagMz0 && firstBytes[1] == kMagMz1) { - writer.Write("newosldr: PE32+ executable detected.\r"); - ExecHeaderPtr hdrPtr = ldr_find_exec_header(firstBytes); ExecOptionalHeaderPtr optHdr = ldr_find_opt_exec_header(firstBytes); - if (hdrPtr->mMachine != 0x8664 && - hdrPtr->mSignature != 0x20b) + if (hdrPtr->mMachine != kPeMachineAMD64 || + hdrPtr->mSignature != kPeMagic) { + writer.Write("newosldr: Not a PE32+ executable.\r"); return; } + if (optHdr->mSubsystem != kNewOSSubsystem) + { + writer.Write("newosldr: Not a New OS executable.\r"); + return; + } + + writer.Write("newosldr: PE32+ executable detected (New OS Subsystem).\r"); + auto numSecs = hdrPtr->mNumberOfSections; writer.Write("newosldr: Major Linker Ver: ").Write(optHdr->mMajorLinkerVersion).Write("\r"); @@ -92,7 +99,6 @@ namespace Boot { UInt64 HandoverMagic; UInt32 HandoverType; - }* structHandover = (struct HANDOVER_INFORMATION_STUB*)((UIntPtr)fBlob + sect->mPointerToRawData); if (structHandover->HandoverMagic != kHandoverMagic || @@ -128,7 +134,7 @@ namespace Boot } /// @note handover header has to be valid! - Void KernelLoader::Start(HEL::HandoverInformationHeader* handover) + Void Thread::Start(HEL::HandoverInformationHeader* handover) { BTextWriter writer; @@ -152,17 +158,17 @@ namespace Boot err_fn(handover); } - const Char* KernelLoader::GetName() + const Char* Thread::GetName() { return fBlobName; } - Void KernelLoader::SetName(const Char* name) + Void Thread::SetName(const Char* name) { CopyMem(fBlobName, name, StrLen(name)); } - bool KernelLoader::IsValid() + bool Thread::IsValid() { return fStartAddress != nullptr; } diff --git a/Boot/amd64-efi.make b/Boot/amd64-efi.make index ef2dae46..5bd422c4 100644 --- a/Boot/amd64-efi.make +++ b/Boot/amd64-efi.make @@ -45,8 +45,8 @@ 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../Kernel -c -nostdlib -fno-rtti -fno-exceptions \ - -std=c++20 -D__HAVE_MAHROUSS_APIS__ -D__NEWOS_AMD64__ -D__MAHROUSS__ -D__BOOTLOADER__ -I../ + -DEFI_FUNCTION_WRAPPER -I./ -I../Vendor -I../Kernel -I../ -c -nostdlib -fno-rtti -fno-exceptions \ + -std=c++20 -D__HAVE_MAHROUSS_APIS__ -D__NEWOS_AMD64__ -D__MAHROUSS__ BOOT_LOADER=newosldr.exe KERNEL=newoskrnl.dll |
