From f06d0703a5813841f5a6dacd294c5cfbe9394037 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sun, 28 Jan 2024 19:29:01 +0100 Subject: Kernel: Update SPECIFICATION.TXT, Implement Shared objects primitives. Kernel: Working on EFI reimplementation. Signed-off-by: Amlal El Mahrouss --- Private/KernelKit/SharedObjectCore.hxx | 114 ++++++++++++++++++++++----------- 1 file changed, 76 insertions(+), 38 deletions(-) (limited to 'Private/KernelKit/SharedObjectCore.hxx') 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 +#include "CodeManager.hpp" +#include "PEF.hpp" #include +#include 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 - 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 SymbolType Load(const char *symbol_name) + { + auto ret = reinterpret_cast(fLoader->FindSymbol(symbol_name, kPefCode)); + + if (!ret) + ret = reinterpret_cast(fLoader->FindSymbol(symbol_name, kPefData)); + + if (!ret) + ret = reinterpret_cast(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__ */ -- cgit v1.2.3