diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-01-31 19:36:16 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-01-31 19:36:16 +0100 |
| commit | 8621867b0e4b38dedc8556e6c483e3575d776af0 (patch) | |
| tree | ae8e9d271db301dc3f9433b909cd80636a8196e5 /Private/KernelKit/PEFSharedObject.hxx | |
| parent | 8f7904569a60721cfd051a359dd17cc86ea67cfe (diff) | |
Kernel: Many improvements done to the kernel and it's HAL and protocols.
Will implement BFileReader on next commit.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'Private/KernelKit/PEFSharedObject.hxx')
| -rw-r--r-- | Private/KernelKit/PEFSharedObject.hxx | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/Private/KernelKit/PEFSharedObject.hxx b/Private/KernelKit/PEFSharedObject.hxx new file mode 100644 index 00000000..af90858e --- /dev/null +++ b/Private/KernelKit/PEFSharedObject.hxx @@ -0,0 +1,93 @@ +/* + * ======================================================== + * + * HCore + * Copyright Mahrouss Logic, all rights reserved. + * + * ======================================================== + */ + +#ifndef __KERNELKIT_SHARED_OBJECT_HXX__ +#define __KERNELKIT_SHARED_OBJECT_HXX__ + +#include <KernelKit/Loader.hpp> +#include <KernelKit/PEF.hpp> +#include <KernelKit/PEFCodeManager.hxx> +#include <NewKit/Defines.hpp> + +namespace HCore { + /** + * @brief Shared Library class + * Load library from this class + */ +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) { + 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 <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_HXX__ */ |
