From ff94ce367f7f23e3a78f157f9420c480a4d7f9aa Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 26 Aug 2024 04:07:14 +0200 Subject: [IMP] DLLInterface class and also reworked SCI's API. [IMP] Handover now gives the kernel image, for the OS. Signed-off-by: Amlal El Mahrouss --- dev/ZKA/KernelKit/CodeManager.hxx | 2 +- dev/ZKA/KernelKit/DLLInterface.hxx | 44 +++++++++++++ dev/ZKA/KernelKit/PEFDLLInterface.hxx | 105 +++++++++++++++++++++++++++++ dev/ZKA/KernelKit/PEFSharedObject.hxx | 117 --------------------------------- dev/ZKA/KernelKit/ProcessScheduler.hxx | 5 +- dev/ZKA/KernelKit/RLE.hxx | 15 ----- dev/ZKA/KernelKit/User.hxx | 3 - 7 files changed, 152 insertions(+), 139 deletions(-) create mode 100644 dev/ZKA/KernelKit/DLLInterface.hxx create mode 100644 dev/ZKA/KernelKit/PEFDLLInterface.hxx delete mode 100644 dev/ZKA/KernelKit/PEFSharedObject.hxx delete mode 100644 dev/ZKA/KernelKit/RLE.hxx (limited to 'dev/ZKA/KernelKit') diff --git a/dev/ZKA/KernelKit/CodeManager.hxx b/dev/ZKA/KernelKit/CodeManager.hxx index a1fea211..b551815e 100644 --- a/dev/ZKA/KernelKit/CodeManager.hxx +++ b/dev/ZKA/KernelKit/CodeManager.hxx @@ -16,7 +16,7 @@ #include #include -#include +#include namespace Kernel { diff --git a/dev/ZKA/KernelKit/DLLInterface.hxx b/dev/ZKA/KernelKit/DLLInterface.hxx new file mode 100644 index 00000000..370363b7 --- /dev/null +++ b/dev/ZKA/KernelKit/DLLInterface.hxx @@ -0,0 +1,44 @@ +/* + * ======================================================== + * + * Kernel + * Copyright ZKA Technologies., all rights reserved. + * + * ======================================================== + */ + +#pragma once + +#include + +namespace Kernel +{ + class DLLInterface + { + public: + explicit DLLInterface() = default; + virtual ~DLLInterface() = default; + + struct DLL_TRAITS final + { + VoidPtr fImageObject{nullptr}; + VoidPtr fImageEntrypointOffset{nullptr}; + + Bool IsValid() + { + return fImageObject && fImageEntrypointOffset; + } + }; + + ZKA_COPY_DEFAULT(DLLInterface); + + virtual DLL_TRAITS** GetAddressOf() = 0; + virtual DLL_TRAITS* Get() = 0; + + virtual void Mount(DLL_TRAITS* to_mount) = 0; + virtual void Unmount() = 0; + }; + + /// @brief Pure implementation, missing method/function handler. + EXTERN_C void __zka_pure_call(void); +} // namespace Kernel diff --git a/dev/ZKA/KernelKit/PEFDLLInterface.hxx b/dev/ZKA/KernelKit/PEFDLLInterface.hxx new file mode 100644 index 00000000..3c0187f1 --- /dev/null +++ b/dev/ZKA/KernelKit/PEFDLLInterface.hxx @@ -0,0 +1,105 @@ +/* + * ======================================================== + * + * Kernel + * Copyright ZKA Technologies., all rights reserved. + * + * ======================================================== + */ + +#ifndef __KERNELKIT_SHARED_OBJECT_HXX__ +#define __KERNELKIT_SHARED_OBJECT_HXX__ + +#include +#include +#include +#include + +namespace Kernel +{ + /** + * @brief Shared Library class + * Load library from this class + */ + class PEFDLLInterface final : public DLLInterface + { + public: + explicit PEFDLLInterface() = default; + ~PEFDLLInterface() = default; + + public: + ZKA_COPY_DEFAULT(PEFDLLInterface); + + private: + DLL_TRAITS* fMounted{nullptr}; + + public: + DLL_TRAITS** GetAddressOf() + { + return &fMounted; + } + + DLL_TRAITS* Get() + { + return fMounted; + } + + public: + void Mount(DLL_TRAITS* to_mount) + { + if (!to_mount || !to_mount->fImageObject) + return; + + fMounted = to_mount; + + if (fLoader && to_mount) + { + delete fLoader; + fLoader = nullptr; + } + + if (!fLoader) + { + fLoader = new PEFLoader(fMounted->fImageObject); + } + } + + void Unmount() + { + if (fMounted) + fMounted = nullptr; + }; + + template + SymbolType Load(const Char* symbol_name, SizeT len, Int32 kind) + { + if (symbol_name == nullptr || *symbol_name == 0) + return nullptr; + if (len > kPathLen || len < 1) + return nullptr; + + auto ret = + reinterpret_cast(fLoader->FindSymbol(symbol_name, kind)); + + if (!ret) + { + if (kind == kPefCode) + return (VoidPtr)__zka_pure_call; + + return nullptr; + } + + return ret; + } + + private: + PEFLoader* fLoader{nullptr}; + }; + + typedef PEFDLLInterface* DLLInterfacePtr; + + EXTERN_C DLLInterfacePtr rtl_init_shared_object(PROCESS_HEADER_BLOCK* header); + EXTERN_C Void rtl_fini_shared_object(PROCESS_HEADER_BLOCK* header, DLLInterfacePtr lib, Bool* successful); +} // namespace Kernel + +#endif /* ifndef __KERNELKIT_SHARED_OBJECT_HXX__ */ diff --git a/dev/ZKA/KernelKit/PEFSharedObject.hxx b/dev/ZKA/KernelKit/PEFSharedObject.hxx deleted file mode 100644 index 48b70508..00000000 --- a/dev/ZKA/KernelKit/PEFSharedObject.hxx +++ /dev/null @@ -1,117 +0,0 @@ -/* - * ======================================================== - * - * Kernel - * Copyright ZKA Technologies., all rights reserved. - * - * ======================================================== - */ - -#ifndef __KERNELKIT_SHARED_OBJECT_HXX__ -#define __KERNELKIT_SHARED_OBJECT_HXX__ - -#include -#include -#include -#include - -namespace Kernel -{ - /// @brief Pure implementation, missing method/function handler. - extern "C" void __mh_purecall(void); - - /** - * @brief Shared Library class - * Load library from this class - */ - class PEFSharedObjectInterface final - { - public: - struct PEF_SHARED_OBJECT_TRAITS final - { - VoidPtr fImageObject{nullptr}; - VoidPtr fImageEntrypointOffset{nullptr}; - - Bool IsValid() { return fImageObject && fImageEntrypointOffset; } - }; - - public: - explicit PEFSharedObjectInterface() = default; - ~PEFSharedObjectInterface() = default; - - public: - ZKA_COPY_DEFAULT(PEFSharedObjectInterface); - - private: - PEF_SHARED_OBJECT_TRAITS* fMounted{nullptr}; - - public: - PEF_SHARED_OBJECT_TRAITS** GetAddressOf() - { - return &fMounted; - } - - PEF_SHARED_OBJECT_TRAITS* Get() - { - return fMounted; - } - - public: - void Mount(PEF_SHARED_OBJECT_TRAITS* to_mount) - { - if (!to_mount || !to_mount->fImageObject) - return; - - fMounted = to_mount; - - if (fLoader && to_mount) - { - delete fLoader; - fLoader = nullptr; - } - - if (!fLoader) - { - fLoader = new PEFLoader(fMounted->fImageObject); - } - } - - void Unmount() - { - if (fMounted) - fMounted = nullptr; - }; - - template - SymbolType Load(const Char* symbol_name, SizeT len, Int32 kind) - { - if (symbol_name == nullptr || *symbol_name == 0) - return nullptr; - if (len > kPathLen || len < 1) - return nullptr; - - auto ret = - reinterpret_cast(fLoader->FindSymbol(symbol_name, kind)); - - if (!ret) - { - if (kind == kPefCode) - return (VoidPtr)__mh_purecall; - - return nullptr; - } - - return ret; - } - - private: - PEFLoader* fLoader{nullptr}; - }; - - typedef PEFSharedObjectInterface* SharedObjectPtr; - - EXTERN_C SharedObjectPtr rtl_init_shared_object(PROCESS_HEADER_BLOCK* header); - EXTERN_C Void rtl_fini_shared_object(PROCESS_HEADER_BLOCK* header, SharedObjectPtr lib, Bool* successful); -} // namespace Kernel - -#endif /* ifndef __KERNELKIT_SHARED_OBJECT_HXX__ */ diff --git a/dev/ZKA/KernelKit/ProcessScheduler.hxx b/dev/ZKA/KernelKit/ProcessScheduler.hxx index 5df9d369..1f70158b 100644 --- a/dev/ZKA/KernelKit/ProcessScheduler.hxx +++ b/dev/ZKA/KernelKit/ProcessScheduler.hxx @@ -29,7 +29,7 @@ namespace Kernel //! @brief Forward declarations. struct PROCESS_HEADER_BLOCK; - class PEFSharedObjectInterface; + class PEFDLLInterface; class ProcessTeam; class ProcessScheduler; class ProcessHelper; @@ -157,8 +157,7 @@ namespace Kernel HeapPtrKind HeapPtr{nullptr}; // shared library handle, reserved for kSharedObjectKind types of executables only. - PEFSharedObjectInterface* DLLPtr{nullptr}; - + PEFDLLInterface* DLLPtr{nullptr}; PROCESS_HEADER_BLOCK* Parent{nullptr}; // Memory usage. diff --git a/dev/ZKA/KernelKit/RLE.hxx b/dev/ZKA/KernelKit/RLE.hxx deleted file mode 100644 index 31e37619..00000000 --- a/dev/ZKA/KernelKit/RLE.hxx +++ /dev/null @@ -1,15 +0,0 @@ -/* ------------------------------------------- - - Copyright ZKA Technologies. - -------------------------------------------- */ - -#ifndef __KERNELKIT_RLE_HXX__ -#define __KERNELKIT_RLE_HXX__ - -#include - -EXTERN_C void rle_compress(void* data, long sz, void* out, long out_sz); -EXTERN_C void rle_decompress(void* data, long sz, void* out, long out_sz); - -#endif // !ifndef __KERNELKIT_RLE_HXX__ diff --git a/dev/ZKA/KernelKit/User.hxx b/dev/ZKA/KernelKit/User.hxx index a7f8fc02..d8f81fd7 100644 --- a/dev/ZKA/KernelKit/User.hxx +++ b/dev/ZKA/KernelKit/User.hxx @@ -27,7 +27,6 @@ namespace Kernel { - class UserManager; class User; enum class RingKind @@ -74,8 +73,6 @@ namespace Kernel RingKind fRing{RingKind::kRingStdUser}; Char fUserName[kMaxUserNameLen] = { 0 }; Char fUserToken[kMaxUserTokenLen] = { 0 }; - - friend UserManager; }; } // namespace Kernel -- cgit v1.2.3