diff options
| author | Amlal EL Mahrouss <amlalelmahrouss@icloud.com> | 2024-08-15 09:09:07 +0200 |
|---|---|---|
| committer | Amlal EL Mahrouss <amlalelmahrouss@icloud.com> | 2024-08-15 09:10:20 +0200 |
| commit | 7a43990192e13a7b32bc1f99a7dd02efe6f71e4e (patch) | |
| tree | becb45624bbef4749233cd26d3c91653c6e77701 | |
| parent | fdc9c15c47fab1e780c97359b90c84bde30671d1 (diff) | |
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 <amlalelmahrouss@icloud.com>
| -rw-r--r-- | CRTKit/__ndk_new_delete.hxx | 34 | ||||
| -rw-r--r-- | CRTKit/__ndk_runtime.cxx | 1 | ||||
| -rw-r--r-- | DDKit/KernelStd.h | 2 | ||||
| -rw-r--r-- | Kernel/ArchKit/ArchKit.hxx | 2 | ||||
| -rw-r--r-- | Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx | 121 | ||||
| -rw-r--r-- | Kernel/HALKit/AMD64/HalPageAlloc.cxx | 20 | ||||
| -rw-r--r-- | Kernel/HALKit/AMD64/HalRoutines.s | 4 | ||||
| -rw-r--r-- | Kernel/HALKit/AMD64/HalSMPCoreManager.asm | 60 | ||||
| -rw-r--r-- | Kernel/HALKit/AMD64/Processor.hxx | 1 | ||||
| -rw-r--r-- | Kernel/HALKit/POWER/HalThread.cxx | 5 | ||||
| -rw-r--r-- | Kernel/Sources/ProcessScheduler.cxx | 30 |
11 files changed, 116 insertions, 164 deletions
diff --git a/CRTKit/__ndk_new_delete.hxx b/CRTKit/__ndk_new_delete.hxx index 9716e778..cde972cc 100644 --- a/CRTKit/__ndk_new_delete.hxx +++ b/CRTKit/__ndk_new_delete.hxx @@ -7,7 +7,6 @@ #pragma once #include <CRTKit/__ndk_defines.hxx> -#include <SCIKit/SCIBase.hxx> namespace stdx { @@ -27,36 +26,3 @@ namespace stdx delete ptr; } } // namespace stdx - -void* operator new(size_type len) -{ - if (!len) - ++len; - - return RtlCreateHeap(len, 0); -} - -void operator delete(void* ptr) -{ - if (!ptr) - return; - - - RtlDestroyHeap(ptr); -} - -void* operator new[](size_type len) -{ - if (!len) - ++len; - - return RtlCreateHeap(len, 0); -} - -void operator delete[](void* ptr) -{ - if (!ptr) - return; - - RtlDestroyHeap(ptr); -}
\ No newline at end of file diff --git a/CRTKit/__ndk_runtime.cxx b/CRTKit/__ndk_runtime.cxx index c8df3bcf..07af32bb 100644 --- a/CRTKit/__ndk_runtime.cxx +++ b/CRTKit/__ndk_runtime.cxx @@ -7,5 +7,6 @@ #include <CRTKit/__ndk_alloca.hxx>
#include <CRTKit/__ndk_defines.hxx>
#include <CRTKit/__ndk_exception.hxx>
+#include <CRTKIt/__ndk_new_delete.hxx>
/// @note No sources needed for now.
\ No newline at end of file diff --git a/DDKit/KernelStd.h b/DDKit/KernelStd.h index 37fc95a0..a00a080b 100644 --- a/DDKit/KernelStd.h +++ b/DDKit/KernelStd.h @@ -2,7 +2,7 @@ Copyright ZKA Technologies. - Purpose: DDK Definitions. + Purpose: DDK DLL Base Header. ------------------------------------------- */ 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<HAL_SYSCALL_RECORD, kKerncalls; EXTERN_C Kernel::HAL::StackFramePtr rt_get_current_context(); -EXTERN_C Kernel::Void rt_do_context_switch(Kernel::HAL::StackFramePtr stackFrame); +EXTERN_C Kernel::Void rt_do_context_switch(Kernel::HAL::StackFramePtr stack_frame); diff --git a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx index 7f70bdee..9de1b5b4 100644 --- a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx +++ b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx @@ -27,9 +27,6 @@ #define kAPIC_BASE_MSR_BSP 0x100 #define kAPIC_BASE_MSR_ENABLE 0x800 -/// @brief assembly routine. internal use only. -EXTERN_C void _hal_enable_smp(void); - /// @note: _hal_switch_context is internal /////////////////////////////////////////////////////////////////////////////////////// @@ -40,12 +37,25 @@ EXTERN_C void _hal_enable_smp(void); namespace Kernel::HAL { + struct MADT_TABLE; + + EXTERN_C Void _hal_spin_core(Void); + + STATIC Void hal_switch_context(HAL::StackFramePtr stack_frame); + constexpr Int32 kThreadAPIC = 0; constexpr Int32 kThreadLAPIC = 1; constexpr Int32 kThreadIOAPIC = 2; constexpr Int32 kThreadAPIC64 = 3; constexpr Int32 kThreadBoot = 4; + STATIC MADT_TABLE* kSMPBlock = nullptr; + Bool kSMPAware = false; + + STATIC Int32 cSMPInterrupt = 34; + + STATIC VoidPtr kRawMADT = nullptr; + /* * * this is used to store info about the current running thread @@ -67,67 +77,13 @@ namespace Kernel::HAL } Selector; }; - STATIC VoidPtr kApicMadt = nullptr; - /// @brief Multiple APIC Descriptor Table. - struct MadtType final : public SDT - { - UInt32 Address; - UInt32 Flags; // 1 = Dual Legacy PICs installed - - struct MadtAddress final - { - Char RecordType; - Char RecordLen; // record length - } MadtRecords[]; - }; - - struct MadtProcessorLocalApic final - { - Char AcpiProcessorId; - Char ApicId; - UInt32 Flags; - }; - - struct MadtIOApic final - { - Char ApicId; - Char Reserved; - UInt32 Address; - UInt32 SystemInterruptBase; - }; - - struct MadtInterruptSource final + struct MADT_TABLE final : public SDT { - Char BusSource; - Char IrqSource; - UInt32 GSI; - UInt16 Flags; - }; + UInt32 Address; // Madt address + UInt8 Flags; // Madt flags - struct MadtInterruptNmi final - { - Char NmiSource; - Char Reserved; - UInt16 Flags; - UInt32 GSI; - }; - - struct MadtLocalApicAddressOverride final - { - UInt16 Resvered; - UIntPtr Address; - }; - - STATIC Void hal_switch_context(HAL::StackFramePtr stackFrame); - - /////////////////////////////////////////////////////////////////////////////////////// - - STATIC MadtType* kApicInfoBlock = nullptr; - - enum - { - cAPICEOI = 0xb0, + VoidPtr Records[]; // Records List }; /////////////////////////////////////////////////////////////////////////////////////// @@ -143,8 +99,6 @@ namespace Kernel::HAL Kernel::ke_dma_write(targetAddress, kAPIC_ICR_Low, kAPIC_SIPI_Vector | vector); } - EXTERN_C Void _hal_spin_core(Void); - /// @brief Send end IPI for CPU. /// @param apicId /// @param vector @@ -156,28 +110,16 @@ namespace Kernel::HAL Kernel::ke_dma_write(targetAddress, kAPIC_ICR_Low, kAPIC_EIPI_Vector | vector); } - STATIC HAL::StackFramePtr cFramePtr = nullptr; - STATIC Int32 cSMPInterrupt = 34; - - /// @brief Gets the current context, used for context switching. - /// @retval StackFramePtr the current context. - EXTERN_C StackFramePtr _hal_leak_current_context(Void) - { - return cFramePtr; - } - /// @internal EXTERN_C Void hal_ap_startup(Void) { - while (Yes) - { - } + ke_stop(RUNTIME_CHECK_BOOTSTRAP); } /// @internal - EXTERN_C Void _hal_switch_context(HAL::StackFramePtr stackFrame) + EXTERN_C Void _hal_switch_context(HAL::StackFramePtr stack_frame) { - hal_switch_context(stackFrame); + hal_switch_context(stack_frame); } constexpr auto cMaxPCBBlocks = cMaxHWThreads; @@ -188,7 +130,12 @@ namespace Kernel::HAL HAL::StackFramePtr f_StackFrame; } fBlocks[cMaxPCBBlocks] = {0}; - STATIC Void hal_switch_context(HAL::StackFramePtr stackFrame) + EXTERN_C HAL::StackFramePtr _hal_leak_current_context(Void) + { + return fBlocks[ProcessScheduler::The().Leak().TheCurrent().Leak().ProcessId % cMaxPCBBlocks].f_StackFrame; + } + + STATIC Void hal_switch_context(HAL::StackFramePtr stack_frame) { STATIC Semaphore sem; @@ -197,10 +144,8 @@ namespace Kernel::HAL HardwareTimer timer(Seconds(cSeconds)); sem.LockOrWait(&ProcessScheduler::The().Leak().TheCurrent().Leak(), &timer); - cFramePtr = stackFrame; - fBlocks[ProcessScheduler::The().Leak().TheCurrent().Leak().ProcessId % cMaxPCBBlocks].f_Header = &ProcessScheduler::The().Leak().TheCurrent().Leak(); - fBlocks[ProcessScheduler::The().Leak().TheCurrent().Leak().ProcessId % cMaxPCBBlocks].f_StackFrame = stackFrame; + fBlocks[ProcessScheduler::The().Leak().TheCurrent().Leak().ProcessId % cMaxPCBBlocks].f_StackFrame = stack_frame; sem.Unlock(); } @@ -233,11 +178,17 @@ namespace Kernel::HAL Void hal_system_get_cores(voidPtr rsdPtr) { auto acpi = ACPIFactoryInterface(rsdPtr); - kApicMadt = acpi.Find(kApicSignature).Leak().Leak(); + kRawMADT = acpi.Find(kApicSignature).Leak().Leak(); + + kSMPBlock = reinterpret_cast<MADT_TABLE*>(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<Detail::VIRTUAL_MEMORY_HEADER*>(kKernelVMTStart); + Detail::VIRTUAL_MEMORY_HEADER* vmh_header = reinterpret_cast<Detail::VIRTUAL_MEMORY_HEADER*>(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<VoidPtr>(vmHeader + sizeof(Detail::VIRTUAL_MEMORY_HEADER)); + return reinterpret_cast<VoidPtr>(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 <HALKit/POWER/Processor.hxx> #include <KernelKit/DebugOutput.hxx> - -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<HAL::StackFrame*>( - 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<HAL::Reg>(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<HAL::Reg>(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<VoidPtr>(kPefStart, rt_string_len(kPefStart), kPefCode); + start) + { + process.Leak().Image = start; + process.Leak().StackFrame->BP = reinterpret_cast<HAL::Reg>(start); + } + } + if (process.Leak().GetStatus() == ProcessStatus::kStarting) { if (process.Leak().PTime <= 0) |
