From 9ebaf586257bf42996881b70a79cb2d57d8fd1ef Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Tue, 14 May 2024 15:26:08 +0200 Subject: MHR-23: SMPManager.cxx: fix HardwareThread::Switch. Signed-off-by: Amlal El Mahrouss --- Kernel/Source/SMPManager.cxx | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) 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; -- cgit v1.2.3