diff options
| author | Amlal <amlal@el-mahrouss-logic.com> | 2024-09-06 16:16:07 +0200 |
|---|---|---|
| committer | Amlal <amlal@el-mahrouss-logic.com> | 2024-09-06 16:16:07 +0200 |
| commit | d7897106bb99a082a2066b2948a823da7059c755 (patch) | |
| tree | e75968246bceddae0210d8d478a2ee7a92e58985 | |
| parent | 607b9fe59c1caefa58d7272702b0668e2a9192a4 (diff) | |
Fix Global Scheduler and fixing ring-3 switch on non MP Scheduler.
Signed-off-by: Amlal <amlal@el-mahrouss-logic.com>
| -rw-r--r-- | dev/ZKA/ArchKit/ArchKit.hxx | 2 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalKernelMain.cxx | 10 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm | 80 | ||||
| -rw-r--r-- | dev/ZKA/NewKit/Array.hxx | 20 | ||||
| -rw-r--r-- | dev/ZKA/Sources/HardwareThreadScheduler.cxx | 5 | ||||
| -rw-r--r-- | dev/ZKA/Sources/UserProcessScheduler.cxx | 2 |
6 files changed, 57 insertions, 62 deletions
diff --git a/dev/ZKA/ArchKit/ArchKit.hxx b/dev/ZKA/ArchKit/ArchKit.hxx index fc2d7d33..c31ee48d 100644 --- a/dev/ZKA/ArchKit/ArchKit.hxx +++ b/dev/ZKA/ArchKit/ArchKit.hxx @@ -107,6 +107,6 @@ inline Kernel::Array<HAL_SYSCALL_RECORD, kKerncalls; EXTERN_C Kernel::HAL::StackFramePtr mp_get_current_context(); -EXTERN_C Kernel::Void mp_do_context_switch_pre(Kernel::Void); + /// @note The context gives out the return address in return register. EXTERN_C Kernel::Void mp_do_context_switch(Kernel::VoidPtr image, Kernel::UInt8* stack_ptr, Kernel::HAL::StackFramePtr stackPtr); diff --git a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx index b420805b..fb76ad20 100644 --- a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx +++ b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx @@ -87,18 +87,16 @@ EXTERN_C void hal_init_platform( kKernelPhysicalStart = reinterpret_cast<Kernel::VoidPtr>( reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_PhysicalStart)); - STATIC CONST auto cEntriesCount = 6; + STATIC CONST auto cEntriesCount = 5; /* GDT, mostly descriptors for user and kernel segments. */ STATIC Kernel::HAL::Detail::ZKA_GDT_ENTRY ALIGN(0x08) cGdt[cEntriesCount] = { {.fLimitLow = 0, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x00, .fFlags = 0x00, .fBaseHigh = 0}, // Null entry {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x9A, .fFlags = 0xAF, .fBaseHigh = 0}, // Kernel code {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x92, .fFlags = 0xCF, .fBaseHigh = 0}, // Kernel data - {.fLimitLow = 0, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x00, .fFlags = 0x00, .fBaseHigh = 0}, - {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x9A, .fFlags = 0xAF, .fBaseHigh = 0}, // User code - {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x92, .fFlags = 0xCF, .fBaseHigh = 0}, // User data - // reserve them for later. - // + {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0xF2, .fFlags = 0xCF, .fBaseHigh = 0}, // User data + {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0xFA, .fFlags = 0xAF, .fBaseHigh = 0}, // User code + }; // Load memory descriptors. diff --git a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm index 6b00715d..07ddbefe 100644 --- a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm +++ b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm @@ -21,27 +21,18 @@ section .text ;; rcx: code ptr. ;; rdx: stack ptr. mp_do_context_switch: - mov fs, rcx - mov gs, rdx + call mp_pre_switch - mov r9, [r8 + (8 * 2)] - mov r10, [r8 + (8 * 3)] + mov ax, 0x18 + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax - mov r12, [r8 + (8 * 5)] - mov r13, [r8 + (8 * 6)] - mov r14, [r8 + (8 * 7)] - mov r15, [r8 + (8 * 8)] - mov r11, gs - mov r12, fs - - mov fs, [r8 + (8 * 4)] - mov gs, [r8 + (8 * 9)] - mov r8, [r8] - - mov r11, 0x202 mov rsp, rdx - o64 sysret + mov r11, 0x202 + o64 sysret ;; @brief Gets the current stack frame. mp_get_current_context: @@ -51,31 +42,7 @@ mp_get_current_context: extern hal_system_call_enter global mp_system_call_handler -mp_system_call_handler: - push r8 - push r9 - push r10 - - jmp hal_system_call_enter - - pop r10 - pop r9 - pop r8 - - o64 sysret - -mp_do_context_switch_pre: - xor rdx, rdx - mov rax, 0x202 - mov rcx, 0xc0000084 - wrmsr - - mov rdx, mp_system_call_handler - shr rdx, 32 - mov rcx, 0xc0000082 - wrmsr - - ; Enable SCE that enables sysret and syscall +mp_pre_switch: mov rcx, 0xc0000082 wrmsr mov rcx, 0xc0000080 @@ -87,4 +54,33 @@ mp_do_context_switch_pre: mov edx, 0x00180008 wrmsr + mov rdx, [mp_system_call_handler] + shr rdx, 32 + mov rcx, 0xc0000082 + wrsmr + ret + +mp_system_call_handler: + + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + + jmp hal_system_call_enter + + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + + o64 sysret diff --git a/dev/ZKA/NewKit/Array.hxx b/dev/ZKA/NewKit/Array.hxx index 9d1dc74a..7538ef02 100644 --- a/dev/ZKA/NewKit/Array.hxx +++ b/dev/ZKA/NewKit/Array.hxx @@ -15,8 +15,16 @@ namespace Kernel class Array final { public: - explicit Array() = default; - ~Array() = default; + explicit Array() + { + for (SizeT i = 0; i < N; i++) + { + if (!fArray[i]) + fArray[i] = T(); + } + } + + ~Array() = default; Array& operator=(const Array&) = default; Array(const Array&) = default; @@ -28,13 +36,7 @@ namespace Kernel Boolean Empty() const { - for (auto Val : fArray) - { - if (Val) - return false; - } - - return true; + return No; } const SizeT Capacity() diff --git a/dev/ZKA/Sources/HardwareThreadScheduler.cxx b/dev/ZKA/Sources/HardwareThreadScheduler.cxx index 134cbb0f..47c71192 100644 --- a/dev/ZKA/Sources/HardwareThreadScheduler.cxx +++ b/dev/ZKA/Sources/HardwareThreadScheduler.cxx @@ -107,12 +107,11 @@ namespace Kernel } else { - kcout << "Switching...\r"; + kcout << "Switching to task...\r"; - mp_do_context_switch_pre(); mp_do_context_switch(image, stack_ptr, fStack); - return true; + return Yes; } } diff --git a/dev/ZKA/Sources/UserProcessScheduler.cxx b/dev/ZKA/Sources/UserProcessScheduler.cxx index 2501afc2..a2541d57 100644 --- a/dev/ZKA/Sources/UserProcessScheduler.cxx +++ b/dev/ZKA/Sources/UserProcessScheduler.cxx @@ -335,7 +335,7 @@ namespace Kernel kcout << process.Name << ": will be runned.\r"; // tell helper to find a core to schedule on. - if (!UserProcessHelper::Switch(process.Image, &process.StackReserve[process.StackSize], process.StackFrame, + if (!UserProcessHelper::Switch(process.Image, &process.StackReserve[process.StackSize - 1], process.StackFrame, process.ProcessId)) { process.Crash(); |
