summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'dev/kernel')
-rw-r--r--dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc12
-rw-r--r--dev/kernel/HALKit/ARM64/HalKernelMain.cc23
-rw-r--r--dev/kernel/KernelKit/UserProcessScheduler.h25
-rw-r--r--dev/kernel/KernelKit/UserProcessScheduler.inl4
-rw-r--r--dev/kernel/src/UserProcessScheduler.cc26
5 files changed, 64 insertions, 26 deletions
diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
index 7114f9f7..7dce21d1 100644
--- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
+++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
@@ -26,7 +26,7 @@ EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp)
process.Leak().Signal.SignalArg = rsp;
process.Leak().Signal.SignalID = SIGKILL;
- process.Leak().Signal.PreviousStatus = process.Leak().Status;
+ process.Leak().Signal.Status = process.Leak().Status;
Kernel::kout << "Kernel: SIGKILL status.\r";
@@ -51,7 +51,7 @@ EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp)
process.Leak().Signal.SignalArg = rsp;
process.Leak().Signal.SignalID = SIGKILL;
- process.Leak().Signal.PreviousStatus = process.Leak().Status;
+ process.Leak().Signal.Status = process.Leak().Status;
process.Leak().Status = Kernel::ProcessStatusKind::kKilled;
@@ -101,7 +101,7 @@ EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp)
process.Leak().Signal.SignalArg = rsp;
process.Leak().Signal.SignalID = SIGKILL;
- process.Leak().Signal.PreviousStatus = process.Leak().Status;
+ process.Leak().Signal.Status = process.Leak().Status;
Kernel::kout << "Kernel: SIGKILL status.\r";
@@ -125,7 +125,7 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp)
process.Leak().Signal.SignalArg = rsp;
process.Leak().Signal.SignalID = SIGKILL;
- process.Leak().Signal.PreviousStatus = process.Leak().Status;
+ process.Leak().Signal.Status = process.Leak().Status;
Kernel::kout << "Kernel: SIGKILL status.\r";
@@ -154,7 +154,7 @@ EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip)
process.Leak().Signal.SignalArg = rip;
process.Leak().Signal.SignalID = SIGTRAP;
- process.Leak().Signal.PreviousStatus = process.Leak().Status;
+ process.Leak().Signal.Status = process.Leak().Status;
Kernel::kout << "Kernel: SIGTRAP status.\r";
@@ -176,7 +176,7 @@ EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp)
process.Leak().Signal.SignalArg = rsp;
process.Leak().Signal.SignalID = SIGKILL;
- process.Leak().Signal.PreviousStatus = process.Leak().Status;
+ process.Leak().Signal.Status = process.Leak().Status;
Kernel::kout << "Kernel: SIGKILL status.\r";
diff --git a/dev/kernel/HALKit/ARM64/HalKernelMain.cc b/dev/kernel/HALKit/ARM64/HalKernelMain.cc
index d9f3eb85..3498d477 100644
--- a/dev/kernel/HALKit/ARM64/HalKernelMain.cc
+++ b/dev/kernel/HALKit/ARM64/HalKernelMain.cc
@@ -48,7 +48,30 @@ EXTERN_C void hal_init_platform(
Kernel::mp_initialize_gic();
+ /// after the scheduler runs, we must look over teams, every 5000s in order to schedule every process according to their affinity fairly.
+
+ auto constexpr kSchedTeamSwitchMS = 5U; /// @brief Team switch time in milliseconds.
+
+ Kernel::HardwareTimer timer(rtl_milliseconds(kSchedTeamSwitchMS));
+
+ STATIC Kernel::Array<UserProcessTeam, kSchedTeamCount> kTeams;
+
+ SizeT team_index = 0U;
+
+ /// @brief This just loops over the teams and switches between them.
+ /// @details Not even round-robin, just a simple loop in this boot core we're at.
while (YES)
{
+ if (team_index > (kSchedTeamCount - 1))
+ {
+ team_index = 0U;
+ }
+
+ while (!UserProcessScheduler::The().SwitchTeam(kTeams[team_index]))
+ ;
+
+ timer.Wait();
+
+ ++team_index;
}
}
diff --git a/dev/kernel/KernelKit/UserProcessScheduler.h b/dev/kernel/KernelKit/UserProcessScheduler.h
index ec16a0e2..3811a2e2 100644
--- a/dev/kernel/KernelKit/UserProcessScheduler.h
+++ b/dev/kernel/KernelKit/UserProcessScheduler.h
@@ -67,26 +67,39 @@ namespace Kernel
SizeT MemoryLimit{kSchedMaxMemoryLimit};
SizeT UsedMemory{0UL};
- struct USER_HEAP_LIST final
+ struct USER_HEAP_TREE final
{
VoidPtr MemoryEntry{nullptr};
SizeT MemoryEntrySize{0UL};
SizeT MemoryEntryPad{0UL};
- struct USER_HEAP_LIST* MemoryPrev{nullptr};
- struct USER_HEAP_LIST* MemoryNext{nullptr};
+ enum
+ {
+ kInvalidMemory = 0,
+ kRedMemory = 100,
+ kBlackMemory = 101,
+ kCountMemory = 2,
+ };
+
+ Int32 MemoryColor{kBlackMemory};
+
+ struct USER_HEAP_TREE* MemoryParent{nullptr};
+ struct USER_HEAP_TREE* MemoryChild{nullptr};
+
+ struct USER_HEAP_TREE* MemoryPrev{nullptr};
+ struct USER_HEAP_TREE* MemoryNext{nullptr};
};
struct USER_PROCESS_SIGNAL final
{
UIntPtr SignalArg;
- ProcessStatusKind PreviousStatus;
+ ProcessStatusKind Status;
UIntPtr SignalID;
};
USER_PROCESS_SIGNAL Signal;
- USER_HEAP_LIST* ProcessMemoryHeap{nullptr};
- UserProcessTeam* ProcessParentTeam;
+ USER_HEAP_TREE* HeapTree{nullptr};
+ UserProcessTeam* ParentTeam;
VoidPtr VMRegister{0UL};
diff --git a/dev/kernel/KernelKit/UserProcessScheduler.inl b/dev/kernel/KernelKit/UserProcessScheduler.inl
index e31b5462..63cdc795 100644
--- a/dev/kernel/KernelKit/UserProcessScheduler.inl
+++ b/dev/kernel/KernelKit/UserProcessScheduler.inl
@@ -23,13 +23,13 @@ namespace Kernel
if (!ptr)
return No;
- if (!this->ProcessMemoryHeap)
+ if (!this->HeapTree)
{
kout << "USER_PROCESS's heap is empty.\r";
return No;
}
- USER_HEAP_LIST* entry = this->ProcessMemoryHeap;
+ USER_HEAP_TREE* entry = this->HeapTree;
while (entry != nullptr)
{
diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc
index 7aded611..cdf7d91f 100644
--- a/dev/kernel/src/UserProcessScheduler.cc
+++ b/dev/kernel/src/UserProcessScheduler.cc
@@ -121,21 +121,21 @@ namespace Kernel
auto ptr = mm_new_heap(sz, Yes, Yes, pad_amount);
#endif
- if (!this->ProcessMemoryHeap)
+ if (!this->HeapTree)
{
- this->ProcessMemoryHeap = new USER_HEAP_LIST();
+ this->HeapTree = new USER_HEAP_TREE();
- this->ProcessMemoryHeap->MemoryEntryPad = pad_amount;
- this->ProcessMemoryHeap->MemoryEntrySize = sz;
+ this->HeapTree->MemoryEntryPad = pad_amount;
+ this->HeapTree->MemoryEntrySize = sz;
- this->ProcessMemoryHeap->MemoryEntry = ptr;
+ this->HeapTree->MemoryEntry = ptr;
- this->ProcessMemoryHeap->MemoryPrev = nullptr;
- this->ProcessMemoryHeap->MemoryNext = nullptr;
+ this->HeapTree->MemoryPrev = nullptr;
+ this->HeapTree->MemoryNext = nullptr;
}
else
{
- USER_HEAP_LIST* entry = this->ProcessMemoryHeap;
+ USER_HEAP_TREE* entry = this->HeapTree;
while (entry)
{
@@ -145,8 +145,10 @@ namespace Kernel
entry = entry->MemoryNext;
}
- entry->MemoryNext = new USER_HEAP_LIST();
+ entry->MemoryNext = new USER_HEAP_TREE();
entry->MemoryNext->MemoryEntry = ptr;
+ entry->MemoryEntrySize = sz;
+ entry->MemoryEntryPad = pad_amount;
entry->MemoryNext->MemoryPrev = entry;
entry->MemoryNext->MemoryNext = nullptr;
@@ -206,7 +208,7 @@ namespace Kernel
kLastExitCode = exit_code;
- auto memory_heap_list = this->ProcessMemoryHeap;
+ auto memory_heap_list = this->HeapTree;
#ifdef __NE_VIRTUAL_MEMORY_SUPPORT__
auto pd = hal_read_cr3();
@@ -277,7 +279,7 @@ namespace Kernel
this->ProcessId = 0UL;
this->Status = ProcessStatusKind::kFinished;
- --this->ProcessParentTeam->mProcessCount;
+ --this->ParentTeam->mProcessCount;
}
/***********************************************************************************/
@@ -390,7 +392,7 @@ namespace Kernel
HAL::mm_map_page((VoidPtr)process.StackReserve, process.StackReserve, flags);
#endif // ifdef __NE_VIRTUAL_MEMORY_SUPPORT__
- process.ProcessParentTeam = &mTeam;
+ process.ParentTeam = &mTeam;
process.ProcessId = pid;
process.Status = ProcessStatusKind::kStarting;