diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-11-07 15:43:23 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-11-07 15:43:23 +0100 |
| commit | 3bb0b718b3fde156b6f30b7f05fa34a4937befaf (patch) | |
| tree | 21933f8c8f203f9ed0fea0e000fa4c145efb5c84 /dev/ZKAKit/HALKit/AMD64 | |
| parent | c80e1c993b1909266d73d1c0b5c798d640652382 (diff) | |
IMP: Improve SMP code for scheduler.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev/ZKAKit/HALKit/AMD64')
| -rw-r--r-- | dev/ZKAKit/HALKit/AMD64/HalContextSwitchAMD64.asm | 42 | ||||
| -rw-r--r-- | dev/ZKAKit/HALKit/AMD64/HalCoreMPScheduler.cc | 29 |
2 files changed, 13 insertions, 58 deletions
diff --git a/dev/ZKAKit/HALKit/AMD64/HalContextSwitchAMD64.asm b/dev/ZKAKit/HALKit/AMD64/HalContextSwitchAMD64.asm deleted file mode 100644 index 27c7895a..00000000 --- a/dev/ZKAKit/HALKit/AMD64/HalContextSwitchAMD64.asm +++ /dev/null @@ -1,42 +0,0 @@ -;; /* -;; * ======================================================== -;; * -;; * ZKA -;; * Copyright (C) 2024, EL Mahrouss Logic, all rights reserved., all rights reserved. -;; * -;; * ======================================================== -;; */ - -[bits 64] - -[global mp_do_task_switch] -[global mp_do_context_switch_pre] -[global mp_user_switch_proc] -[global mp_user_switch_proc_stack_begin] - -section .text - -;; @brief Switch to user mode. -mp_do_task_switch: - mov rbp, rdx - mov rsp, rdx - - mov ax, 0x18 | 3 - mov ds, ax - mov es, ax - mov gs, ax - mov fs, ax - - push 0x18 | 3 - - mov rax, rdx - push rax - - o64 pushf - - push 0x20 | 3 - - mov rax, rcx - push rax - - o64 iret diff --git a/dev/ZKAKit/HALKit/AMD64/HalCoreMPScheduler.cc b/dev/ZKAKit/HALKit/AMD64/HalCoreMPScheduler.cc index b6154c33..b3718b96 100644 --- a/dev/ZKAKit/HALKit/AMD64/HalCoreMPScheduler.cc +++ b/dev/ZKAKit/HALKit/AMD64/HalCoreMPScheduler.cc @@ -7,15 +7,14 @@ #include <Modules/ACPI/ACPIFactoryInterface.h> #include <KernelKit/UserProcessScheduler.h> #include <HALKit/AMD64/Processor.h> -#include <NewKit/Stop.h> #include <ArchKit/ArchKit.h> #include <KernelKit/Semaphore.h> #include <KernelKit/UserProcessScheduler.h> #include <KernelKit/Timer.h> #include <Modules/FB/Text.h> +#include <NewKit/Stop.h> -// Needed for SMP. // -#include <FirmwareKit/EFI.h> +// Needed for SMP. #include <KernelKit/HardwareThreadScheduler.h> #define kApicSignature "APIC" @@ -108,10 +107,10 @@ namespace Kernel::HAL /////////////////////////////////////////////////////////////////////////////////////// /***********************************************************************************/ - /// @brief Send start IPI for CPU. - /// @param apicId - /// @param vector - /// @param targetAddress + /// @brief Send IPI command to APIC. + /// @param apicId programmable interrupt controller id. + /// @param vector vector interrupt. + /// @param targetAddress target APIC adress. /// @return /***********************************************************************************/ @@ -136,27 +135,25 @@ namespace Kernel::HAL EXTERN_C Bool mp_register_process(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame); - struct PROCESS_CONTROL_BLOCK final + STATIC struct PROCESS_CONTROL_BLOCK final { HAL::StackFramePtr f_Frame; UInt8* f_Stack; VoidPtr f_Image; - } fBlocks[kSchedProcessLimitPerTeam] = {0}; + } kProcessBlocks[kSchedProcessLimitPerTeam] = {0}; EXTERN_C HAL::StackFramePtr mp_get_current_context(Void) { - return fBlocks[UserProcessScheduler::The().GetCurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Frame; + return kProcessBlocks[UserProcessScheduler::The().GetCurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Frame; } - EXTERN_C Void mp_do_task_switch(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame); - EXTERN_C Bool mp_register_process(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame) { - fBlocks[UserProcessScheduler::The().GetCurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Frame = stack_frame; - fBlocks[UserProcessScheduler::The().GetCurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Stack = stack_ptr; - fBlocks[UserProcessScheduler::The().GetCurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Image = image; + MUST_PASS(image && stack_ptr && stack_frame); - mp_do_task_switch(image, stack_ptr, stack_frame); + kProcessBlocks[UserProcessScheduler::The().GetCurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Frame = stack_frame; + kProcessBlocks[UserProcessScheduler::The().GetCurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Stack = stack_ptr; + kProcessBlocks[UserProcessScheduler::The().GetCurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Image = image; return Yes; } |
