summaryrefslogtreecommitdiffhomepage
path: root/dev/ZKAKit
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-11-07 15:43:23 +0100
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-11-07 15:43:23 +0100
commit3bb0b718b3fde156b6f30b7f05fa34a4937befaf (patch)
tree21933f8c8f203f9ed0fea0e000fa4c145efb5c84 /dev/ZKAKit
parentc80e1c993b1909266d73d1c0b5c798d640652382 (diff)
IMP: Improve SMP code for scheduler.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev/ZKAKit')
-rw-r--r--dev/ZKAKit/HALKit/AMD64/HalContextSwitchAMD64.asm42
-rw-r--r--dev/ZKAKit/HALKit/AMD64/HalCoreMPScheduler.cc29
-rw-r--r--dev/ZKAKit/HALKit/ARM64/HalCoreMPScheduler.cc17
-rw-r--r--dev/ZKAKit/HALKit/POWER/HalContextSwitchPowerPC.s30
-rw-r--r--dev/ZKAKit/amd64-efi.make1
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)