summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAmlal <amlal@el-mahrouss-logic.com>2024-09-06 16:16:07 +0200
committerAmlal <amlal@el-mahrouss-logic.com>2024-09-06 16:16:07 +0200
commitd7897106bb99a082a2066b2948a823da7059c755 (patch)
treee75968246bceddae0210d8d478a2ee7a92e58985
parent607b9fe59c1caefa58d7272702b0668e2a9192a4 (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.hxx2
-rw-r--r--dev/ZKA/HALKit/AMD64/HalKernelMain.cxx10
-rw-r--r--dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm80
-rw-r--r--dev/ZKA/NewKit/Array.hxx20
-rw-r--r--dev/ZKA/Sources/HardwareThreadScheduler.cxx5
-rw-r--r--dev/ZKA/Sources/UserProcessScheduler.cxx2
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();