summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/src
diff options
context:
space:
mode:
Diffstat (limited to 'dev/kernel/src')
-rw-r--r--dev/kernel/src/HardwareThreadScheduler.cc4
-rw-r--r--dev/kernel/src/UserProcessScheduler.cc23
2 files changed, 18 insertions, 9 deletions
diff --git a/dev/kernel/src/HardwareThreadScheduler.cc b/dev/kernel/src/HardwareThreadScheduler.cc
index b801632c..23365af5 100644
--- a/dev/kernel/src/HardwareThreadScheduler.cc
+++ b/dev/kernel/src/HardwareThreadScheduler.cc
@@ -21,7 +21,7 @@ namespace Kernel {
/***********************************************************************************/
EXTERN_C Bool hal_check_stack(HAL::StackFramePtr frame);
-EXTERN_C Bool mp_register_process(HAL::StackFramePtr frame, ProcessID pid);
+EXTERN_C Bool mp_register_task(HAL::StackFramePtr frame, ProcessID pid);
STATIC HardwareThreadScheduler kHardwareThreadScheduler;
@@ -94,7 +94,7 @@ Void HardwareThread::Wake(const bool wakeup) noexcept {
Bool HardwareThread::Switch(HAL::StackFramePtr frame) {
this->fStack = frame;
- Bool ret = mp_register_process(fStack, this->fPID);
+ Bool ret = mp_register_task(fStack, this->fPID);
return ret;
}
diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc
index 0de38532..a901e6d0 100644
--- a/dev/kernel/src/UserProcessScheduler.cc
+++ b/dev/kernel/src/UserProcessScheduler.cc
@@ -21,6 +21,7 @@
#include <KernelKit/ProcessScheduler.h>
#include <NewKit/KString.h>
#include <SignalKit/Signals.h>
+#include "NewKit/Macros.h"
///! BUGS: 0
@@ -125,7 +126,7 @@ ErrorOr<VoidPtr> USER_PROCESS::New(SizeT sz, SizeT pad_amount) {
if (this->UsedMemory > kSchedMaxMemoryLimit) return ErrorOr<VoidPtr>(-kErrorHeapOutOfMemory);
#ifdef __NE_VIRTUAL_MEMORY_SUPPORT__
- auto vm_register = kKernelCR3;
+ auto vm_register = kKernelVM;
hal_write_cr3(this->VMRegister);
auto ptr = mm_new_ptr(sz, Yes, Yes, pad_amount);
@@ -271,7 +272,7 @@ Void USER_PROCESS::Exit(const Int32& exit_code) {
auto memory_ptr_list = this->HeapTree;
#ifdef __NE_VIRTUAL_MEMORY_SUPPORT__
- auto pd = kKernelCR3;
+ auto pd = kKernelVM;
hal_write_cr3(this->VMRegister);
#endif
@@ -384,7 +385,7 @@ ProcessID UserProcessScheduler::Spawn(const Char* name, VoidPtr code, VoidPtr im
rt_copy_memory(reinterpret_cast<VoidPtr>(const_cast<Char*>(name)), process.Name, len);
#ifdef __NE_VIRTUAL_MEMORY_SUPPORT__
- process.VMRegister = kKernelCR3;
+ process.VMRegister = kKernelVM;
#else
process.VMRegister = 0UL;
#endif // ifdef __NE_VIRTUAL_MEMORY_SUPPORT__
@@ -401,6 +402,15 @@ ProcessID UserProcessScheduler::Spawn(const Char* name, VoidPtr code, VoidPtr im
process.StackFrame->IP = reinterpret_cast<UIntPtr>(code);
process.StackFrame->SP = reinterpret_cast<UIntPtr>(&process.StackReserve[0] + process.StackSize);
+#ifdef __NE_VIRTUAL_MEMORY_SUPPORT__
+ HAL::mm_map_page((VoidPtr) process.StackFrame->IP,
+ (VoidPtr) HAL::mm_get_phys_address((VoidPtr) process.StackFrame->IP),
+ HAL::kMMFlagsUser | HAL::kMMFlagsPresent);
+ HAL::mm_map_page((VoidPtr) process.StackFrame->SP,
+ (VoidPtr) HAL::mm_get_phys_address((VoidPtr) process.StackFrame->SP),
+ HAL::kMMFlagsUser | HAL::kMMFlagsPresent);
+#endif // ifdef __NE_VIRTUAL_MEMORY_SUPPORT__
+
process.StackSize = kSchedMaxStackSz;
rt_set_memory(process.StackReserve, 0, process.StackSize);
@@ -494,6 +504,8 @@ SizeT UserProcessScheduler::Run() noexcept {
if (UserProcessHelper::CanBeScheduled(process)) {
kout << process.Name << " will be scheduled...\r";
+ this->TheCurrentProcess() = process;
+
if (UserProcessHelper::Switch(process.StackFrame, process.ProcessId)) {
process.PTime = static_cast<Int32>(process.Affinity);
@@ -606,6 +618,7 @@ Bool UserProcessHelper::Switch(HAL::StackFramePtr frame_ptr, PID new_pid) {
if (HardwareThreadScheduler::The()[index].Leak()->IsBusy()) {
(Void)(kout << "AP_" << hex_number(index));
kout << " is busy\r";
+
continue;
}
@@ -627,10 +640,6 @@ Bool UserProcessHelper::Switch(HAL::StackFramePtr frame_ptr, PID new_pid) {
HardwareThreadScheduler::The()[index].Leak()->fPTime =
UserProcessScheduler::The().TheCurrentTeam().AsArray()[new_pid].PTime;
- HardwareThreadScheduler::The()[index].Leak()->Wake(YES);
-
- UserProcessScheduler::The().TheCurrentProcess() =
- UserProcessScheduler::The().TheCurrentTeam().AsArray()[new_pid];
return YES;
}