summaryrefslogtreecommitdiffhomepage
path: root/Private/KernelKit
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-01-28 19:29:01 +0100
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-01-28 19:29:42 +0100
commitf06d0703a5813841f5a6dacd294c5cfbe9394037 (patch)
treeb6626ef96cd0fe290e889054c8a934e04d556eef /Private/KernelKit
parent4a789fd64c44e38ed0c3d9fb597e62afd17a337d (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.hpp2
-rw-r--r--Private/KernelKit/ProcessManager.hpp2
-rw-r--r--Private/KernelKit/SharedObjectCore.hxx114
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__ */