summaryrefslogtreecommitdiffhomepage
path: root/dev/zka/src
diff options
context:
space:
mode:
authorAmlal <amlal@el-mahrouss-logic.com>2024-09-24 23:14:02 +0200
committerAmlal <amlal@el-mahrouss-logic.com>2024-09-24 23:14:02 +0200
commit8f62fbe30655e4d18837f196f01bb203126f474f (patch)
tree0b765ca18723524553ae10249d5dd9a9930abf5a /dev/zka/src
parentb6adb479cbd704600fcbf663325396b60f3e4439 (diff)
Refactor kernel refactors and worked on fixing the GPF on user mode switch.
TODO: Re-implement the mm_map_page function. Signed-off-by: Amlal <amlal@el-mahrouss-logic.com>
Diffstat (limited to 'dev/zka/src')
-rw-r--r--dev/zka/src/CodeMgr.cxx2
-rw-r--r--dev/zka/src/HardwareThreadScheduler.cxx2
-rw-r--r--dev/zka/src/UserProcessScheduler.cxx63
-rw-r--r--dev/zka/src/UserThreadScheduler.cxx49
4 files changed, 45 insertions, 71 deletions
diff --git a/dev/zka/src/CodeMgr.cxx b/dev/zka/src/CodeMgr.cxx
index 13bcd640..cc1d2059 100644
--- a/dev/zka/src/CodeMgr.cxx
+++ b/dev/zka/src/CodeMgr.cxx
@@ -22,7 +22,7 @@ namespace Kernel
UserProcess proc;
proc.SetImageStart(reinterpret_cast<VoidPtr>(main));
- proc.Kind = UserProcess::kExeKind;
+ proc.Kind = UserProcess::eExecutableKind;
proc.StackSize = kib_cast(32);
rt_set_memory(proc.Name, 0, kProcessLen);
diff --git a/dev/zka/src/HardwareThreadScheduler.cxx b/dev/zka/src/HardwareThreadScheduler.cxx
index 22a69b9b..ef04907d 100644
--- a/dev/zka/src/HardwareThreadScheduler.cxx
+++ b/dev/zka/src/HardwareThreadScheduler.cxx
@@ -159,7 +159,7 @@ namespace Kernel
fThreadList[idx].fKind = kHartBoot;
}
}
- else if (idx >= cMaxHWThreads)
+ else if (idx >= cMaxHartInsideSched)
{
static HardwareThread* fakeThread = nullptr;
return {fakeThread};
diff --git a/dev/zka/src/UserProcessScheduler.cxx b/dev/zka/src/UserProcessScheduler.cxx
index 88980f8d..9f0a5a3f 100644
--- a/dev/zka/src/UserProcessScheduler.cxx
+++ b/dev/zka/src/UserProcessScheduler.cxx
@@ -59,6 +59,12 @@ namespace Kernel
this->Exit(kErrorProcessFault);
}
+ //! @brief boolean operator, check status.
+ UserProcess::operator bool()
+ {
+ return this->Status != ProcessStatusKind::kDead;
+ }
+
/// @brief Gets the local last exit code.
/// @note Not thread-safe.
/// @return Int32 the last exit code.
@@ -83,8 +89,9 @@ namespace Kernel
}
/***********************************************************************************/
-
/** @brief Add pointer to entry. */
+ /***********************************************************************************/
+
VoidPtr UserProcess::New(const SizeT& sz)
{
#ifdef __ZKA_AMD64__
@@ -110,16 +117,19 @@ namespace Kernel
}
else
{
- auto entry = this->MemoryEntryList;
+ PROCESS_MEMORY_ENTRY* entry = this->MemoryEntryList;
PROCESS_MEMORY_ENTRY* prev_entry = nullptr;
while (!entry)
{
+ if (entry->MemoryEntry == nullptr)
+ break; // chose to break here, when we get an already allocated memory entry for our needs.
+
prev_entry = entry;
entry = entry->MemoryNext;
}
- entry->MemoryNext = new UserProcess::PROCESS_MEMORY_ENTRY();
+ entry->MemoryNext = new PROCESS_MEMORY_ENTRY();
entry->MemoryNext->MemoryEntry = ptr;
entry->MemoryNext->MemoryPrev = entry;
@@ -130,13 +140,18 @@ namespace Kernel
}
/***********************************************************************************/
-
/** @brief Free pointer from usage. */
+ /***********************************************************************************/
+
Boolean UserProcess::Delete(VoidPtr ptr, const SizeT& sz)
{
- auto entry = this->MemoryEntryList;
+ if (!ptr ||
+ sz == 0)
+ return No;
+
+ PROCESS_MEMORY_ENTRY* entry = this->MemoryEntryList;
- while (entry)
+ while (entry != nullptr)
{
if (entry->MemoryEntry == ptr)
{
@@ -149,7 +164,7 @@ namespace Kernel
return ret;
#else
- bool ret = mm_delete_heap(ptr);
+ Bool ret = mm_delete_heap(ptr);
return ret;
#endif
}
@@ -157,16 +172,16 @@ namespace Kernel
entry = entry->MemoryNext;
}
- return false;
+ return No;
}
- /// @brief UserProcess name getter.
+ /// @brief Gets the name of the current process..
const Char* UserProcess::GetProcessName() noexcept
{
return this->Name;
}
- /// @brief UserProcess user getter.
+ /// @brief Gets the owner of the process.
const User* UserProcess::GetOwner() noexcept
{
return this->Owner;
@@ -179,18 +194,22 @@ namespace Kernel
}
/***********************************************************************************/
-
/**
@brief Affinity is the time slot allowed for the process.
*/
+ /***********************************************************************************/
+
const AffinityKind& UserProcess::GetAffinity() noexcept
{
return this->Affinity;
}
+ /***********************************************************************************/
/**
- @brief Standard exit proc.
+ @brief Process exit method.
*/
+ /***********************************************************************************/
+
void UserProcess::Exit(const Int32& exit_code)
{
this->Status = ProcessStatusKind::kDead;
@@ -208,14 +227,14 @@ namespace Kernel
this->Image = nullptr;
this->StackFrame = nullptr;
- if (this->Kind == kDLLKind)
+ if (this->Kind == eExecutableDLLKind)
{
Bool success = false;
- rtl_fini_dll(this, this->DLLPtr, &success);
+ rtl_fini_dll(this, this->PefDLLDelegate, &success);
if (success)
{
- this->DLLPtr = nullptr;
+ this->PefDLLDelegate = nullptr;
}
}
@@ -251,14 +270,14 @@ namespace Kernel
}
// Create heap according to type of process.
- if (process.Kind == UserProcess::kDLLKind)
+ if (process.Kind == UserProcess::eExecutableDLLKind)
{
- process.DLLPtr = rtl_init_dll(&process);
+ process.PefDLLDelegate = rtl_init_dll(&process);
}
if (!process.Image)
{
- if (process.Kind != UserProcess::kDLLKind)
+ if (process.Kind != UserProcess::eExecutableDLLKind)
{
process.Crash();
return -kErrorProcessFault;
@@ -398,18 +417,20 @@ namespace Kernel
return No;
if (!process.Image &&
- process.Kind == UserProcess::kExeKind)
+ process.Kind == UserProcess::eExecutableKind)
return No;
return Yes;
}
+ /***********************************************************************************/
/**
* @brief Scheduler helper class.
*/
+ /***********************************************************************************/
EXTERN
- HardwareThreadScheduler* cHardwareThreadScheduler;
+ HardwareThreadScheduler* cHardwareThreadScheduler; //! @brief Ask linker for the hardware thread scheduler.
SizeT UserProcessHelper::StartScheduling()
{
@@ -429,11 +450,13 @@ namespace Kernel
return ret;
}
+ /***********************************************************************************/
/**
* \brief Does a context switch in a CPU.
* \param the_stack the stackframe of the running app.
* \param new_pid the process's PID.
*/
+ /***********************************************************************************/
Bool UserProcessHelper::Switch(VoidPtr image_ptr, UInt8* stack, HAL::StackFramePtr frame_ptr, const PID& new_pid)
{
diff --git a/dev/zka/src/UserThreadScheduler.cxx b/dev/zka/src/UserThreadScheduler.cxx
deleted file mode 100644
index 3fc9aee4..00000000
--- a/dev/zka/src/UserThreadScheduler.cxx
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * ========================================================
- *
- * newoskrnl
- * Copyright ZKA Technologies., all rights reserved.
- *
- * ========================================================
- */
-
-#include <NewKit/String.hxx>
-#include <CFKit/Property.hxx>
-#include <KernelKit/UserProcessScheduler.hxx>
-
-namespace Kernel
-{
- /// \brief UserProcess thread information header.
- struct USER_THREAD_BLOCK final
- {
- STATIC constexpr SizeT cMaxLen = 256;
-
- Char fName[cMaxLen] = {"THREAD #0 (PROCESS 0)"};
- ProcessStatusKind fThreadStatus;
- Int64 fThreadID;
- UserProcessPtr fProcess{nullptr};
- VoidPtr fCode{nullptr};
- VoidPtr fStack{nullptr};
- VoidPtr fData{nullptr};
-
- Void Exit() noexcept
- {
- this->fThreadStatus = ProcessStatusKind::kKilled;
- }
-
- VoidPtr GetStack() noexcept
- {
- return fStack;
- }
-
- VoidPtr GetData() noexcept
- {
- return fData;
- }
-
- VoidPtr GetPC() noexcept
- {
- return fCode;
- }
- };
-} // namespace Kernel