summaryrefslogtreecommitdiffhomepage
path: root/dev
diff options
context:
space:
mode:
Diffstat (limited to 'dev')
-rw-r--r--dev/ddk/src/ddk_dev.c4
-rw-r--r--dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc26
-rw-r--r--dev/kernel/HALKit/AMD64/HalCoreSystemCalls.cc4
-rw-r--r--dev/kernel/HALKit/AMD64/HalInterruptAPI.asm2
-rw-r--r--dev/kernel/HALKit/AMD64/HalKernelMain.cc28
-rw-r--r--dev/kernel/KernelKit/CoreProcessScheduler.h59
-rw-r--r--dev/kernel/KernelKit/UserProcessScheduler.h30
-rw-r--r--dev/kernel/KernelKit/UserProcessScheduler.inl10
-rw-r--r--dev/kernel/src/UserProcessScheduler.cc83
9 files changed, 136 insertions, 110 deletions
diff --git a/dev/ddk/src/ddk_dev.c b/dev/ddk/src/ddk_dev.c
index 281e48c7..4cd7dcdd 100644
--- a/dev/ddk/src/ddk_dev.c
+++ b/dev/ddk/src/ddk_dev.c
@@ -13,7 +13,7 @@
DDK_EXTERN DDK_DEVICE_PTR open(const char* devicePath) {
if (!devicePath) return nil;
- return ke_call("sk_open_dev", 1, (void*) devicePath, kstrlen(devicePath));
+ return ke_call("dk_open_dev", 1, (void*) devicePath, kstrlen(devicePath));
}
/// @brief Close any device.
@@ -21,6 +21,6 @@ DDK_EXTERN DDK_DEVICE_PTR open(const char* devicePath) {
DDK_EXTERN BOOL close(DDK_DEVICE_PTR device) {
if (!device) return NO;
- ke_call("sk_close_dev", 1, device, sizeof(DDK_DEVICE));
+ ke_call("dk_close_dev", 1, device, sizeof(DDK_DEVICE));
return YES;
}
diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
index 84c35615..c72a109a 100644
--- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
+++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
@@ -16,7 +16,9 @@ STATIC BOOL kIsScheduling = NO;
EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp) {
auto process = Kernel::UserProcessScheduler::The().CurrentProcess();
- if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning) return;
+ if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning) {
+ MUST_PASS(NO);
+ }
kIsScheduling = NO;
@@ -38,7 +40,9 @@ EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp) {
EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) {
auto process = Kernel::UserProcessScheduler::The().CurrentProcess();
- if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning) return;
+ if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning) {
+ MUST_PASS(NO);
+ }
kIsScheduling = NO;
@@ -83,7 +87,9 @@ EXTERN_C void idt_handle_scheduler(Kernel::UIntPtr rsp) {
EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) {
auto process = Kernel::UserProcessScheduler::The().CurrentProcess();
- if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning) return;
+ if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning) {
+ MUST_PASS(NO);
+ }
kIsScheduling = NO;
@@ -105,7 +111,9 @@ EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) {
EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) {
auto process = Kernel::UserProcessScheduler::The().CurrentProcess();
- if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning) return;
+ if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning) {
+ MUST_PASS(NO);
+ }
kIsScheduling = NO;
@@ -126,10 +134,12 @@ EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) {
auto process = Kernel::UserProcessScheduler::The().CurrentProcess();
if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning) {
+ (Void)(Kernel::kout << "Kernel: Kernel RIP: " << Kernel::hex_number(rip) << Kernel::kendl);
Kernel::kout << "Kernel: SIGTRAP\r";
- while (YES)
- ;
+ kIsScheduling = NO;
+
+ while (YES);
}
kIsScheduling = NO;
@@ -152,7 +162,9 @@ EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) {
EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) {
auto process = Kernel::UserProcessScheduler::The().CurrentProcess();
- if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning) return;
+ if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning) {
+ MUST_PASS(NO);
+ }
kIsScheduling = NO;
diff --git a/dev/kernel/HALKit/AMD64/HalCoreSystemCalls.cc b/dev/kernel/HALKit/AMD64/HalCoreSystemCalls.cc
index 8581950f..11e773a8 100644
--- a/dev/kernel/HALKit/AMD64/HalCoreSystemCalls.cc
+++ b/dev/kernel/HALKit/AMD64/HalCoreSystemCalls.cc
@@ -3,3 +3,7 @@
Copyright (C) 2025, Amlal El Mahrouss, all rights reserved.
------------------------------------------- */
+
+#include <ArchKit/ArchKit.h>
+
+using namespace Kernel;
diff --git a/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm b/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm
index cc34b99f..cf2870c8 100644
--- a/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm
+++ b/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm
@@ -98,7 +98,7 @@ __NE_INT_3:
out 0x20, al
push rcx
- call idt_handle_generic
+ call idt_handle_breakpoint
pop rcx
std
diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc
index 2747439a..70b07193 100644
--- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc
+++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc
@@ -126,32 +126,6 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept {
idt_loader.Load(idt_reg);
- /// 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;
-
- static 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;
- }
-
- kTeams[team_index].Id() = team_index;
-
- while (!UserProcessScheduler::The().SwitchTeam(kTeams[team_index]))
- ;
-
- timer.Wait();
-
- ++team_index;
- }
+ dbg_break_point();
}
#endif // ifndef __NE_MODULAR_KERNEL_COMPONENTS__
diff --git a/dev/kernel/KernelKit/CoreProcessScheduler.h b/dev/kernel/KernelKit/CoreProcessScheduler.h
index 643c5479..830f17f9 100644
--- a/dev/kernel/KernelKit/CoreProcessScheduler.h
+++ b/dev/kernel/KernelKit/CoreProcessScheduler.h
@@ -24,6 +24,65 @@ class USER_PROCESS;
class KERNEL_TASK;
class UserProcessTeam;
+enum {
+ kInvalidTreeKind = 0U,
+ kRedTreeKind = 100U,
+ kBlackTreeKind = 101U,
+ kTreeKindCount = 2U,
+};
+
+template <typename T>
+struct PROCESS_HEAP_TREE {
+ static constexpr auto kPtr = true;
+ static constexpr auto kFD = false;
+
+ T Entry{nullptr};
+ SizeT EntrySize{0UL};
+ SizeT EntryPad{0UL};
+
+ UInt32 Color{kBlackTreeKind};
+
+ struct PROCESS_HEAP_TREE<T>* Parent {
+ nullptr
+ };
+ struct PROCESS_HEAP_TREE<T>* Child {
+ nullptr
+ };
+
+ struct PROCESS_HEAP_TREE<T>* Prev {
+ nullptr
+ };
+ struct PROCESS_HEAP_TREE<T>* Next {
+ nullptr
+ };
+};
+
+template <typename T>
+struct PROCESS_FILE_TREE {
+ static constexpr auto kPtr = false;
+ static constexpr auto kFD = true;
+
+ T Entry{nullptr};
+ SizeT EntrySize{0UL};
+ SizeT EntryPad{0UL};
+
+ UInt32 Color{kBlackTreeKind};
+
+ struct PROCESS_FILE_TREE<T>* Parent {
+ nullptr
+ };
+ struct PROCESS_FILE_TREE<T>* Child {
+ nullptr
+ };
+
+ struct PROCESS_FILE_TREE<T>* Prev {
+ nullptr
+ };
+ struct PROCESS_FILE_TREE<T>* Next {
+ nullptr
+ };
+};
+
/***********************************************************************************/
/// @brief Subsystem enum type.
/***********************************************************************************/
diff --git a/dev/kernel/KernelKit/UserProcessScheduler.h b/dev/kernel/KernelKit/UserProcessScheduler.h
index 42855e11..f04f4a0a 100644
--- a/dev/kernel/KernelKit/UserProcessScheduler.h
+++ b/dev/kernel/KernelKit/UserProcessScheduler.h
@@ -55,37 +55,16 @@ class USER_PROCESS final {
SizeT MemoryLimit{kSchedMaxMemoryLimit};
SizeT UsedMemory{0UL};
- /// @brief Allocation tracker structure.
- struct USER_HEAP_TREE final {
- VoidPtr MemoryEntry{nullptr};
- SizeT MemoryEntrySize{0UL};
- SizeT MemoryEntryPad{0UL};
-
- 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 Status;
UIntPtr SignalID;
};
- USER_PROCESS_SIGNAL Signal;
- USER_HEAP_TREE* HeapTree{nullptr};
- UserProcessTeam* ParentTeam;
+ USER_PROCESS_SIGNAL Signal;
+ PROCESS_FILE_TREE<UInt32*>* FileTree{nullptr};
+ PROCESS_HEAP_TREE<VoidPtr>* HeapTree{nullptr};
+ UserProcessTeam* ParentTeam;
VoidPtr VMRegister{0UL};
@@ -205,6 +184,7 @@ class UserProcessScheduler final : public ISchedulable {
NE_COPY_DELETE(UserProcessScheduler)
NE_MOVE_DELETE(UserProcessScheduler)
+ public:
operator bool();
bool operator!();
diff --git a/dev/kernel/KernelKit/UserProcessScheduler.inl b/dev/kernel/KernelKit/UserProcessScheduler.inl
index 2333b898..7bf98d78 100644
--- a/dev/kernel/KernelKit/UserProcessScheduler.inl
+++ b/dev/kernel/KernelKit/UserProcessScheduler.inl
@@ -25,18 +25,18 @@ Boolean USER_PROCESS::Delete(ErrorOr<T*> ptr) {
return No;
}
- USER_HEAP_TREE* entry = this->HeapTree;
+ PROCESS_HEAP_TREE<VoidPtr>* entry = this->HeapTree;
while (entry != nullptr) {
- if (entry->MemoryEntry == ptr.Leak().Leak()) {
- this->UsedMemory -= entry->MemoryEntrySize;
+ if (entry->Entry == ptr.Leak().Leak()) {
+ this->UsedMemory -= entry->EntrySize;
#ifdef __NE_AMD64__
auto pd = hal_read_cr3();
hal_write_cr3(this->VMRegister);
- auto ret = mm_delete_heap(entry->MemoryEntry);
+ auto ret = mm_delete_heap(entry->Entry);
hal_write_cr3(pd);
@@ -48,7 +48,7 @@ Boolean USER_PROCESS::Delete(ErrorOr<T*> ptr) {
#endif
}
- entry = entry->MemoryNext;
+ entry = entry->Next;
}
kout << "USER_PROCESS: Trying to free a pointer which doesn't exist.\r";
diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc
index 2082642c..f868a810 100644
--- a/dev/kernel/src/UserProcessScheduler.cc
+++ b/dev/kernel/src/UserProcessScheduler.cc
@@ -101,16 +101,15 @@ Void USER_PROCESS::Wake(Bool should_wakeup) {
/** @param tree The tree to calibrate */
/***********************************************************************************/
-STATIC USER_PROCESS::USER_HEAP_TREE* sched_try_go_upper_heap_tree(
- USER_PROCESS::USER_HEAP_TREE* tree) {
+STATIC PROCESS_HEAP_TREE<VoidPtr>* sched_try_go_upper_heap_tree(PROCESS_HEAP_TREE<VoidPtr>* tree) {
if (!tree) {
return nullptr;
}
- tree = tree->MemoryParent;
+ tree = tree->Parent;
if (tree) {
- auto tree_tmp = tree->MemoryNext;
+ auto tree_tmp = tree->Next;
if (!tree_tmp) {
return tree;
@@ -141,65 +140,63 @@ ErrorOr<VoidPtr> USER_PROCESS::New(SizeT sz, SizeT pad_amount) {
#endif
if (!this->HeapTree) {
- this->HeapTree = new USER_HEAP_TREE();
+ this->HeapTree = new PROCESS_HEAP_TREE<VoidPtr>();
- this->HeapTree->MemoryEntryPad = pad_amount;
- this->HeapTree->MemoryEntrySize = sz;
+ this->HeapTree->EntryPad = pad_amount;
+ this->HeapTree->EntrySize = sz;
- this->HeapTree->MemoryEntry = ptr;
+ this->HeapTree->Entry = ptr;
- this->HeapTree->MemoryColor = USER_HEAP_TREE::kBlackMemory;
+ this->HeapTree->Color = kBlackTreeKind;
- this->HeapTree->MemoryPrev = nullptr;
- this->HeapTree->MemoryNext = nullptr;
- this->HeapTree->MemoryParent = nullptr;
- this->HeapTree->MemoryChild = nullptr;
+ this->HeapTree->Prev = nullptr;
+ this->HeapTree->Next = nullptr;
+ this->HeapTree->Parent = nullptr;
+ this->HeapTree->Child = nullptr;
} else {
- USER_HEAP_TREE* entry = this->HeapTree;
- USER_HEAP_TREE* prev_entry = entry;
+ PROCESS_HEAP_TREE<VoidPtr>* entry = this->HeapTree;
+ PROCESS_HEAP_TREE<VoidPtr>* prev_entry = entry;
BOOL is_parent = NO;
while (entry) {
- if (entry->MemoryEntrySize < 1) break;
+ if (entry->EntrySize < 1) break;
prev_entry = entry;
- if (entry->MemoryColor == USER_HEAP_TREE::kBlackMemory) break;
+ if (entry->Color == kBlackTreeKind) break;
- if (entry->MemoryChild && entry->MemoryChild->MemoryEntrySize > 0 &&
- entry->MemoryChild->MemoryEntrySize == sz) {
- entry = entry->MemoryChild;
+ if (entry->Child && entry->Child->EntrySize > 0 && entry->Child->EntrySize == sz) {
+ entry = entry->Child;
is_parent = YES;
- } else if (entry->MemoryNext && entry->MemoryChild->MemoryEntrySize > 0 &&
- entry->MemoryNext->MemoryEntrySize == sz) {
+ } else if (entry->Next && entry->Child->EntrySize > 0 && entry->Next->EntrySize == sz) {
is_parent = NO;
- entry = entry->MemoryNext;
+ entry = entry->Next;
} else {
entry = sched_try_go_upper_heap_tree(entry);
- if (entry && entry->MemoryColor == USER_HEAP_TREE::kBlackMemory) break;
+ if (entry && entry->Color == kBlackTreeKind) break;
}
}
- auto new_entry = new USER_HEAP_TREE();
+ auto new_entry = new PROCESS_HEAP_TREE<VoidPtr>();
- new_entry->MemoryEntry = ptr;
- new_entry->MemoryEntrySize = sz;
- new_entry->MemoryEntryPad = pad_amount;
- new_entry->MemoryParent = entry;
- new_entry->MemoryChild = nullptr;
- new_entry->MemoryNext = nullptr;
- new_entry->MemoryPrev = nullptr;
+ new_entry->Entry = ptr;
+ new_entry->EntrySize = sz;
+ new_entry->EntryPad = pad_amount;
+ new_entry->Parent = entry;
+ new_entry->Child = nullptr;
+ new_entry->Next = nullptr;
+ new_entry->Prev = nullptr;
- new_entry->MemoryColor = USER_HEAP_TREE::kBlackMemory;
- prev_entry->MemoryColor = USER_HEAP_TREE::kRedMemory;
+ new_entry->Color = kBlackTreeKind;
+ prev_entry->Color = kRedTreeKind;
if (is_parent) {
- prev_entry->MemoryChild = new_entry;
- new_entry->MemoryParent = prev_entry;
+ prev_entry->Child = new_entry;
+ new_entry->Parent = prev_entry;
} else {
- prev_entry->MemoryNext = new_entry;
- new_entry->MemoryPrev = prev_entry;
+ prev_entry->Next = new_entry;
+ new_entry->Prev = prev_entry;
}
}
@@ -243,18 +240,18 @@ const AffinityKind& USER_PROCESS::GetAffinity() noexcept {
/** @brief Free heap tree. */
/***********************************************************************************/
-STATIC Void sched_free_heap_tree(USER_PROCESS::USER_HEAP_TREE* memory_heap_list) {
+STATIC Void sched_free_heap_tree(PROCESS_HEAP_TREE<VoidPtr>* memory_heap_list) {
// Deleting memory lists. Make sure to free all of them.
while (memory_heap_list) {
- if (memory_heap_list->MemoryEntry) {
- MUST_PASS(mm_delete_heap(memory_heap_list->MemoryEntry));
+ if (memory_heap_list->Entry) {
+ MUST_PASS(mm_delete_heap(memory_heap_list->Entry));
}
- auto next = memory_heap_list->MemoryNext;
+ auto next = memory_heap_list->Next;
mm_delete_heap(memory_heap_list);
- if (memory_heap_list->MemoryChild) sched_free_heap_tree(memory_heap_list->MemoryChild);
+ if (memory_heap_list->Child) sched_free_heap_tree(memory_heap_list->Child);
memory_heap_list = next;
}