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 /dev/ZKA/HALKit | |
| parent | 607b9fe59c1caefa58d7272702b0668e2a9192a4 (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.cxx | 10 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm | 80 |
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 |
