summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/HALKit
diff options
context:
space:
mode:
Diffstat (limited to 'dev/kernel/HALKit')
-rw-r--r--dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc12
-rw-r--r--dev/kernel/HALKit/ARM64/HalKernelMain.cc23
2 files changed, 29 insertions, 6 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;
}
}