summaryrefslogtreecommitdiffhomepage
path: root/dev/ZKA/HALKit
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 /dev/ZKA/HALKit
parent607b9fe59c1caefa58d7272702b0668e2a9192a4 (diff)
Fix Global Scheduler and fixing ring-3 switch on non MP Scheduler.
Signed-off-by: Amlal <amlal@el-mahrouss-logic.com>
Diffstat (limited to 'dev/ZKA/HALKit')
-rw-r--r--dev/ZKA/HALKit/AMD64/HalKernelMain.cxx10
-rw-r--r--dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm80
2 files changed, 42 insertions, 48 deletions
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