summaryrefslogtreecommitdiffhomepage
path: root/Private/KernelKit
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlalelmahrouss@icloud.com>2024-02-01 14:41:18 +0100
committerAmlal El Mahrouss <amlalelmahrouss@icloud.com>2024-02-01 14:45:34 +0100
commit4efd7b8a6608a9299ef8cc750c264a3be0cb12e7 (patch)
treed146ac34c2587274beecd602ca8f6064cd11e125 /Private/KernelKit
parent1bb395c7ceae7d06448e2ac6f60e91ffffe6b091 (diff)
HCR-9 : Update EFIKit, working on Volume API.
HCR-9 Related: - New EfiMountVolume, EfiUnmountVolume. Kernel Related: - Update Shared Object API, it was lacking a cleanup routine. - Add __mh_purecall as a C linked symbol for unknown symbols. Signed-off-by: Amlal El Mahrouss <amlalelmahrouss@icloud.com>
Diffstat (limited to 'Private/KernelKit')
-rw-r--r--Private/KernelKit/PEFSharedObject.hxx39
1 files changed, 19 insertions, 20 deletions
diff --git a/Private/KernelKit/PEFSharedObject.hxx b/Private/KernelKit/PEFSharedObject.hxx
index af90858e..263f08f4 100644
--- a/Private/KernelKit/PEFSharedObject.hxx
+++ b/Private/KernelKit/PEFSharedObject.hxx
@@ -16,10 +16,13 @@
#include <NewKit/Defines.hpp>
namespace HCore {
- /**
- * @brief Shared Library class
- * Load library from this class
- */
+/// @brief Pure implementation, missing method/function handler.
+extern "C" void __mh_purecall(void);
+
+/**
+ * @brief Shared Library class
+ * Load library from this class
+ */
class SharedObject final {
public:
struct SharedObjectTraits final {
@@ -44,9 +47,7 @@ class SharedObject final {
public:
void Mount(SharedObjectTraits *to_mount) {
- if (!to_mount ||
- !to_mount->fImageObject)
- return;
+ if (!to_mount || !to_mount->fImageObject) return;
fMounted = to_mount;
@@ -65,17 +66,18 @@ class SharedObject final {
};
template <typename SymbolType>
- SymbolType Load(const char *symbol_name) {
- auto ret = reinterpret_cast<SymbolType>(
- fLoader->FindSymbol(symbol_name, kPefCode));
+ 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;
- if (!ret)
- ret = reinterpret_cast<SymbolType>(
- fLoader->FindSymbol(symbol_name, kPefData));
+ auto ret =
+ reinterpret_cast<SymbolType>(fLoader->FindSymbol(symbol_name, kind));
- if (!ret)
- ret = reinterpret_cast<SymbolType>(
- fLoader->FindSymbol(symbol_name, kPefZero));
+ if (!ret) {
+ if (kind == kPefCode) return (VoidPtr)__mh_purecall;
+
+ return nullptr;
+ }
return ret;
}
@@ -84,10 +86,7 @@ class SharedObject final {
PEFLoader *fLoader{nullptr};
};
-inline void hcore_pure_call(void) {
- // virtual placeholder.
- return;
-}
+typedef SharedObject *SharedObjectPtr;
} // namespace HCore
#endif /* ifndef __KERNELKIT_SHARED_OBJECT_HXX__ */