diff options
| author | Amlal <amlal@el-mahrouss-logic.com> | 2024-09-08 22:19:00 +0200 |
|---|---|---|
| committer | Amlal <amlal@el-mahrouss-logic.com> | 2024-09-08 22:19:00 +0200 |
| commit | ef71b80d3df1969a2be85eadf2d83cd85745469d (patch) | |
| tree | 218415d633ba1010f57f218a139c791e7a737e4f /dev/ZKA | |
| parent | 11219de11b35cb4f1e1a27408244243b11b41e05 (diff) | |
A lot:
- Changed task banks are being switched in the kernel.
- Changed user mode switch mode, improved it to push rflags.
- User proc will start the scheduler when it's being jumped on.
Signed-off-by: Amlal <amlal@el-mahrouss-logic.com>
Diffstat (limited to 'dev/ZKA')
| -rw-r--r-- | dev/ZKA/ArchKit/ArchKit.hxx | 4 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalCoreMPScheduler.cxx | 2 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm | 35 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/ARM64/HalSchedulerCore.cxx | 2 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/POWER/HalContextSwitchPowerPC.s | 6 | ||||
| -rw-r--r-- | dev/ZKA/Sources/ExeMain.cxx | 7 | ||||
| -rw-r--r-- | dev/ZKA/Sources/HardwareThreadScheduler.cxx | 25 |
7 files changed, 39 insertions, 42 deletions
diff --git a/dev/ZKA/ArchKit/ArchKit.hxx b/dev/ZKA/ArchKit/ArchKit.hxx index 6e93359b..8ccb430c 100644 --- a/dev/ZKA/ArchKit/ArchKit.hxx +++ b/dev/ZKA/ArchKit/ArchKit.hxx @@ -107,6 +107,4 @@ inline Kernel::Array<HAL_SYSCALL_RECORD, kKerncalls; EXTERN_C Kernel::HAL::StackFramePtr mp_get_current_context(); - -/// @note The context gives out the return address in return register. -EXTERN_C Kernel::Void mp_do_context_switch(Kernel::VoidPtr image, Kernel::UInt8* stack_ptr, Kernel::HAL::StackFramePtr frame_ptr); +EXTERN_C Kernel::Void mp_do_user_switch(Kernel::Void); diff --git a/dev/ZKA/HALKit/AMD64/HalCoreMPScheduler.cxx b/dev/ZKA/HALKit/AMD64/HalCoreMPScheduler.cxx index a5bf07ec..1a518c5d 100644 --- a/dev/ZKA/HALKit/AMD64/HalCoreMPScheduler.cxx +++ b/dev/ZKA/HALKit/AMD64/HalCoreMPScheduler.cxx @@ -152,7 +152,7 @@ namespace Kernel::HAL VoidPtr f_Image; } fBlocks[kSchedProcessLimitPerTeam] = {0}; - EXTERN_C HAL::StackFramePtr _hal_leak_current_context(Void) + EXTERN_C HAL::StackFramePtr mp_get_current_context(Void) { return fBlocks[UserProcessScheduler::The().CurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Frame; } diff --git a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm index 4403263a..c61db220 100644 --- a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm +++ b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm @@ -9,10 +9,7 @@ [bits 64] -[global mp_get_current_context] -[global mp_do_context_switch] -[extern _hal_switch_context] -[extern _hal_leak_current_context] +[global mp_do_user_switch] [global mp_do_context_switch_pre] section .text @@ -20,7 +17,7 @@ section .text ;; Does a user mode switch, and then loads the task to be run. ;; rcx: code ptr. ;; rdx: stack ptr. -mp_do_context_switch: +mp_do_user_switch: mov ax, 0x18 | 3 mov ds, ax mov es, ax @@ -28,14 +25,28 @@ mp_do_context_switch: mov fs, ax push 0x18 | 3 - push rdx - push 0x200 + + mov rax, mp_user_switch_proc_end + push rax + + o64 pushf + push 0x20 | 3 - push rcx + + mov rdx, mp_user_switch_proc + push rdx + + mov rsp, mp_user_switch_proc_end o64 iret -;; @brief Gets the current stack frame. -mp_get_current_context: - call _hal_leak_current_context - ret +section .bss + +mp_user_switch_proc_begin: + resb 4*4096 +mp_user_switch_proc_end: + +section .text + +mp_user_switch_proc: + jmp $ diff --git a/dev/ZKA/HALKit/ARM64/HalSchedulerCore.cxx b/dev/ZKA/HALKit/ARM64/HalSchedulerCore.cxx index 781c639a..2c801372 100644 --- a/dev/ZKA/HALKit/ARM64/HalSchedulerCore.cxx +++ b/dev/ZKA/HALKit/ARM64/HalSchedulerCore.cxx @@ -33,7 +33,7 @@ namespace Kernel /// Wakes up thread from the hang state. Void mp_wakeup_thread(HAL::StackFrame* stack) { - mp_do_context_switch(stack); + ZKA_UNUSED(stack); } /// @brief makes the thread sleep on a loop. diff --git a/dev/ZKA/HALKit/POWER/HalContextSwitchPowerPC.s b/dev/ZKA/HALKit/POWER/HalContextSwitchPowerPC.s index 9a9c3aa6..588de23a 100644 --- a/dev/ZKA/HALKit/POWER/HalContextSwitchPowerPC.s +++ b/dev/ZKA/HALKit/POWER/HalContextSwitchPowerPC.s @@ -7,10 +7,10 @@ .align 4 .type name, @function .text -.globl mp_do_context_switch +.globl mp_do_user_switch /* r3 (3) = assigner stack, r4 (4) = assignee stack */ -mp_do_context_switch: +mp_do_user_switch: lwz 0(%4), 0(%3) lwz 4(%4), 4(%3) lwz 8(%4), 8(%3) @@ -24,5 +24,7 @@ mp_do_context_switch: 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/ZKA/Sources/ExeMain.cxx b/dev/ZKA/Sources/ExeMain.cxx index 2ac752ad..93bbb3e5 100644 --- a/dev/ZKA/Sources/ExeMain.cxx +++ b/dev/ZKA/Sources/ExeMain.cxx @@ -69,7 +69,7 @@ namespace Kernel::Detail const Kernel::Char* cDirStr[cDirCount] = { "\\Boot\\", "\\System\\", "\\Support\\", "\\Applications\\", - "\\Users\\", "\\Library\\", "\\Mount\\", "\\Games\\", "\\Applications\\Java\\"}; + "\\Users\\", "\\Library\\", "\\Mount\\", "\\Store\\", "\\Applications\\Store\\"}; if (fNeFS->GetParser()) { @@ -146,8 +146,5 @@ EXTERN_C Kernel::Void ke_dll_entrypoint(Kernel::Void) CG::CGDrawStringToWnd(cKernelWnd, "Running: ", 10, 10, RGB(0, 0, 0)); CG::CGDrawStringToWnd(cKernelWnd, kSysProcess, 10, 10 + (FONT_SIZE_X * Kernel::rt_string_len("Running: ")), RGB(0, 0, 0)); - while (Yes) - { - Kernel::UserProcessHelper::StartScheduling(); - } + mp_do_user_switch(); } diff --git a/dev/ZKA/Sources/HardwareThreadScheduler.cxx b/dev/ZKA/Sources/HardwareThreadScheduler.cxx index 09eadefb..e5947357 100644 --- a/dev/ZKA/Sources/HardwareThreadScheduler.cxx +++ b/dev/ZKA/Sources/HardwareThreadScheduler.cxx @@ -97,27 +97,16 @@ namespace Kernel fStack = frame; - if (kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled) - { - if (this->IsBusy()) - return false; + if (this->IsBusy()) + return false; - kcout << "Switching to the Process's HW thread...\r"; + kcout << "Registering process bank...\r"; - this->Busy(true); - Bool ret = mp_register_process(image, stack_ptr, fStack); - this->Busy(false); + this->Busy(true); + Bool ret = mp_register_process(image, stack_ptr, fStack); + this->Busy(false); - return ret; - } - else - { - kcout << "Switching to the Process's thread...\r"; - - mp_do_context_switch(image, stack_ptr, fStack); - - return Yes; - } + return ret; } ///! @brief Tells if processor is waked up. |
