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 | |
| parent | c80e1c993b1909266d73d1c0b5c798d640652382 (diff) | |
IMP: Improve SMP code for scheduler.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
| -rw-r--r-- | dev/ZKAKit/HALKit/AMD64/HalContextSwitchAMD64.asm | 42 | ||||
| -rw-r--r-- | dev/ZKAKit/HALKit/AMD64/HalCoreMPScheduler.cc | 29 | ||||
| -rw-r--r-- | dev/ZKAKit/HALKit/ARM64/HalCoreMPScheduler.cc | 17 | ||||
| -rw-r--r-- | dev/ZKAKit/HALKit/POWER/HalContextSwitchPowerPC.s | 30 | ||||
| -rw-r--r-- | dev/ZKAKit/amd64-efi.make | 1 |
5 files changed, 26 insertions, 93 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; } diff --git a/dev/ZKAKit/HALKit/ARM64/HalCoreMPScheduler.cc b/dev/ZKAKit/HALKit/ARM64/HalCoreMPScheduler.cc index 29ca4c85..28d36c5a 100644 --- a/dev/ZKAKit/HALKit/ARM64/HalCoreMPScheduler.cc +++ b/dev/ZKAKit/HALKit/ARM64/HalCoreMPScheduler.cc @@ -9,11 +9,20 @@ using namespace Kernel; -EXTERN_C Void mp_do_task_switch(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame); +STATIC struct PROCESS_CONTROL_BLOCK final +{ + HAL::StackFramePtr f_Frame; + UInt8* f_Stack; + VoidPtr f_Image; +} kProcessBlocks[kSchedProcessLimitPerTeam] = {0}; -EXTERN_C Bool mp_register_process(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame) +EXTERN_C HAL::StackFramePtr mp_get_current_context(Void) { - mp_do_task_switch(image, stack_ptr, stack_frame); + return kProcessBlocks[UserProcessScheduler::The().GetCurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Frame; +} - return Yes; +EXTERN_C Bool mp_register_process(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame) +{ + MUST_PASS(image && stack_ptr && stack_frame); + return No; } diff --git a/dev/ZKAKit/HALKit/POWER/HalContextSwitchPowerPC.s b/dev/ZKAKit/HALKit/POWER/HalContextSwitchPowerPC.s deleted file mode 100644 index dfe6fc66..00000000 --- a/dev/ZKAKit/HALKit/POWER/HalContextSwitchPowerPC.s +++ /dev/null @@ -1,30 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024, EL Mahrouss Logic, all rights reserved. - -------------------------------------------- */ - -.align 4 -.type name, @function -.text -.globl mp_do_task_switch - -/* r3 (3) = assigner stack, r4 (4) = assignee stack */ -mp_do_task_switch: - lwz 0(%4), 0(%3) - lwz 4(%4), 4(%3) - lwz 8(%4), 8(%3) - lwz 12(%4), 12(%3) - lwz 14(%4), 14(%3) - lwz 18(%4), 18(%3) - lwz 22(%4), 22(%3) - lwz 24(%4), 24(%3) - lwz 28(%4), 28(%3) - lwz 32(%4), 32(%3) - lwz 34(%4), 34(%3) - lwz 38(%4), 38(%3) - - /* also change exception level */ - - /* we are done here, the assignee should start executing code now. */ - blr diff --git a/dev/ZKAKit/amd64-efi.make b/dev/ZKAKit/amd64-efi.make index 96770736..bf32e1ea 100644 --- a/dev/ZKAKit/amd64-efi.make +++ b/dev/ZKAKit/amd64-efi.make @@ -58,7 +58,6 @@ newos-amd64-epm: clean $(wildcard HALKit/AMD64/*.cc) $(wildcard HALKit/AMD64/*.cpp) \ $(wildcard HALKit/AMD64/*.s) $(ASM) $(ASMFLAGS) HALKit/AMD64/HalInterruptAPI.asm - $(ASM) $(ASMFLAGS) HALKit/AMD64/HalContextSwitchAMD64.asm $(ASM) $(ASMFLAGS) HALKit/AMD64/HalBoot.asm $(ASM) $(ASMFLAGS) HALKit/AMD64/HalUtils.asm $(MOVEALL) |
