summaryrefslogtreecommitdiffhomepage
path: root/dev/ZKA
diff options
context:
space:
mode:
authorAmlal <amlal@el-mahrouss-logic.com>2024-09-08 22:19:00 +0200
committerAmlal <amlal@el-mahrouss-logic.com>2024-09-08 22:19:00 +0200
commitef71b80d3df1969a2be85eadf2d83cd85745469d (patch)
tree218415d633ba1010f57f218a139c791e7a737e4f /dev/ZKA
parent11219de11b35cb4f1e1a27408244243b11b41e05 (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.hxx4
-rw-r--r--dev/ZKA/HALKit/AMD64/HalCoreMPScheduler.cxx2
-rw-r--r--dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm35
-rw-r--r--dev/ZKA/HALKit/ARM64/HalSchedulerCore.cxx2
-rw-r--r--dev/ZKA/HALKit/POWER/HalContextSwitchPowerPC.s6
-rw-r--r--dev/ZKA/Sources/ExeMain.cxx7
-rw-r--r--dev/ZKA/Sources/HardwareThreadScheduler.cxx25
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.