summaryrefslogtreecommitdiffhomepage
path: root/Private/Source
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/Source
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/Source')
-rw-r--r--Private/Source/CodeManager.cxx202
-rw-r--r--Private/Source/ProcessManager.cxx14
-rw-r--r--Private/Source/RuntimeMain.cxx9
-rw-r--r--Private/Source/SharedObject.cxx42
4 files changed, 156 insertions, 111 deletions
diff --git a/Private/Source/CodeManager.cxx b/Private/Source/CodeManager.cxx
index 1928683b..f1c6840e 100644
--- a/Private/Source/CodeManager.cxx
+++ b/Private/Source/CodeManager.cxx
@@ -7,138 +7,156 @@
* ========================================================
*/
-#include <KernelKit/FileManager.hpp>
+#include "NewKit/Defines.hpp"
+#include "NewKit/Panic.hpp"
#include <KernelKit/CodeManager.hpp>
#include <KernelKit/DebugOutput.hpp>
+#include <KernelKit/FileManager.hpp>
#include <KernelKit/ProcessManager.hpp>
+#include <NewKit/ErrorID.hpp>
#include <NewKit/KHeap.hpp>
-#include <NewKit/String.hpp>
#include <NewKit/OwnPtr.hpp>
-#include <NewKit/ErrorID.hpp>
+#include <NewKit/String.hpp>
namespace hCore
{
- namespace Detail
- {
- UInt32 rt_get_pef_platform(void) noexcept
- {
+namespace Detail
+{
+UInt32 rt_get_pef_platform(void) noexcept
+{
#ifdef __32x0__
- return kPefArch32x0;
+ return kPefArch32x0;
#elif defined(__64x0__)
- return kPefArch64x0;
+ return kPefArch64x0;
#elif defined(__x86_64__)
- return kPefArchAMD64;
+ return kPefArchAMD64;
#else
- return kPefArchInvalid;
+ return kPefArchInvalid;
#endif // __POWER || __x86_64__
- }
- }
+}
+} // namespace Detail
- PEFLoader::PEFLoader(const char* path)
- : fCachedBlob(nullptr), fBad(false)
- {
- OwnPtr<FileStream<char>> file;
-
- file.New(const_cast<Char*>(path));
+PEFLoader::PEFLoader(const VoidPtr blob) : fCachedBlob(nullptr)
+{
+ fCachedBlob = blob;
+ fBad = false;
- if (StringBuilder::Equals(file->MIME(), this->MIME()))
- {
- fPath = StringBuilder::Construct(path).Leak();
-
- fCachedBlob = file->ReadAll();
-
- PEFContainer* container = reinterpret_cast<PEFContainer*>(fCachedBlob);
-
- auto fFree = [&]() -> void {
- kcout << "CodeManager: Warning: Bad executable, program will not be started!\n";
- fBad = true;
-
- kernel_delete_ptr(fCachedBlob);
-
- fCachedBlob = nullptr;
- };
-
- if (container->Cpu == Detail::rt_get_pef_platform() &&
- container->Magic[0] == kPefMagic[0] &&
- container->Magic[1] == kPefMagic[1] &&
- container->Magic[2] == kPefMagic[2] &&
- container->Abi == kPefAbi)
- {
- if (container->Kind != kPefKindObject &&
- container->Kind != kPefKindDebug)
- {
- kcout << "CodeManager: Info: Good executable. can proceed.\n";
- return;
- }
- }
+ MUST_PASS(fCachedBlob);
+}
- fFree();
- }
- }
+PEFLoader::PEFLoader(const char *path) : fCachedBlob(nullptr), fBad(false)
+{
+ OwnPtr<FileStream<char>> file;
- PEFLoader::~PEFLoader()
- {
- if (fCachedBlob)
- kernel_delete_ptr(fCachedBlob);
- }
+ file.New(const_cast<Char *>(path));
- VoidPtr PEFLoader::FindSymbol(const char* name, Int32 kind)
+ if (StringBuilder::Equals(file->MIME(), this->MIME()))
{
- if (!fCachedBlob ||
- fBad)
- return nullptr;
+ fPath = StringBuilder::Construct(path).Leak();
- PEFContainer* container = reinterpret_cast<PEFContainer*>(fCachedBlob);
+ fCachedBlob = file->ReadAll();
- PEFCommandHeader* container_header = reinterpret_cast<PEFCommandHeader*>((UIntPtr)fCachedBlob + sizeof(PEFContainer));
+ PEFContainer *container = reinterpret_cast<PEFContainer *>(fCachedBlob);
- for (SizeT index = 0; index < container->Count; ++index)
- {
- kcout << "Iterating over container at index: " << StringBuilder::FromInt("%", index) << ", name: " << container_header->Name << "\n";
+ auto fFree = [&]() -> void {
+ kcout << "CodeManager: Warning: Bad executable, program will not be started!\n";
+ fBad = true;
- if (StringBuilder::Equals(container_header->Name, name))
- {
- kcout << "Found potential container, checking for validity.\n";
+ kernel_delete_ptr(fCachedBlob);
- if (container_header->Kind == kind)
- return static_cast<UIntPtr*>(fCachedBlob) + container_header->Offset;
+ fCachedBlob = nullptr;
+ };
- continue;
+ if (container->Cpu == Detail::rt_get_pef_platform() && container->Magic[0] == kPefMagic[0] &&
+ container->Magic[1] == kPefMagic[1] && container->Magic[2] == kPefMagic[2] && container->Abi == kPefAbi)
+ {
+ if (container->Kind != kPefKindObject && container->Kind != kPefKindDebug)
+ {
+ kcout << "CodeManager: Info: Good executable. can proceed.\n";
+ return;
}
}
- return nullptr;
+ fFree();
}
+}
- ErrorOr<VoidPtr> PEFLoader::LoadStart()
- {
- if (auto sym = this->FindSymbol("__start", kPefCode); sym)
- return ErrorOr<VoidPtr>(sym);
+PEFLoader::~PEFLoader()
+{
+ if (fCachedBlob)
+ kernel_delete_ptr(fCachedBlob);
+}
- return ErrorOr<VoidPtr>(H_EXEC_ERROR);
- }
+VoidPtr PEFLoader::FindSymbol(const char *name, Int32 kind)
+{
+ if (!fCachedBlob || fBad)
+ return nullptr;
+
+ PEFContainer *container = reinterpret_cast<PEFContainer *>(fCachedBlob);
- bool PEFLoader::IsLoaded() noexcept { return !fBad && fCachedBlob; }
+ PEFCommandHeader *container_header =
+ reinterpret_cast<PEFCommandHeader *>((UIntPtr)fCachedBlob + sizeof(PEFContainer));
- namespace Utils
+ for (SizeT index = 0; index < container->Count; ++index)
{
- bool execute_from_image(PEFLoader& exec) noexcept
- {
- auto errOrStart = exec.LoadStart();
+ kcout << "Iterating over container at index: " << StringBuilder::FromInt("%", index)
+ << ", name: " << container_header->Name << "\n";
- if (errOrStart.Error() != 0)
- return false;
+ if (StringBuilder::Equals(container_header->Name, name))
+ {
+ kcout << "Found potential container, checking for validity.\n";
- Process proc(errOrStart.Leak().Leak());
- Ref<Process> refProc = proc;
+ if (container_header->Kind == kind)
+ return static_cast<UIntPtr *>(fCachedBlob) + container_header->Offset;
- return ProcessManager::Shared().Leak().Add(refProc);
+ continue;
}
}
- const char* PEFLoader::Path() { return fPath.Leak().CData(); }
+ return nullptr;
+}
+
+ErrorOr<VoidPtr> PEFLoader::LoadStart()
+{
+ if (auto sym = this->FindSymbol("__start", kPefCode); sym)
+ return ErrorOr<VoidPtr>(sym);
+
+ return ErrorOr<VoidPtr>(H_EXEC_ERROR);
+}
+
+bool PEFLoader::IsLoaded() noexcept
+{
+ return !fBad && fCachedBlob;
+}
+
+namespace Utils
+{
+bool execute_from_image(PEFLoader &exec) noexcept
+{
+ auto errOrStart = exec.LoadStart();
+
+ if (errOrStart.Error() != 0)
+ return false;
- const char* PEFLoader::Format() { return "PEF"; }
+ Process proc(errOrStart.Leak().Leak());
+ Ref<Process> refProc = proc;
- const char* PEFLoader::MIME() { return "application/x-exec"; }
+ return ProcessManager::Shared().Leak().Add(refProc);
+}
+} // namespace Utils
+
+const char *PEFLoader::Path()
+{
+ return fPath.Leak().CData();
+}
+
+const char *PEFLoader::Format()
+{
+ return "PEF";
+}
+
+const char *PEFLoader::MIME()
+{
+ return "application/x-exec";
+}
} // namespace hCore
diff --git a/Private/Source/ProcessManager.cxx b/Private/Source/ProcessManager.cxx
index 4679daff..664a1c7c 100644
--- a/Private/Source/ProcessManager.cxx
+++ b/Private/Source/ProcessManager.cxx
@@ -25,6 +25,10 @@
namespace hCore
{
+/***********************************************************************************/
+/// Exit Code stuff
+/***********************************************************************************/
+
static Int32 kExitCode = 0;
const Int32 &rt_get_exit_code() noexcept
@@ -32,9 +36,11 @@ const Int32 &rt_get_exit_code() noexcept
return kExitCode;
}
+/***********************************************************************************/
+
void Process::Crash()
{
- kcout << this->Name << ": Crashed.";
+ kcout << this->Name << ": Crashed\n";
this->Exit(-1);
}
@@ -43,6 +49,8 @@ void Process::Wake(const bool should_wakeup)
this->Status = should_wakeup ? ProcessStatus::kRunning : ProcessStatus::kFrozen;
}
+/***********************************************************************************/
+
VoidPtr Process::New(const SizeT &sz)
{
if (this->FreeMemory < 1)
@@ -65,6 +73,8 @@ VoidPtr Process::New(const SizeT &sz)
return nullptr;
}
+/***********************************************************************************/
+
/* @brief checks if runtime pointer is in region. */
bool rt_in_pool_region(VoidPtr pool_ptr, VoidPtr pool, const SizeT &sz)
{
@@ -122,6 +132,8 @@ const ProcessStatus &Process::GetStatus()
return this->Status;
}
+/***********************************************************************************/
+
/**
@brief Affinity is the time slot allowed for the process.
*/
diff --git a/Private/Source/RuntimeMain.cxx b/Private/Source/RuntimeMain.cxx
index 4b91bb5f..210a5c43 100644
--- a/Private/Source/RuntimeMain.cxx
+++ b/Private/Source/RuntimeMain.cxx
@@ -13,14 +13,15 @@
#include <KernelKit/FileManager.hpp>
#include <NewKit/Json.hpp>
-extern void (*__SYSTEM_INIT_END)();
-extern void (**init)();
+/// PRIVATE SYMBOLS EXPORTED BY GCC.
+extern "C" void (*__SYSTEM_FINI)();
+extern "C" void (**__SYSTEM_INIT)();
extern "C" void RuntimeMain()
{
- for (hCore::SizeT index_init = 0UL; init[index_init] != __SYSTEM_INIT_END; ++index_init)
+ for (hCore::SizeT index_init = 0UL; __SYSTEM_INIT[index_init] != __SYSTEM_FINI; ++index_init)
{
- init[index_init]();
+ __SYSTEM_INIT[index_init]();
}
MUST_PASS(hCore::init_hal());
diff --git a/Private/Source/SharedObject.cxx b/Private/Source/SharedObject.cxx
index 154fe0ed..a6ccc224 100644
--- a/Private/Source/SharedObject.cxx
+++ b/Private/Source/SharedObject.cxx
@@ -1,41 +1,55 @@
-/*
-* ========================================================
-*
-* hCore
-* Copyright 2024 Mahrouss Logic, all rights reserved.
-*
-* ========================================================
-*/
+/*
+ * ========================================================
+ *
+ * hCore
+ * Copyright 2024 Mahrouss Logic, all rights reserved.
+ *
+ * ========================================================
+ */
#include <KernelKit/DebugOutput.hpp>
+#include <KernelKit/PEF.hpp>
#include <KernelKit/ProcessManager.hpp>
-#include <KernelKit/ThreadLocalStorage.hxx>
#include <KernelKit/SharedObjectCore.hxx>
+#include <KernelKit/ThreadLocalStorage.hxx>
+#include <NewKit/Defines.hpp>
using namespace hCore;
/***********************************************************************************/
-extern "C" SharedObject* __LibMain(VoidPtr image)
+extern "C" SharedObject *__LibMain(VoidPtr image)
{
/***********************************************************************************/
/* Allocate new library to be added to the lookup table. */
/***********************************************************************************/
- SharedObject* library = hcore_tls_new_class<SharedObject>();
+ SharedObject *library = hcore_tls_new_class<SharedObject>();
if (!library)
{
- kcout << "__LibMain: out of memory!\n";
+ kcout << "__LibMain: Out of Memory!\n";
ProcessManager::Shared().Leak().GetCurrent().Leak().Crash();
+
return nullptr;
}
library->Mount(hcore_tls_new_class<SharedObject::SharedObjectTraits>());
- kcout << "__LibMain: Done allocate DSO.\n";
+ if (!library->Get())
+ {
+ kcout << "__LibMain: Out of Memory!\n";
+ ProcessManager::Shared().Leak().GetCurrent().Leak().Crash();
+
+ return nullptr;
+ }
+
+ library->Get()->fImageObject = ProcessManager::Shared().Leak().GetCurrent().Leak().Image;
+ library->Get()->fImageEntrypointOffset = library->Load<VoidPtr>(kPefStart);
+
+ kcout << "__LibMain: Done allocating Shared Library...\n";
return library;
}
-/***********************************************************************************/ \ No newline at end of file
+/***********************************************************************************/