summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'dev/kernel')
-rw-r--r--dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc35
-rw-r--r--dev/kernel/HALKit/AMD64/HalInterruptAPI.asm10
-rw-r--r--dev/kernel/HALKit/AMD64/HalKernelMain.cc6
-rw-r--r--dev/kernel/KernelKit/CoreProcessScheduler.h4
-rw-r--r--dev/kernel/src/HardwareThreadScheduler.cc2
-rw-r--r--dev/kernel/src/UserProcessScheduler.cc18
6 files changed, 33 insertions, 42 deletions
diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
index 2c2bf5ff..ff283141 100644
--- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
+++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
@@ -9,16 +9,12 @@
#include <NewKit/KString.h>
#include <SignalKit/Signals.h>
-STATIC BOOL kIsScheduling = NO;
-
EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip);
/// @brief Handle GPF fault.
/// @param rsp
EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp) {
- auto process = Kernel::UserProcessScheduler::The().CurrentProcess();
-
- kIsScheduling = NO;
+ auto& process = Kernel::UserProcessScheduler::The().CurrentProcess();
Kernel::kout << "Kernel: General Protection Fault.\r";
@@ -36,9 +32,7 @@ EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp) {
/// @brief Handle page fault.
/// @param rsp
EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) {
- auto process = Kernel::UserProcessScheduler::The().CurrentProcess();
-
- kIsScheduling = NO;
+ auto& process = Kernel::UserProcessScheduler::The().CurrentProcess();
Kernel::kout << "Kernel: Page Fault.\r";
Kernel::kout << "Kernel: SIGKILL\r";
@@ -55,20 +49,13 @@ EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) {
/// @brief Handle scheduler interrupt.
EXTERN_C void idt_handle_scheduler(Kernel::UIntPtr rsp) {
NE_UNUSED(rsp);
-
- Kernel::kout << "Kernel: Scheduler interrupt.\r";
-
- kIsScheduling = YES;
Kernel::UserProcessHelper::StartScheduling();
- kIsScheduling = NO;
}
/// @brief Handle math fault.
/// @param rsp
EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) {
- auto process = Kernel::UserProcessScheduler::The().CurrentProcess();
-
- kIsScheduling = NO;
+ auto& process = Kernel::UserProcessScheduler::The().CurrentProcess();
Kernel::kout << "Kernel: Math error (division by zero?).\r";
@@ -86,11 +73,10 @@ EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) {
/// @brief Handle any generic fault.
/// @param rsp
EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) {
- auto process = Kernel::UserProcessScheduler::The().CurrentProcess();
-
- kIsScheduling = NO;
+ auto& process = Kernel::UserProcessScheduler::The().CurrentProcess();
- Kernel::kout << "Kernel: Generic Process Fault.\r";
+ (Void)(Kernel::kout << "Kernel: Process RSP: " << Kernel::hex_number(rsp) << Kernel::kendl);
+ Kernel::kout << "Kernel: Access Process Fault.\r";
process.Leak().Signal.SignalArg = rsp;
process.Leak().Signal.SignalID = SIGKILL;
@@ -104,11 +90,10 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) {
}
EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) {
- auto process = Kernel::UserProcessScheduler::The().CurrentProcess();
-
- kIsScheduling = NO;
+ auto& process = Kernel::UserProcessScheduler::The().CurrentProcess();
(Void)(Kernel::kout << "Kernel: Process RIP: " << Kernel::hex_number(rip) << Kernel::kendl);
+
Kernel::kout << "Kernel: SIGTRAP\r";
process.Leak().Signal.SignalArg = rip;
@@ -124,9 +109,9 @@ EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) {
/// @brief Handle #UD fault.
/// @param rsp
EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) {
- auto process = Kernel::UserProcessScheduler::The().CurrentProcess();
+ NE_UNUSED(rsp);
- kIsScheduling = NO;
+ auto& process = Kernel::UserProcessScheduler::The().CurrentProcess();
Kernel::kout << "Kernel: Undefined Opcode.\r";
diff --git a/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm b/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm
index 60a20b77..189b2976 100644
--- a/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm
+++ b/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm
@@ -164,7 +164,6 @@ __NE_INT_8:
cld
mov al, 0x20
- out 0xA0, al
out 0x20, al
push rcx
@@ -185,7 +184,6 @@ __NE_INT_13:
cld
mov al, 0x20
- out 0xA0, al
out 0x20, al
push rcx
@@ -200,7 +198,6 @@ __NE_INT_14:
cld
mov al, 0x20
- out 0xA0, al
out 0x20, al
push rcx
@@ -235,13 +232,16 @@ IntNormal 31
[extern kApicBaseAddress]
__NE_INT_32:
+ mov al, 0x20
+ out 0x20, al
+
+ mov dword [kApicBaseAddress+0xB0], 0
+
push rax
mov rcx, rsp
call idt_handle_scheduler
pop rax
- mov dword [kApicBaseAddress+0xB0], 0
-
o64 iret
IntNormal 33
diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc
index 722c9cb5..b7ff3038 100644
--- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc
+++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc
@@ -106,9 +106,9 @@ EXTERN_C Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) {
EXTERN_C void rtl_ne_task(void);
EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept {
- Kernel::rtl_create_user_process(rtl_ne_task, "NeTask");
- Kernel::rtl_create_user_process(rtl_ne_task, "NeTask#2");
- Kernel::rtl_create_user_process(rtl_ne_task, "NeTask#3");
+ Kernel::rtl_create_user_process(rtl_ne_task, "MGMTCTL");
+ Kernel::rtl_create_user_process(rtl_ne_task, "LAUNCHCTL");
+ Kernel::rtl_create_user_process(rtl_ne_task, "SECURITYCTL");
Kernel::HAL::Register64 idt_reg;
idt_reg.Base = reinterpret_cast<Kernel::UIntPtr>(kInterruptVectorTable);
diff --git a/dev/kernel/KernelKit/CoreProcessScheduler.h b/dev/kernel/KernelKit/CoreProcessScheduler.h
index f9d11459..6cb17261 100644
--- a/dev/kernel/KernelKit/CoreProcessScheduler.h
+++ b/dev/kernel/KernelKit/CoreProcessScheduler.h
@@ -128,8 +128,8 @@ enum class ProcessStatusKind : Int32 {
//! @brief Affinity is the amount of nano-seconds this process is going to run.
/***********************************************************************************/
enum class AffinityKind : Int32 {
- kRealTime = 500,
- kVeryHigh = 250,
+ kRealTime = 50,
+ kVeryHigh = 150,
kHigh = 200,
kStandard = 1000,
kLowUsage = 1500,
diff --git a/dev/kernel/src/HardwareThreadScheduler.cc b/dev/kernel/src/HardwareThreadScheduler.cc
index 1df5ad7a..6cb83b3d 100644
--- a/dev/kernel/src/HardwareThreadScheduler.cc
+++ b/dev/kernel/src/HardwareThreadScheduler.cc
@@ -105,6 +105,8 @@ Void HardwareThread::Wake(const bool wakeup) noexcept {
/// @retval false stack is invalid, previous code is running.
/***********************************************************************************/
Bool HardwareThread::Switch(HAL::StackFramePtr frame, const ThreadID& pid) {
+ if (this->IsBusy()) return NO;
+
this->fStack = frame;
this->fPID = pid;
diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc
index 24869d63..fe1a95ae 100644
--- a/dev/kernel/src/UserProcessScheduler.cc
+++ b/dev/kernel/src/UserProcessScheduler.cc
@@ -491,7 +491,7 @@ SizeT UserProcessScheduler::Run() noexcept {
continue;
}
- kout << process.Name << " is being scheduled to run...\r";
+ kout << ((*process.Name) ? process.Name : "USER_PROCESS") << " will be scheduled...\r";
this->CurrentProcess() = process;
@@ -499,17 +499,21 @@ SizeT UserProcessScheduler::Run() noexcept {
if (process.PTime < process.RTime) {
if (process.RTime < (Int32) AffinityKind::kVeryHigh)
- process.PTime = (Int32) AffinityKind::kLowUsage;
+ process.RTime = (Int32) AffinityKind::kLowUsage;
else if (process.RTime < (Int32) AffinityKind::kHigh)
- process.PTime = (Int32) AffinityKind::kStandard;
+ process.RTime = (Int32) AffinityKind::kStandard;
else if (process.RTime < (Int32) AffinityKind::kStandard)
- process.PTime = (Int32) AffinityKind::kHigh;
+ process.RTime = (Int32) AffinityKind::kHigh;
+
+ process.PTime += process.RTime;
process.RTime = 0UL;
- } else {
- ++process.RTime;
+ }
+
+ if (!UserProcessHelper::Switch(process.StackFrame, process.ProcessId)) {
+ continue;
}
} else {
- kout << process.Name << " won't be scheduled to run...\r";
+ ++process.RTime;
--process.PTime;
}
}