diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-01-28 19:29:01 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-01-28 19:29:42 +0100 |
| commit | f06d0703a5813841f5a6dacd294c5cfbe9394037 (patch) | |
| tree | b6626ef96cd0fe290e889054c8a934e04d556eef /Private/KernelKit | |
| parent | 4a789fd64c44e38ed0c3d9fb597e62afd17a337d (diff) | |
Kernel: Update SPECIFICATION.TXT, Implement Shared objects primitives.
Kernel: Working on EFI reimplementation.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'Private/KernelKit')
| -rw-r--r-- | Private/KernelKit/CodeManager.hpp | 2 | ||||
| -rw-r--r-- | Private/KernelKit/ProcessManager.hpp | 2 | ||||
| -rw-r--r-- | Private/KernelKit/SharedObjectCore.hxx | 114 |
3 files changed, 79 insertions, 39 deletions
diff --git a/Private/KernelKit/CodeManager.hpp b/Private/KernelKit/CodeManager.hpp index 5aa35a5b..66c8ca45 100644 --- a/Private/KernelKit/CodeManager.hpp +++ b/Private/KernelKit/CodeManager.hpp @@ -10,6 +10,7 @@ #ifndef _INC_CODE_MANAGER_ #define _INC_CODE_MANAGER_ +#include "NewKit/Defines.hpp" #include <KernelKit/PEF.hpp> #include <NewKit/ErrorOr.hpp> #include <NewKit/String.hpp> @@ -26,6 +27,7 @@ class PEFLoader : public Loader explicit PEFLoader() = delete; public: + explicit PEFLoader(const VoidPtr blob); explicit PEFLoader(const char *path); ~PEFLoader() override; diff --git a/Private/KernelKit/ProcessManager.hpp b/Private/KernelKit/ProcessManager.hpp index cc96a18c..8f3e04a5 100644 --- a/Private/KernelKit/ProcessManager.hpp +++ b/Private/KernelKit/ProcessManager.hpp @@ -123,7 +123,7 @@ class Process final public: void AssignStart(UIntPtr &imageStart) noexcept; - private: + public: Char Name[kProcessLen] = {"hCore Process"}; ProcessSubsystem SubSystem; ProcessSelector Selector; diff --git a/Private/KernelKit/SharedObjectCore.hxx b/Private/KernelKit/SharedObjectCore.hxx index 94b0ead2..07b261d0 100644 --- a/Private/KernelKit/SharedObjectCore.hxx +++ b/Private/KernelKit/SharedObjectCore.hxx @@ -10,48 +10,86 @@ #ifndef __KERNELKIT_SHARED_OBJECT_CORE_HXX__ #define __KERNELKIT_SHARED_OBJECT_CORE_HXX__ -#include <NewKit/Defines.hpp> +#include "CodeManager.hpp" +#include "PEF.hpp" #include <KernelKit/Loader.hpp> +#include <NewKit/Defines.hpp> namespace hCore { - class SharedObject final - { - public: - struct SharedObjectTraits final - { - VoidPtr fImageObject; - VoidPtr fImageEntrypointOffset; - }; - - public: - explicit SharedObject() = default; - ~SharedObject() = default; - - public: - HCORE_COPY_DEFAULT(SharedObject); - - private: - SharedObjectTraits* fMounted{ nullptr }; - - public: - SharedObjectTraits** GetAddressOf() { return &fMounted; } - SharedObjectTraits* Get() { return fMounted; } - - public: - void Mount(SharedObjectTraits* to_mount) { fMounted = to_mount; } - void Unmount() { if (fMounted) fMounted = nullptr; }; - - template <typename SymbolType> - SymbolType Load(const char* symbol_name); - - }; - - inline void hcore_pure_call(void) - { - // virtual placeholder. - return; - } +class SharedObject final +{ + public: + struct SharedObjectTraits final + { + VoidPtr fImageObject; + VoidPtr fImageEntrypointOffset; + }; + + public: + explicit SharedObject() = default; + ~SharedObject() = default; + + public: + HCORE_COPY_DEFAULT(SharedObject); + + private: + SharedObjectTraits *fMounted{nullptr}; + + public: + SharedObjectTraits **GetAddressOf() + { + return &fMounted; + } + SharedObjectTraits *Get() + { + return fMounted; + } + + public: + void Mount(SharedObjectTraits *to_mount) + { + 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 <typename SymbolType> SymbolType Load(const char *symbol_name) + { + auto ret = reinterpret_cast<SymbolType>(fLoader->FindSymbol(symbol_name, kPefCode)); + + if (!ret) + ret = reinterpret_cast<SymbolType>(fLoader->FindSymbol(symbol_name, kPefData)); + + if (!ret) + ret = reinterpret_cast<SymbolType>(fLoader->FindSymbol(symbol_name, kPefZero)); + + return ret; + } + + private: + PEFLoader *fLoader{nullptr}; +}; + +inline void hcore_pure_call(void) +{ + // virtual placeholder. + return; } +} // namespace hCore #endif /* ifndef __KERNELKIT_SHARED_OBJECT_CORE_HXX__ */ |
