summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc42
-rw-r--r--dev/kernel/KernelKit/KPC.h11
-rw-r--r--dev/kernel/KernelKit/ThreadLocalStorage.inl4
-rw-r--r--dev/kernel/KernelKit/UserProcessScheduler.h7
-rw-r--r--dev/kernel/NewKit/Utils.h8
-rw-r--r--dev/kernel/src/PEFCodeMgr.cc4
-rw-r--r--dev/kernel/src/UserProcessScheduler.cc45
-rw-r--r--dev/kernel/src/UtfUtils.cc12
8 files changed, 94 insertions, 39 deletions
diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
index f52a7167..00c206f0 100644
--- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
+++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
@@ -35,7 +35,12 @@ STATIC void hal_idt_send_eoi(UInt8 vector) {
EXTERN_C Kernel::Void idt_handle_gpf(Kernel::UIntPtr rsp) {
hal_idt_send_eoi(13);
- auto& process = Kernel::UserProcessScheduler::The().CurrentProcess();
+ auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess();
+
+ if (process.Leak().Signal.SignalID == SIGKILL || process.Leak().Signal.SignalID == SIGABRT ||
+ process.Leak().Signal.SignalID == SIGTRAP) {
+ dbg_break_point();
+ }
Kernel::kout << "Kernel: General Access Fault.\r";
@@ -55,7 +60,12 @@ EXTERN_C Kernel::Void idt_handle_gpf(Kernel::UIntPtr rsp) {
EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) {
hal_idt_send_eoi(14);
- auto& process = Kernel::UserProcessScheduler::The().CurrentProcess();
+ auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess();
+
+ if (process.Leak().Signal.SignalID == SIGKILL || process.Leak().Signal.SignalID == SIGABRT ||
+ process.Leak().Signal.SignalID == SIGTRAP) {
+ dbg_break_point();
+ }
Kernel::kout << "Kernel: Page Fault.\r";
Kernel::kout << "Kernel: SIGKILL\r";
@@ -89,7 +99,12 @@ EXTERN_C void idt_handle_scheduler(Kernel::UIntPtr rsp) {
EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) {
hal_idt_send_eoi(8);
- auto& process = Kernel::UserProcessScheduler::The().CurrentProcess();
+ auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess();
+
+ if (process.Leak().Signal.SignalID == SIGKILL || process.Leak().Signal.SignalID == SIGABRT ||
+ process.Leak().Signal.SignalID == SIGTRAP) {
+ dbg_break_point();
+ }
Kernel::kout << "Kernel: Math error (division by zero?).\r";
@@ -109,7 +124,12 @@ EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) {
EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) {
hal_idt_send_eoi(30);
- auto& process = Kernel::UserProcessScheduler::The().CurrentProcess();
+ auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess();
+
+ if (process.Leak().Signal.SignalID == SIGKILL || process.Leak().Signal.SignalID == SIGABRT ||
+ process.Leak().Signal.SignalID == SIGTRAP) {
+ dbg_break_point();
+ }
(Void)(Kernel::kout << "Kernel: Process RSP: " << Kernel::hex_number(rsp) << Kernel::kendl);
Kernel::kout << "Kernel: Access Process Fault.\r";
@@ -128,7 +148,12 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) {
EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) {
hal_idt_send_eoi(3);
- auto& process = Kernel::UserProcessScheduler::The().CurrentProcess();
+ auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess();
+
+ if (process.Leak().Signal.SignalID == SIGKILL || process.Leak().Signal.SignalID == SIGABRT ||
+ process.Leak().Signal.SignalID == SIGTRAP) {
+ dbg_break_point();
+ }
(Void)(Kernel::kout << "Kernel: Process RIP: " << Kernel::hex_number(rip) << Kernel::kendl);
@@ -153,7 +178,12 @@ EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) {
NE_UNUSED(rsp);
- auto& process = Kernel::UserProcessScheduler::The().CurrentProcess();
+ auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess();
+
+ if (process.Leak().Signal.SignalID == SIGKILL || process.Leak().Signal.SignalID == SIGABRT ||
+ process.Leak().Signal.SignalID == SIGTRAP) {
+ dbg_break_point();
+ }
Kernel::kout << "Kernel: Undefined Opcode.\r";
diff --git a/dev/kernel/KernelKit/KPC.h b/dev/kernel/KernelKit/KPC.h
index 9de1f70f..4c48b53a 100644
--- a/dev/kernel/KernelKit/KPC.h
+++ b/dev/kernel/KernelKit/KPC.h
@@ -11,13 +11,14 @@
/// @file KPC.h
/// @brief Kernel Procedure Code.
-#define err_local_ok() \
- (Kernel::UserProcessScheduler::The().CurrentProcess().Leak().GetLocalCode() == \
+#define err_local_ok() \
+ (Kernel::UserProcessScheduler::The().TheCurrentProcess().Leak().GetLocalCode() == \
Kernel::kErrorSuccess)
-#define err_local_fail() \
- (Kernel::UserProcessScheduler::The().CurrentProcess().Leak().GetLocalCode() != \
+#define err_local_fail() \
+ (Kernel::UserProcessScheduler::The().TheCurrentProcess().Leak().GetLocalCode() != \
Kernel::kErrorSuccess)
-#define err_local_get() (Kernel::UserProcessScheduler::The().CurrentProcess().Leak().GetLocalCode())
+#define err_local_get() \
+ (Kernel::UserProcessScheduler::The().TheCurrentProcess().Leak().GetLocalCode())
#define err_global_ok() (Kernel::kErrorLocalNumber == Kernel::kErrorSuccess)
#define err_global_fail() (Kernel::kErrorLocalNumber != Kernel::kErrorSuccess)
diff --git a/dev/kernel/KernelKit/ThreadLocalStorage.inl b/dev/kernel/KernelKit/ThreadLocalStorage.inl
index 553f8d42..7c7a0b7f 100644
--- a/dev/kernel/KernelKit/ThreadLocalStorage.inl
+++ b/dev/kernel/KernelKit/ThreadLocalStorage.inl
@@ -15,7 +15,7 @@ template <typename T>
inline T* tls_new_ptr(void) noexcept {
using namespace Kernel;
- auto ref_process = UserProcessScheduler::The().CurrentProcess();
+ auto ref_process = UserProcessScheduler::The().TheCurrentProcess();
MUST_PASS(ref_process);
auto pointer = ref_process.Leak().New(sizeof(T));
@@ -33,7 +33,7 @@ inline Kernel::Bool tls_delete_ptr(T* obj) noexcept {
if (!obj) return No;
- auto ref_process = UserProcessScheduler::The().CurrentProcess();
+ auto ref_process = UserProcessScheduler::The().TheCurrentProcess();
MUST_PASS(ref_process);
ErrorOr<T*> obj_wrapped{obj};
diff --git a/dev/kernel/KernelKit/UserProcessScheduler.h b/dev/kernel/KernelKit/UserProcessScheduler.h
index 717788e9..a15e8e38 100644
--- a/dev/kernel/KernelKit/UserProcessScheduler.h
+++ b/dev/kernel/KernelKit/UserProcessScheduler.h
@@ -76,7 +76,8 @@ class USER_PROCESS final {
};
ProcessTime PTime{0}; //! @brief Process allocated tine.
- ProcessTime RTime{0}; //! @brief Process Run time
+ ProcessTime RTime{0}; //! @brief Process run time.
+ ProcessTime UTime{0}; //! #brief Process used time.
PID ProcessId{kSchedInvalidPID};
Int32 Kind{kExecutableKind};
@@ -191,7 +192,7 @@ class UserProcessScheduler final : public ISchedulable {
bool operator!();
public:
- UserProcessTeam& CurrentTeam();
+ UserProcessTeam& TheCurrentTeam();
BOOL SwitchTeam(UserProcessTeam& team);
public:
@@ -203,7 +204,7 @@ class UserProcessScheduler final : public ISchedulable {
Bool HasMP() override;
public:
- Ref<USER_PROCESS>& CurrentProcess();
+ Ref<USER_PROCESS>& TheCurrentProcess();
SizeT Run() noexcept;
public:
diff --git a/dev/kernel/NewKit/Utils.h b/dev/kernel/NewKit/Utils.h
index e3420d84..cd36654a 100644
--- a/dev/kernel/NewKit/Utils.h
+++ b/dev/kernel/NewKit/Utils.h
@@ -26,7 +26,9 @@ Int rt_to_uppercase(Int c);
Int rt_to_lower(Int c);
voidPtr rt_string_in_string(const Char* in, const Char* needle);
char* rt_string_has_char(Char* str, Char chr);
-Void urt_set_memory(const voidPtr src, UInt32 dst, Size len);
-Int urt_copy_memory(const voidPtr src, voidPtr dst, Size len);
-Size urt_string_len(const Utf8Char* str);
+
+Int urt_string_cmp(const Char* src, const Char* cmp, Size len);
+Void urt_set_memory(const voidPtr src, UInt32 dst, Size len);
+Int urt_copy_memory(const voidPtr src, voidPtr dst, Size len);
+Size urt_string_len(const Utf8Char* str);
} // namespace Kernel
diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc
index 5ff54098..25a25122 100644
--- a/dev/kernel/src/PEFCodeMgr.cc
+++ b/dev/kernel/src/PEFCodeMgr.cc
@@ -249,8 +249,8 @@ namespace Utils {
*(volatile UIntPtr*) stacksym.Leak().Leak() = kSchedMaxStackSz;
}
- UserProcessScheduler::The().CurrentTeam().AsArray()[id].Kind = process_kind;
- UserProcessScheduler::The().CurrentTeam().AsArray()[id].StackSize =
+ UserProcessScheduler::The().TheCurrentTeam().AsArray()[id].Kind = process_kind;
+ UserProcessScheduler::The().TheCurrentTeam().AsArray()[id].StackSize =
*(UIntPtr*) stacksym.Leak().Leak();
mm_delete_ptr(stacksym.Leak().Leak());
diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc
index 4f6e859e..b0d56c5d 100644
--- a/dev/kernel/src/UserProcessScheduler.cc
+++ b/dev/kernel/src/UserProcessScheduler.cc
@@ -14,13 +14,13 @@
/***********************************************************************************/
#include <ArchKit/ArchKit.h>
-#include <NewKit/KString.h>
-
#include <KernelKit/HardwareThreadScheduler.h>
#include <KernelKit/IPEFDylibObject.h>
#include <KernelKit/KPC.h>
#include <KernelKit/MemoryMgr.h>
#include <KernelKit/ProcessScheduler.h>
+#include <NewKit/KString.h>
+#include <SignalKit/Signals.h>
///! BUGS: 0
@@ -479,18 +479,23 @@ SizeT UserProcessScheduler::Run() noexcept {
return 0UL;
}
+ auto& process = this->TheCurrentProcess().Leak();
+
+ //! Increase the usage time of the process.
+ if (process.UTime < process.PTime) {
+ ++process.UTime;
+ }
+
SizeT process_index = 0UL; //! we store this guy to tell the scheduler how many
//! things we have scheduled.
for (; process_index < mTeam.AsArray().Capacity(); ++process_index) {
auto& process = mTeam.AsArray()[process_index];
- if (this->CurrentProcess() == process) continue;
-
//! Check if the process needs to be run.
if (UserProcessHelper::CanBeScheduled(process)) {
if (process.StackSize > kSchedMaxStackSz) {
- kout << "The process: " << process.Name << ", has not a valid stack size! Crashing it...\r";
+ kout << "Process: " << process.Name << ", has not a valid stack size! Crashing it...\r";
process.Crash();
continue;
}
@@ -511,13 +516,14 @@ SizeT UserProcessScheduler::Run() noexcept {
process.RTime = 0UL;
}
- this->CurrentProcess() = process;
-
if (!UserProcessHelper::Switch(process.StackFrame, process.ProcessId)) {
break;
}
- break;
+ mTeam.AsArray()[this->TheCurrentProcess().Leak().ProcessId] =
+ this->TheCurrentProcess().Leak();
+
+ this->TheCurrentProcess() = process;
} else {
++process.RTime;
--process.PTime;
@@ -529,7 +535,7 @@ SizeT UserProcessScheduler::Run() noexcept {
/// @brief Gets the current scheduled team.
/// @return
-UserProcessTeam& UserProcessScheduler::CurrentTeam() {
+UserProcessTeam& UserProcessScheduler::TheCurrentTeam() {
return mTeam;
}
@@ -550,17 +556,17 @@ BOOL UserProcessScheduler::SwitchTeam(UserProcessTeam& team) {
/// @brief Gets current running process.
/// @return
-Ref<USER_PROCESS>& UserProcessScheduler::CurrentProcess() {
+Ref<USER_PROCESS>& UserProcessScheduler::TheCurrentProcess() {
return mTeam.AsRef();
}
/// @brief Current proccess id getter.
/// @return USER_PROCESS ID integer.
ErrorOr<PID> UserProcessHelper::TheCurrentPID() {
- if (!UserProcessScheduler::The().CurrentProcess()) return ErrorOr<PID>{-kErrorProcessFault};
+ if (!UserProcessScheduler::The().TheCurrentProcess()) return ErrorOr<PID>{-kErrorProcessFault};
kout << "UserProcessHelper::TheCurrentPID: Leaking ProcessId...\r";
- return ErrorOr<PID>{UserProcessScheduler::The().CurrentProcess().Leak().ProcessId};
+ return ErrorOr<PID>{UserProcessScheduler::The().TheCurrentProcess().Leak().ProcessId};
}
/// @brief Check if process can be schedulded.
@@ -575,12 +581,17 @@ Bool UserProcessHelper::CanBeScheduled(const USER_PROCESS& process) {
// real time processes shouldn't wait that much.
if (process.Affinity == AffinityKind::kRealTime) return Yes;
+ if (process.Signal.SignalID == SIGKILL || process.Signal.SignalID == SIGABRT ||
+ process.Signal.SignalID == SIGTRAP) {
+ return No;
+ }
+
return process.PTime < 1;
}
/***********************************************************************************/
/**
- * @brief Start scheduling current AP.
+ * @brief Start scheduling the current team.
*/
/***********************************************************************************/
@@ -604,13 +615,13 @@ Bool UserProcessHelper::Switch(HAL::StackFramePtr frame_ptr, PID new_pid) {
// A fallback is a special core for real-time tasks which needs immediate execution.
if (HardwareThreadScheduler::The()[index].Leak()->Kind() == kAPRealTime) {
- if (UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].Affinity !=
+ if (UserProcessScheduler::The().TheCurrentTeam().AsArray()[new_pid].Affinity !=
AffinityKind::kRealTime)
continue;
if (HardwareThreadScheduler::The()[index].Leak()->Switch(frame_ptr, new_pid)) {
HardwareThreadScheduler::The()[index].Leak()->fPTime =
- UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].PTime;
+ UserProcessScheduler::The().TheCurrentTeam().AsArray()[new_pid].PTime;
UserProcessHelper::TheCurrentPID().Leak().Leak() = UserProcessHelper::TheCurrentPID();
@@ -620,7 +631,7 @@ Bool UserProcessHelper::Switch(HAL::StackFramePtr frame_ptr, PID new_pid) {
continue;
}
- if (UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].Affinity ==
+ if (UserProcessScheduler::The().TheCurrentTeam().AsArray()[new_pid].Affinity ==
AffinityKind::kRealTime)
continue;
@@ -639,7 +650,7 @@ Bool UserProcessHelper::Switch(HAL::StackFramePtr frame_ptr, PID new_pid) {
UserProcessHelper::TheCurrentPID().Leak().Leak() = new_pid;
HardwareThreadScheduler::The()[index].Leak()->fPTime =
- UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].PTime;
+ UserProcessScheduler::The().TheCurrentTeam().AsArray()[new_pid].PTime;
HardwareThreadScheduler::The()[index].Leak()->Wake(YES);
return YES;
diff --git a/dev/kernel/src/UtfUtils.cc b/dev/kernel/src/UtfUtils.cc
index 11d7471a..1374ee86 100644
--- a/dev/kernel/src/UtfUtils.cc
+++ b/dev/kernel/src/UtfUtils.cc
@@ -25,7 +25,17 @@ Void urt_set_memory(const voidPtr src, UInt32 dst, Size len) {
}
}
-Int urt_copy_memory(const voidPtr src, voidPtr dst, Size len) {
+Int32 rt_string_cmp(const Utf8Char* src, const Utf8Char* cmp, Size size) {
+ Int32 counter = 0;
+
+ for (Size index = 0; index < size; ++index) {
+ if (src[index] != cmp[index]) ++counter;
+ }
+
+ return counter;
+}
+
+Int urt_copy_memory(const VoidPtr src, VoidPtr dst, Size len) {
Utf8Char* srcChr = reinterpret_cast<Utf8Char*>(src);
Utf8Char* dstChar = reinterpret_cast<Utf8Char*>(dst);