From 7a43990192e13a7b32bc1f99a7dd02efe6f71e4e Mon Sep 17 00:00:00 2001 From: Amlal EL Mahrouss Date: Thu, 15 Aug 2024 09:09:07 +0200 Subject: MHR-38: Ticket done. MHR-28: Initial commit, working on it. + Reworked SMP support inside x86 HAL with some bug fixes as well. + Reworked scheduler as well with some bug fixes as well. + Add ControlWord field inside StackFrame struct in x86 HAL. Signed-off-by: Amlal EL Mahrouss --- Kernel/ArchKit/ArchKit.hxx | 2 +- .../HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx | 121 ++++++--------------- Kernel/HALKit/AMD64/HalPageAlloc.cxx | 20 ++-- Kernel/HALKit/AMD64/HalRoutines.s | 4 - Kernel/HALKit/AMD64/HalSMPCoreManager.asm | 60 ++++++---- Kernel/HALKit/AMD64/Processor.hxx | 1 + Kernel/HALKit/POWER/HalThread.cxx | 5 - Kernel/Sources/ProcessScheduler.cxx | 30 ++++- 8 files changed, 114 insertions(+), 129 deletions(-) (limited to 'Kernel') diff --git a/Kernel/ArchKit/ArchKit.hxx b/Kernel/ArchKit/ArchKit.hxx index 1e7f287c..a3fd81a6 100644 --- a/Kernel/ArchKit/ArchKit.hxx +++ b/Kernel/ArchKit/ArchKit.hxx @@ -102,4 +102,4 @@ inline Kernel::Array(kRawMADT); - MUST_PASS(kApicMadt); + if (!kSMPBlock) + kSMPAware = false; - kApicInfoBlock = (MadtType*)kApicMadt; + if (kSMPBlock) + { + kSMPAware = true; + } } } // namespace Kernel::HAL diff --git a/Kernel/HALKit/AMD64/HalPageAlloc.cxx b/Kernel/HALKit/AMD64/HalPageAlloc.cxx index 5354bb25..b554e211 100644 --- a/Kernel/HALKit/AMD64/HalPageAlloc.cxx +++ b/Kernel/HALKit/AMD64/HalPageAlloc.cxx @@ -73,24 +73,24 @@ namespace Kernel kAllocationInProgress = true; //! fetch from the start. - Detail::VIRTUAL_MEMORY_HEADER* vmHeader = reinterpret_cast(kKernelVMTStart); + Detail::VIRTUAL_MEMORY_HEADER* vmh_header = reinterpret_cast(kKernelVMTStart); Detail::VirtualMemoryHeaderTraits traits; - while (vmHeader->Present && - vmHeader->Magic == cVMHMagic) + while (vmh_header->Present && + vmh_header->Magic == cVMHMagic) { - vmHeader = traits.Next(vmHeader); + vmh_header = traits.Next(vmh_header); } - vmHeader->Magic = cVMHMagic; - vmHeader->Present = true; - vmHeader->ReadWrite = rw; - vmHeader->User = user; - vmHeader->Size = size; + vmh_header->Magic = cVMHMagic; + vmh_header->Present = true; + vmh_header->ReadWrite = rw; + vmh_header->User = user; + vmh_header->Size = size; kAllocationInProgress = false; - return reinterpret_cast(vmHeader + sizeof(Detail::VIRTUAL_MEMORY_HEADER)); + return reinterpret_cast(vmh_header + sizeof(Detail::VIRTUAL_MEMORY_HEADER)); } /// @brief Allocate a new page to be used by the OS. diff --git a/Kernel/HALKit/AMD64/HalRoutines.s b/Kernel/HALKit/AMD64/HalRoutines.s index 321ad3d3..d794882d 100644 --- a/Kernel/HALKit/AMD64/HalRoutines.s +++ b/Kernel/HALKit/AMD64/HalRoutines.s @@ -1,8 +1,4 @@ -.globl hal_load_idt -.globl hal_load_gdt .globl rt_wait_400ns -.globl rt_get_current_context -.globl hal_ap_trampoline .section .text rt_wait_400ns: diff --git a/Kernel/HALKit/AMD64/HalSMPCoreManager.asm b/Kernel/HALKit/AMD64/HalSMPCoreManager.asm index 508abf80..3c53d49d 100644 --- a/Kernel/HALKit/AMD64/HalSMPCoreManager.asm +++ b/Kernel/HALKit/AMD64/HalSMPCoreManager.asm @@ -11,7 +11,6 @@ [global rt_get_current_context] [global rt_do_context_switch] -[global _hal_enable_smp] [global _hal_spin_core] [extern _hal_switch_context] [extern _hal_leak_current_context] @@ -22,20 +21,53 @@ section .text ;; rcx: Stack Pointer ;; rdx: SMP core address. rt_do_context_switch: - push rcx push rax - call _hal_switch_context + pop rax + + ;; Now grab newly allocated process's stack frame. - pop rcx + push rax + call _hal_leak_current_context + mov rax, r9 pop rax - retfq + + ;; Take care of context switching within AP. + + mov r9, rax + + mov rbp, [r9 + (8 * 5)] + mov rsp, [r9 + (8 * 6)] + + mov gs, [r9 + (8 * 19)] + mov fs, [r9 + (8 * 20)] + + mov rcx, [r9 + (8 * 3)] + mov rdx, [r9 + (8 * 4)] + mov rbx, [r9 + (8 * 7)] + mov rax, [r9 + (8 * 8)] + movq xmm0, [r9 + (8 * 9)] + movq xmm1, [r9 + (8 * 10)] + + mov r8, [r9 + (8 * 11)] + mov r10, [r9 + (8 * 13)] + mov r11, [r9 + (8 * 14)] + mov r12, [r9 + (8 * 15)] + mov r13, [r9 + (8 * 16)] + mov r14, [r9 + (8 * 17)] + mov r15, [r9 + (8 * 18)] + + fldcw word [r9 + (8 * 21)] + + mov r9, [r9 + (8 * 12)] + + retfq ;; gets the current stack frame. rt_get_current_context: push rax - jmp _hal_leak_current_context + call _hal_leak_current_context mov rax, r9 pop rax @@ -44,22 +76,6 @@ rt_get_current_context: retfq -;; @brief enables a smp core to run. -_hal_enable_smp: - ; Read the APIC base MSR - mov ecx, 0x1B ; IA32_APIC_BASE MSR - rdmsr - - ; Enable the APIC by setting bit 11 (APIC Global Enable) - or rdx, 0x800 - - ; Set the base address (0xFEE00000) - mov eax, 0xFEE - shl rax, 12 - or rax, rdx - wrmsr - ret - _hal_spin_core: jmp $ ret diff --git a/Kernel/HALKit/AMD64/Processor.hxx b/Kernel/HALKit/AMD64/Processor.hxx index 42495b61..d80a2834 100644 --- a/Kernel/HALKit/AMD64/Processor.hxx +++ b/Kernel/HALKit/AMD64/Processor.hxx @@ -168,6 +168,7 @@ namespace Kernel::HAL Reg A0, A2, BP, SP, A3, A4, A5, A6; Reg R8, R9, R10, R11, R12, R13, R14, R15; Reg Gs, Fs; + Reg ControlWord; }; typedef StackFrame* StackFramePtr; diff --git a/Kernel/HALKit/POWER/HalThread.cxx b/Kernel/HALKit/POWER/HalThread.cxx index b6a15918..3e2f1703 100644 --- a/Kernel/HALKit/POWER/HalThread.cxx +++ b/Kernel/HALKit/POWER/HalThread.cxx @@ -6,8 +6,3 @@ #include #include - -EXTERN_C Kernel::HAL::StackFramePtr rt_get_current_context() -{ - return nullptr; -} diff --git a/Kernel/Sources/ProcessScheduler.cxx b/Kernel/Sources/ProcessScheduler.cxx index 954d9a7c..8ca94b60 100644 --- a/Kernel/Sources/ProcessScheduler.cxx +++ b/Kernel/Sources/ProcessScheduler.cxx @@ -244,11 +244,27 @@ namespace Kernel } process.Leak().StackFrame = reinterpret_cast( - mm_new_ke_heap(sizeof(HAL::StackFrame), true, false)); + mm_new_ke_heap(sizeof(HAL::StackFrame), Yes, Yes)); MUST_PASS(process.Leak().StackFrame); - process.Leak().Status = ProcessStatus::kRunning; + if (process.Leak().Image) + { + process.Leak().StackFrame->BP = reinterpret_cast(process.Leak().Image); + } + else + { + if (process.Leak().Kind != PROCESS_HEADER_BLOCK::kSharedObjectKind) + { + process.Leak().Crash(); + return -kErrorProcessFault; + } + } + + if (!process.Leak().StackFrame->SP) + process.Leak().StackFrame->SP = reinterpret_cast(mm_new_ke_heap(sizeof(UInt8) * 8196, Yes, Yes)); + + process.Leak().Status = ProcessStatus::kStarting; process.Leak().ProcessId = (mTeam.AsArray().Count() - 1); process.Leak().HeapCursor = process.Leak().HeapPtr; @@ -356,6 +372,16 @@ namespace Kernel process.Leak().Status == ProcessStatus::kDead) return false; + if (process.Leak().Kind == PROCESS_HEADER_BLOCK::kSharedObjectKind) + { + if (auto start = process.Leak().DLLPtr->Load(kPefStart, rt_string_len(kPefStart), kPefCode); + start) + { + process.Leak().Image = start; + process.Leak().StackFrame->BP = reinterpret_cast(start); + } + } + if (process.Leak().GetStatus() == ProcessStatus::kStarting) { if (process.Leak().PTime <= 0) -- cgit v1.2.3