summaryrefslogtreecommitdiffhomepage
path: root/Private/KernelKit/PEFSharedObject.hxx
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-01-31 19:36:16 +0100
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-01-31 19:36:16 +0100
commit8621867b0e4b38dedc8556e6c483e3575d776af0 (patch)
treeae8e9d271db301dc3f9433b909cd80636a8196e5 /Private/KernelKit/PEFSharedObject.hxx
parent8f7904569a60721cfd051a359dd17cc86ea67cfe (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.hxx93
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__ */