summaryrefslogtreecommitdiffhomepage
path: root/dev/Kernel/src/UserProcessScheduler.cc
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-12-30 20:56:19 +0100
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-12-30 20:56:19 +0100
commite02c25872a51595954da9eb33a321a7d7ed7e5d2 (patch)
treed3fff54b2ff74a5916d0f1b270ec2e8dfa490b79 /dev/Kernel/src/UserProcessScheduler.cc
parent224e747b04022a5b8f8577fd730e907febf90a75 (diff)
IMPL: Process scheduler and bit map mgr fixes.
- Finally got it working, at least before execution, need to fix the VMMgr now. Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev/Kernel/src/UserProcessScheduler.cc')
-rw-r--r--dev/Kernel/src/UserProcessScheduler.cc52
1 files changed, 27 insertions, 25 deletions
diff --git a/dev/Kernel/src/UserProcessScheduler.cc b/dev/Kernel/src/UserProcessScheduler.cc
index b00779e9..831acf42 100644
--- a/dev/Kernel/src/UserProcessScheduler.cc
+++ b/dev/Kernel/src/UserProcessScheduler.cc
@@ -12,6 +12,7 @@
/// @brief Low level/Ring-3 process scheduler.
/***********************************************************************************/
+#include "HALKit/AMD64/Processor.h"
#include <KernelKit/UserProcessScheduler.h>
#include <KernelKit/HardwareThreadScheduler.h>
#include <KernelKit/IPEFDLLObject.h>
@@ -281,46 +282,46 @@ namespace Kernel
ProcessID UserProcessScheduler::Spawn(UserProcess* process)
{
- if (!process ||
- !process->Image.HasCode())
- {
- return kProcessInvalidID;
- }
-
#ifdef __ZKA_AMD64__
- process->VMRegister = mm_new_heap(sizeof(PDE), No, Yes);
+ process->VMRegister = new PDE();
if (!process->VMRegister)
{
process->Crash();
- return -kErrorProcessFault;
+ return kErrorProcessFault;
}
-#endif // __ZKA_AMD64__
- kcout << "Create VMRegister for: " << process->Name << endl;
+ UInt32 flags = HAL::kMMFlagsPresent;
+ flags |= HAL::kMMFlagsWr;
+ flags |= HAL::kMMFlagsUser;
+
+ HAL::mm_map_page((VoidPtr)process->VMRegister, flags);
+#endif // __ZKA_AMD64__
- process->StackFrame = reinterpret_cast<HAL::StackFramePtr>(mm_new_heap(sizeof(HAL::StackFrame), Yes, Yes));
+ process->StackFrame = new HAL::StackFrame();
if (!process->StackFrame)
{
process->Crash();
- return -kErrorProcessFault;
+ return kErrorProcessFault;
}
- kcout << "Create StackFrame for: " << process->Name << endl;
+ flags = HAL::kMMFlagsPresent;
+ flags |= HAL::kMMFlagsWr;
+ flags |= HAL::kMMFlagsUser;
+
+ HAL::mm_map_page((VoidPtr)process->StackFrame, flags);
- // Create heap according to type of process->
+ // Create heap according to type of process.
if (process->Kind == UserProcess::kExectuableDLLKind)
{
process->DylibDelegate = rtl_init_dylib(process);
MUST_PASS(process->DylibDelegate);
-
- kcout << "Created DylibDelegate for process: " << process->Name << endl;
}
process->StackReserve = new UInt8[process->StackSize];
- UInt32 flags = HAL::kMMFlagsPresent;
+ flags = HAL::kMMFlagsPresent;
flags |= HAL::kMMFlagsWr;
flags |= HAL::kMMFlagsUser;
@@ -332,12 +333,14 @@ namespace Kernel
return -kErrorProcessFault;
}
- kcout << "Created StackReserve for process: " << process->Name << endl;
-
ProcessID pid = this->mTeam.mProcessCount;
- if (pid > kSchedProcessLimitPerTeam)
- return kProcessInvalidID;
+ if (pid > kSchedProcessLimitPerTeam &&
+ pid != (kSchedProcessLimitPerTeam + 1))
+ {
+ this->mTeam.mProcessCount = 0;
+ pid = 0UL;
+ }
++this->mTeam.mProcessCount;
@@ -347,11 +350,10 @@ namespace Kernel
process->Status = ProcessStatusKind::kStarting;
process->PTime = (UIntPtr)AffinityKind::kStandard;
- kcout << "Process Name: " << process->Name << endl;
- kcout << "PID: " << number(process->ProcessId) << endl;
-
this->mTeam.mProcessList.Assign(pid, process);
+ kcout << "PID: " << number(process->ProcessId) << endl;
+
return process->ProcessId;
}
@@ -412,7 +414,7 @@ namespace Kernel
SizeT process_index = 0; //! we store this guy to tell the scheduler how many
//! things we have scheduled.
- if (mTeam.mProcessList.Empty())
+ if (mTeam.mProcessCount < 1)
{
kcout << "UserProcessScheduler::Run(): This team doesn't have any process!\r";
return 0;