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 | |
| 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>
| -rw-r--r-- | .vscode/c_cpp_properties.json | 1 | ||||
| -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 | ||||
| -rw-r--r-- | Kernel/FirmwareKit/EFI/API.hxx | 10 | ||||
| -rw-r--r-- | Kernel/KernelKit/PE.hxx | 4 | ||||
| -rw-r--r-- | Kernel/Sources/ThreadScheduler.cxx | 5 | ||||
| -rw-r--r-- | SCIKit/ReadMe.md | 3 | ||||
| -rw-r--r-- | SCIKit/SCIBase.hxx | 41 | ||||
| -rw-r--r-- | SCIKit/scm.internal.inl | 6 |
11 files changed, 73 insertions, 52 deletions
diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index b2e339e6..c15cd223 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -39,6 +39,7 @@ "__EFI_x86_64__", "__ATA_PIO__", "__NEWOS_AMD64__", + "__NEWOSLDR__", "__DEBUG__" ], "cStandard": "c17", 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 diff --git a/Kernel/FirmwareKit/EFI/API.hxx b/Kernel/FirmwareKit/EFI/API.hxx index 1466bdd1..7d06cf12 100644 --- a/Kernel/FirmwareKit/EFI/API.hxx +++ b/Kernel/FirmwareKit/EFI/API.hxx @@ -12,6 +12,8 @@ #include <KernelKit/MSDOS.hxx> #include <KernelKit/PE.hxx> +#define kNewOSSubsystem 17 + #ifdef __NEWOSLDR__ // forward decl. class BTextWriter; @@ -65,7 +67,7 @@ Bascially frees everything we have in the EFI side. inline UInt32 Platform() noexcept { - return kPEMachineAMD64; + return kPeMachineAMD64; } /*** @@ -105,12 +107,10 @@ inline void InitEFI(EfiSystemTable* SystemTable) noexcept ST->ConOut->EnableCursor(ST->ConOut, false); } -#ifdef __BOOTLOADER__ +#ifdef __NEWOSLDR__ #include <BootKit/Platform.hxx> -#endif // ifdef __BOOTLOADER__ - -#define kNewOSSubsystem 17 +#endif // ifdef __NEWOSLDR__ #endif /* ifndef __EFI_API__ */ diff --git a/Kernel/KernelKit/PE.hxx b/Kernel/KernelKit/PE.hxx index 2931410f..9d30fd8e 100644 --- a/Kernel/KernelKit/PE.hxx +++ b/Kernel/KernelKit/PE.hxx @@ -21,8 +21,8 @@ #define kMagPE32 0x010b #define kMagPE64 0x020b -#define kPEMachineAMD64 0x8664 -#define kPEMachineARM64 0xaa64 +#define kPeMachineAMD64 0x8664 +#define kPeMachineARM64 0xaa64 typedef struct ExecHeader final { diff --git a/Kernel/Sources/ThreadScheduler.cxx b/Kernel/Sources/ThreadScheduler.cxx new file mode 100644 index 00000000..b2d0b934 --- /dev/null +++ b/Kernel/Sources/ThreadScheduler.cxx @@ -0,0 +1,5 @@ +/* -------------------------------------------
+
+ Copyright ZKA Technologies
+
+------------------------------------------- */
\ No newline at end of file diff --git a/SCIKit/ReadMe.md b/SCIKit/ReadMe.md new file mode 100644 index 00000000..b5f76a9f --- /dev/null +++ b/SCIKit/ReadMe.md @@ -0,0 +1,3 @@ +# Official SCM implementation for New OS
+
+Read the specs for + information...
\ No newline at end of file diff --git a/SCIKit/SCIBase.hxx b/SCIKit/SCIBase.hxx index c685a081..8bc09afe 100644 --- a/SCIKit/SCIBase.hxx +++ b/SCIKit/SCIBase.hxx @@ -12,6 +12,8 @@ Purpose: SCIKit foundation header. #define IMPORT_CXX extern "C++"
#define IMPORT_C extern "C"
+#define OBJECT_PATH "\\::\\OBJDLL\\"
+
typedef bool Bool;
typedef void UInt0;
@@ -63,8 +65,8 @@ public: UnknownInterface(const UnknownInterface&) = default;
virtual SInt32 Release() = 0;
- virtual void DecrementRef() = 0;
- virtual UnknownInterface* IncrementRef() = 0;
+ virtual void RemoveRef() = 0;
+ virtual UnknownInterface* AddRef() = 0;
virtual VoidPtr QueryInterface(UUID* p_uuid) = 0;
};
@@ -82,8 +84,27 @@ public: };
#endif
+// ------------------------------------------------------------------------------------------ //
+/// @note Handle types.
+// ------------------------------------------------------------------------------------------ //
+
+typedef VoidPtr NEW_OBJECT;
+
+typedef NEW_OBJECT DLL_OBJECT;
+typedef NEW_OBJECT IO_OBJECT;
+typedef NEW_OBJECT COMP_OBJECT;
+
+// ------------------------------------------------------------------------------------------ //
+
+// ------------------------------------------------------------------------------------------ //
/// @note Part of NK loader API.
+// ------------------------------------------------------------------------------------------ //
+
+/// @brief Get function which is part of the DLL.
+/// @param symbol the symbol to look for
+/// @param dll_handle the DLL handle.
+/// @return the proc pointer.
IMPORT_C VoidPtr RtlGetDLLProc(const char* symbol, VoidPtr dll_handle);
/// @brief Open DLL handle.
@@ -113,21 +134,7 @@ IMPORT_C UInt0 RtlCloseFile(UInt64 file_desc); /// @brief Installs the TIB and GIB inside the current process.
/// @param none
/// @return > 0 error ocurred or already present, = 0 success.
-IMPORT_C UInt32 RtlInstallTIB(UInt0);
-
-/// @brief Asks for the process's own framebuffer. (Not a GPU one)
-/// @param flags
-/// @param fb_ptr
-/// @param fb_out_sz
-/// @return
-IMPORT_C UInt32 RtlRequestFB(SInt32* type, VoidPtr* fb_ptr, SizeT* fb_out_sz);
-
-enum
-{
- eFBGPU,
- eFBCPU,
- eFBInvalid,
-};
+IMPORT_C UInt32 RtlInstallInfoBlocks(UInt0);
/// @brief Allocate new SCM object.
/// @tparam TCLS the class type.
diff --git a/SCIKit/scm.internal.inl b/SCIKit/scm.internal.inl index 96210889..8a5a85fa 100644 --- a/SCIKit/scm.internal.inl +++ b/SCIKit/scm.internal.inl @@ -34,8 +34,8 @@ public: UnknownInterface(const UnknownInterface&) = default;
virtual SInt32 Release() = 0;
- virtual void DecrementRef() = 0;
- virtual UnknownInterface* IncrementRef() = 0;
+ virtual void RemoveRef() = 0;
+ virtual UnknownInterface* AddRef() = 0;
virtual VoidPtr QueryInterface(UUID* p_uuid) = 0;
};
@@ -78,7 +78,7 @@ public: virtual EventListenerInterface& operator +=(FnSign arg)
{
- this->AddEvent(arg);
+ this->AddEventListener(arg);
return *this;
}
};
|
