summaryrefslogtreecommitdiffhomepage
path: root/dev/zka/src/UserProcessScheduler.cxx
diff options
context:
space:
mode:
authorAmlal El Mahrouss <zka-holder@mahrouss-logic.com>2024-10-14 05:58:38 +0000
committerAmlal El Mahrouss <zka-holder@mahrouss-logic.com>2024-10-14 05:58:38 +0000
commit7ad3739afdfaa2466723467f5ef2526f171c87c3 (patch)
tree37775f4299281598b0f5121df4c188392daebd04 /dev/zka/src/UserProcessScheduler.cxx
parent7477a0f942c374b652da4f80cdb36d4661aac3c8 (diff)
parentd9d82713326069478e6dd212763d1fac15e65370 (diff)
Merge branch 'port-stage1-hello-world' into 'unstable'
IMP: Basic ARM64 port. See merge request mahrouss/zka-dev!20
Diffstat (limited to 'dev/zka/src/UserProcessScheduler.cxx')
-rw-r--r--dev/zka/src/UserProcessScheduler.cxx60
1 files changed, 42 insertions, 18 deletions
diff --git a/dev/zka/src/UserProcessScheduler.cxx b/dev/zka/src/UserProcessScheduler.cxx
index 0819e638..b5a2a998 100644
--- a/dev/zka/src/UserProcessScheduler.cxx
+++ b/dev/zka/src/UserProcessScheduler.cxx
@@ -242,12 +242,16 @@ namespace Kernel
{
if (memory_list->MemoryEntry)
{
+#ifdef __ZKA_AMD64__
auto pd = hal_read_cr3();
hal_write_cr3(reinterpret_cast<VoidPtr>(this->MemoryPD));
+#endif
MUST_PASS(mm_delete_heap(memory_list->MemoryEntry));
+#ifdef __ZKA_AMD64__
hal_write_cr3(pd);
+#endif
}
auto next = memory_list->MemoryNext;
@@ -271,7 +275,7 @@ namespace Kernel
this->Image = nullptr;
this->StackFrame = nullptr;
- if (this->Kind == eExecutableDLLKind)
+ if (this->Kind == kExectuableDLLKind)
{
Bool success = false;
rtl_fini_dll(this, this->PefDLLDelegate, &success);
@@ -317,14 +321,14 @@ namespace Kernel
}
// Create heap according to type of process.
- if (process.Kind == UserProcess::eExecutableDLLKind)
+ if (process.Kind == UserProcess::kExectuableDLLKind)
{
process.PefDLLDelegate = rtl_init_dll(&process);
}
if (!process.Image)
{
- if (process.Kind != UserProcess::eExecutableDLLKind)
+ if (process.Kind != UserProcess::kExectuableDLLKind)
{
process.Crash();
return -kErrorProcessFault;
@@ -378,12 +382,27 @@ namespace Kernel
{
// check if process is within range.
if (process_id > mTeam.AsArray().Count())
- return false;
+ return No;
mTeam.AsArray()[process_id].Status = ProcessStatusKind::kDead;
--mTeam.mProcessAmount;
- return true;
+ return Yes;
+ }
+
+ const Bool UserProcessScheduler::IsUser()
+ {
+ return Yes;
+ }
+
+ const Bool UserProcessScheduler::IsKernel()
+ {
+ return No;
+ }
+
+ const Bool UserProcessScheduler::HasMP()
+ {
+ return kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled;
}
/***********************************************************************************/
@@ -466,7 +485,7 @@ namespace Kernel
return No;
if (!process.Image &&
- process.Kind == UserProcess::eExecutableKind)
+ process.Kind == UserProcess::kExectuableKind)
return No;
return Yes;
@@ -474,27 +493,32 @@ namespace Kernel
/***********************************************************************************/
/**
- * @brief Scheduler helper class.
+ * @brief Allocate a scheduler.
*/
/***********************************************************************************/
- EXTERN
- HardwareThreadScheduler* cHardwareThreadScheduler; //! @brief Ask linker for the hardware thread scheduler.
-
- SizeT UserProcessHelper::StartScheduling()
+ Bool UserProcessHelper::InitializeScheduling()
{
- if (!cHardwareThreadScheduler)
- {
- cHardwareThreadScheduler = mm_new_class<HardwareThreadScheduler>();
- MUST_PASS(cHardwareThreadScheduler);
- }
-
if (!cProcessScheduler)
{
cProcessScheduler = mm_new_class<UserProcessScheduler>();
- MUST_PASS(cProcessScheduler);
+ return cProcessScheduler;
}
+ return No;
+ }
+
+ /***********************************************************************************/
+ /**
+ * @brief Start the scheduler.
+ */
+ /***********************************************************************************/
+
+ SizeT UserProcessHelper::StartScheduling()
+ {
+ if (!cProcessScheduler)
+ return 0;
+
SizeT ret = cProcessScheduler->Run();
return ret;
}