summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-05-14 15:26:08 +0200
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-05-14 15:26:08 +0200
commit9ebaf586257bf42996881b70a79cb2d57d8fd1ef (patch)
tree093086456781af0b46d3c25950b12c6b36c40089
parentdcbdbc9198774f72894dc25854c5687be8445914 (diff)
MHR-23: SMPManager.cxx: fix HardwareThread::Switch.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
-rw-r--r--Kernel/Source/SMPManager.cxx19
1 files changed, 18 insertions, 1 deletions
diff --git a/Kernel/Source/SMPManager.cxx b/Kernel/Source/SMPManager.cxx
index d9aac48e..2c3f11f2 100644
--- a/Kernel/Source/SMPManager.cxx
+++ b/Kernel/Source/SMPManager.cxx
@@ -78,12 +78,29 @@ namespace NewOS
extern bool rt_check_stack(HAL::StackFramePtr stackPtr);
+ /// @brief Switch to hardware thread.
+ /// @param stack the new hardware thread.
+ /// @retval true stack was changed, code is running.
+ /// @retval false stack is invalid, previous code is running.
bool HardwareThread::Switch(HAL::StackFramePtr stack)
{
if (!rt_check_stack(stack))
return false;
- fStack = stack;
+ if (!fStack)
+ {
+ fStack = stack;
+ }
+ else
+ {
+ /// Keep the arguments, switch the base pointer, stack pointer
+ /// fs and gs registers.
+
+ fStack->Rbp = stack->Rbp;
+ fStack->Rsp = stack->Rsp;
+ fStack->Fs = stack->Fs;
+ fStack->Gs = stack->Gs;
+ }
rt_do_context_switch(fStack);
return true;